采用Symbian中MAD(MPEG音频解码库)用法
作者: Denis Mingulov 2005.4.28
前段时间我在newlc.com写了为Series 60创建MP3播放器的程序。我收到了许多关于MP3解码并运用在Symbian上的邮件。这里采用Symbian中MAD(MPEG音频解码库)用法来解决问题。
绪论
因为Symbian 7.0中可以通过MMF在smartphones在播放MP3, 但如果你的手机不支持 MP3解码,或如果你想自己接收解码MP3。这里我将演示如何采用Symbian中的MAD(MPEG音频解码,libmad)用法。
为什么使用MAD呢? 因为它是高品质的MPEG音频解码器,并且它已经在ARM下测试通过(也就是说不同的微型电脑和掌上MP3可以使用它)。将MAD移植到Symbian。
为了得到MAD来源,将需要以下文件:
? inc
o D.dat
o imdct_s.dat
o qc_table.dat
o rq_table.dat
o sf_table.dat
o bit.h
o config.h
o decoder.h
o fixed.h
o frame.h
o global.h
o huffman.h
o layer12.h
o layer3.h
o mad.h
o stream.h
o synth.h
o timer.h
o version.h
? src
o bit.c
o decoder.c
o fixed.c
o frame.c
o huffman.c
o layer12.c
o layer3.c
o stream.c
o synth.c
o timer.c
o version.c
o imdct_l_arm.S
固定静态函数/ 变量为非静态.(变量可以被转换为"静态的const")。
编辑mad.h,,为设备对象和FPM_DEFAULT定义FPM_ARM. 如果你的WINS编译器不支持big inline,需要这样做:
# ifndef__WINS__
inline
#endif
可能在layer3.c III_decode函数中引起堆栈错误,即在字符串:
mad_fixed_t xr[2][576];
你可以为变量分配存储器或(在简单程序的情况下)为WINS对象使用窍门,置成静态变量.在真机上它会正常运行的.
imdct_l_arm.S是针对ARMI最佳化的,使用它必须添加它的报头(函数 III_imdct_l) .
# ifndef __WINS__
void III_imdct_l(mad_fixed_t const X[18], mad_fixed_t z[36], unsigned int block_type);
# else
static
void III_imdct_l(mad_fixed_t const X[18], mad_fixed_t z[36], unsigned int block_type)
注意! 优化的 imdct_l_arm 不能在THUMB下编译,所以只是ARMI 对象被使用.
创建MP3解码动态链接库
使用MP3解码器的最好方法是DLL,你可以编译一次或有效的若干次,没有任何的平台特殊事件。所以使用ETTYPE.为libmad把\epoc32\include\libc加入在MM文件中的SYSTEMINCLUDE。如果想使用优化的III_imdct_l函数,加入到MMP:
#if !defined (WINS)
SOURCE imdct_l_arm.S
#endif
同样加入到bld.inf:(所以imdct_l_arm对THUMB编译)
PRJ_PLATFORMS
ARMI WINS
如果在iii_decode函数中为堆栈错误使用窍门并且在WINS库中没有_chkstk,需要自己添加它(empty void _chkstk()):
为了在程序中使用DLL,添加函数。
你可以使用基于madplay的MP3解码器的主循环:
读文件到缓冲器
MP3结构解码
应用滤波器
合成解码到PCM样本
重新取PCM样本
过滤 大多数的Symbian smartphones不支持立体声播放,所以这里你可以实现单一声音合成。并且可以使用平衡器。
频率 不需要做没必要的计算,如果所需频率大于当前架框流通频率的一半,在申请滤波器后转换架框选项:
Frame.options |= MAD_OPTION_HALFSAMPLERATE;
编辑 推荐使用 GCC 3 编译这一程序。根据我的测试它比普通的GCC 2.95解码器速度快20%。不要忘记MAD在GNU General Public License version 2下是得到许可的。
希望文章对你能有所帮助,同时欢迎写出注释或提出宝贵意见。 |