DM6446的音訊編解碼及播放實現

helloxchen發表於2010-10-27
摘要: DM6446核心處理器整合了ARM核心與C64x+ DSP核心,提高了系統整合度和整個系統的運算速度,更加適合實時狀態下的音訊訊號編解碼處理並實現語音播放。本文主要介紹了音訊處理應用程式的構成,著重講述了音訊編解碼及播放過程。
  關鍵詞:達芬奇技術;DM6446;音訊編解碼
  
  1基於DaVinci技術的音訊編解碼綜述:
  達芬奇(DaVinci)技術是一種專門針對數字音影片應用、基於訊號處理的解決方案,能為音影片裝置製造商提供整合處理器、軟體、工具等支援,以簡化設計程式,加速產品創新。
  由於大量的音影片編解碼工作需要一個強勁的DSP處理器作為支撐,所以在本文提出的解決方案中採用了TMS320C64x+ DSP處理器,它是TMS320C6000系列DSP處理器中效能最為優異的定點DSP核。因為其基於第二代先進超長指令字(Very-Long-Instruction-Word,VLIW)結構,能夠很好滿足現場音訊編解碼處理和播放的需求。
  2 OSS(開放原始碼軟體)驅動簡介
  OSS為多種Unix系統(或Unix相容的作業系統)提供音效卡和其他聲音裝置的驅動。使用OSS應用程式介面(API)的應用程式在移植到不同的Unix系統(或與Unix相容的系統)之前只需要重新編譯,而不必重寫程式碼。OSS支援的主要裝置檔案中有些是和音效卡擁有的裝置如數字聲音裝置(Digitized Voice Device)、混合裝置(mixer)、合成器(synthesizer)等相對應。
  2.1 /dev/mixer
  混合器裝置檔案和音效卡中的混合器相對應,OSS驅動支援在一個系統中存在多個混合器,不同的混合器被命名為/dev/mixer0、/dev/mixer1等,而裝置檔案/dev/mixer是某個裝置檔案的符號連結(通常是第一個混合器,/dev/mixer0)。
  2.2 /dev/sndstat
  該裝置檔案不同於其他聲音裝置,它產生可被讀懂的診斷資訊。此裝置列印出所有被OSS檢測到的埠和裝置資訊。執行命令“cat /dev/sndstat”將會顯示裝置配置的有用資訊。
  2.3/dev/dsp和/dev/audio
  這些裝置是數字音訊應用的主要裝置。任何寫入這個裝置檔案的資料都會透過音效卡中的DAC/PCM DSP裝置播放出來。而從此裝置檔案中讀出的資料就是從當前輸入裝置(預設輸入是麥克風)錄下的音訊資料。
  /dev/dsp和/dev/audio裝置非常相似。不同在於,/dev/audio在預設情況下使用對數μ律編碼,而/dev/dsp使用8位無符號線性編碼。μ律編碼會把採集的12位或16位資料轉換成8位資料。在經過資料轉換後,/dev/dsp和/dev/audio對資料的處理是相同的。與裝置/dev/mixer相似,OSS同樣支援在一個系統中存在多個dsp和audio裝置。
  3 OSS應用程式設計設計
  下面主要講解程式中關於OSS驅動控制程式設計方法。
  開啟裝置檔案時使用標誌位O_WRONLY來指示該裝置以只寫的方式開啟。除了標誌位O_WRONLY外,裝置還支援以O_RDONLY(只讀)和O_RDWR(可讀可寫)方式開啟。如下圖所示為開啟音訊裝置程式碼:
  #define SOUND_DEVICE“/dev/dsp”
  soundFd = (SOUND_DEVICE, O_WRONLY);
  設定的引數有資料格式、聲道格式和取樣率。
  3.1取樣率配置:
  取樣率是音訊播放的重要引數。OSS的API允許設定取樣率為1Hz至2GHz中的任何一個頻率,但是實際應用中只有有限的幾個取樣率被用到。下圖是配置音訊取樣率的程式碼示意:
  SNDCTL_DSP_SPEED用於指示ioctl函式對裝置檔案/dev/dsp的取樣率進行配置。
  3.2聲道格式設定:
  程式中將聲道格式設定為雙聲道立體聲。OSS中預設模式為單聲道,而最多支援16個聲道。聲道格式配置程式碼示意如下圖所示:
  SNDCTL_DSP_CHANNELS指示函式ioctl對裝置檔案/dev/dsp的聲道數進行配置。
  3.3採集與播放設定:
  採集與播放我們透過read與write函式完成。函式中第一個參數列示裝置標識,第二個參數列示快取地址,第三個地址表示地址長度。如下圖所示:
write(soundFd, decodebuffer, BUF_SIZE);
  read(soundFd, encodebuffer, BUF_SIZE);
  4語音編解碼實現
  語音模組需要先透過OSS驅動對語音訊號進行採集,之後放到共享快取中交給DSP做語音壓縮,收到的資料解壓後在透過OSS驅動播放出來。
  4.1語音編碼
  語音編碼模組收到了採集進來語音資料後,送到編碼快取中對其進行編碼,再在送到傳輸模組將編碼後的資料傳送出去,處理流程如下圖所示:①語音模組首先設定兩個全域性函式--編碼快取和解碼快取,使其可以被傳輸模組直接使用,作為語音模組與傳輸模組之間的資料交流通道;②使用Codec Engine的Engine_open()來建立音訊編碼演算法引擎,返回一個控制程式碼,所有使用相同Engine的模組執行緒都需要單獨的控制程式碼,來確定執行緒的安全;③使用speechEncodeAlgCreate()建立編碼演算法,使用SPHENC_create()裡的靜態引數來建立“g.711enc”語音編碼器;④使用Memory_contigAlloc()函式為編碼快取與原始音訊資料快取分配一段連續的記憶體空間;⑤使用SPHENC_process()函式呼叫G..711演算法對資料進行編碼,而後送到傳輸模組,完成語音編碼任務。
  4.2語音解碼
  語音模組收到傳輸模組傳來的編碼資料後,先將其解碼而後播放出來。解碼流程如下圖所示:①語音模組首先設定兩個全域性函式--編碼快取和解碼快取,使其可以被傳輸模組直接使用,作為語音模組與傳輸模組之間的資料交流通道;②使用Codec Engine的Engine_open()來建立音訊編碼演算法引擎,返回一個控制程式碼,所有使用相同Engine的模組執行緒都需要單獨的控制程式碼,來確定執行緒的安全;③使用speechDecodeAlgCreate()建立解碼演算法,這包括:a.使用SPHDEC_create()裡的靜態引數來建立“g.711dec”語音解碼器;b.使用SPHDEC_control()和XDM_GETSTATUS來設定動態的語音解碼引數,查詢編解碼緩衝區大小;④使用Memory_contigAlloc()函式為解碼快取分配一段連續的記憶體空間;⑤使用SPHDEC_process()函式呼叫G.711演算法對資料進行解碼,完成解碼任務,而後播放。
  小結。DM6446平臺應用達芬奇雙核技術,能夠快速的完成對實時傳輸要求很高的音訊資料處理任務,本設計可以較有效的解決語音抖動和播放延遲的問題,實現音訊編解碼和播放,為在該平臺上開發網路語音通話服務奠定基礎,也為在該平臺上進行其他多媒體應用提供了參考。
[@more@]

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/24790158/viewspace-1040466/,如需轉載,請註明出處,否則將追究法律責任。

相關文章