OSS接口音量调节

从网上查找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\n", DFT_SND_MIX, strerror(errno));  

  	printf("the fd = %d\n",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\n", 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\n",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;
	
}

你可能感兴趣的:(Linux系统开发,Linux应用)