如何让pulseaudio在Ubuntu 17.04和17.10 for Firefox中自动启动?

bgo*_*odr 5 firefox pulseaudio facebook

我正在尝试让 Firefox 56.0 在 Ubuntu 17.04 和 17.10 上播放 Facebook 视频中的声音(甚至不确定它是否特定于 Facebook)。我已将问题归结为当我播放视频时,pulseaudio 没有启动,或者根本没有启动。但如果我从命令行执行pulseaudio,然后从Facebook 内播放视频,我就会听到声音。

让我困惑的是试图弄清楚我应该期望什么时候这个pulseaudio UNIX进程应该启动。

  1. 在启动时?
  2. 在用户登录之前的 X11 启动时间?
  3. 在用户登录时(“问候语”;GDM 或其他)?
  4. 通过 Firefox,当它在某个共享库中执行代码时,然后要求启动pulseaudio

https://www.freedesktop.org/wiki/Software/PulseAudio/Documentation/User/Running/对我来说意味着它应该在用户登录时。

/etc/xdg/autostart 是一个目录,其中包含有关图形会话管理器应在用户登录时自动启动的会话服务的信息。PulseAudio 在那里发布自己的文件。pulseaudio.desktop 告诉会话管理器运行 start-pulseaudio-x11,这是一个加载一些 X11 相关模块的脚本(在 KDE 上还有 module-device-manager,这是 KDE 的音频路由配置工具所需的)。start-pulseaudio-x11 通常首先需要运行 PulseAudio 服务器,因此通常当会话管理器在登录会话开始时运行 start-pulseaudio-x11 时,服务器就会启动。

如果禁用自动生成,则 start-pulseaudio-x11 不起作用,因为 start-pulseaudio-x11 不会显式启动服务器。它在加载 X11 模块时依赖于自动生成。从这个意义上说,脚本名称具有误导性。start-pulseaudio-x11 脚本过去用于显式启动服务器,这解释了脚本名称。

我最近执行的命令是为了确保我按照http://support.system76.com/articles/audio/上的说明从良好的基线开始(出于不同的原因而执行,因为我的机器中的前置音频连接器没有工作并执行以下操作修复了它):

rm -r ~/.config/pulse
sudo apt install --reinstall alsa-base alsa-utils pulseaudio linux-sound-base libasound2
Run Code Online (Sandbox Code Playgroud)

我目前并不认为丢失的~/.config/pulse目录是罪魁祸首,但真的是这样吗?

dmesg | grep pulse
Run Code Online (Sandbox Code Playgroud)

什么也没显示,所以就好像有些东西甚至没有在正确的时间执行正确的脚本。

我需要更改什么才能启用此功能?我不想pulseaudio每次运行 Firefox 时都手动调用(我可以按脚本方式拼凑一些东西,但我不想)。

我的结论是 autospawn 已被启用,因为它被注释掉了(假设注释掉意味着被注释掉的东西程序的默认值):

drunkard@norehab:~$ ps -ef --forest --cols=10000 | grep pulse
drunkard    3448  2721  0 14:25 pts/0    00:00:00  |               \_ grep pulse
drunkard@norehab:~$ ls -ld ~/.config/pulse
ls: cannot access '/home/drunkard/.config/pulse': No such file or directory
drunkard@norehab:~$ ls -ld /etc/xdg/autostart/pulseaudio-kde.desktop
ls: cannot access '/etc/xdg/autostart/pulseaudio-kde.desktop': No such file or directory
drunkard@norehab:~$ ls -ld /etc/xdg/autostart/pulseaudio*
-rw-r--r-- 1 root root 4836 Mar 29  2017 /etc/xdg/autostart/pulseaudio.desktop
drunkard@norehab:~$ grep auto /etc/pulse/client.conf
; autospawn = yes
; auto-connect-localhost = no
; auto-connect-display = no
drunkard@norehab:~$ 
Run Code Online (Sandbox Code Playgroud)

更新#1

我试过这个:

cp -p /etc/pulse/client.conf ~/.config/pulse/client.conf
Run Code Online (Sandbox Code Playgroud)

然后重新启动,仍然没有自动启动。

更新#2

以下向我证明根本没有/usr/bin/start-pulseaudio-x11被执行:

我省了/usr/bin/start-pulseaudio-x11

