Linux音訊程式設計指南 二

2021-06-02 00:36:29 字數 2993 閱讀 3928

四、應用框架在linux下進行音訊程式設計時,重點在於如何正確地操作音效卡驅動程式所提供的各種裝置檔案,由於涉及到的概念和因素比較多,所以遵循乙個通用的框架無疑將有助於簡化應用程式的設計。

4.1 dsp程式設計

對音效卡進行程式設計時首先要做的是開啟與之對應的硬體裝置,這是借助於open系統呼叫來完成的,並且一般情況下使用的是/dev/dsp檔案。採用何種模式對音效卡進行操作也必須在開啟裝置時指定,對於不支援全雙工的音效卡來說,應該使用唯讀或者只寫的方式開啟,只有那些支援全雙工的音效卡,才能以讀寫的方式開啟,並且還要依賴於驅動程式的具體實現。linux允許應用程式多次開啟或者關閉與音效卡對應的裝置檔案,從而能夠很方便地在放音狀態和錄音狀態之間進行切換,建議在進行音訊程式設計時只要有可能就盡量使用唯讀或者只寫的方式開啟裝置檔案,因為這樣不僅能夠充分利用音效卡的硬體資源,而且還有利於驅動程式的優化。下面的**示範了如何以只寫方式開啟音效卡進行放音(playback)操作:

int handle = open("/dev/dsp", o_wronly);

if (handle == -1) {

perror("open /dev/dsp");

return -1;

執行在linux核心中的音效卡驅動程式專門維護了乙個緩衝區,其大小會影響到放音和錄音時的效果,使用ioctl系統呼叫可以對它的尺寸進行恰當的設定。調節驅動程式中緩衝區大小的操作不是必須的,如果沒有特殊的要求,一般採用預設的緩衝區大小也就可以了。但需要注意的是,緩衝區大小的設定通常應緊跟在裝置檔案開啟之後,這是因為對音效卡的其它操作有可能會導致驅動程式無法再修改其緩衝區的大小。下面的**示範了怎樣設定音效卡驅動程式中的核心緩衝區的大小:

int setting = 0xnnnnssss;

int result = ioctl(handle, sndctl_dsp_setfragment, &setting);

if (result == -1) {

perror("ioctl buffer size");

return -1;

// 檢查設定值的正確性

在設定緩衝區大小時,引數setting實際上由兩部分組成,其低16位標明緩衝區的尺寸,相應的計算公式為buffer_size = 2^ssss,即若引數setting低16位的值為16,那麼相應的緩衝區的大小會被設定為65536位元組。引數setting的高16位則用來標明分片(fragment)的最大序號,它的取值範圍從2一直到0x7fff,其中0x7fff表示沒有任何限制。

接下來要做的是設定音效卡工作時的聲道(channel)數目,根據硬體裝置和驅動程式的具體情況,可以將其設定為0(單聲道,mono)或者1(立體聲,stereo)。下面的**示範了應該怎樣設定聲道數目:

int channels = 0; // 0=mono 1=stereo

int result = ioctl(handle, sndctl_dsp_stereo, &channels);

if ( result == -1 ) {

perror("ioctl channel number");

return -1;

if (channels != 0) {

// 只支援立體聲

取樣格式和取樣頻率是在進行音訊程式設計時需要考慮的另乙個問題,音效卡支援的所有取樣格式可以在標頭檔案soundcard.h中找到,而通過ioctl系統呼叫則可以很方便地更改當前所使用的取樣格式。下面的**示範了如何設定音效卡的取樣格式:

int format = afmt_u8;

int result = ioctl(handle, sndctl_dsp_setfmt, &format);

if ( result == -1 ) {

perror("ioctl sample format");

return -1;

// 檢查設定值的正確性

音效卡取樣頻率的設定也非常容易,只需在呼叫ioctl時將第二個引數的值設定為sndctl_dsp_speed,同時在第三個引數中指定取樣頻率的數值就行了。對於大多數音效卡來說,其支援的取樣頻率範圍一般為5khz到44.1khz或者48khz,但並不意味著該範圍內的所有頻率都會被硬體支援,在linux下進行音訊程式設計時最常用到的幾種取樣頻率是11025hz、16000hz、22050hz、32000hz和44100hz。下面的**示範了如何設定音效卡的取樣頻率:

int rate = 22050;

int result = ioctl(handle, sndctl_dsp_speed, &rate);

if ( result == -1 ) {

perror("ioctl sample format");

return -1;

// 檢查設定值的正確性

4.2 mixer程式設計

音效卡上的混音器由多個混音通道組成,它們可以通過驅動程式提供的裝置檔案/dev/mixer進行程式設計。對混音器的操作是通過ioctl系統呼叫來完成的,並且所有控制命令都由sound_mixer或者mixer開頭,表1列出了常用的幾個混音器控制命令:

名 稱 作 用

sound_mixer_volume 主音量調節

sound_mixer_bass 低音控制

sound_mixer_treble 高音控制

sound_mixer_synth fm合成器

sound_mixer_pcm 主d/a轉換器

sound_mixer_speaker pc喇叭

sound_mixer_line 音訊線輸入

sound_mixer_mic 麥克風輸入

sound_mixer_cd cd輸入

sound_mixer_imix 回放音量

sound_mixer_altpcm 從d/a 轉換器

sound_mixer_reclev 錄音音量

sound_mixer_igain 輸入增益

sound_mixer_ogain 輸出增益

sound_mixer_line1 音效卡的第1輸入

sound_mixer_line2 音效卡的第2輸入

sound_mixer_line3 音效卡的第3輸入

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

什麼是音訊?取樣和量化。取樣就是每隔一定時間就讀一次聲音頻號的幅度,而量化則是將取樣得到的聲音頻號幅度轉換為數字值.1 取樣頻率 是指將模擬聲音波形進行數位化時,每秒鐘抽取聲波幅度樣本的次數。取樣頻率的選擇應該遵循奈奎斯特 harrynyquist 取樣理論 如果對某一模擬訊號進行取樣,則取樣後可還...

《Linux核心程式設計指南》心得之二

1.執行中的程式只有中斷和系統呼叫可以打斷,而系統呼叫只是特殊的中斷.2.linux中沒有將執行緒與程序在記憶體上進行區分.3.可以用sysctl介面修改系統任務的數量max threads.4.由於對稱多處理 p 被支援,原來用於登記當前執行任務的全域性變數struct task struct c...

Xerces C DOM程式設計指南(二)

xercesdomparser 構造xercesdomparser物件 為了用xerces c 解析xml檔案,利用dom,您可以建立xercesdomparser類的乙個例項。下面的例子顯示了利用xercesdomparser建立乙個例項所需要的 include include include i...