Как использовать звук alsa и / или snd_pcm_open в докере?
Я запускаю контейнер Ubuntu 12.04 Docker на хосте Ubuntu 16.04. У некоторого тестового кода есть упражнения snd_pcm_open / snd_pcm_close с типами потоков SND_PCM_STREAM_PLAYBACK и SND_PCM_STREAM_CAPTURE.
Мне не нужны какие-либо реальные звуковые / звуковые возможности, но просто получить 'snd_pcm_open', возвращающий 0 с допустимым дескриптором, тогда 'snd_pcm_close', чтобы вернуть 0 на том же дескрипторе, было бы достаточно для моих целей. Я не хочу изменять код, так как он уже получил некоторые не очень хорошие переключатели, зависящие от платформы, и я не сопровождающий.
Я использую простой код и компилирую его как 'g++ alsa_test.cpp -lasound'
#include <stdio.h>
#include <alsa/asoundlib.h>
int main() {
snd_pcm_t* handle;
snd_pcm_stream_t stream_type[]= {SND_PCM_STREAM_PLAYBACK, SND_PCM_STREAM_CAPTURE};
printf("\nstarting\n");
for (unsigned char i = 0; i < sizeof(stream_type) / sizeof(stream_type[0]); ++i) {
printf(">>>>>>>>\n\n");
int deviceResult = snd_pcm_open(&handle, "default" , stream_type[i], 0);
printf("\n%d open: %d\n", stream_type[i], deviceResult);
if (deviceResult >= 0) {
printf("attempting to close %d\n", stream_type[i]);
snd_pcm_drain(handle);
deviceResult = snd_pcm_close(handle);
printf("%d close: %d\n\n", stream_type[i], deviceResult);
}
printf("<<<<<<<<\n\n");
}
return 0;
}
Он отлично работает на хосте, но, несмотря на все разные попытки, snd_pcm_open возвращает -2 для обоих типов потоков в контейнере.
Я попытался установить 'libasound2.dev', но 'modinfo soundcore' пуст, а '/dev/snd' не существует.
Также попытался запустить контейнер с указанными ниже параметрами, даже если для такой простой цели это выглядит как массовое перебивание
--privileged --cap-add=ALL -v /dev:/dev -v /lib/modules:/lib/modules
После передачи этих дополнительных параметров в контейнер следующие команды генерируют одинаковые выходные данные как в хосте, так и в контейнере.
root@31142791f82d:/export# modinfo soundcore
filename: /lib/modules/4.4.0-59-generic/kernel/sound/soundcore.ko
alias: char-major-14-*
license: GPL
author: Alan Cox
description: Core sound module
srcversion: C941364F5CD0B525693B243
depends:
intree: Y
vermagic: 4.4.0-59-generic SMP mod_unload modversions
parm: preclaim_oss:int
root@31142791f82d:/export# ls -l /dev/snd/
total 0
drwxr-xr-x 2 root root 100 Feb 2 21:10 by-path
crw-rw----+ 1 root audio 116, 2 Feb 2 07:42 controlC0
crw-rw----+ 1 root audio 116, 7 Feb 2 07:42 controlC1
crw-rw----+ 1 root audio 116, 12 Feb 2 21:10 controlC2
crw-rw----+ 1 root audio 116, 6 Feb 2 07:42 hwC0D0
crw-rw----+ 1 root audio 116, 11 Feb 2 07:42 hwC1D0
crw-rw----+ 1 root audio 116, 3 Feb 2 07:42 pcmC0D3p
crw-rw----+ 1 root audio 116, 4 Feb 2 07:42 pcmC0D7p
crw-rw----+ 1 root audio 116, 5 Feb 2 07:42 pcmC0D8p
crw-rw----+ 1 root audio 116, 9 Feb 2 10:44 pcmC1D0c
crw-rw----+ 1 root audio 116, 8 Feb 2 07:42 pcmC1D0p
crw-rw----+ 1 root audio 116, 10 Feb 2 21:30 pcmC1D1p
crw-rw----+ 1 root audio 116, 14 Feb 2 21:10 pcmC2D0c
crw-rw----+ 1 root audio 116, 13 Feb 2 21:10 pcmC2D0p
crw-rw----+ 1 root audio 116, 1 Feb 2 07:42 seq
crw-rw----+ 1 root audio 116, 33 Feb 2 07:42 timer
Между прочим, у контейнера есть только пользователь root, поэтому права доступа также не должны быть проблемой.
Что было бы самым простым и наименее хакерским способом заставить это работать? Я бы предпочел избавиться от привилегированного режима и отображения dev/modules на контейнер, однако, эти контейнеры не доступны из внешнего мира и создаются / уничтожаются только для некоторых краткосрочных задач. Таким образом, безопасность не является серьезной проблемой.
Заранее спасибо.
1 ответ
Если вам на самом деле не нужно устройство для правильной работы, используйте null
устройство вместо default
,
Чтобы сделать null
плагин по умолчанию, поместите это в контейнер /etc/asound.conf
или в пользователя ~/.asoundrc
:
pcm.!default = null;