Linux音訊程式設計(三)混音器介紹

2022-08-30 03:27:12 字數 2800 閱讀 4539

一、介紹

1、mixer:用來控制多個輸入、輸出的音量,也控制輸入(microphone,line-in,cd)之間的切換,可以將多個訊號組合或者疊加在一起。音效卡上的混音器由多個混音通道組成,它們可以通過音效卡驅動程式提供的裝置檔案/dev/mixer進行程式設計(對混音器進行操作的軟體介面),

混音器主要是

對音效卡的輸入增益和輸出增益進行調節

。2、混音器的操作不符合典型的讀/寫操作模式,除了open和close系統呼叫,

大部分通過ioctl系統呼叫來完成的。與/dev/dsp不同,/dev/mixer允許多個應用程式同時訪問,並且混音器的設定值會一直保持到對應的裝置檔案被關閉為止。linux上的音效卡驅動程式大多都支援將混音器的ioctl操作直接應用到聲音裝置上,也就是說如果已經開啟了/dev /dsp,那麼就不用再開啟/dev/mixer來對混音器進行操作,而是可以直接用開啟/dev/dsp時得到的檔案識別符號來設定混音器。

二、mixer程式設計

1、使用ioctl系統呼叫的

控制命令由sound_mixer或者mixer開頭,以下

常用的幾個混音器控制命令:

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 輸入

2、(1)在進行混音器程式設計時,可以使用 sound_mixer_read巨集來讀取混音通道的增益大小,如下:

int vol;  

ioctl(fd, sound_mixer_read(sound_mixer_mic), &vol);  

printf("mic gain is at %d %%\n", vol);  

對於只有乙個混音通道的單聲道裝置來說,返回的增益大小儲存在低位位元組中。

(2)支援多個混音通道的雙聲道裝置來說,返回的增益大小實際上包括兩個部分,分別代表左、右兩個聲道的值,其中低位位元組儲存左聲道的音量,而高位位元組則儲存右聲道的音量。下面的**可以從返回值中依次提取左右聲道的增益大小:

int left, right;  

left = vol & 0xff;  

right = (vol & 0xff00) >> 8;  

printf("left gain is %d %%, right gain is %d %%\n",left, right);  

(3)設定混音通道的增益大小,則可以通過sound_mixer_write巨集來實現,此時遵循的原則與獲取增益值時的原則基本相同,設定輸入增益如下

:vol = (right << 8) + left;  

ioctl(fd, sound_mixer_write(sound_mixer_mic), &vol);  

(4)音效卡驅動程式提供了多個 ioctl系統呼叫來獲得混音器的資訊,返回乙個整型的位掩碼(bitmask)中每一位分別代表乙個特定的混音通道,如果相應的位為1,則說明與之對應的混音通道是可用的。例如通過sound_mixer_read_devmask返回的位掩碼,可以查詢出能夠被音效卡支援的每乙個混音通道,而通過sound_mixer_read_recmas返回的位掩碼,則可以查詢出能夠被當作錄音源的每乙個通道。下面的**可以用來檢查cd輸入是否是 乙個有效的混音通道:

ioctl(fd, sound_mixer_read_devmask, &devmask);  

if (devmask & sound_mixer_cd)   

printf("the cd input is supported");

(5)其是否是乙個有效的錄音源,如下:

ioctl(fd, sound_mixer_read_recmask, &recmask);  

if (recmask & sound_mixer_cd)   

printf("the cd input can be a recording source");  

(6)目前大多數音效卡提供多個錄音源,通過sound_mixer_read_recsrc可以查詢出當前正在使用的錄音源,同一時刻能夠使用幾個錄音源是由音效卡硬體決定的。類似地,使用sound_mixer_write_recsrc可以設定音效卡當前使用的錄音源,例如下面的**可以將cd輸入作為音效卡的錄音源使用:

devmask = sound_mixer_cd;  

ioctl(fd, sound_mixer_write_devmask, &devmask);

(7)所有的混音通道都有單聲道和雙聲道的區別,如果需要知道哪些混音通道提供了對立體聲的支援,可以通過sound_mixer_read_stereodevs來獲得。

三、參考:

1、mixer.h

2、mixer.c

混音指南 第三章 學習混音

現在有兩種處理eq的方式 掃頻,揪出來乙個不好的頻段,壓下去 想象一下你需要的聲音,直接通過eq做出來 誠實地說,第一種是我用的。第一種就是碰運氣式的做法,做出什麼樣的聲音都是天時地利人和。第二種人有自己的混音觀念,知道自己想要什麼樣的聲音,並實現。我們可以不斷地對作品進行評價,找到問題所在,如 吊...

Linux音訊程式設計指南 二

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

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

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