Linux音訊程式設計指南(1)

2021-05-27 19:32:22 字數 2529 閱讀 1841

什麼是音訊?

取樣和量化。取樣就是每隔一定時間就讀一次聲音頻號的幅度,而量化則是將取樣得到的聲音頻號幅度轉換為數字值.

1 取樣頻率

是指將模擬聲音波形進行數位化時,每秒鐘抽取聲波幅度樣本的次數。取樣頻率的選擇應該遵循奈奎斯特(harrynyquist)取樣理論:如果對某一模擬訊號進行取樣,則取樣後可還原的最高訊號頻率只有取樣頻率的一半.正常人聽覺的頻率範圍大約在20hz~20khz之間,根據奈奎斯特取樣理論,為了保證聲音不失真,取樣頻率應該在40khz左右。常用的音訊取樣頻率有8khz、11.025khz、22.05khz、16khz、37.8khz、44.1khz、48khz等.

2量化位數

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

3聲道數

它有單聲道和雙聲道之分。雙聲道又稱為立體聲,在硬體中有兩條線路,音質和音色都要優於單聲道.

通過音訊驅動操作硬體:

linux下的應用程式無法直接對音效卡這類硬體裝置進行操作,而是必須通過核心提供的驅動程式才能完成,最早出現在linux上的音訊程式設計介面是oss(open soundsystem),alsa(advanced linux soundarchitecture)它是在linux下進行音訊程式設計時另乙個可供選擇的音效卡驅動程式。alsa除了像oss那樣提供了一組核心驅動程式模組之外,還專門為簡化應用程式的編寫提供了相應的函式庫,與oss提供的基於ioctl的原始程式設計介面相比,alsa函式庫使用起來要更加方便一些.alsa和oss最大的不同之處在於alsa是由志願者維護的自由專案,而oss則是由公司提供的商業產品,因此在對硬體的適應程度上oss要優於alsa,它能夠支援的音效卡種類更多。alsa雖然不及oss運用得廣泛,但卻具有更加友好的程式設計介面,並且完全相容於oss,對應用程式設計師來講無疑是乙個更佳的選擇。

如何對音訊程式設計?

無論是oss還是alsa,都是以核心驅動程式的形式執行在linux核心空間中的,應用程式要想訪問音效卡這一硬體裝置,必須借助於linux核心所提供的系統呼叫(systemcall)。從程式設計師的角度來說,對音效卡的操作在很大程度上等同於對磁碟檔案的操作:首先使用open系統呼叫建立起與硬體間的聯絡,此時返回的檔案描述符將作為隨後操作的標識;接著使用read系統呼叫從裝置接收資料,或者使用write系統呼叫向裝置寫入資料,而其它所有不符合讀/寫這一基本模式的操作都可以由ioctl系統呼叫來完成;最後,使用close系統呼叫告訴linux核心不會再對該裝置做進一步的處理。

int open(const char *pathname, int flags, int mode);
引數pathname是將要被開啟的裝置檔案的名稱,對於音效卡來講一般是/dev/dsp。引數flags用來指明應該以什麼方式開啟裝置檔案,它可以是o_rdonly、o_wronly或者o_rdwr,分別表示以唯讀、只寫或者讀寫的方式開啟裝置檔案;引數mode通常是可選的,它只有在指定的裝置檔案不存在時才會用到,指明新建立的檔案應該具有怎樣的許可權。

int read(int fd, char *buf, size_t count);

fd是裝置檔案的識別符號,它是通過之前的open系統呼叫獲得的;引數buf是指向緩衝區的字元指標,它用來儲存從音效卡獲得的資料;

引數count則用來限定從音效卡獲得的最大位元組數。如果read系統呼叫成功完成,它將返回從音效卡實際讀取的位元組數,通常情況會比count的值要小一些;

如果read系統呼叫失敗,它將返回-1,同時還會設定全域性變數errno,來指明是什麼原因導致了錯誤的發生。

size_t write(int fd, const char *buf, size_t count);
引數buf儲存著向音效卡寫入的資料;引數count則用來限定向音效卡寫入的最大位元組數。

如果write系統呼叫成功完成,它將返回向音效卡實際寫入的位元組數;如果read系統呼叫失敗,它將返回-1,同時還會設定全域性變數errno,來指明是什麼原因導致了錯誤的發生。無論是read還是write,一旦呼叫之後linux核心就會阻塞當前應用程式,直到資料成功地從音效卡讀出或者寫入為止。

int ioctl(int fd, int request, ...);

凡是對裝置檔案的操作不符合讀/寫基本模式的,都是通過ioctl來完成的,它可以影響裝置的行為,或者返回裝置的狀態

int close(int fd);

音訊硬體物件:

音效卡中的dsp裝置實際上包含兩個組成部分:在以唯讀方式開啟時,能夠使用a/d轉換器進行聲音的輸入;而在以只寫方式開啟時,則能夠使用d/a轉換器進行聲音的輸出。嚴格說來,linux下的應用程式要麼以唯讀方式開啟/dev/dsp輸入聲音,要麼以只寫方式開啟/dev/dsp輸出聲音,但事實上某些音效卡驅動程式仍允許以讀寫的方式開啟/dev/dsp,以便同時進行聲音的輸入和輸出,這對於某些應用場合(如ip**)來講是非常關鍵的。

對於linux應用程式設計師來講,音訊程式設計介面實際上就是一組音訊裝置檔案,通過它們可以從音效卡讀取資料,或者向音效卡寫入資料,並且能夠對音效卡進行控制,設定取樣頻率和聲道數目等等。

Linux音訊程式設計指南 二

四 應用框架在linux下進行音訊程式設計時,重點在於如何正確地操作音效卡驅動程式所提供的各種裝置檔案,由於涉及到的概念和因素比較多,所以遵循乙個通用的框架無疑將有助於簡化應用程式的設計。4.1 dsp程式設計 對音效卡進行程式設計時首先要做的是開啟與之對應的硬體裝置,這是借助於open系統呼叫來完...

SICS程式設計指南 1 序言

牛雖然吹得震天響,但是真到要開始面對眾多行家裡手的時候,我不得不說 作為sics的作者,雖然我清楚它的能力,卻也非常清楚它的一些缺陷 嚴格來說,有些缺陷甚至非常嚴重 雖然這麼多年來,我一直在對sics的體系和功能進行完善,但是依然有一些問題沒有得到很好的解決。對於技術方面的問題,我通常都是力求完美和...

Apple Pay程式設計指南 1 簡介

要發起支付,程式需要建立乙個支付請求。此請求包括購買的服務和貨物的小計,以及任何額外的稅費 運費或折扣。將此請求傳遞給付款授權控制器 payment authorization view controller 該控制器將向使用者顯示該請求並提示使用者輸入所需的任何資訊,例如發貨或賬單位址。當使用者與...