systemd를 사용하여 상호 작용 없이 aplay 대화식 프로세스를 시작하는 방법

systemd를 사용하여 상호 작용 없이 aplay 대화식 프로세스를 시작하는 방법

语境:

Adafruit 스피커 Bonnet 사운드 카드가 설치된 Raspberry Pi Zero가 있습니다. 모든 세부 사항을 건너뛰고, 우리는 이 추가 기능에 새로운 사운드 재생을 시작할 때 "팝" 문제가 있다는 것을 알고 있습니다. 이는 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를 사용하고 있습니다. 데스크탑 환경이 설치되어 있지 않습니다.

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

관련 정보