2017-02-02 17 views
0

我在Ubuntu 16.04主机上运行Ubuntu 12.04 Docker容器。一些测试代码使用了SND_PCM_STREAM_PLAYBACK和SND_PCM_STREAM_CAPTURE流类型的练习'snd_pcm_open'/'snd_pcm_close'操作。如何在Docker中使用alsa声音和/或snd_pcm_open?

我不需要任何实际的声音/音频功能,只是让'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

这些额外的参数到容器后,下面的命令产生两个输出相同主机和容器。

[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; 
相关问题