Estou enfrentando um problema que, quando o ALSA fornece um underrun de XRUN, os coletores virtuais pulseaudio para a saída que eu configurei começam a mudar. Descrição abaixo:
Eu criei três coletores virtuais usando os seguintes comandos (de Virtual0 para 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
Estou então executando alguns comandos DSP que saem em três comandos aplay (aplay -v -r 48000 -f S16_LE). Então, no pavucontrol, defino cada um deles para um coletor virtual separado (Virtual0 - Virtual2), que eu uso para canalizar para outro programa DSP.
O problema é que sempre que o ALSA for insuficiente devido ao alto uso da CPU, a entrada de origem no pavucontrol desaparecerá brevemente e voltará um ou dois segundos depois com o coletor virtual alterado para o último que configurei na GUI do pavucontrol (geralmente Virtual2). Então, depois de alguns underruns em cada instância alsa, todas as fontes acabam sendo enviadas para o coletor Virtual2.
Eu não me importo com a subexecução do ALSA de vez em quando (os subexecuções ocorrem raramente quando a CPU atinge o máximo - este é um Raspberry Pi), mas eu só quero que as fontes sejam restauradas para o mesmo coletor.
Acho que o problema é que cada fonte aplay tem o mesmo nome. Então, quando um desaparece brevemente devido a um underrun, ele vai para o último coletor definido para esse nome, que é o último definido na GUI.
Existe alguma coisa que eu possa fazer para impedir que a entrada de origem desapareça brevemente em um underrun? Ou alterar o nome da fonte aplay para algo único?
Apenas uma nota: Curiosamente, eu também tentei produzir com o mplayer, e isso nunca falha a fonte no pavucontrol, mas infelizmente o mplayer apresenta uma latência inaceitável no áudio (mesmo com o cache desativado), então não pode ser usado. aplay e play (de sox) ambos têm o problema.
Se alguém se deparar com um problema semelhante, finalmente encontrei a solução. Você precisa criar alguns cartões virtuais que tenham o dispositivo definido em asound.conf e, em seguida, enviar o áudio para esses cartões.
Cole em asound.conf.
Em seguida, execute a saída com
Agora, sempre que o dispositivo 'desaparece' brevemente do pulseaudio em um underrun, ele pelo menos voltará para o coletor correto.
Certifique-se de criar os coletores virtuais primeiro, como descrevi no OP.