主页(http://www.pttcn.net):基于IPP的嵌入式音频解码器设计与优化(2) 除解码和播放MP3程序外,还需用户控制部分的程序。MP3播放要求实时性很高,所以不能跟用户控制程序放在一起,需要为它创建一个线程。通过Linux下的Pthread线程,它可以共享内存的数据,这使得线程间通信变得方便。MP3播放的代码就可以放到一个线程里面去,通过共享内存数据由主线程来处理用户操作、启动、暂停和结束播放线程序。引入了多线程操作后,使播放器用户界面的各操作(如按纽按下、鼠标点击等)不必等待MP3解码完成而不能得到及时响应。 5.3 MP3音频解码关键算法对IPP关键算法的API移植封装接口 这使得最上层的QT图形界面应用程序的各个成员函数可以非常方便地调用利用IPP生成的音频播放各种操作的函数接口。这样仍然可以利用IPP的高效算法进行解码优化而且屏蔽了底层IPP API的复杂性。还为以后的二次开发提供便利。自己定义的音频解码各个函数原型如下: void mp3open(char filename);/*打开MP3文件并创建解码线程*/ void mp3play(void); /*设置ispause共享变量为假,重新进入播放线程循环体*/ void mp3pause(void);/*设置ispause共享变量为真*/ void mp3stop(void); /*设置done共享变量为真,等待播放线程结束* 需要说明的是上述函数完成播放器用户界面中启动音频播放、控制暂停和结束播放功能,通过多线程之间共享内存数据的方式进行线程间的通信,从而在主线程中控制播放线程的暂停和停止。 void *MP3Start(void *arg) /*针对MP3播放线程主函数进行解释和流程分析*/ { if(!ispause)/*通过判断线程之间的共享变量ispause判断时候有暂停键按下*/ switch( DecodeMP3Frame(&bs,pcm,&DecoderState) ) {/*根据解码函数返回的状态选择下一步操作*/ case MP3_FRAME_COMPLETE: /*缓冲区中已有足够数据来解码一帧流数据*/ …}} /*关闭 I/O 音频设备,此MP3文件播放结束*/ } 6 结束语 (中国集群通信网 | 责任编辑:陈晓亮) |