systemd を使用して対話なしで aplay 対話型プロセスを起動する方法

systemd を使用して対話なしで aplay 対話型プロセスを起動する方法

コンテクスト:

私は、Adafruit Speaker Bonnet サウンド カードを搭載した Raspberry Pi Zero を持っています。詳細は省きますが、このアドオンでは、新しいサウンドの再生を開始するときに「ポップ」音の問題が発生することがわかっています。これは、i2s クロッキングの問題などに関係しています。

この特定の問題に関するスレッドは Web 上にたくさんありますが、解決策は次の 2 つしかありません。

  • ハードウェアを変更して、プレイ間で IC の電源をオン/オフするための専用ピンを使用します。
  • オーディオは常に開いたままにして、決して閉じないでください。

2番目のオプションを実装してみます。

これを実行する 1 つの方法 ( CLI 環境の場合 ) は、次を実行することです。

/usr/bin/aplay -t raw -r 48000 -c 2 -f S32_LE /dev/zero

そして、その aplay インスタンスを決して終了しないでください。ただし、欠点の 1 つは、CPU に追加の負荷がかかることです。これは、play が実際には /dev/zero からすべての 0 を処理して再生するためです。

オーディオをオープンにしておくためのもう 1 つのより賢い方法は、インタラクティブ モードで aplay を呼び出すことです。

aplay -i

オーディオ ストリームが開かれ、CPU が少し浪費されますが、以前ほどではありません。

まだ回避策ではありますが、必要なことは実行できるようです。

質問

起動時にコマンドをaplay -i透過的に開始するにはどうすればよいですか?

私のPiはsystemdを使用しています。

次のようにしてサービス (/etc/systemd/system/aplay.service) を作成しようとしました:

[Unit]
Description=Invoke aplay from at system start to avoid pops.

[Service]
ExecStart=/usr/bin/aplay -Ddmixer -i

[Install]
WantedBy=multi-user.target

しかし、次のような結果が得られました。

aplay.service - Invoke aplay from at system start to avoid pops.
   Loaded: loaded (/etc/systemd/system/aplay.service; enabled; vendor preset: enabled)
   Active: failed (Result: exit-code) since Mon 2021-11-01 11:58:16 CET; 1h 30min ago
  Process: 613 ExecStart=/usr/bin/aplay -Ddmixer -i (code=exited, status=1/FAILURE)
 Main PID: 613 (code=exited, status=1/FAILURE)

Nov 01 11:58:16 raspberrypi systemd[1]: Started Invoke aplay from /dev/zero at system start..
Nov 01 11:58:16 raspberrypi aplay[613]: aplay: read_header:2834: read error
Nov 01 11:58:16 raspberrypi systemd[1]: aplay.service: Main process exited, code=exited, status=1/FAILURE
Nov 01 11:58:16 raspberrypi systemd[1]: aplay.service: Failed with result 'exit-code'.

追加情報

uname -a
Linux raspberrypi 5.10.63+ #1459 Wed Oct 6 16:40:27 BST 2021 armv6l GNU/Linux

PI OS Lite 32Bit をヘッドレス環境で使用しています。デスクトップ環境はインストールされていません。

私の alsa 設定:

サウンドファイル

pcm.speakerbonnet {
   type hw card 0
}

pcm.!default {
   type plug
   slave.pcm "dmixer"
}

pcm.dmixer {
   type dmix
   ipc_key 1024
   ipc_perm 0666
   slave {
     pcm "speakerbonnet"
     period_time 0
     period_size 1024
     buffer_size 8192
     rate 44100
     channels 2
   }
}

ctl.dmixer {
  type hw card 0
}

~/.asoundrc:

pcm.speakerbonnet {
   type hw card 0
}

pcm.dmixer {
   type dmix
   ipc_key 1024
   ipc_perm 0666
   slave {
     pcm "speakerbonnet"
     period_time 0
     period_size 1024
     buffer_size 8192
     rate 44100
     channels 2
   }
}

ctl.dmixer {
    type hw card 0
}

pcm.softvol {
    type softvol
    slave.pcm "dmixer"
    control.name "PCM"
    control.card 0
}

ctl.softvol {
    type hw card 0
}

pcm.!default {
    type             plug
    slave.pcm       "softvol"
}

関連情報