我手头上有一块tq2440开发板,最近没事就裸奔下,裸奔到iis接口那里,做了wave音频的播放。想想 arm9软解MP3应该没什么问题,于是乎 下载了libmad的源码,加入keil4工程里,有几个文件稍作了一下修改,使用minimad.c里的程序解码(这个例子里是使用操作系统的,从stdin读入数据,把解码后得到的pcm数据通过终端打印) 数组里的数据做实验。发现解码速度慢啊,我总结了下,应该是 我没使用FPM_ARM ,另外没有使用ASO_IMDCT ,
但是使用 后编译出错:
# define mad_f_mul(x, y) \
({ mad_fixed64hi_t __hi; \
mad_fixed64lo_t __lo; \
mad_fixed_t __result; \
asm ("smull %0, %1, %3, %4\n\t" \
"movs %0, %0, lsr %5\n\t" \
"adc %2, %0, %1, lsl %6" \
: "=&r" (__lo), "=&r" (__hi), "=r" (__result) \
: "%r" (x), "r" (y), \
"M" (MAD_F_SCALEBITS), "M" (32 - MAD_F_SCALEBITS) \
: "cc"); \
__result; \
})
其中mad_fixed_t、mad_fixed64hi_t均已预定义为signed int,mad_fixed64lo_t预定义为unsigned int。
在别的C文件中使用该定义,如:
……
# define MUL(x, y) mad_f_mul((x), (y))
……
t59 = MUL(t16 - t17, costab2);
此处调用该头定义的部分全部报Pe029错误“Expected an Expression”。
另外一部分头定义:
# define MAD_F_MLX(hi, lo, x, y) \
asm ("smull %0, %1, %2, %3" \
: "=&r" (lo), "=&r" (hi) \
: "%r" (x), "r" (y))
在调用时:
……
# define MAD_F_ML0(hi, lo, x, y) MAD_F_MLX((hi), (lo), (x), (y))
……
# define ML0(hi, lo, x, y) MAD_F_ML0((hi), (lo), (x), (y))
……
ML0(hi, lo, (*fx)[0], ptr[ 0]);
此种调用的地方全部报Pe018错误“Expected a ')'”,
imdct_l_arm.S文件也报错
找了找百度老师,大约是说 libmad是基于gcc编译的,用keil的编译器 编译有问题。
我按照arm汇编 修改了imdct_l_arm.S文件,然后 imdct_l_arm.S可以顺利编译。但是却不能解码(测试使用 FPM_DEFAULT)。至于那两个其他的编译错误我不知道怎么弄了。
坛子里有谁做过这方面的工作,能否给点意见和参考。
下面附上我的工程,请大家帮看看。
我是在SDRAM中仿真的,直接运行程序会不会快点? |