2017-02-02 25 views
0

Я запускаю контейнер 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 в контейнере, однако эти контейнеры не доступны из внешнего мира и только создаются/уничтожаются для некоторых непродолжительных задач. Таким образом, безопасность не является серьезной проблемой.

Заранее спасибо.

+0

Пробовали ли вы: 'Докер run' с флагом' --device/DEV/snd' –

+0

Да, я тоже пробовал это без везения. -v/dev:/dev еще более вовлекает, я полагаю, но не работает. –

+0

Можете ли вы поделиться выходом для 'strace -fe open./A.out' –

ответ

2

Если вам действительно не нужно, чтобы устройство работало правильно, используйте устройство null вместо default.

Чтобы сделать null плагин по умолчанию один, поместите это в контейнер-х /etc/asound.conf, или внутрь пользователя ~/.asoundrc:

pcm.!default = null; 

 Смежные вопросы

  • Нет связанных вопросов^_^