Contexto:
Eu tenho um Raspberry Pi Zero com uma placa de som Adafruit Speaker Bonnet. Ignorando todos os detalhes, sabe-se que este complemento apresenta problemas de “pop” ao começar a reproduzir um novo som. Está relacionado a um problema de clock do i2s, etc.
Existem tópicos em toda a web sobre esse problema específico, mas existem apenas duas soluções:
- Modifique o hardware para usar um pino dedicado para ligar e desligar o IC entre as execuções.
- Mantenha o áudio aberto o tempo todo e nunca o feche.
Tento implementar a segunda opção.
Uma maneira de fazer isso (em um ambiente CLI) é executar:
/usr/bin/aplay -t raw -r 48000 -c 2 -f S32_LE /dev/zero
E nunca saia dessa instância do aplay. Mas uma desvantagem é a carga adicional na CPU... porque uma reprodução está realmente processando todos os 0 de /dev/zero e reproduzindo-os.
Outra maneira mais inteligente de manter o áudio aberto é chamar aplay no modo interativo:
aplay -i
Ele abre o fluxo de áudio e ainda desperdiça um pouco de CPU, mas não tanto quanto antes.
Ainda é uma solução alternativa, mas parece fazer o que preciso.
Pergunta
Como inicio o comando aplay -i
na inicialização de maneira transparente?
Meu Pi usa systemd.
Tentei criar um serviço ( /etc/systemd/system/aplay.service) com:
[Unit]
Description=Invoke aplay from at system start to avoid pops.
[Service]
ExecStart=/usr/bin/aplay -Ddmixer -i
[Install]
WantedBy=multi-user.target
mas obtive o seguinte resultado:
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'.
informação adicional
uname -a
Linux raspberrypi 5.10.63+ #1459 Wed Oct 6 16:40:27 BST 2021 armv6l GNU/Linux
Eu uso o PI OS Lite 32Bit em um ambiente headless. Nenhum ambiente de desktop instalado.
Minha configuração também:
/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"
}