ALSA:以共享模式打开PCM设备

问题描述 投票:7回答:4

我想使用ALSA将一些音频数据回放到PCM设备。作为一个例子,我已经下载了this sample example并在我的电脑上运行它。当没有其他进程正在使用声卡时,它工作正常。但是当其他一些进程使用音频设备(即媒体播放器播放歌曲)并显示以下错误时,它不播放任何内容 -

Playback open error: Device or resource busy

看一下这个例子的源代码,我可以说第882行的snd_pcm_open函数抛出了这个错误。它找到设备忙,因为另一个进程当前正在使用它。

我也尝试了相反的方式 - 首先开始这个例子然后尝试开始一首歌。在这种情况下,媒体播放器保持空闲状态,在进度条旁边显示“空闲”(我正在使用Banshee)。我假设snd_pcm_open获得了设备资源的专有权,因此没有其他进程可以使用它。

但我不希望这样。我想在不需要任何专有权的情况下向音频设备播放声音,以便PC中的其他进程可以共享同一设备以输出音频数据。

我怎样才能做到这一点?如何打开PCM设备以便其他进程也可以共享同一设备?

c++ c linux alsa
4个回答
3
投票

我找不到在多个进程之间共享设备的方法。我尝试使用dmix插件使用.asoundrc配置文件组合多个播放流,但由于某种原因不起作用。我试图使用我的声卡的default设备,但这也不起作用。根据ALSA邮件列表中的建议,我尝试使用default:CARD=x作为snd_pcm_open函数的设备名称参数打开默认设备,这导致我的系统中出现device not found错误。显然没有办法做到这一点(如果有人能找到方法,请更新此答案)。

而不是使用ALSA,我使用PulseAudio接下来解决了我的问题。


1
投票

检查文件/ dev / sndstat(如果启用了OSS兼容层)。它应列出与系统上的ALSA设备对应的音频设备。此外,您还可以检查/ proc / asound / devices以获取每个设备的功能。

通过为snd_pcm_open()选择不同的名称,尝试访问不同的播放设备(在您的示例中,它是“plughw:0,0”打开):这来自here

plughw:卡设备。两者都具有作为参数的卡(ID字符串或数字索引),设备和可选择的要访问的硬件的子设备。


1
投票

也许你可以使用杰克:http://jackaudio.org/


1
投票

当时ALSA的问题在于缺少在默认输出中插入的混音器插件。在ALSA的最新版本中,这不再发生,因为默认情况下dmix插件现在包含在输出路径中。

(如果你弄乱~/.asoundrc,或者你通过告诉应用程序直接使用硬件插件绕过调音台,你可以为自己重新创建共享声卡故障。请注意,如果没有告知应用程序,如JACK将尝试直接使用硬件不这样做。)

使用PulseAudio,您仍然使用ALSA作为后端,您只需添加一个带调音台的图层(以及您可能根本不想知道的其他一些内容)。杰克会为你完成同样的工作。

如今,ALSA的dmix插件将为您完成,因此您可以摆脱PulseAudios和JACK等中间件,直到您真正需要它们提供的非基本音响系统功能。

作为参考,查找some .asoundrc documentation

© www.soinside.com 2019 - 2024. All rights reserved.