MPlayer音量控制问题

开发板: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%
分析:目前还不知道是不是我的开发环境出了问题。

2,

当使用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

分析:该问题或许是在配置MPlayer的时候没有加入ALSA驱动。解决办法是重新配置,编译,移植MPlayer。

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

第3种办法经过测试可行

你可能感兴趣的:(linux,音乐,qt,mplayer,音量控制)