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






猜你喜欢

转载自blog.csdn.net/sevenjoin/article/details/50925900