mpd falha ao abrir o dispositivo ALSA no qual aplay é bem-sucedida

0

Estou tentando configurar um reprodutor de áudio Raspberry Pi / Raspbian wheezy usando o hardware de som onboard via plug-ins ALSA LADSPA para downmix estéreo e comprimir o áudio.

aplay, sox, mpg123, moc ( cd ~/.moc && cp /usr/share/doc/moc/examples/config.example.gz ./ && gunzip config.example.gz && mv config.example config ) trabalham com este "dispositivo" personalizado:

pi@raspberrypi ~ $ aplay -D mcl audiofile.wav
pi@raspberrypi ~ $ sox audiofile.wav -t alsa mcl
pi@raspberrypi ~ $ mpg123 -a mcl audiofile.mp3
pi@raspberrypi ~ $ speaker-test -t wav -c 2
pi@raspberrypi ~ $ speaker-test -t wav -c 2 -D mcl

Eu construí a versão atual do mpd a partir da fonte ( link ) seguindo este tutorial: link (precisa de dependências adicionais libboost-dev e libicu-dev )

pi@raspberrypi ~ $ mpc version
mpd version: 0.19.0
pi@raspberrypi ~ $ mpd --version
Music Player Daemon 0.19.8

mas ainda recebe o erro:

ALSA lib pcm.c:2217:(snd_pcm_open_noupdate) Unknown PCM mcl
Jan 25 10:23 : alsa_output: Failed to open "My ALSA Device" [alsa]: Failed to open ALSA device "mcl": No such file or directory
Jan 25 10:23 : output: Failed to open audio output
Jan 25 10:23 : client: [1] closed

Funciona bem ao usar o default device ( ladcomp também não funciona).

Portanto, há algo errado / ausente na minha configuração do ALSA que os outros jogadores estão adivinhando ou o mpd está fazendo errado.

Não há /etc/asound.conf, eu criei o seguinte ~ / .asoundrc usando várias fontes

pcm.!default {
    type hw
    card 0
    device 0
    } 

ctl.!default {
    type hw
    card 0
    device 0
}


###############


# compressor

pcm.ladcomp_limiter {
    type ladspa
    slave.pcm "plughw:0,0";
#    slave.pcm "default";
#    slave.pcm "makemono";

    path "/usr/lib/ladspa";
    plugins [{
        label fastLookaheadLimiter
        input {
            #InputGain(Db) -20 -> +20 ; Limit (db) -20 -> 0 ; Release time (s) 0.01 -> 2
            controls [ 20 0 0.8  ]
        }
    }]
}

pcm.ladcomp_compressor {
    type ladspa
    slave.pcm "ladcomp_limiter";
    path "/usr/lib/ladspa";
    plugins [{
        label dysonCompress
        input {
            #peak limit, release time, fast ratio, ratio
            controls [0 1 0.5 0.99]
        }
    }]
}

pcm.ladcomp {
    type plug
    slave.pcm "ladcomp_compressor";
}




### test mono downmix

#pcm.card0 {
#  type hw
#  card 0
#  device 0
#}

#ctl.card0 {
#  type hw
#  card 0
#  device 0
#}


#pcm.monocard {
#  slave.pcm card0
#  slave.channels 2
#  type plug
#}

#ctl.monocard {
#  type hw
#  card 0
#  device 0
#}

#pcm.!default monocard

####### didnt work, try this


pcm.mcl {
#pcm.makemono {
    type route
   # slave.pcm "plughw:0,0"
    slave.pcm "ladcomp"

    ttable {

    # Copy both input channels to output channel 0 (Left).
    0.0 1.0
    1.0 1.0
    # copy both input channels to output channel 1 (Right).
    0.1 1.0
    1.1 1.0
    }
}

#pcm.!default monocomplimiter


# EOF

pi @ raspberrypi ~ $ grep -v '^ $ \ | ^ \ s * #' /etc/mpd.conf

