`

关于音频的播放

    博客分类:
  • brew
阅读更多

 先了解一下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.多个音乐的存储。
    用一个数组存放音乐文件的名字即可。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics