ARM-Linux:設(shè)備-mixer-linux系統(tǒng)聲音效果調(diào)節(jié)
系統(tǒng):arm板/Linux系統(tǒng)
內(nèi)核:2.6.7
設(shè)備:/dev/mixer
功能:linux系統(tǒng)聲音效果調(diào)節(jié)
文件名:xxx.c
編譯:gcc xxx.c -o mixerSet
終端執(zhí)行:./mixerSet [leftvalue] [rightvalue]
測(cè)試:無(wú)問(wèn)題
#include
#include
#include
#include
#include
#include
/* 用來(lái)存儲(chǔ)所有可用混音設(shè)備的名稱 */
const char *sound_device_names[] = SOUND_DEVICE_NAMES;
/* 混音設(shè)備所對(duì)應(yīng)的文件描述符 */
int fd;
/* 混音器信息對(duì)應(yīng)的位圖掩碼 */
int devmask, stereodevs;
char *name;
/* 顯示命令的使用方法及所有可用的混音設(shè)備 */
void usage()
{
int i;
fprintf(stderr, "usage: %s
" %s
"Where
for (i = 0 ; i < SOUND_MIXER_NRDEVICES ; i++)
if ((1 << i) & devmask) /* 只顯示有效的混音設(shè)備 */
fprintf(stderr, "%s ", sound_device_names[i]);
fprintf(stderr, "n");
exit(1);
}
int main(int argc, char *argv[])
{
int left, right, level; /* 增益設(shè)置 */
int status; /* 系統(tǒng)調(diào)用的返回值 */
int device; /* 選用的混音設(shè)備 */
char *dev; /* 混音設(shè)備的名稱 */
int i;
name = argv[0];
/* 以只讀方式打開(kāi)混音設(shè)備 */
fd = open("/dev/mixer", O_RDONLY);
if (fd == -1) {
perror("unable to open /dev/mixer");
exit(1);
}
/* 獲得所需要的信息 */
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 = argv[1];
/* 確定即將用到的混音設(shè)備 */
for (i = 0 ; i < SOUND_MIXER_NRDEVICES ; i++)
if (((1 << i) & devmask) && !strcmp(dev, sound_device_names[i]))break;
if (i == SOUND_MIXER_NRDEVICES) { /* 沒(méi)有找到匹配項(xiàng) */
fprintf(stderr, "%s is not a valid mixer devicen", dev);
usage();
}
/* 查找到有效的混音設(shè)備 */
device = i;
/* 獲取增益值 */
if (argc == 4) {
/* 左、右聲道均給定 */
left = atoi(argv[2]);
right = atoi(argv[3]);
} else {
/* 左、右聲道設(shè)為相等 */
left = atoi(argv[2]);
right = atoi(argv[2]);
}
/* 對(duì)非立體聲設(shè)備給出警告信息 */
if ((left != right) && !((1 << i) & stereodevs)) {
fprintf(stderr, "warning: %s is not a stereo devicen", dev);
}
/* 將兩個(gè)聲道的值合到同一變量中 */
level = (right << 8) + left;
/* 設(shè)置增益 */
status = ioctl(fd, MIXER_WRITE(device), &level);
if (status == -1) {
perror("MIXER_WRITE ioctl failed");
exit(1);
}
/* 獲得從驅(qū)動(dòng)返回的左右聲道的增益 */
left = level & 0xff;
right = (level & 0xff00) >> 8;
/* 顯示實(shí)際設(shè)置的增益 */
fprintf(stderr, "%s gain set to %d%% / %d%%n", dev, left, right);
/* 關(guān)閉混音設(shè)備 */
close(fd);
return 0;
}
注:
首先不帶參數(shù)執(zhí)行編譯出來(lái)的程序,得到系統(tǒng)中有效的混音設(shè)備,我使用的是飛凌OK210,里面已經(jīng)有的設(shè)備有:speakerpcm2 igain ogain phout 共五個(gè)。
speaker:測(cè)試無(wú)效果
pcm2:測(cè)試可以調(diào)節(jié)音量大小,在40%時(shí)已經(jīng)聽(tīng)不見(jiàn)聲音了,在100%時(shí)聲音最大
igain:測(cè)試無(wú)效果
ogain:測(cè)試可以調(diào)節(jié)音量大小,在40%時(shí)已經(jīng)聽(tīng)不見(jiàn)聲音了,在100%時(shí)聲音最大,但相對(duì)于pcm2設(shè)備來(lái)說(shuō),效果較差。
phout:測(cè)試無(wú)效果