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になっているため、 リモートから接続要求が来て初めて起動される。