gpt4 book ai didi

linux - 如何在 docker 中使用 alsa 声音和/或 snd_pcm_open?

转载 作者:太空宇宙 更新时间:2023-11-04 09:20:55 25 4
gpt4 key购买 nike

我在 Ubuntu 16.04 主机上运行 Ubuntu 12.04 Docker 容器。一些测试代码我用 SND_PCM_STREAM_PLAYBACK 和 SND_PCM_STREAM_CAPTURE 流类型练习了“snd_pcm_open”/“snd_pcm_close”操作。

我不需要任何实际的声音/音频功能,但只需让“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”用户,因此访问权限也不成问题。

让这项工作最简单、最简单的方法是什么?我宁愿摆脱特权模式和开发/模块映射到容器,但是,这些容器不能从外部世界访问,并且只为一些短期任务创建/销毁。因此,安全并不是一个大问题。

提前致谢。

最佳答案

如果您实际上不需要设备正常工作,请使用null 设备而不是default

要使 null 插件成为默认插件,请将其放入容器的 /etc/asound.conf,或放入用户的 ~/.asoundrc:

pcm.!default = null;

关于linux - 如何在 docker 中使用 alsa 声音和/或 snd_pcm_open?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42013102/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com