music_directory         "/var/lib/mpd/music"
playlist_directory              "/var/lib/mpd/"
db_file                 "/var/lib/mpd/tag_cache"
log_file                        "/var/lib/mpd/mpd.log"
pid_file                        "/var/run/mpd/pid"
state_file                      "/var/lib/mpd/state"
sticker_file                   "/var/lib/mpd/sticker.sql"
user                            "mpd"
bind_to_address         "any"
metadata_to_use "artist,album,title,track,name,comment"
input {
        plugin "curl"
}
audio_output {
        type            "alsa"
        name            "My ALSA Device"
        device          "mcl"
}
mixer_type                      "disabled"
filesystem_charset              "UTF-8"
id3v1_encoding                  "UTF-8"


pi@raspberrypi ~ $ uname -r
3.18.3+

Deixe-me saber se você precisar de mais informações.

Editar:

pi@raspberrypi ~ $ cat /proc/asound/cards
 0 [ALSA           ]: bcm2835 - bcm2835 ALSA
                      bcm2835 ALSA
pi@raspberrypi ~ $ cat /proc/asound/devices
  0: [ 0]   : control
  1:        : sequencer
 16: [ 0- 0]: digital audio playback
 17: [ 0- 1]: digital audio playback
 33:        : timer
pi@raspberrypi ~ $

Existe uma maneira de o ALSA criar dispositivos virtuais a partir da configuração aqui, onde o mpd poderia encontrá-lo (se ele pesquisar lá)?

Editar:

pi@raspberrypi ~ $ cat /proc/asound/pcm
00-00: bcm2835 ALSA : bcm2835 ALSA : playback 8
00-01: bcm2835 ALSA : bcm2835 IEC958/HDMI : playback 1
pi@raspberrypi ~ $ ls /proc/asound/dev
ls: cannot access /proc/asound/dev: No such file or directory
pi@raspberrypi ~ $ ls /dev/snd
controlC0  pcmC0D0p  pcmC0D1p  seq  timer
pi@raspberrypi ~ $ ls /proc/sound/
ls: cannot access /proc/sound/: No such file or directory
pi@raspberrypi ~ $ ls /proc/sound
ls: cannot access /proc/sound: No such file or directory
pi@raspberrypi ~ $ amixer
amixer: Mixer attach default error: Invalid argument
pi@raspberrypi ~ $ alsamixer
cannot open mixer: Invalid argument
pi@raspberrypi ~ $

Editar:

pi@raspberrypi ~ $ alsamixer -c 0

funciona.

    
por none 25.01.2015 / 11:05

1 resposta

3

A saída alsa de

mpd não encontra o dispositivo, porque realmente não está definido! mpd (o programa daemon) é executado como usuário mpd , que não sabe sobre o usuário "normal" pi s /home/pi/.asoundrc

Isso pode ser testado executando um player como usuário mpd :

pi@raspberrypi ~ $ sudo -u mpd speaker-test -t wav -c 2 -D mcl

Eu descobri em outro lugar que há, de fato, um arquivo de configuração alsa

pi@raspberrypi ~ $ sudo nano /usr/share/alsa/alsa.conf

#
#  ALSA library configuration file
#

# pre-load the configuration files

@hooks [
        {
                func load
                files [
                        {
                                @func concat
                                strings [
                                        { @func datadir }
                                        "/alsa.conf.d/"
                                ]
                        }
                        "/etc/asound.conf"
                        "~/.asoundrc"
                        "/home/pi/.asoundrc" # added !
                ]
                errors false
        }
]
...

ao qual eu adicionei a configuração local de pi .

E então funciona:

pi@raspberrypi ~ $ sudo -u mpd speaker-test -t wav -c 2 -D mcl

speaker-test 1.0.25

Playback device is mcl
Stream parameters are 48000Hz, S16_LE, 2 channels
WAV file(s)
Rate set to 48000Hz (requested 48000Hz)
Buffer size range from 256 to 16384
Period size range from 256 to 16384
Using max buffer size 16384
Periods = 4
was set period_size = 4096
was set buffer_size = 16384
 0 - Front Left
 1 - Front Right
Time per period = 2.944647
 0 - Front Left
^C

Também com o mpd

pi@raspberrypi ~ mpc play
    
por 25.01.2015 / 13:09