基于ARM L i nux QT的掌上多媒體系統(tǒng)的設(shè)計(jì)和實(shí)現(xiàn)
系統(tǒng)音頻驅(qū)動(dòng)主要是對(duì)UDA1314TS進(jìn)行驅(qū)動(dòng)編寫,包括對(duì)UDA1314TS的L3接口的控制。首先初始化I/O和UDA1 314芯片,然后申請(qǐng)兩個(gè)DMA(Direct Memory Access)通道用于音頻傳輸(音頻數(shù)據(jù)的發(fā)送和接收都通過一個(gè)先入先出的隊(duì)列FIFO,但是只靠FIFO要保證音頻的連續(xù)播放是很困難的,所以申請(qǐng)DMA通道來(lái)解決此問題)。OSS標(biāo)準(zhǔn)中由兩個(gè)最基本的音頻設(shè)備:混音器(Mixer)和數(shù)字信號(hào)處理器(DSP)又稱編解碼器,其中混音器主要用來(lái)控制輸入輸出音量的大小,只有open和release以及幾個(gè)接管OSS標(biāo)準(zhǔn)的iotcl。而DSF設(shè)備驅(qū)動(dòng)的方法比較復(fù)雜,主要包括open、release、read、write、poll、ioctl。其中主要在write和read方法中實(shí)現(xiàn)音頻的播放和錄音。以播放音頻來(lái)說明DSP驅(qū)動(dòng)程序的編寫,對(duì)應(yīng)了驅(qū)動(dòng)程序中的open和write方法,它們利用DMA實(shí)現(xiàn)了音頻的播放。在open中,首先判斷設(shè)備打開的方法:讀取、寫入和讀/寫,分別對(duì)應(yīng)音頻的錄音、播放以及錄音同時(shí)回放,然后申請(qǐng)兩個(gè)與音頻DMA緩沖區(qū)相關(guān)的,在初始化DMA時(shí)要用到,最后程序可以根據(jù)設(shè)備打開模式的初始化S3C2410的工作模式,并清空所需的DMA緩沖區(qū)(在write方法被調(diào)用時(shí)創(chuàng)建)的數(shù)據(jù)結(jié)構(gòu),把它留給緩沖區(qū)創(chuàng)建。在這里,因?yàn)槭褂昧藘蓚€(gè)DMA音頻數(shù)據(jù)傳輸,DMA緩沖的建立發(fā)生在第一次調(diào)用wri te將音頻數(shù)據(jù)傳送到設(shè)備,而OSS驅(qū)動(dòng)的調(diào)用者通常要在打開音頻設(shè)備時(shí)就期望獲得DMA緩沖的信息,然而因?yàn)榫彌_尚未建立,會(huì)使得緩沖大小為0這個(gè)結(jié)果,解決辦法時(shí)在兩個(gè)與音頻DMA緩沖區(qū)相關(guān)的程序部分一定不能少了以下代碼:
if(!output_stream.bufferaudio_setup_buf(&out stream))
return-ENOMEM;
在Write方法中首先判斷設(shè)備文件打開的方式,具有write特性打開的設(shè)備才可以寫入,然后判斷是否沒有建立DMA緩沖區(qū),若沒有,則通過audio_setup_buf()來(lái)創(chuàng)建,定義一個(gè)結(jié)構(gòu)體(audio_stream_t)的指針如下:本文引用地址:http://www.ex-cimer.com/article/152272.htm
2.3 Gu l程序的設(shè)計(jì)與播放器的實(shí)現(xiàn)
2.3.1 GUI程序的設(shè)計(jì)和實(shí)現(xiàn)
播放器的圖形界面在Qtopia視窗環(huán)境下運(yùn)行,采用Qt/Embedded2.3.7作為底層圖形庫(kù),用于生成用戶界面。QT是一個(gè)跨平臺(tái)的c++圖形用戶界面庫(kù),Qt/Embedded是面向嵌入式系統(tǒng)的版本,其最大的特點(diǎn)就是使信號(hào)和槽用于對(duì)象間的通信,Qt的窗口部件有多個(gè)預(yù)定義的信號(hào),槽是一個(gè)可以被調(diào)用處理特定信號(hào)的函數(shù)。Qt的窗口部件有多個(gè)預(yù)定義的槽,當(dāng)一個(gè)特定事件發(fā)生的時(shí)候,一個(gè)信號(hào)被發(fā)射,對(duì)應(yīng)感興趣的槽就會(huì)調(diào)用對(duì)應(yīng)的相應(yīng)函數(shù)。播放器界面主要包括主界面窗口、文件操作窗口、播放列表窗口。主界面窗口有一個(gè)顯示屏和一些控制按鈕,包括播放、暫停、快進(jìn)、快退、下一首、上一首、音量調(diào)整以及播放進(jìn)度條和播放時(shí)間顯示。文件操作窗口可以使用戶選擇要播放的文件。播放列表用來(lái)播放最近播放的五個(gè)多媒體文件。
2.3.2 播放器的實(shí)現(xiàn)
Linux下的播放器Mplayer是Linux上最優(yōu)秀的多媒體播放器,它能夠使用眾多的編解碼器,支持多種輸出設(shè)備。可以播放市面上幾乎所有的音視頻格式。本系統(tǒng)選擇其作為播放器,對(duì)其進(jìn)行優(yōu)化和移植。進(jìn)行的優(yōu)化主要有:
(1)Mplayer在系統(tǒng)上運(yùn)行的時(shí)候顏色會(huì)有偏差,因此編程校正Mplayer的色彩;
(2)Mplayer正常模式不能在FramBuffer的中間顯示,帶-fs的全屏參數(shù)播放后,只能將播放位置移到中間,并不放大,修改播放顯示位置,讓它和Nplayer圖形界面的調(diào)用相符合;
(3)編程實(shí)現(xiàn)播放時(shí)對(duì)鍵盤事件正?;?;
(4)Mplayer采用的自帶的mp3lib浮點(diǎn)音頻解碼庫(kù)的解碼效率很低,在播放音頻時(shí)會(huì)很卡,通過采用使用定點(diǎn)運(yùn)算的libmad音頻解碼庫(kù)替代原來(lái)的mp3lib庫(kù)進(jìn)行音頻解碼;
(5)使用Mplayer的-input選項(xiàng),通過FIFO從GUI向后端程序傳遞控制信息。通過優(yōu)化后,對(duì)Mplayer交叉編譯,移植到系統(tǒng)上可以流暢地播放mp3等音頻文件以及mpeg-1、mpeg-2、avi等視頻格式。
評(píng)論