新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 基于ARM Linux QT的掌上多媒體系統的設計和實現

        基于ARM Linux QT的掌上多媒體系統的設計和實現

        作者: 時間:2011-06-18 來源:網絡 收藏
        系統音頻驅動主要是對UDA1314TS進行驅動編寫,包括對UDA1314TS的L3接口的控制。首先初始化I/O和UDA1 314芯片,然后申請兩個DMA(Direct Memory Access)通道用于音頻傳輸(音頻數據的發送和接收都通過一個先入先出的隊列FIFO,但是只靠FIFO要保證音頻的連續播放是很困難的,所以申請DMA通道來解決此問題)。OSS標準中由兩個最基本的音頻設備:混音器(Mixer)和數字信號處理器(DSP)又稱編解碼器,其中混音器主要用來控制輸入輸出音量的大小,只有open和release以及幾個接管OSS標準的iotcl。而DSF設備驅動的方法比較復雜,主要包括open、release、read、write、poll、ioctl。其中主要在write和read方法中實現音頻的播放和錄音。以播放音頻來說明DSP驅動程序的編寫,對應了驅動程序中的open和write方法,它們利用DMA實現了音頻的播放。在open中,首先判斷設備打開的方法:讀取、寫入和讀/寫,分別對應音頻的錄音、播放以及錄音同時回放,然后申請兩個與音頻DMA緩沖區相關的,在初始化DMA時要用到,最后程序可以根據設備打開模式的初始化S3C2410的工作模式,并清空所需的DMA緩沖區(在write方法被調用時創建)的數據結構,把它留給緩沖區創建。在這里,因為使用了兩個DMA音頻數據傳輸,DMA緩沖的建立發生在第一次調用wri te將音頻數據傳送到設備,而OSS驅動的調用者通常要在打開音頻設備時就期望獲得DMA緩沖的信息,然而因為緩沖尚未建立,會使得緩沖大小為0這個結果,解決辦法時在兩個與音頻DMA緩沖區相關的程序部分一定不能少了以下代碼:
        if(!output_stream.bufferaudio_setup_buf(&out stream))
        return-ENOMEM;
        在Write方法中首先判斷設備文件打開的方式,具有write特性打開的設備才可以寫入,然后判斷是否沒有建立DMA緩沖區,若沒有,則通過audio_setup_buf()來創建,定義一個結構體(audio_stream_t)的指針如下:


        2.3 Gu l程序的設計與播放器的實現
        2.3.1 GUI程序的設計和實現
        播放器的圖形界面在Qtopia視窗環境下運行,采用Qt/Embedded2.3.7作為底層圖形庫,用于生成用戶界面。是一個跨平臺的c++圖形用戶界面庫,Qt/Embedded是面向嵌入式系統的版本,其最大的特點就是使信號和槽用于對象間的通信,Qt的窗口部件有多個預定義的信號,槽是一個可以被調用處理特定信號的函數。Qt的窗口部件有多個預定義的槽,當一個特定事件發生的時候,一個信號被發射,對應感興趣的槽就會調用對應的相應函數。播放器界面主要包括主界面窗口、文件操作窗口、播放列表窗口。主界面窗口有一個顯示屏和一些控制按鈕,包括播放、暫停、快進、快退、下一首、上一首、音量調整以及播放進度條和播放時間顯示。文件操作窗口可以使用戶選擇要播放的文件。播放列表用來播放最近播放的五個多媒體文件。
        2.3.2 播放器的實現
        下的播放器Mplayer是上最優秀的多媒體播放器,它能夠使用眾多的編解碼器,支持多種輸出設備??梢圆シ攀忻嫔蠋缀跛械囊粢曨l格式。本系統選擇其作為播放器,對其進行優化和移植。進行的優化主要有:
        (1)Mplayer在系統上運行的時候顏色會有偏差,因此編程校正Mplayer的色彩;
        (2)Mplayer正常模式不能在FramBuffer的中間顯示,帶-fs的全屏參數播放后,只能將播放位置移到中間,并不放大,修改播放顯示位置,讓它和Nplayer圖形界面的調用相符合;
        (3)編程實現播放時對鍵盤事件正?;?BR> (4)Mplayer采用的自帶的mp3lib浮點音頻解碼庫的解碼效率很低,在播放音頻時會很卡,通過采用使用定點運算的libmad音頻解碼庫替代原來的mp3lib庫進行音頻解碼;
        (5)使用Mplayer的-input選項,通過FIFO從GUI向后端程序傳遞控制信息。通過優化后,對Mplayer交叉編譯,移植到系統上可以流暢地播放mp3等音頻文件以及mpeg-1、mpeg-2、avi等視頻格式。

        linux操作系統文章專題:linux操作系統詳解(linux不再難懂)


        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 长宁县| 陆川县| 山阳县| 织金县| 甘南县| 江津市| 客服| 霍邱县| 布拖县| 紫金县| 奉节县| 贡觉县| 高州市| 商河县| 漳浦县| 营口市| 咸阳市| 那曲县| 高州市| 陈巴尔虎旗| 黄冈市| 双城市| 百色市| 敖汉旗| 南宁市| 丰台区| 五莲县| 舟曲县| 阿城市| 文成县| 大理市| 河间市| 九江县| 威信县| 沽源县| 灵丘县| 平山县| 惠安县| 延津县| 江山市| 武夷山市|