突然音がならなくなる現象から復活する方法

Ubuntuを使っていると突然動画とかの音がならなくなる現象が時々発生する。
まあこうなるとOSごと再起動すれしか手が無く、なんとも面倒くさい。


で、ちょっと調べてみた。
/var/log/messagesを見ると、以下のようなエラーがずらり。

pulseaudio[1952]: ratelimit.c: 962 events suppressed
pulseaudio[1952]: sink-input.c: Failed to create sink input: too many inputs per sink.
pulseaudio[1952]: last message repeated 1328 times
pulseaudio[1952]: last message repeated 1323 times
pulseaudio[1952]: last message repeated 751 times
pulseaudio[1952]: last message repeated 742 times
pulseaudio[1952]: last message repeated 1383 times
pulseaudio[1952]: last message repeated 1319 times
pulseaudio[1952]: last message repeated 758 times
pulseaudio[1952]: last message repeated 754 times
pulseaudio[1952]: sink-input.c: Failed to create sink input: too many inputs per sink.
pulseaudio[1952]: last message repeated 746 times
pulseaudio[1952]: last message repeated 738 times
pulseaudio[1952]: last message repeated 1316 times
pulseaudio[1952]: last message repeated 667 times
pulseaudio[1952]: last message repeated 745 times
pulseaudio[1952]: last message repeated 1294 times
pulseaudio[1952]: last message repeated 730 times
pulseaudio[1952]: last message repeated 1320 times
pulseaudio[1952]: last message repeated 730 times
pulseaudio[1952]: last message repeated 1316 times
pulseaudio[1952]: last message repeated 1327 times
pulseaudio[1952]: last message repeated 1422 times
pulseaudio[1952]: last message repeated 738 times
pulseaudio[1952]: sink-input.c: Failed to create sink input: too many inputs per sink.
pulseaudio[1952]: last message repeated 3 times
pulseaudio[1952]: sink-input.c: Failed to create sink input: too many inputs per sink.
pulseaudio[1952]: last message repeated 2 times
pulseaudio[1952]: last message repeated 12 times


さて、犯人はpulseaudioというのらしいが、何者かはさっぱり分からん。
まあpulseaudioという名前から察するにsound system関係っぽいぐらいは想像つくが、さっぱり分からん。


で、調べてみると、PulseAudioに注目すべき理由(とPulseAudioの始め方)と言う記事を発見。
まあ、多少古いが問題はない。
多少引用してみる。

上記の状況に当てはめると、PulseAudioはパイプラインの他の部分に影響を与えることなくESDに置き換わることができる。ただし他のプレイヤーを使う場合には、上記の例には含まれていない、ALSAユーザ空間ライブラリも使用されるかもしれない。その場合にもやはりPulseAudioは、パイプラインの中でカーネルレベルのハードウェアドライバのすぐ上に位置することになる。PulseAudioを利用することにより階層が一つ増えることになるが、そうすることによりすべてのサウンドが同じサウンドサーバを経由することの利点を享受することができるようになる。

 そして、そこがポイントだ――ユーザ空間ALSA APIやaRtsやJACKを使うように書かれているアプリケーションもあれば、サウンドを内部的に扱うように書かれているアプリケーションもある――しかしすべてのサウンドが単一のハンドラを経由するようにすれば、制御しやすく、衝突が起こりにくく、予想外のことも起こりにくくなる。


まあ、Linuxではsound関係は昔から鬼門だよね(ossとか、alsaとか)。
ともかく、この説明を見る限りは普通のプロセスっぽいと想像がついたので、それを何とかしてやればOKのはず。原因を追ってもいいけどそれは暇な時に。


というわけで、まずはpsをgrepしてみると発見。

# ps aux|grep pulseaudio
 ******    1952  3.0  1.1 2193704 37844 ?       S


あとは簡単。

# /etc/init.d/pulseaudio restart
 * PulseAudio configured for per-user sessions
# ps aux|grep pulseaudio
 ******    1952  3.0  1.1 2193704 37844 ?       S

と思いきや、再起動しない。何故?ちなみに、stopもダメだった。


仕方がないので、/etc/init.d/pulseaudioを覗いてみると、以下の部分で終了しているようだ。

PULSEAUDIO_SYSTEM_START=0
DISALLOW_MODULE_LOADING=1
test -f /etc/default/pulseaudio && . /etc/default/pulseaudio
if [ "$PULSEAUDIO_SYSTEM_START" != "1" ]; then
        log_warning_msg "PulseAudio configured for per-user sessions"
        exit 0
fi


ためしに、"DISALLOW_MODULE_LOADING=1"とかしても同じ結果。
さて、原因はtestコマンドの行にありそうだ。


まずは、/etc/default/pulseaudioを見てみるとビンゴ。
PULSEAUDIO_SYSTEM_STARTが0に設定されている。

$ cat /etc/default/pulseaudio
# Start the PulseAudio sound server in system mode.
# (enables the pulseaudio init script - requires that users be in the
# pulse-access group)
# System mode is not the recommended way to run PulseAudio as it has some
# limitations (such as no shared memory access) and could potentially allow
# users to disconnect or redirect each others' audio streams. The
# recommended way to run PulseAudio is as a per-session daemon. For GNOME/KDE/
# Xfce sessions in Ubuntu Lucid/10.04, /etc/xdg/autostart/pulseaudio.desktop
# handles this function of automatically starting PulseAudio on login, and for
# it to work correctly your user must *not* have "autospawn = no" set in
# ~/.pulse/client.conf (or in /etc/pulse/client.conf). By default, autospawn
# is enabled. For other sessions, you can simply start PulseAudio with
# "pulseaudio --daemonize".
# 0 = don't start in system mode, 1 = start in system mode
PULSEAUDIO_SYSTEM_START=0

# Prevent users from dynamically loading modules into the PulseAudio sound
# server. Dynamic module loading enhances the flexibilty of the PulseAudio
# system, but may pose a security risk.
# 0 = no, 1 = yes
DISALLOW_MODULE_LOADING=1


あとは書いてある通り、"pulseaudio --daemonize"コマンドを叩くか、PULSEAUDIO_SYSTEM_START=1にして"/etc/init.d/pulseaudio start"すれば無事音が出るようになった。
まったく、ややこしい事をしてくれるもんだ。