先了解一下brew中可以播放音频的API(以下内容来自API帮助文档)
ISOUND:可以提供基本的声音服务。这些服务可以产生蜂鸣、铃声、振动、各种音调和音调列表。只能播放音调。
IRingerMgr:播放铃声。
ISoundPlayer:只能播放音乐文件。现在已不推荐使用。
IMEDIA:可以支持pmd格式的文件,声音,文本,图象都可以。
本例子中,使用IMEDIA接口,播放一首mp3格式的音乐。
1.创建工程app及其同名mif文件;
//创建工程的第一步中选File、Sound
//在mif文件的权限里勾选“文件”
//把要播放的mp3音乐放在本工程的文件夹下,音乐名是英文,不含非法字符
2.在文件开始,添加AEEMedia.h
//这样才可以使用IMEDIA接口及其函数
//部分音乐格式需要AEEMediaFormats.h的支持
3.在结构体定义中添加AEEMediaData变量、IMedia指针;
4.在app_HandleEvent中的EVT_APP_START下添加功能入口函数start;
//功能入口函数就是要播放音乐的函数
5.在app_InitAppData中用ISHELL_CreateInstance创建IMedia实例
//中间的参数由要播放的音乐格式确定,以下是常用的对应关系
//midi——AEECLSID_MEDIAMIDI
//mp3——AEECLSID_MEDIAMP3
//qcp——AEECLSID_MEDIAQCP
//pmd——AEECLSID_MEDIAPMD
//mpg4——AEECLSID_MEDIAMPEG4
//mmf——AEECLSID_MEDIAMMF
//phrase——AEECLSID_MEDIAPAPHR
6.在start中初始化AEEMediaData变量
//clsData = MMD_FILE_NAME;以下指定的是文件名
//pData = "music.mp3";mp3的文件名
//dwSize = 0;在指定文件名时,这个参数是没有意义的
7.用IMEDIA_SetMediaData把要播放的文件放进去;
//第二个参数前要带&
8.IMEDIA_Play播放
到这一步,应该可以听到音乐了。
IMEDIA_Play是异步执行的,在调试中,我们发现,它返回SUCCESS时不一定有声音。那么,它是在什么情况下返回SUCCESS的呢?好像是:它检查硬件是否支持播放这种格式的音乐,如果支持,就立刻返回SUCCESS。至于什么时候播放,播放结束后返回什么,到现在我还没弄明白。
以上步骤实现了:一个音乐,播放一次,然后停止。
当然,在实际应用中不会如此简单。满足复杂的需求,要用到回调函数,假设创建回调函数为app_notify。回调函数要按照IMedia.h中的格式写,在IMEDIA_Play之前用IMEDIA_RegisterNotify注册回调函数。
1.一个音乐,播放n遍。比如说游戏的背景音乐,需要一直播的。
解决:在app_notify中调用IMEDIA_Play,这段音乐会循环播放不停止。
2.多个音乐的播放。比如游戏中的提示声音。
解决:app_notify中,判断AEEMediaCmdNotify,在MM_STATUS_DONE状态下,用IMEDIA_Stop停止当前音乐(可有可无,其实是释放一些资源,置为ready状态),释放当前IMedia实例。再用ISHELL_SetTimer启动一个回调(如果把ISHELL_CreateInstance放到start中,这个回调就是start),在回调里重新创建IMedia实例,执行步骤6、7、8。
3.音乐的定时播放。比如需要音乐之间有停顿。
通过设置app_notify中的ISHELL_SetTimer。它必须存在,如果不需要音乐之间有停顿,把值设得小一些。从我们的测试结果看,太小也不行。500ms几乎是听不出来有停顿。
4.多个音乐的存储。
用一个数组存放音乐文件的名字即可。