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

时间:2011-11-17 14:25:34

标签: c++ c linux alsa

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

Playback open error: Device or resource busy

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

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

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

我该怎么做?如何打开PCM设备以便其他进程也可以共享同一设备?

5 个答案:

答案 0 :(得分:3)

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

我没有使用ALSA,而是使用了PulseAudio,这解决了我的问题。

答案 1 :(得分:1)

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

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

  

<强> plughw:卡,设备即可。两者都具有卡的参数(ID字符串或数字   索引),设备和可选的硬件子设备。

答案 2 :(得分:1)

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

答案 3 :(得分:1)

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

(如果您遇到~/.asoundrc,或者通过告诉应用程序直接使用硬件插件绕过调音台,您可以为自己重新创建共享声卡麻烦。请注意一些应用程序如果没有被告知,JACK会尝试直接使用硬件。)

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

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

供参考,请查看some .asoundrc documentation

答案 4 :(得分:0)

我最近在 Audacious 遇到了这个问题,我设法通过 Audacious 解决了这个问题,所以我想我会分享我所做的,以防它对其他人的问题有所了解。

症状:

如果我在打开 youtube 标签的情况下打开 Firefox(甚至没有运行),那么当我尝试在 Audacious 中播放音乐时,我不能。我收到此错误:

alsa snd_pcm_open device busy

我还遇到了一些与设置 PCM 比特率等有关的其他错误。

Audacious 被配置为使用:

PCM Device: hw:0,0 - Generic Analog 
Mixer Device: default - Default mixer dev 
Mixer Element: Master

我将其更改为:

PCM Device: sysdefault: CARD=Generic - HD-Audio Generic, Generic Analog Default Audio Device
Mixer Device: hw: CARD=Generic - HD-Audio Generic Direct control device
Mixer Element: Master

错误消失了。所以我认为有些声卡设备和访问路径是应用程序专有的,有些不是,所以尝试不同的选项。