开发板:mini2440
操作系统:Linux2.4
IDE:Qt Creator
在做音乐播放器的过程中,移植MPlayer10rc2到mini2440开发板上,碰到MPlayer无法控制音量大小,使用0和9来控制音量都将导致播放的声音为0。以下为原因分析:
1,
当使用默认的OSS驱动播放的时候,提示:
Requested audio codec family [mp3] (afm=mp3lib) not available.音乐还是照常播放。当使用“volume 100”来设置音量时,无论设置的音量值是多少,都会提示如下:
Volume:0%
分析:目前还不知道是不是我的开发环境出了问题。
当使用ALSA驱动播放时,提示:
Could not open/initialize audio device -> no sound.音乐无法播放。
在开发板上查看到mini2440有配置ALSA驱动
ALSA device list: #0: S3C24XX_UDA134X (UDA134X)
但是当使用如下命令查看MPlayer配置的音频驱动情况,却是没有配置ALSA驱动
[root@FriendlyARM /]# mplayer -ao help MPlayer 1.0rc2-4.3.2 (C) 2000-2007 MPlayer Team CPU: ARM Available audio output drivers: oss OSS/ioctl audio output mpegpes DVB audio output v4l2 V4L2 MPEG Audio Decoder output null Null audio output pcm RAW PCM/WAVE file writer audio output
3,
最直接的办法是读写设备文件/dev/mixer来控制音量,代码如下:
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <unistd.h> #include <fcntl.h> #include <sys/ioctl.h> #include <sys/types.h> #include <sys/soundcard.h> int main(int argc, char* argv[]) { int set_volume = 0; int get_volume = 0; int fd = 0; int status = 0; fd = open("/dev/mixer", O_RDWR); if(fd == -1) { printf("open /dev/mixer error!\n"); close(fd); exit(1); } //get volume value about system volume if((argc == 2) && (!(strcmp("get_volume", argv[1])))) { status = ioctl(fd, SOUND_MIXER_READ_VOLUME, &get_volume); if(status == -1) { printf("get volume value from /dev/mixer error!\n"); exit(1); } get_volume = get_volume/257; //因为输出的值都是以257的倍数出现 printf("get_volume = %d\n", get_volume); close(fd); return 0; } //set volume value to system else if((argc == 3) && (!(strcmp("set_volume", argv[1]))) && (0<=atoi(argv[2])) && (atoi(argv[2])<=100)) { set_volume = atoi(argv[2]); status = ioctl(fd, SOUND_MIXER_WRITE_VOLUME, &set_volume); if(status == -1) { printf("write volume value to /dev/mixer error!\n"); exit(1); } close(fd); return 0; } else { printf("Usage:%s set_volume [0~100]\n",argv[0]); printf("Usage:%s get_volume\n", argv[0]); close(fd); exit(1); } }