主頁(http://www.130131.com):基于IPP的嵌入式音頻解碼器設(shè)計與優(yōu)化(2) 除解碼和播放MP3程序外,還需用戶控制部分的程序。MP3播放要求實時性很高,所以不能跟用戶控制程序放在一起,需要為它創(chuàng)建一個線程。通過Linux下的Pthread線程,它可以共享內(nèi)存的數(shù)據(jù),這使得線程間通信變得方便。MP3播放的代碼就可以放到一個線程里面去,通過共享內(nèi)存數(shù)據(jù)由主線程來處理用戶操作、啟動、暫停和結(jié)束播放線程序。引入了多線程操作后,使播放器用戶界面的各操作(如按紐按下、鼠標點擊等)不必等待MP3解碼完成而不能得到及時響應(yīng)。 5.3 MP3音頻解碼關(guān)鍵算法對IPP關(guān)鍵算法的API移植封裝接口 這使得最上層的QT圖形界面應(yīng)用程序的各個成員函數(shù)可以非常方便地調(diào)用利用IPP生成的音頻播放各種操作的函數(shù)接口。這樣仍然可以利用IPP的高效算法進行解碼優(yōu)化而且屏蔽了底層IPP API的復(fù)雜性。還為以后的二次開發(fā)提供便利。自己定義的音頻解碼各個函數(shù)原型如下: void mp3open(char filename);/*打開MP3文件并創(chuàng)建解碼線程*/ void mp3play(void); /*設(shè)置ispause共享變量為假,重新進入播放線程循環(huán)體*/ void mp3pause(void);/*設(shè)置ispause共享變量為真*/ void mp3stop(void); /*設(shè)置done共享變量為真,等待播放線程結(jié)束* 需要說明的是上述函數(shù)完成播放器用戶界面中啟動音頻播放、控制暫停和結(jié)束播放功能,通過多線程之間共享內(nèi)存數(shù)據(jù)的方式進行線程間的通信,從而在主線程中控制播放線程的暫停和停止。 void *MP3Start(void *arg) /*針對MP3播放線程主函數(shù)進行解釋和流程分析*/ { if(!ispause)/*通過判斷線程之間的共享變量ispause判斷時候有暫停鍵按下*/ switch( DecodeMP3Frame(&bs,pcm,&DecoderState) ) {/*根據(jù)解碼函數(shù)返回的狀態(tài)選擇下一步操作*/ case MP3_FRAME_COMPLETE: /*緩沖區(qū)中已有足夠數(shù)據(jù)來解碼一幀流數(shù)據(jù)*/ …}} /*關(guān)閉 I/O 音頻設(shè)備,此MP3文件播放結(jié)束*/ } 6 結(jié)束語 (中國集群通信網(wǎng) | 責任編輯:陳曉亮) |




