如何使用 PulseAudio 和 Multiseat 配置声音?

如何使用 PulseAudio 和 Multiseat 配置声音?

本着充分披露的精神,我刚刚发布了这个问题到 ubuntu 论坛,但我认为更多的人参与进来不会有什么坏处。

我有一个多座位设置,运行良好。热插拔输入设备按预期工作。我唯一无法解决的问题是获取每个座位的音频。

以下是我为使音频正常工作所做的尝试的总结:

  1. 根据用户登录的 $DISPLAY 动态配置 ~/.pulse/default.pa。

  2. 将 pulseaudio 作为系统范围的实例进行加载。

    • 无法使其工作。用户无法访问任何音频硬件。
  3. 使用 udev 规则在 ConsoleKit 中标记席位。请遵循此处的 udev 指南: http://www.freedesktop.org/wiki/Software/systemd/multiseat

    • 我不认为这会起作用,尽管 irc.freenode #pulseaudio 上的某个人“保证”它可以起作用

这些尝试都没有成功,这就是为什么我现在向社区寻求帮助。建议的方法很可能有效,只是我把其中的某些方面搞砸了,我不知道。这是我去更新 MultiseatX 页面以包含针对 Ubuntu 12.04 的说明之前需要的最后一块拼图。

我对这种情况的理解是:对 pulseaudio 的访问仅限于 ConsoleKit 标记的活动会话(有关 ACL 的内容)。CK 一次只能将一个会话标记为活动会话。这个简单的小事实让我相信解决方案应该涉及将 pulseaudio 作为系统范围的实例运行。每个用户都应该连接到脉冲服务器,并限制为所有硬件的子集。也许每个用户都通过 localhost 连接到脉冲服务器,我不知道。我确实知道,无论我尝试了什么,结果如何,我总是能够使用它sudo aplay -D plughw:0,0 /usr/share/sounds/alsa/Front_Center.wav在任何硬件上播放某些东西。

我正在拼命寻找救命稻草,现在只剩下最后几根头发可以拔了。请帮我解决这个问题,这样我们就可以共享财富了。任何需要的附加信息都可以根据您的要求提供。

答案1

我花了很多时间在网上研究、测试各种设置并与 Pulseaudio 开发人员交谈。最重要的是,在正常用户模式下运行 pulseaudio 将只允许 ConsoleKit 标记的活动会话访问音频硬件。由于当前 ConsoleKit 一次只能将一个会话标记为活动,这意味着我们必须运行系统范围的 pulseaudio 实例。优点:每个座位都可以有单独的音频。缺点:所有音频硬件都可供任何用户使用,并且可以随意操作。对于网吧或其他真正关注安全的公共场所来说,这不是理想的情况。在创建站点安全策略时请记住这一点。将 pavucontrol 执行限制为仅管理员可能是明智的做法。

与往常一样,备份所有默认配置文件。如果您在没有备份的情况下修改了配置,则可以使用 apt-get -d install pulseaudio 检索 pulseaudio 包。这将仅下载包(到 /var/cache/archives/apt),您可以提取内容以检索默认配置。请注意,client.conf 不包含在其中。

要将 pulseaudio 作为系统范围的守护进程运行,我们需要编辑一些文件。

1.)/etc/default/pulseaudio

    PULSEAUDIO_SYSTEM_START=1

2.)/etc/pulse/daemon.conf- 查看 man pulse-daemon.conf 以了解更多信息。

    daemonize = yes
    local-server-type = system

3.)/etc/pulse/client.conf

    autospawn = no

我们还需要将用户添加到脉冲访问组。

sudo usermod -a -G pulse-access <username>

现在所有用户都可以访问音频硬件了,我们需要选择每个用户将使用的硬件。这可以使用 pavucontrol 来完成。请注意,设置是按用户存储的,不会跟随座位。如果用户切换座位,您将需要重新选择所需的音频硬件。

关于 Pulseaudio 的附加评论

我曾希望有一个更优雅的解决方案来让每个座位的音频正常工作。在多座位中使用系统范围的 Pulseaudio 有很多缺点,并且在重新启动之间并不完全稳定。我曾尝试启动系统范围的实例并让用户实例通过 localhost 将其作为服务器连接到它。这似乎不起作用,因为当运行 pulseaudio --start 时,它会获取 daemon.conf。

关于ConsolKit

运行正常的每用户 pulseaudio 时,我们看到的问题是,一个席位可以访问硬件,而所有其他席位都有虚拟输出。这是因为 ConsoleKit 不完全了解席位。CK 将我们所有的席位视为席位 1 的会话,并且只能将一个会话标记为活动会话。通过运行 getfacl /dev/snd/* 可以看到这一事实。我突然想到,我们可能能够根据特定用户正在使用的 $DISPLAY 来编辑相应 /dev/snd/ 文件的 acl。这是我尚未探索的选项。请考虑通过探索这一假设并使用您的发现编辑文档来为多席位事业做出贡献。

多席位分支机构控制台套件GDM-2.3GDM-3.x确实存在,它应该提供自动多座位功能。

补充笔记

1.) 禁止用户加载模块 DISALLOW_MODULE_LOADING=1 也是明智之举。

2.)自动生成 = 否从我的示例文件中可以看出,这并不是完全必要的。它不会引起任何问题。

答案2

我对这种情况的理解是:对 pulseaudio 的访问仅限于 ConsoleKit 标记的活动会话(有关 ACL)。CK 一次只能将一个会话标记为活动会话。

有一个ConsoleKit 补丁添加多席位支持;这将允许它将所有活动席位报告为活动席位。这也许可以解决您的问题。它需要与显示管理器合作,并且有一个修补旧版本的 GDM添加了此支持。

我使用修改后的 ConsoleKit 和 GDM 包在 Natty (11.04) 中实现了多座席运行电力供应协议。我还没有从 Natty 升级——我花了很长时间才弄清楚如何让它工作,而且我担心 LightDM 无法与修补后的 ConsoleKit 一起工作。

编辑:我应该指出,Fedora 17 有一些令人印象深刻的多席位功能,其中一些将在 Quantal 中实现。他们有一个描述他们的方法的维基页面。Ubuntu 不能简单地复制 Fedora 的方法,因为这需要进行重大改变;Fedora 使用 systemd 和 GDM,而 Ubuntu 使用 upstart 和 LightDM。

答案3

我最近尝试解决 PulseAudio 和 Multiseat 的问题。由于没有完美的解决方案,我的解决方法是使用网络。

这个解决方案适合我的情况,因为我是最常在机器上的用户,并且我的座位是最常登录的。并且我的座位是左手配置的,没有其他人使用它。

在我的系统中~/.config/pulse/default.pa,我复制了系统配置/etc/pulse/default.pa并添加了以下行:

load-module module-native-protocol-tcp auth-anonymous=1 auth-ip-acl=127.0.0.1

在其他用户的 pulseaudio 设置中,添加一个隧道(如果需要,可以添加多个隧道),并附带以下内容:

load-module module-tunnel-sink server=127.0.0.1 sink=alsa_output.pci-0000_00_XX.X.iec958-stereo

将接收器名称更改为与您机器中的名称匹配。您可以决定配置一个更友好的名称 - 这意味着您应该在 pulseaudio 设置文件中进行配置 - 但我只是通过使用来查找给定的名称pacmd list-sinks

这不是一个优雅的解决方案,我可能会尝试在我的下一个装备中使用@Anthony 建议的系统范围的配置,但如果你有很多卡并且只想共享一个或几个接收器/源,这是一个更“外科手术”的解决方案。

相关内容