通过程序调madplay音量问题

通过程序调madplay音量问题
程序如下,运行后,音量还是一样不变,请问怎样才能使通过程序使音量变小?谢谢
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <linux/soundcard.h>
main()
{
int MIX_FD;
int iLeft = 20;
int iRight = 20;
int iLevel;
iLevel = (iRight << 8) + iLeft;
MIX_FD= open("/dev/mixer", O_WRONLY);
if (MIX_FD == -1) {
perror("Error:open /dev/mixer error");
exit(1);
}
if (ioctl(MIX_FD, MIXER_WRITE(SOUND_MIXER_VOLUME), &iLevel) == -1) { perror("Error:MIXER_WRITE ioctl failed");
exit(1);
}
if (ioctl(MIX_FD, MIXER_READ(SOUND_MIXER_VOLUME), &iLevel) == -1) { perror("Error:MIXER_WRITE ioctl failed");
exit(1);
}
close(MIX_FD);
}
.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
火星500计划声卡的第3输入
表1 混音器命令
对声卡的输入增益和输出增益进行调节是混音器的一个主要作用,目前大部分声卡采用的是8位或16位的增益控制器,但作为程式员来讲并不必关心这些,因为声卡驱动程式会负责将他们变换成百分比的形式,也就是说无论是输入增益还是输出增益,其取值范围都是从0到100。在进行混音器编程时,能使用SOUND_MIXER_READ宏来读取混音通道的增益大小,例如在获取麦克风的输入增益时,能使用如下的代码:
int vol;ioctl(fd, SOUND_MIXER_READ(SOUND_MIXER_MIC), &vol);printf("Mic gain is at %d %%\n", vol);数值模拟
对于只有一个混音通道的单声道设备来说,返回的增益大小保存在低位字节中。而对于支持多个混音通道的双声道设备来说,返回的增益大小实际上包括两个部分,分别代表左、右两个声道的值,其中低位字节保存左声道的音量,而高位字节则保存右声道的音量。下面的代码能从返回值中依次提取左右声道的增益大小:
int left, right;left = vol & 0xff;right = (vol & 0xff00) >> 8;printf("Left gain is %d %%, Right gain is %d %%\n", left, right);
类似地,如果想设置混音通道的增益大小,则能通过SOUND_MIXER_WRITE宏来实现,此时遵循的原则和获取增益值时的原则基本相同,例如下面的语句能用来设置麦克风的输入增益:vol = (right ioctl(fd, SOUND_MIXER_WRITE(SOUND_MIXER_MIC), &vol);
在编写实用的音频程式时,混音器是在涉及到兼容性时需要重点考虑的一个对象,这是因为不同的声卡所提供的混音器资源是有所差别的。声卡驱动程式提供了多个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");
如果进一步还想知道其是否是个有效的录音源,则能使用如下语句:
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_DEVMASK, &devmask);
此外,所有的混音通道都有单声道和双声道的差别,如果需要知道哪些混音通道提供了对立体声的支持,能通过SOUND_MIXER_READ_STEREODEVS来获得。

本文发布于:2024-09-22 05:23:48,感谢您对本站的认可!

本文链接:https://www.17tex.com/xueshu/202218.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:增益   声卡   混音器   混音   通道   输入
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议