天天看點

在mt7628實作alsa架構解碼并播放音頻檔案

//by seven

最近在評估用MT7628做一個音樂播放器,最初使用ffmpeg+sdl但過程曲折離奇,費了一番折騰最後發現mt7628的性能根本無法支撐ffmpeg的資源訴求,播放出來的聲音一卡一卡的,解碼速度跟不上。 無奈最終選擇了libmad+libao庫實作mp3格式的播放。

整個方案下來占用資源非常小, 解碼并播放時隻占用不到20%的cpu資源。 libmad确實對cpu性能的要求不高,很适合低端cpu對音樂播放功能的需求。

下面說一下本人實作的步驟:

源碼庫編譯安裝: - libao-1.2.0.tar.gz 和 libmad-0.15.1b.tar.gz - 解壓并安裝libao - libao-1.2.0.tar.gz

1、cd $(MYWORK) 2、tar zxvf libao-1.2.0.tar.gz 3、cd  libao-1.2.0 4、./configure --prefix=`pwd`/../_install/ao-1.2.0-op --disable-broken-oss --enable-alsa-mmap --host=mipsel-openwrt-linux CC=mipsel-openwrt-linux-gcc LIBS="-L/home/seven/work/mtk/mtk7620a/openwrt/rakHiveSDK/staging_dir/target-mipsel_24kec+dsp_uClibc-0.9.33.2/usr/lib/" CPPFLAGS="-I/home/seven/work/mtk/mtk7620a/openwrt/rakHiveSDK/staging_dir/target-mipsel_24kec+dsp_uClibc-0.9.33.2/usr/include" --disable-esd --disable-arts --disable-nas --disable-pulse

5、make && make install

以上将所要的libao庫和頭檔案安裝到指定的目錄下即:_install/ao-1.2.0-op, 以備後面程式設計使用。- mark

- 解壓變安裝libmad - libmad-0.15.1b.tar.gz

1、cd $(MYWORK) 2、tar zxvf libmad-0.15.1b.tar.gz 3、cd libmad-0.15.1b 4、./configure --prefix=`pwd`/../_install/libmad-0.5.15.1b-op --host=mipsel-openwrt-linux --enable-fpm=mips 5、make 此處在執行make的時候将會出現下面兩個編譯問題, 問題一:   

if /bin/sh ./libtool --mode=compile gcc -DHAVE_CONFIG_H -I. -I. -I. -DFPM_INTEL -DASO_ZEROCHECK    -Wall -march=i486 -g -O -fforce-mem -fforce-addr -fthread-jumps -fcse-follow-jumps -fcse-skip-blocks -fexpensive-optimizations -fregmove -fschedule-insns2 -fstrength-reduce -MT version.lo -MD -MP -MF ".deps/version.Tpo" -c -o version.lo version.c; /

        then mv -f ".deps/version.Tpo" ".deps/version.Plo"; else rm -f ".deps/version.Tpo"; exit 1; fi

gcc -DHAVE_CONFIG_H -I. -I. -I. -DFPM_INTEL -DASO_ZEROCHECK -Wall -march=i486 -g -O -fforce-mem -fforce-addr -fthread-jumps -fcse-follow-jumps -fcse-skip-blocks -fexpensive-optimizations -fregmove -fschedule-insns2 -fstrength-reduce -MT version.lo -MD -MP -MF .deps/version.Tpo -c version.c  -fPIC -DPIC -o .libs/version.o

cc1: error: unrecognized command line option "-fforce-mem"

make[2]: *** [version.lo] Error 1

對于這個問題都很簡單了, 網上随便一搜都有解決方案,這個問題無論什麼平台(arm/mips/x86) 都會出現,解決方法即: 問題解決: 修改Makefile查找-fforce-mem關鍵詞,然後去掉即可。

問題二:

fixed.h:307:5: error: impossible constraint in 'asm'      asm ("mult %2,%3"  \      ^ synth.c:497:15: note: in expansion of macro 'MUL'    t176 = (((((MUL(t161 - t162, costab16) * 2) -                ^ fixed.h:307:5: error: impossible constraint in 'asm'      asm ("mult %2,%3"  \      ^ ... ...      ^ synth.c:115:22: note: in expansion of macro 'mad_f_mul'  #  define MUL(x, y)  mad_f_mul((x), (y))                       ^ synth.c:502:20: note: in expansion of macro 'MUL'        SHIFT((((((((MUL(t171 - t172, costab16) * 2) -                     ^ make[2]: *** [synth.lo] Error 1 make[2]: Leaving directory `/home/xxxxxx/ffmpeg/libmad-0.15.1b' make[1]: *** [all-recursive] Error 1 make[1]: Leaving directory `/home/xxxxxk/ffmpeg/libmad-0.15.1b' make: *** [all] Error 2

對于這個問題用的是mips架構的應該都會遇到, arm的無此類問題,在此需要更新一個更新檔;

6、make install

以上将所要的libmad庫和頭檔案安裝到指定的目錄下即:_install/libmad-0.5.15.1b-op , 以備後面程式設計使用。- mark

- 應用執行個體程式設計

該執行個體是基于libmad提供的miniamd.c修改而來,同時針對mt7628 alsa存在的缺陷, 不能動态的改變period buffer,是以做了适當的改動。

具體執行個體請參看如下連結,将詳細step-by-step體驗demo的效果 TKs。

libmad執行個體