【问题标题】:ALSA: open a PCM device in shared modeALSA:以共享模式打开 PCM 设备
【发布时间】:2011-12-31 09:45:57
【问题描述】:

我想使用 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


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢,在我的媒体播放器设置中从 ALSA 切换到 PulseAudio 有效!
    【解决方案2】:

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

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

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

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

    如需参考,请查看some .asoundrc documentation

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

      • 不,我没有启用 OSS 兼容层,我也不想依赖它。我还检查了 /proc/asound/devices 并在那里看到了设备列表(尽管我可以通过编程方式获取该列表)。我还可以访问不同的播放设备。但这些都不是真正的问题。我想知道我是否可以在共享模式下打开单个设备。
      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

        我最近在使用 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
        

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

        【讨论】:

          猜你喜欢
          • 2016-06-13
          • 2018-01-24
          • 1970-01-01
          • 2011-05-27
          • 2016-05-09
          • 2023-03-06
          • 2012-01-03
          • 1970-01-01
          • 2019-04-27
          相关资源
          最近更新 更多