我同时运行两个用户,因为有些游戏不喜欢合成窗口管理器,而且您无法在我最喜欢的桌面 Unity 中关闭合成。我不想运行同一用户的两个 TTY,因为它们以不幸的方式相互交互。我运行的是 Ubuntu 16.04。
一个用户 jonathan 正在 TTY7 中的 Unity 会话中,另一个用户 steamdude 正在 TTY2 中的 XFCE 会话中。除了音频之外,一切都按我想要的方式工作。将两个用户添加到音频组并重新登录后,我可以在一个 TTY 中听到来自另一个 TTY 的音频。但是,当一个用户正在使用声卡时,另一用户根本无法播放音频。
我拥有的最接近的解决方案(我不知道它为什么有效)是使用 paprefs 使 RTP 设备能够在 Unity 会话中环回。 steamdude不需要连接RTP设备;由于某种原因,环回不会干扰 TTY2 的声音。问题在于模块环回中存在一个长期存在的错误,导致其延迟长达一秒。手动循环
pacat -r --latency-msec=1 -d rtp.monitor | pacat --latency-msec=1 -d alsa_output.pci-0000_00_1b.0.analog-stereo
修复了延迟问题,但没有解决问题;声卡锁定问题再次出现。
潜在的解决方案(最理想的首先)包括:
1) 将音频直接从一个用户传送到另一个用户
我尝试的第一个明显但不起作用的事情是
pacat -r --latency-msec=1 -d rtp.monitor | sudo -u steamdude pacat --latency-msec=1 -d alsa_output.pci-0000_00_1b.0.analog-stereo
此操作失败,输出如下:
Home directory not accessible: Permission denied
Connection failure: Connection refused
pa_context_connect() failed: Connection refused
write() failed: Broken pipe
请注意,两个用户都在彼此的组中,我通过 chmod 和 setfacl 授予了对其主目录的完全控制权。
2) 通过 RTP 多播将音频从一个用户传输到另一个用户
我不知道该怎么做,因为脉冲不向我显示来自同一台计算机的流设备。
3) 通过 RTP 将音频从一个 TTY 发送到另一个 TTY 中的轻量级虚拟机(或专门设计的 chroot?)。
这应该可行,但它是所有可能的解决方案中最不优雅的,并且占用了大量的系统资源。
我愿意做任何这些事情,但我更想知道如何以最有效的方式做到这一点。