mixer 程式設計
音效卡上的混音器由多個混音通道組成,它們可以通過驅動程式提供的裝置檔案/dev/mixer 進行程式設計。 對混音器的操作一般都通過 ioctl()系統呼叫來完成, 所有控制命令都以 sound_mixer 或者 mixer 開頭
(1)sound_mixer_read 巨集。
在進行混音器程式設計時,可以使用 sound_mixer_read 巨集來讀取混音通道的增益大小,例如,如下**可以獲得麥克風的輸入增益:
ioctl
(fd,
sound_mixer_read
(sound_mixer_mic)
,&vol)
;
對於只有乙個混音通道的單聲道裝置來說,返回的增益大小儲存在低位位元組中。而對於支援多個混音通道的雙聲道裝置來說,返回的增益大小實際上包括兩個部分,分別代表左、右兩個聲道的值,其中低位位元組儲存左聲道的音量,而高位位元組則儲存右聲道的音量。下面的**可以從返回值中依次提取左右聲道的增益大小:
int left, right;
left = vol &
0xff
;right =
(vol &
0xff00
)>>
8;
(2)sound_mixer_write 巨集。
如果想設定混音通道的增益大小,則可以通過 sound_mixer_write 巨集來實現,例如下面的語句可以用來設定麥克風的輸入增益:
vol =
(right <<8)
+ left;
ioctl
(fd,
sound_mixer_write
(sound_mixer_mic)
,&vol)
;
(3)查詢 mixer 資訊。
音效卡驅動程式提供了多個 ioctl()系統呼叫來獲得混音器的資訊,它們通常返回乙個整型的位掩碼,其中每一位分別代表乙個特定的混音通道,如果相應的位為 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"
);
如下**可用來檢查 cd 輸入是否是乙個有效的錄音源:
ioctl
(fd, sound_mixer_read_recmask,
&recmask);if
(recmask & sound_mixer_cd)
printf
("the cd input can be a recording source"
);
大多數音效卡提供了多個錄音源,通過 sound_mixer_read_recsrc 可以查詢出當前正在使用的錄音源,同一時刻可使用兩個或兩個以上的錄音源,具體由音效卡硬體本身決定。相應地,使用sound_mixer_write_recsrc 可以設定音效卡當前使用的錄音源,如下**可以將 cd 輸入作為音效卡的錄音源使用。
devmask = sound_mixer_cd;
ioctl
(fd, sound_mixer_write_recsrc,
&devmask)
;
此外,所有的混音通道都有單聲道和雙聲道的區別,如果需要知道哪些混音通道提供了對立體聲的支援,可以通過 sound_mixer_read_stereodevs 來獲得。
**清單 17.4 的程式實現了利用/dev/mixer 介面對混音器進行程式設計的過程,該程式可對各種混音通道的增益進行調節。
oss mixer 介面應用程式設計範例
#include
#include
#include
#include
#include
#include
/* 用來儲存所有可用混音裝置的名稱 */
const
char
*sound_device_names[
]= sound_device_names;
int fd;
/* 混音裝置所對應的檔案描述符 */
int devmask, stereodevs;
/* 混音器資訊對應的 bit 掩碼 */
char
*name;
/* 顯示命令的使用方法及所有可用的混音裝置 */
void
usage()
intmain
(int argc,
char
*ar**)
/* 獲得所需要的資訊 */
status =
ioctl
(fd, sound_mixer_read_devmask,
&devmask);if
(status ==-1
)perror
("sound_mixer_read_devmask ioctl failed");
status =
ioctl
(fd, sound_mixer_read_stereodevs,
&stereodevs);if
(status ==-1
)perror
("sound_mixer_read_stereodevs ioctl failed");
/* 檢查使用者輸入 */
if(argc !=
3&& argc !=4)
usage()
;/* 儲存使用者輸入的混音器名稱 */
dev = ar**[1]
;/* 確定即將用到的混音裝置 */
for(i =
0; i < sound_mixer_nrdevices; i++)if
(((1
<< i)
&devmask)&&!
strcmp
(dev,
sound_device_names[i]))
break;if
(i == sound_mixer_nrdevices)
/* 查詢到有效的混音裝置 */
device = i;
/* 獲取增益值 */
if(argc ==4)
else
/* 對非立體聲裝置給出警告資訊 */if(
(left != right)&&!
((1<< i)
&stereodevs)
)/* 將兩個聲道的值合到同一變數中 */
level =
(right <<8)
+ left;
/* 設定增益 */
status =
ioctl
(fd,
mixer_write
(device)
,&level);if
(status ==-1
)/* 獲得從驅動返回的左右聲道的增益 */
left = level &
0xff
; right =
(level &
0xff00
)>>8;
/* 顯示實際設定的增益 */
fprintf
(stderr
,"%s gain set to %d%% / %d%%\n"
, dev, left,
right)
;/* 關閉混音裝置 */
close
(fd)
;return0;
}編 譯 上 述 程 序 為 可 執 行 文 件 mixer , 執 行 .
/mixer
>
>或.
/mixer
>可設定增益,
device 可以是 vol、 pcm、 speaker、
line、mic、cd、igain、line1、phin、video。
驅動篇 字元裝置驅動綜合例項(一)(摘錄)
1.按鍵的裝置驅動 在嵌入式系統中,按鍵的硬體原理比較簡單,通過乙個上拉電阻將處理器的外部中斷 或 gpio 引腳拉高,電阻的另一端連線按鈕並接地即可實現。如圖 12.1 所示,當按鈕被按下時,eint10 ein13 eint14 eint15 上將產生低電平,這個低電平將中斷 cpu 圖中的 c...
第十章 音訊裝置驅動程式移植
10.1 音訊裝置介面 10.2 linux音訊涉筆驅動 oss驅動 10.3 linux音訊裝置驅動 alsa驅動 10.4 音訊裝置應用程式 10.5 音訊裝置驅動移植 1.在mach mini2440.c中新增標頭檔案 include 10.5.1 2.在mach mini2440.c中新增u...
Linux 驅動篇 字元驅動裝置01(框架篇)
定義乙個file operations結構體型別的變數 並填充owner函式 open函式 write函式 static int drvledopen struct inode inode,struct file file static ssize t drvledwrite struct file...