歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Linux音頻驅動簡述

一、數字音頻

音頻信號是一種連續變化的模擬信號,但計算機只能處理和記錄二進制的數字信號,由自然音源得到的音頻信號必須經過一定的變換,成為數字音頻信號之後,才能送到計算機中作進一步的處理。

數字音頻系統通過將聲波的波型轉換成一系列二進制數據,來實現對原始聲音的重現,實現這一步驟的設備常被稱為模/數轉換器(A/D)。A/D轉換器以每秒鐘上萬次的速率對聲波進行采樣,每個采樣點都記錄下了原始模擬聲波在某一時刻的狀態,通常稱之為樣本(sample),而每一秒鐘所采樣的數目則稱為采樣頻率,通過將一串連續的樣本連接起來,就可以在計算機中描述一段聲音了。對於采樣過程中的每一個樣本來說,數字音頻系統會分配一定存儲位來記錄聲波的振幅,一般稱之為采樣分辨率或者采樣精度,采樣精度越高,聲音還原時就會越細膩。

數字音頻涉及到的概念非常多,對於在Linux下進行音頻編程的程序員來說,最重要的是理解聲音數字化的兩個關鍵步驟:采樣和量化。采樣就是每隔一定時間就讀一次聲音信號的幅度,而量化則是將采樣得到的聲音信號幅度轉換為數字值,從本質上講,采樣是時間上的數字化,而量化則是幅度上的數字化。

基於mini2440的UDA1341音頻驅動架構分析 http://www.linuxidc.com/Linux/2012-10/73066.htm

Linux 2.6.32系統中基於dm6467平台ASOC架構的音頻驅動 http://www.linuxidc.com/Linux/2011-06/37176.htm

Linux音頻驅動之三:PCM設備的創建 http://www.linuxidc.com/Linux/2011-04/34319.htm

Linux音頻驅動之二:聲卡的創建 http://www.linuxidc.com/Linux/2011-03/33941.htm

Linux音頻驅動之一:ALSA架構簡介 http://www.linuxidc.com/Linux/2011-03/33736.htm

下面介紹幾個在進行音頻編程時經常需要用到的技術指標

采樣頻率

采樣頻率是指將模擬聲音波形進行數字化時,每秒鐘抽取聲波幅度樣本的次數。采樣頻率的選擇應該遵循奈奎斯特(Harry Nyquist)采樣理論:如果對某一模擬信號進行采樣,則采樣後可還原的最高信號頻率只有采樣頻率的一半,或者說只要采樣頻率高於輸入信號最高頻率的兩倍,就能從采樣信號系列重構原始信號。正常人聽覺的頻率范圍大約在20Hz~20kHz之間,根據奈奎斯特采樣理論,為了保證聲音不失真,采樣頻率應該在40kHz左右。常用的音頻采樣頻率有8kHz、11.025kHz、22.05kHz、16kHz、37.8kHz、44.1kHz、48kHz等,如果采用更高的采樣頻率,還可以達到DVD的音質。

量化位數

量化位數是對模擬音頻信號的幅度進行數字化,它決定了模擬信號數字化以後的動態范圍,常用的有8位、12位和16位。量化位越高,信號的動態范圍越大,數字化後的音頻信號就越可能接近原始信號,但所需要的存貯空間也越大。

聲道數

聲道數是反映音頻數字化質量的另一個重要因素,它有單聲道和雙聲道之分。雙聲道又稱為立體聲,在硬件中有兩條線路,音質和音色都要優於單聲道,但數字化後占據的存儲空間的大小要比單聲道多一倍。

二、聲卡驅動

出於對安全性方面的考慮,Linux下的應用程序無法直接對聲卡這類硬件設備進行操作,而是必須通過內核提供的驅動程序才能完成。在Linux上進行音頻編程的本質就是要借助於驅動程序,來完成對聲卡的各種操作。對硬件的控制涉及到寄存器中各個比特位的操作,通常這是與設備直接相關並且對時序的要求非常嚴格,如果這些工作都交由應用程序員來負責,那麼對聲卡的編程將變得異常復雜而困難起來,驅動程序的作用正是要屏蔽硬件的這些底層細節,從而簡化應用程序的編寫。

目前Linux下常用的聲卡驅動程序主要有兩種:OSS和ALSA。

ALSA和OSS最大的不同之處在於ALSA是由志願者維護的自由項目,而OSS則是由公司提供的商業產品,因此在對硬件的適應程度上OSS要優於ALSA,它能夠支持的聲卡種類更多。ALSA雖然不及OSS運用得廣泛,但卻具有更加友好的編程接口,並且完全兼容於OSS,對應用程序員來講無疑是一個更佳的選擇。

三、Linux  OSS音頻設備驅動

3.1 OSS驅動的組成

OSS標准中有2個最基本的音頻設備:mixer(混音器)和DSP(數字信號處理器)。

在聲卡的硬件電路中,mixer是一個很重要的組成部分,它的作用是將多個信號組合或者疊加在一起,對於不同的聲卡來說,其混音器的作用可能各不相同。OSS驅動中,/dev/mixer設備文件是應用程序對mixer進行操作的軟件接口。

混音器電路通常由兩個部分組成:輸入混音器(input mixer)和輸出混音器(output mixer)。輸入混音器負責從多個不同的信號源接收模擬信號,這些信號源有時也被稱為混音通道或者混音設備。模擬信號通過增益控制器和由軟件控制的音量調節器後,在不同的混音通道中進行級別(level)調制,然後被送到輸入混音器中進行聲音的合成。混音器上的電子開關可以控制哪些通道中有信號與混音器相連,有些聲卡只允許連接一個混音通道作為錄音的音源,而有些聲卡則允許對混音通道做任意的連接。經過輸入混音器處理後的信號仍然為模擬信號,它們將被送到A/D轉換器進行數字化處理。

輸出混音器的工作原理與輸入混音器類似,同樣也有多個信號源與混音器相連,並且事先都經過了增益調節。當輸出混音器對所有的模擬信號進行了混合之後,通常還會有一個總控增益調節器來控制輸出聲音的大小,此外還有一些音調控制器來調節輸出聲音的音調。經過輸出混音器處理後的信號也是模擬信號,它們最終會被送給喇叭或者其它的模擬輸出設備。對混音器的編程包括如何設置增益控制器的級別,以及怎樣在不同的音源間進行切換,這些操作通常來講是不連續的,而且不會像錄音或者放音那樣需要占用大量的計算機資源。由於混音器的操作不符合典型的讀/寫操作模式,因此除了 open()和close()兩個系統調用之外,大部分的操作都是通過ioctl()系統調用來完成的。與/dev/dsp不同,/dev/mixer允許多個應用程序同時訪問,並且混音器的設置值會一直保持到對應的設備文件被關閉為止。

DSP也稱為編解碼器,實現錄音(錄音)和放音(播放),其對應的設備文件是/dev/dsp或/dev/sound/dsp。OSS聲卡驅動程序提供的 /dev/dsp是用於數字采樣和數字錄音的設備文件,向該設備寫數據即意味著激活聲卡上的D/A轉換器進行放音,而向該設備讀數據則意味著激活聲卡上的 A/D轉換器進行錄音。

在從DSP設備讀取數據時,從聲卡輸入的模擬信號經過A/D轉換器變成數字采樣後的樣本,保存在聲卡驅動程序的內核緩沖區中,當應用程序通過 read()系統調用從聲卡讀取數據時,保存在內核緩沖區中的數字采樣結果將被復制到應用程序所指定的用戶緩沖區中。需要指出的是,聲卡采樣頻率是由內核中的驅動程序所決定的,而不取決於應用程序從聲卡讀取數據的速度。如果應用程序讀取數據的速度過慢,以致低於聲卡的采樣頻率,那麼多余的數據將會被丟棄(即overflow);如果讀取數據的速度過快,以致高於聲卡的采樣頻率,那麼聲卡驅動程序將會阻塞那些請求數據的應用程序,直到新的數據到來為止。

在向DSP設備寫入數據時,數字信號會經過D/A轉換器變成模擬信號,然後產生出聲音。應用程序寫入數據的速度應該至少等於聲卡的采樣頻率,過慢會產生聲音暫停或者停頓的現象(即underflow)。如果用戶寫入過快的話,它會被內核中的聲卡驅動程序阻塞,直到硬件有能力處理新的數據為止。

與其它設備有所不同,聲卡通常不需要支持非阻塞(non-blocking)的I/O操作。即便內核OSS驅動提供了非阻塞的I/O支持,用戶空間也不宜采用。

無論是從聲卡讀取數據,或是向聲卡寫入數據,事實上都具有特定的格式(format),如無符號8位、單聲道、8KHz采樣率,如果默認值無法達到要求,可以通過ioctl()系統調用來改變它們。通常說來,在應用程序中打開設備文件/dev/dsp之後,接下去就應該為其設置恰當的格式,然後才能從聲卡讀取或者寫入數據。

更多詳情見請繼續閱讀下一頁的精彩內容: http://www.linuxidc.com/Linux/2014-06/103123p2.htm

Copyright © Linux教程網 All Rights Reserved