OSS接口音量调节

本文介绍了一种通过OSS接口实现音量调节的方法。针对特定芯片PCM2706无法正常工作的问题,作者通过调整ioctl函数中的命令字实现了音量控制。文中提供了一个简单的C语言程序示例,演示了如何读取和设置音量值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

从网上查找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;
	
}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值