みつきんのメモ

組み込みエンジニアです。Interface誌で「Yocto Projectではじめる 組み込みLinux開発入門」連載中

raspberrypi2 yocto systemdでpulseaudio

yoctoのpulseaudioをsystemdで動かしてみた。

今回はレシピを作成したりはしないので若干手順は端折っている。

pulseaudioのインストール

pulseaudioを追加するためには、local.confに下記を追加する。

DISTRO_FEATURES_append = " pulseaudio pam"
IMAGE_INSTALL_append = " pulseaudio pulseaudio-server"

pulseaudioだけじゃ何も入らないので注意。 さりげにDISTRO_FEATURESにpamを追加していることも重要。

また、DISTRO_FEATURESにはすでにsystemdが追加してあると想定。

fidoのpulseaudioのレシピにはsystemd対応が不完全で、 意図したとおりに動作するためにはレシピを修正する必要がある。

しかし、masterやjethroのレシピは必要な修正はすでに入っているため、 作業はmasterかjethroで行うこととする。

User Unitについて

systemdのunitにはシステム全体に一つのインスタンスが実行されるSystem Unitと ユーザーごとにインスタンスが実行されるUser Unitがある。

pulseaudioはUser Unitとなるため、systemctlでの操作には--userオプションが必要になる。

$ systemctl --user status pulseaudio

systemctl --userでエラー

User Unitを動作させるには、pamの機能が有効化されている必要があるため、先述したように DISTRO_FEATURESにpamを追加しておく必要がある。これを忘れると下記のようなエラーに悩まされる事になる。

$ systemctl --user
Failed to get D-Bus connection: No such file or directory

また、sshなどリモートのシェルでも同様のエラーが出るので注意。 ターゲット直接かシリアルコンソールで操作する必要がある。

Socket Activation

systemdには、サービスにアクセスされた時に初めてデーモンを起動する、「Socket Activation」という機能がある。

これは、昔あったinetdスーパーデーモンの動作に似ている。

pulseaudioはSocket Activationに対応している。これを使用するためには下記のようにする。

$ systemctl start --user pulseaudio.socket
$ systemctl enable --user pulseaudio.socket

一時的に試すだけならstartのみで良い。

この時点では、pulseaudioは起動されていないが、pulseaudioに接続しようとするアプリケーションが実行された時点でpulseaudioが起動される。

pulseaudioの動作確認

alsaをpulseaudio経由で再生するように設定して、aplayでwavファイルを再生してみる。

alsa-utilsのインストール

aplayを使用するためにalsa-utilsをインストールする。 local.confに下記を追加する。

IMAGE_INSTALL_append = " alsa-utils"

asound.confの作成

ターゲット側で「/etc/asound.conf」を下記の内容で作成する

pcm.pulse {
    type pulse
}

ctl.pulse {
    type pulse
}

pcm.!default {
    type pulse
}
ctl.!default {
    type pulse
}

aplayでファイル再生

pulseaudioの設定が有効になっているか下記のコマンドで確認する。

$ aplay -L
...
pulse
    PulseAudio Sound Server
...

aplayの前後でpsコマンドでプロセスを確認し、aplayの後でpulseaudioが起動していれば、 Socket Activationは成功。

$ ps
  PID USER       VSZ STAT COMMAND
...
$ aplay -D pulse test.wav
$ ps
  PID USER       VSZ STAT COMMAND
...
  311 root      157m S <  /usr/bin/pulseaudio --daemonize=no

ちなみに、sshd(dropbear)もSocket Activationになっているため、 リモートから接続要求が来て初めて起動される。