1. 程式人生 > >OSS介面音量調節

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