Я запускаю контейнер Docker Ubuntu 12.04 на хосте Ubuntu 16.04. В некоторых тестовых кодах я выполняю операции 'snd_pcm_open'/'snd_pcm_close' с типами SND_PCM_STREAM_PLAYBACK и SND_PCM_STREAM_CAPTURE.Как использовать звук alsa и/или snd_pcm_open в докере?
Мне не нужны какие-либо реальные возможности звука/звука, но просто получаю 'snd_pcm_open' return 0 с допустимым дескриптором, тогда 'snd_pcm_close' для возврата 0 на том же дескрипторе будет достаточно хорошим для моих целей. Я не хочу изменять код, поскольку у него уже есть некоторые не очень приятные переключатели, зависящие от платформы, и я не сторонник.
Я использую простой код и компилировать его как «г ++ 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
После этих дополнительных параметров в контейнере, следующие команды генерируют один и тот же вывод, как в хоста и контейнера.
[email protected]:/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
[email protected]:/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 в контейнере, однако эти контейнеры не доступны из внешнего мира и только создаются/уничтожаются для некоторых непродолжительных задач. Таким образом, безопасность не является серьезной проблемой.
Заранее спасибо.
Пробовали ли вы: 'Докер run' с флагом' --device/DEV/snd' –
Да, я тоже пробовал это без везения. -v/dev:/dev еще более вовлекает, я полагаю, но не работает. –
Можете ли вы поделиться выходом для 'strace -fe open./A.out' –