DSP

OSS接口音量调节

2019-07-13 18:41发布

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