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 <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <sys/ioctl.h>
#include <linux/soundcard.h>

#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;
	
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值