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

10

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

Playback open error: Device or resource busy

通过查看这个示例的源代码,我可以说位于第882行的snd_pcm_open函数引发了这个错误。它发现设备正忙于另一个进程正在使用它。

我还尝试了反过来的方式——先启动示例,然后再尝试启动歌曲。在这种情况下,媒体播放器保持闲置状态,在进度条旁边显示“idle”(我正在使用Banshee)。 我假设snd_pcm_open获得了设备资源的独占权,使得其他进程无法使用它。

但我不想要那样。我想将声音播放到音频设备上,而不需要任何独占权限,这样PC中的其他进程就可以共享同一设备以输出音频数据。

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

6个回答

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

谢谢,我在我的媒体播放器设置中从ALSA切换到PulseAudio成功了! - 16851556

2
ALSA当时的问题是默认输出中没有插入混音器插件。在最近的ALSA版本中,dmix插件现在已经默认包含在输出路径中,因此不再出现这种情况。
如果您搞乱了`.asoundrc`文件,或者绕过混音器直接告诉应用程序直接使用硬件插件,则可以自己重新创建共享声卡的问题。请注意,一些应用程序(如JACK)如果未被告知否则会尝试直接使用硬件。
使用PulseAudio时,您仍然使用ALSA作为后端,只是添加了一个混音器层(以及大量其他您可能不想知道的东西)。JACK也会为您完成完全相同的工作。
现在,ALSA的dmix插件将为您完成此操作,因此您可以摆脱类似PulseAudios和JACKs这样的中间件,直到您真正需要它们提供的非基本声音系统功能为止。
有关参考,请查阅some .asoundrc documentation

1

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

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

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


不,我没有启用OSS兼容层,而且我也不想依赖它。我还检查了/proc/asound/devices,并在那里看到了设备列表(我可以通过编程获取该列表)。我也可以访问不同的播放设备。但这些都不是问题所在。我想知道是否可以以共享模式打开单个设备。 - MD Sayem Ahmed

1

0
我来到这个旧问题是因为这些天Pulseaudio有音频设备。在某些情况下的解决方案可能是
  • padsp - 一个包装命令,为被包装的程序提供一个虚假的OSS设备。这可能对某些应用程序有帮助,或者对使用OSS构建选项构建的sweep有帮助。
  • pasuspend - 使Pulseaudio在一段时间内释放音频设备,以便可以将其借给其他东西。这使我能够运行sweep声音编辑器,使用以下命令:
    pasuspender sweep &
    
    请注意,其他应用程序将无法使用声音设备,但音量控制仍然有效。如果没有这个选项,sweep会启动但无法播放或录制,出现Error opening ALSA device plughw:0,0: Device or resource busy错误。

目前来看,你的回答不够清晰。请[编辑]以增加更多细节,帮助他人理解如何解答问题。你可以在帮助中心找到更多关于如何撰写好回答的信息。 - Community

0
最近我在使用Audacious时遇到了这个问题,但是我最终通过Audacious解决了它。所以我想分享一下我的解决方法,以便能够帮助其他人解决类似的问题。
症状如下:
如果我打开Firefox并且有一个Youtube标签页(即使没有播放视频),那么当我尝试在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

错误已经消失了。因此,我认为一些声卡设备和访问路由是专门用于应用程序的,而另一些则不是,因此请尝试不同的选项。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接