Как использовать звук 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;
Другие вопросы по тегам