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

本着充分披露的精神,我刚刚将这个问题发布到ubuntu论坛,但我认为更多关于它的人不会受到伤害。

我有一个多座位设置工作得很好。 热插拔输入设备按预期工作等。 我仍然无法解决的唯一问题是为每个座位获取音频。

以下是我尝试使音频工作的总结:

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

    • 有关详细信息,请参阅此pastebin 。
  2. 将pulseaudio加载为系统范围的实例。

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

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

这些尝试都没有取得成功,这就是我现在求助于社区的原因。 很有可能建议的方法有效,我只是搞砸了它的某些方面,idk。 这是在我可以更新MultiseatX页面以包含Ubuntu 12.04的说明之前所需的最后一块拼图。

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

我正在抓住稻草,现在我可以从头脑中拔出最后几根头发了。 请帮我解决这个问题,以便分享财富。 我们将根据您的要求提供所需的任何其他信息。

我花了很多时间在线研究,测试各种设置并与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  

既然所有用户都能够访问音频硬件,我们需要选择每个用户将使用的硬件。 这可以使用pavucontrol完成。 请注意,设置存储在PER USER中,不会跟随座位。 如果用户切换座位,则需要重新选择所需的音频硬件。

关于Pulseaudio的补充评论

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

关于ConsolKit

我们在运行普通的每用户脉冲音频时看到的问题是,一个座位可以访问硬件而其他所有座位都具有虚拟输出。 这是因为ConsoleKit不完全是座位感知。 CK将我们所有的席位视为seat1的会话,并且只能将一个会话标记为活动。 通过运行getfacl / dev / snd / *可以看出这一事实。 我想到我们可以根据特定用户正在使用的$ DISPLAY来编辑相应/ dev / snd /文件的acl。 这是我没有探索过的一个选项。 请考虑通过探索此假设并根据您的发现编辑文档来为多元化原因做出贡献。

ConsoleKit , GDM-2.3和GDM-3.x的 Multiseat分支确实存在,应该提供自动多functionfunction。

补充说明

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

2.) autospawn = no并不是完全必要的,如我的示例文件中所示。 它没有引起任何问题。

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

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

我使用PPA中修改过的ConsoleKit和GDM软件包在Natty(11.04)中进行了多项工作。 我还没有从Natty升级 – 我花了很长时间才弄清楚如何让它工作,我担心LightDM无法使用修补的ConsoleKit。

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