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
?
$ # 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
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.)
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:
Pulse_SERVER
afin de permettre à l’utilisateur du conteneur de connaître l’adresse du serveur.audio
.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.