it-swarm.com.de

Wie stelle ich das ALSA-Standardgerät auf den pulseaudio-Soundserver in Docker ein?

Ich möchte unter Ubuntu 16.04 auf Docker mit PulseAudio und ALSA Sound abspielen. Es wird jedoch ein Fehler Device or resource busy ausgegeben. Ich denke, das liegt daran, dass das Standardgerät von ALSA nicht auf den PulseAudio-Soundserver eingestellt ist (Hinweis: Es ist auf den PulseAudio auf dem Host-Ubuntu eingestellt). Wie kann ich das Standardgerät darauf umstellen? Kann ich dazu beispielsweise ~/.asoundrc erstellen oder /etc/Pulse/client.conf ändern?

Schritte zum Reproduzieren

$ # 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
[email protected]:/# apt update
[email protected]:/# apt install alsa-base alsa-utils pulseaudio
[email protected]:/# 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
[email protected]:/# 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
[email protected]:/# paplay /usr/share/sounds/alsa/Front_Center.wav 
Connection failure: Connection refused
pa_context_connect() failed: Connection refused

Umgebung

  • Host: Ubuntu 17.04
  • Hafenarbeiter: 17.09.0-ce

Zusätzliche Bemerkungen

  • In meiner Umgebung funktioniert Jess 'Bilder auch nicht. Hier ist ein Beispielprotokoll.

    $ # 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
    

    In der letzten Zeile steht, dass ein Fehler in Bezug auf ALSA vorliegt. (Beachten Sie, dass jess/spotify Musik abspielen kann, wenn es keine andere Software gibt, die Ton wiedergibt. Dies kann daran liegen, dass das Audiogerät in einem solchen Fall nicht ausgelastet ist.)

  • Obwohl ich diese Frage selbst beantwortet habe, möchte ich immer noch eine differenziertere Lösung oder eine ausführliche Erklärung, warum einige Optionen benötigt werden. Über Kommentare würde ich mich freuen. Danke.
2
nekketsuuu

Dank fsmunozs diesem Kommentar kann ich mit pulseaudio Sounds auf dem Container abspielen , ohne Konfigurationsdateien zu ändern. Die Punkte sind die folgenden:

Und hier ist ein funktionierendes Beispiel:

_$ 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
[email protected]:/# apt update
[email protected]:/# apt install alsa-base alsa-utils pulseaudio
[email protected]:/# 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
[email protected]:/# 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
[email protected]:/# paplay /usr/share/sounds/alsa/Front_Center.wav  # Success!
_

Hinweis: Ich weiß immer noch nicht, warum der Cookie benötigt wird. Ohne das Cookie ist ein Fehler ALSA lib Pulse.c:243:(Pulse_connect) PulseAudio: Unable to connect: Access denied aufgetreten.

2
nekketsuuu