Como configurar o dispositivo padrão ALSA para o servidor de som pulseaudio no Docker?

2

Eu quero tocar som no Ubuntu 16.04 no Docker usando o PulseAudio e o ALSA. No entanto, gera um erro Device or resource busy . Eu acho que isso é porque o dispositivo padrão do ALSA não está definido para o servidor de som PulseAudio (Nota: é definido como o PulseAudio no host Ubuntu). Como posso alterar o dispositivo padrão para isso? Por exemplo, posso fazer isso criando ~/.asoundrc ou modificando /etc/pulse/client.conf ?

Etapas para reproduzir

$ # On the host Ubuntu...
$ aplay -L | head -n9
default
    Playback/recording through the PulseAudio sound server
null
    Discard all samples (playback) or generate zero samples (capture)
pulse
    PulseAudio Sound Server
sysdefault:CARD=PCH
    HDA Intel PCH, ALC295 Analog
    Default Audio Device
$ aplay /usr/share/sounds/alsa/Front_Center.wav 
Playing WAVE '/usr/share/sounds/alsa/Front_Center.wav' : Signed 16 bit Little Endian, Rate 48000 Hz, Mono
$ paplay /usr/share/sounds/alsa/Front_Center.wav  # Success
$ # On the Docker container...
$ sudo docker run -it --device /dev/snd ubuntu:16.04 /bin/bash
root@81af4bf99890:/# apt update
root@81af4bf99890:/# apt install alsa-base alsa-utils pulseaudio
root@81af4bf99890:/# aplay -L | head -n10
null
    Discard all samples (playback) or generate zero samples (capture)
pulse
    PulseAudio Sound Server
default:CARD=PCH
    HDA Intel PCH, ALC295 Analog
    Default Audio Device
sysdefault:CARD=PCH
    HDA Intel PCH, ALC295 Analog
    Default Audio Device
root@81af4bf99890:/# aplay /usr/share/sounds/alsa/Front_Center.wav 
ALSA lib pcm_dmix.c:1029:(snd_pcm_dmix_open) unable to open slave
aplay: main:722: audio open error: Device or resource busy
root@81af4bf99890:/# paplay /usr/share/sounds/alsa/Front_Center.wav 
Connection failure: Connection refused
pa_context_connect() failed: Connection refused

Ambiente

  • Anfitrião: Ubuntu 17.04
  • Docker: 17.09.0-ce

Notas adicionais

  • No meu ambiente, as imagens de Jess também não funcionam. Aqui está um log de exemplo.

    $ # When I play some sounds on host, 'jess/spotify' fails to play music.
    $ sudo docker run -it \
        -v /tmp/.X11-unix:/tmp/.X11-unix \
        -e DISPLAY=unix$DISPLAY \
        --device /dev/snd \
        --name spotify \
        jess/spotify
    Gtk-Message: Failed to load module "canberra-gtk-module"
    libGL error: MESA-LOADER: failed to retrieve device information
    libGL error: Version 4 or later of flush extension not found
    libGL error: failed to load driver: i915
    libGL error: failed to open drm device: No such file or directory
    libGL error: failed to load driver: i965
    [1115/043835.051841:ERROR:sandbox_linux.cc(344)] InitializeSandbox() called with multiple threads in process gpu-process.
    [1115/043840.945653:ERROR:web_plugin_impl.cc(38)] Widevine registration is not supported after context initialization
    
    (spotify:1): GLib-GIO-CRITICAL **: g_dbus_connection_send_message: assertion 'G_IS_DBUS_CONNECTION (connection)' failed
    ALSA lib pcm_dmix.c:1052:(snd_pcm_dmix_open) unable to open slave
    

    A última linha diz que há um erro relacionado ao ALSA. (Observe que jess/spotify pode reproduzir música quando não há outro software que reproduza som. Isso pode ocorrer porque o dispositivo de som não está ocupado nesse caso.)

  • Embora eu tenha respondido a essa pergunta, ainda quero uma solução mais sofisticada ou uma explicação detalhada do motivo pelo qual algumas opções são necessárias. Qualquer comentário seria apreciado. Obrigado.
por nekketsuuu 03.11.2017 / 12:45

1 resposta

1

Graças ao comentário deste do fsmunoz, posso reproduzir sons no contêiner usando pulseaudio, < strong> sem modificar qualquer arquivo de configuração. Os pontos são os seguintes:

E aqui está um exemplo prático:

$ sudo docker run -it \
    --device /dev/snd \
    -e PULSE_SERVER=unix:${XDG_RUNTIME_DIR}/pulse/native \
    -v ${XDG_RUNTIME_DIR}/pulse/native:${XDG_RUNTIME_DIR}/pulse/native \
    -v ~/.config/pulse/cookie:/root/.config/pulse/cookie \
    --group-add $(getent group audio | cut -d: -f3) \
    ubuntu:16.04 /bin/bash
root@9c9f7e0db4e3:/# apt update
root@9c9f7e0db4e3:/# apt install alsa-base alsa-utils pulseaudio
root@eed016c1fb61:/# aplay -L | head -n9
default
    Playback/recording through the PulseAudio sound server
null
    Discard all samples (playback) or generate zero samples (capture)
pulse
    PulseAudio Sound Server
sysdefault:CARD=PCH
    HDA Intel PCH, ALC295 Analog
    Default Audio Device
root@9c9f7e0db4e3:/# aplay /usr/share/sounds/alsa/Front_Center.wav 
Playing WAVE '/usr/share/sounds/alsa/Front_Center.wav' : Signed 16 bit Little Endian, Rate 48000 Hz, Mono
root@9c9f7e0db4e3:/# paplay /usr/share/sounds/alsa/Front_Center.wav  # Success!

Nota: Ainda assim, não sei por que o cookie é necessário. Sem o cookie, ocorreu um erro ALSA lib pulse.c:243:(pulse_connect) PulseAudio: Unable to connect: Access denied .

    
por nekketsuuu 15.11.2017 / 06:46