Kontext:
Ich habe einen Raspberry Pi Zero mit einer Adafruit Speaker Bonnet-Soundkarte. Wenn ich alle Details überspringe, ist bekannt, dass dieses Add-on „Pop“-Probleme hat, wenn es mit der Wiedergabe eines neuen Sounds beginnt. Es hängt mit einem i2s-Taktproblem usw. zusammen.
Zu diesem speziellen Problem gibt es überall im Web Threads, aber nur zwei Lösungen:
- Ändern Sie die Hardware, um einen dedizierten Pin zum Ein- und Ausschalten des IC zwischen den Wiedergaben zu verwenden.
- Lassen Sie den Ton immer offen und schließen Sie ihn nie.
Ich versuche die zweite Möglichkeit umzusetzen.
Eine Möglichkeit hierfür (in einer CLI-Umgebung) besteht darin, Folgendes auszuführen:
/usr/bin/aplay -t raw -r 48000 -c 2 -f S32_LE /dev/zero
Und beenden Sie diese Play-Instanz niemals. Ein Nachteil ist jedoch die zusätzliche Belastung der CPU, da ein Play tatsächlich alle 0 von /dev/zero verarbeitet und abspielt.
Eine andere und cleverere Möglichkeit, den Ton offen zu halten, besteht darin, aplay im interaktiven Modus aufzurufen:
aplay -i
Es öffnet den Audiostream und verbraucht zwar immer noch ein wenig CPU-CPU, aber nicht so viel wie zuvor.
Es handelt sich zwar immer noch um eine Problemumgehung, aber es scheint das zu tun, was ich brauche.
Frage
Wie starte ich den Befehl aplay -i
beim Booten auf transparente Weise?
Mein Pi verwendet systemd.
Ich habe versucht, einen Dienst (/etc/systemd/system/aplay.service) mit folgendem zu erstellen:
[Unit]
Description=Invoke aplay from at system start to avoid pops.
[Service]
ExecStart=/usr/bin/aplay -Ddmixer -i
[Install]
WantedBy=multi-user.target
aber ich habe das folgende Ergebnis erhalten:
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'.
zusätzliche Information
uname -a
Linux raspberrypi 5.10.63+ #1459 Wed Oct 6 16:40:27 BST 2021 armv6l GNU/Linux
Ich verwende PI OS Lite 32Bit in einer Headless-Umgebung. Keine Desktop-Umgebung installiert.
Meine Alsa-Konfiguration:
/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"
}