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