在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。






發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章