MPlayerボリューム制御の問題


開発ボード:mini 2440
オペレーティングシステム:Linux 2.4
IDE:Qt Creator
音楽プレーヤーを作る過程で、MPlayer 10 rc 2をmini 2440開発ボードに移植し、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.
音楽が再生できません.
開発ボードでmini 2440が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!
");         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!
");             exit(1);         }         get_volume = get_volume/257;    // 257         printf("get_volume = %d
", 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!
");             exit(1);         }         close(fd);         return 0;     }     else     {         printf("Usage:%s set_volume [0~100]
",argv[0]);         printf("Usage:%s get_volume
", argv[0]);         close(fd);         exit(1);     } }

第3の方法はテストを経て実行可能である