Как запустить интерактивный процесс aplay с помощью systemd без взаимодействия

Как запустить интерактивный процесс aplay с помощью systemd без взаимодействия

Контекст:

У меня есть Raspberry Pi Zero со звуковой картой Adafruit Speaker Bonnet. Опуская все детали, известно, что у этого дополнения есть проблемы с "щелчком" при запуске нового звука. Это связано с проблемой синхронизации i2s и т. д.

В Интернете полно обсуждений этой конкретной проблемы, но существует только два решения:

  • Измените аппаратное обеспечение так, чтобы для включения и выключения ИС между воспроизведениями использовался специальный контакт.
  • Держите аудиоустройство постоянно открытым и никогда не закрывайте его.

Я пытаюсь реализовать второй вариант.

Один из способов сделать это (в среде CLI) — запустить:

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

И никогда не выходить из этого экземпляра aplay. Но один недостаток — дополнительная нагрузка на процессор... потому что play на самом деле обрабатывает все 0 из /dev/zero и воспроизводит их.

Другой, более умный способ сохранить аудио открытым — вызвать aplay в интерактивном режиме:

aplay -i

Он открывает аудиопоток и по-прежнему немного загружает процессор, но не так много, как раньше.

Это все еще обходной путь, но, похоже, он делает то, что мне нужно.

Вопрос

Как запустить команду 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 в среде headless. Среда рабочего стола не установлена.

Моя конфигурация ALSA:

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

Связанный контент