web-dev-qa-db-fra.com

Comment définir le périphérique par défaut d'ALSA sur le serveur de son pulseaudio sur Docker?

Je veux jouer du son sur Ubuntu 16.04 sur Docker en utilisant PulseAudio et ALSA. Cependant, il génère une erreur Device or resource busy. Je pense que cela est dû au fait que le périphérique par défaut d'ALSA n'est pas défini sur le serveur de son PulseAudio (Remarque: il est défini sur PulseAudio sur l'hôte Ubuntu). Comment puis-je changer le périphérique par défaut? Par exemple, puis-je le faire en créant ~/.asoundrc ou en modifiant /etc/Pulse/client.conf?

Étapes pour reproduire

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

Environnement

  • Hôte: Ubuntu 17.04
  • Docker: 17.09.0-ce

Notes complémentaires

  • Dans mon environnement, les images de Jess ne fonctionnent pas aussi. Voici un exemple de journal.

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

    La dernière ligne indique qu'il y a une erreur liée à ALSA. (Notez que jess/spotify peut lire de la musique quand aucun autre logiciel ne lit le son. Cela est peut-être dû au fait que le périphérique audio n'est pas occupé dans ce cas.)

  • Bien que je réponde moi-même à cette question, je souhaite toujours une solution plus sophistiquée ou une explication détaillée de la raison pour laquelle certaines options sont nécessaires. Tous les commentaires seraient appréciés. Je vous remercie.
2
nekketsuuu

Grâce à ce commentaire , je peux jouer des sons sur le conteneur en utilisant pulseaudio, sans modifier aucun fichier de configuration. Les points sont les suivants:

  • Définissez Pulse_SERVER afin de permettre à l’utilisateur du conteneur de connaître l’adresse du serveur.
  • Ajoutez le conteneur dans le groupe audio .
  • Partager pulseaudio's cookie .

Et voici un exemple de travail:

_$ 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!
_

Remarque: je ne sais toujours pas pourquoi le cookie est nécessaire. Sans le cookie, une erreur ALSA lib Pulse.c:243:(Pulse_connect) PulseAudio: Unable to connect: Access denied s'est produite.

2
nekketsuuu