北京理工大学 20981 陈罡
前几篇说到在win mobile 5上面播放mp3音频需要了解的基本知识。
在这里我再总结一下:
首先是移植libmad,mp3文件解码器这是必不可少的第一步;
然后是使用libmad把mp3文件解码成为pcm码流,也就是wav文件
(其实还是有一些区别的,wav文件是有wav头的pcm码流)。
最后就是利用pcm码流的播放api实现最终的播放目的,在这当中,
需要善于利用缓冲队列。
如果能够把这么多东西封装成一个方便使用的类就好了,我在开发
5mbox的过程中也是这么想的,所以就按照上一篇所讲的原理编写了
一个类专门用于封装解码线程和pcm码流播放线程的。不知道为什么,
虽然在真机上的效果已经可以让人满意了,但是在模拟器上播放mp3
的时候,总是听上去稍微有一点点一顿一顿的感觉。如果哪位大侠
从下面的代码中发现了修正这个问题的方法,还请不吝赐教!
使用方法如下:
(1)新建win mobile 5.0 ppc工程(我在这里创建的是WM5Mp3Demo工程),
然后把mp3core这个目录整个拷贝到系统自动创建的目录下面。
(2)在"Solution Explore"里面,右键单击"WM5Mp3Demo",在弹出菜单
中选择"Add"->"New filter",创建一个目录,取名叫"mp3core",然后
再用类似的方法在mp3core上面再创建目录,然后在每个目录上单击右键
选择"Add"->"Existing item...",把对应的目录下的所有源文件都选上。
这样就可以完成mp3core目录下的源文件添加到你的新建项目的操作。
如下图所示:
(3)可以根据需要选择debug模式或者release模式,然后选择"Project"->
"WM5Mp3Demo Properties",然后如图所示,设置附加包含路径:
(4)然后设置编译器不采用预编译头文件,如下图所示:
(5)好了,然后就是添加代码了,要使用mp3core的封装,必须加入:
#include "M5Mp3Play.h"
然后声明一个全局的变量,如:g_mp3play之类的:
// Global Variables:
HINSTANCE g_hInst; // current instance
HWND g_hWndMenuBar; // menu bar handle
CM5Mp3Play g_mp3_play ; // mp3 player
我用的是win32 api风格的ppc开发,如果用到mfc之类的库的朋友,也可以
不声明成全局的变量,这里只是为了清晰、简单。
然后找到可以调用的入口,比如button的OnClick处理啦,键盘的事件啦之类的
地方,加入下面的调用代码即可。我这里是用WndProc里面的键盘事件:
case WM_KEYDOWN:
// Handle any non-accelerated key commands
switch (wParam) {
case VK_ACTION:
case VK_RETURN:
{
// 这里是定义了退出
PostMessage(hWnd, WM_CLOSE, 0, 0);
return 0L;
}
case VK_UP:
{
// 按上方向键停止播放
g_mp3_play.Stop() ;
}
break ;
case VK_DOWN:
{
// 按下方向键开始播放,注意这里用的是绝对路径
// 需要把test.mp3拷贝到手机内存的相应位置下面才能够播放,
// 这一点一定要注意。这里的第一个参数是mp3文件的路径,
// 第二个参数是是否循环播放,如果是true则循环播放,播放
// 完毕后会自动从头开始重新播放;如果是false则播放一遍后
// 停止播放。
g_mp3_play.Init("/Program Files/WM5Mp3Demo/test.mp3", true) ;
g_mp3_play.Play() ;
}
break ;
}
break;
好了,至此win mobile 5.0下面播放mp3文件的方法就全部介绍完毕了。
上述整个demo的源代码可以自由下载,希望下载的朋友能够多多提出改进的意见,谢谢