10

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

Playback open error: Device or resource busy

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

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

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

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

4

5 回答 5

3

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

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

于 2011-12-08T20:26:19.587 回答
2

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

(如果你弄乱了,或者如果你通过告诉应用程序直接使用硬件插件来绕过混音器,你可以为自己重新创建共享声卡~/.asoundrc问题。请注意,某些应用程序,如 JACK 将尝试直接使用硬件,如果没有被告知否则做。)

使用 PulseAudio,您仍然使用 ALSA 作为后端,您只是添加了一个带有混音器的层(以及许多您可能甚至不想知道的其他事情)。杰克会为你做同样的工作。

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

作为参考,请查看一些 .asoundrc 文档

于 2018-01-01T20:55:56.367 回答
1

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

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

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

于 2011-11-17T14:52:58.867 回答
1

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

于 2011-11-17T14:56:17.837 回答
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

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

于 2021-05-17T08:42:41.887 回答