So starten Sie einen interaktiven Aplay-Prozess mit systemd ohne Interaktion

So starten Sie einen interaktiven Aplay-Prozess mit systemd ohne Interaktion

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

verwandte Informationen