Linux音頻編程(三)混音器介紹


 

 

一、介紹

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

原文鏈接:

https://github.com/tinyalsa/tinyalsa/blob/67b9210d344c34e8d1aa0cfe638abce71c5221ca/include/tinyalsa/mixer.h

2、mixer.c

原文鏈接:

https://github.com/tinyalsa/tinyalsa/blob/8752514eaf1e530e9fa8db4dda51ce80b775f001/src/mixer.c


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM