语境:
我有一个 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"
}