OSS介面音量調節
阿新 • • 發佈:2019-02-17
從網上查詢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; }