drunkard@norehab:~$ sudo cp -p /usr/bin/start-pulseaudio-x11 /usr/bin/start-pulseaudio-x11.orig
Run Code Online (Sandbox Code Playgroud)

然后在末尾添加一行,将当前时间戳写入日志文件中/tmp/start-pulseaudio-x11.log

drunkard@norehab:~$ sudo sh -c 'echo "date >> /tmp/start-pulseaudio-x11.log" >> /usr/bin/start-pulseaudio-x11'
drunkard@norehab:~$ tail /usr/bin/start-pulseaudio-x11

    if [ x"$KDE_FULL_SESSION" = x"true" ]; then
       /usr/bin/pactl load-module module-device-manager "do_routing=1" > /dev/null
    fi

    if [ x"$SESSION_MANAGER" != x ] ; then
      /usr/bin/pactl load-module module-x11-xsmp "display=$DISPLAY session_manager=$SESSION_MANAGER" > /dev/null
    fi
fi
date >> /tmp/start-pulseaudio-x11.log
drunkard@norehab:~$
Run Code Online (Sandbox Code Playgroud)

然后重启并登录发现/tmp/start-pulseaudio-x11.log不存在了。

因此,无论在登录之前或之后调用什么,/usr/bin/start-pulseaudio-x11都不会这样做。

更新#3

这在 Ubuntu 17.10 中仍然被破坏。但评论告诉我,我的解决方法可以使用systemctl而不是直接执行。

但我说这仍然是错误的,因为为什么没有为所有使用桌面的用户启用声音?我的意思是,在任何情况下,我都不会不想听到任何浏览器播放的视频中的声音。无论什么声音守护进程(在本例中为 pulseaudio,但这并不重要)都应该默认为桌面用户“启用”。对于服务器安装来说并非如此,但这里的情况并非如此。

bgo*_*odr 2

这是一个解决方法,我将其视为答案,直到有人可以向我确定这是在处理桌面用户配置的上游 Ubuntu 安装逻辑中修复的:

\n\n

我有一个在启动时使用此答案中显示的启动应用程序运行的脚本: https: //unix.stackexchange.com/a/32616/21372,因此在该脚本中我添加了:

\n\n
# Start pulseaudio because something got broken in Ubuntu or Firefox\n# or PulseAudio or or\n# or... (https://askubuntu.com/questions/962920/how-do-i-get-pulseaudio-to-start-automatically-in-ubuntu-17-04-for-firefox):\nif ! pulseaudio --check\nthen\n  # But not via the old way:\n  #\n  #   nohup pulseaudio > /dev/null 2>&1 &\n  #\n  # Use the proper way to enable this at login time per https://askubuntu.com/a/989674/340383\n  systemctl --user enable pulseaudio && systemctl --user start pulseaudio\nfi\n
Run Code Online (Sandbox Code Playgroud)\n\n

这会检查pulseaudio进程是否已使用该--check选项启动,如果未运行,则启动它。

\n\n

更新#1:

\n\n

我稍微更改了解决方法以使用https://askubuntu.com/a/989674/340383systemctl中所示的命令

\n\n

这仍然是一个解决方法,因为 Ubuntu 应该默认为桌面用户启用此功能。

\n\n

我认为不幸的是我仍然必须采取这种解决方法,因为下次我从头开始升级或安装并第一次运行我的新帐户时,如果我的启动脚本中没有上述内容,我将因此对为什么声音停止工作感到困惑。

\n\n

反驳:由于 systemctl 调用将因此更新 ~/.config 文件(这是来自上面的systemctl...命令行):

\n\n
Created symlink /home/drunkard/.config/systemd/user/default.target.wants/pulseaudio.service \xe2\x86\x92 /usr/lib/systemd/user/pulseaudio.service.\nCreated symlink /home/drunkard/.config/systemd/user/sockets.target.wants/pulseaudio.socket \xe2\x86\x92 /usr/lib/systemd/user/pulseaudio.socket.\n
Run Code Online (Sandbox Code Playgroud)\n\n

然后下次重新安装 Ubuntu 时,它应该可以正常工作。但这只是当我保留我的 ~/.config 文件时,这不是一个好的假设:出于这个原因,我将我的所有“用户配置”文件(除了 ~/.config 深处的文件!)保留在 Git 存储库下不得不解决可用性问题,就像这个问题一样,浪费了我很多时间来调试它的根本原因,而我不想重复这样做。

\n