从网上查找OSS接口的音量调节方法,调用的函数是:ioctl(fd,MIXER_READ(SOUND_MIXER_VOLUME),&volume); volume为一整形变量,似乎是只用其低两字节,低字节表示左声道,高字节表示右声道。但是测试后发现对我用的芯片PCM2706来说无法控制音量,后经反复查资料,在看一篇alsa与oss音量设置例程的文章的时候收到启发,链接如下:
http://blog.chinaunix.net/uid-20737871-id-1881236.html。
把条件音量的函数命令字换了一下,发现可以调节音量了,成功的设置方法是:ioctl(fd,MIXER_WRITE(SOUND_MIXER_PCM),&vol);
这次发现可以控制音量了,然后自己写了一个小程序来控制音量,使用方法为
~$./mixer 0x1010
高字节为右声道音量,低字节为左声道音量,程序源码如下,因为是测试用的写的比较粗糙,仅供参考。
调节音量的设备节点也可以改为“/dev/dsp”,当播放音乐时已经打开dsp的时候也可以不用另外在打开mixer了,dsp也支持mixer的相应控制参数。
#include
#include
#include
#include
#include
#include
#include
#include
#define DFT_SND_MIX "/dev/mixer"
int init_mixer(void)
{
int fd;
if ((fd = open(DFT_SND_MIX, O_RDWR)) < 0){
fprintf(stderr, "Error opening %s: %s
", DFT_SND_MIX, strerror(errno));
printf("the fd = %d
",fd);
return -1;
}
return fd;
}
int contrl_vol(int fd, int vol)
{
int volume, ret;
ret = ioctl(fd,MIXER_READ(SOUND_MIXER_PCM),&volume);
if (ret < 0){
perror("MIXER_READ(SOUND_MIXER_VOLUME)");
}
printf("initiatory volume is %x
", volume);
//vol += increment;
ret = ioctl(fd,MIXER_WRITE(SOUND_MIXER_PCM),&vol);
if (ret < 0){
perror("MIXER_WRITE(SOUND_MIXER_VOLUME)");
}
ret = ioctl(fd,MIXER_READ(SOUND_MIXER_PCM),&volume);
if (ret < 0){
perror("MIXER_READ(SOUND_MIXER_VOLUME)");
}
printf("write volume is %x, read the writed volume is %x
",vol, volume);
return 0;
}
int main(int argc, char *argv[])
{
int fd, vol;
fd = init_mixer();
vol = strtol(argv[1], NULL, 0);
contrl_vol(fd, vol);
return 0;
}