如何使用 systemd 啟動 aplay 互動式進程而無需交互

如何使用 systemd 啟動 aplay 互動式進程而無需交互

情境:

我有一個 Raspberry Pi Zero,上面裝有 Adafruit 揚聲器 Bonnet 音效卡。跳過所有細節,我們知道這個附加元件在開始播放新聲音時會出現「流行」問題。這與 i2s 時鐘問題等有關。

網路上到處都有關於該特定問題的線索,但只有兩種解決方案:

  • 修改硬體以使用專用引腳在播放之間開啟和關閉 IC 電源。
  • 保持音訊始終打開,切勿關閉。

我嘗試實施第二個選項。

一種方法(在 CLI 環境中)是運行:

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

並且永遠不要退出那個 aplay 實例。但一個缺點是 CPU 上的額外負載...因為播放實際上是處理 /dev/zero 中的所有 0 並播放它們。

另一種更聰明的保持音訊開啟的方法是在互動模式下呼叫 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。沒有安裝桌面環境。

我的阿爾薩配置:

/etc/asound.conf

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"
}

相關內容