ALSA가 XRUN 언더런을 제공했을 때 출력으로 설정한 펄스 오디오 가상 수신기가 변경되기 시작하는 문제가 발생했습니다. 다음과 같이 설명됩니다:
다음 명령을 사용하여 3개의 가상 수신기(Virtual0에서 Virtual2까지)를 만들었습니다.
pacmd load-module module-null-sink sink_name=Virtual0
pacmd update-sink-proplist Virtual0 device.description=Virtual0
pacmd update-source-proplist Virtual0.monitor device.description=Virtual0
그런 다음 세 가지 aplay 명령(aplay -v -r 48000 -f S16_LE)으로 출력되는 일부 DSP 명령을 실행했습니다. 그런 다음 pavucontrol에서 각각을 별도의 가상 수신기(Virtual0 - Virtual2)로 설정한 다음 이를 사용하여 다른 DSP 프로그램으로 연결했습니다.
문제는 높은 CPU 사용량으로 인해 ALSA가 제대로 실행되지 않을 때마다 pavucontrol의 소스 항목이 잠시 사라졌다가 가상 싱크가 pavucontrol GUI에서 설정한 마지막 싱크로 변경된 상태로 1~2초 후에 다시 돌아온다는 것입니다. 2). 따라서 각 alsa 인스턴스에서 몇 번의 언더런이 발생한 후 모든 소스는 결국 Virtual2 싱크로 출력됩니다.
나는 때때로 ALSA가 언더런하는 것을 신경 쓰지 않지만(CPU가 완전히 최대치에 도달했을 때만 거의 발생하지 않습니다. 이는 Raspberry Pi입니다) 소스를 동일한 싱크로 되돌리기를 원합니다.
문제는 각 aplay 소스의 이름이 동일하다는 것입니다. 따라서 언더런으로 인해 잠시 사라지면 해당 이름의 마지막 세트 수신기로 이동하며, 이는 GUI에서 마지막 세트 수신기가 됩니다.
로드가 부족할 때 소스 항목이 잠시 사라지는 것을 방지할 수 있는 방법이 있습니까? 아니면 aplay 소스 이름을 고유한 이름으로 변경하시겠습니까?
참고 사항: 흥미롭게도 pavucontrol의 소스에 결함이 발생하지 않는 출력용 mplayer를 사용해 보았지만 불행하게도 mplayer는 오디오에 허용할 수 없는 대기 시간을 발생시키므로(캐싱이 비활성화된 경우에도) 사용할 수 없습니다. aplay와 play(from sox) 모두 이 문제를 안고 있습니다.
답변1
누구든지 비슷한 문제가 있는 경우 마침내 해결책을 찾았습니다. asound.conf에 설정된 장치로 일부 가상 카드를 만든 다음 해당 카드에 오디오를 출력해야 합니다.
sudo nano /etc/asound.conf
asound.conf에 붙여넣습니다.
pcm.VirtualCard0 {
type pulse
device Virtual0
}
ctl.VirtualCard0 {
type pulse
device Virtual0
}
pcm.VirtualCard1 {
type pulse
device Virtual1
}
ctl.VirtualCard1 {
type pulse
device Virtual1
}
pcm.VirtualCard2 {
type pulse
device Virtual2
}
ctl.VirtualCard2 {
type pulse
device Virtual2
}
그런 다음 출력을 실행하십시오.
aplay -v -r 48000 -f S16_LE -DVirtualCard0
aplay -v -r 48000 -f S16_LE -DVirtualCard1
aplay -v -r 48000 -f S16_LE -DVirtualCard2
이제 장치가 부하가 적은 동안 펄스 오디오에서 잠깐 "사라질" 때마다 최소한 올바른 수신기로 되돌아갑니다.
OP에서 설명한 대로 먼저 더미 수신기를 생성해야 합니다.