Pias virtuais de áudio de pulso estão mudando na Alsa Underrun

0

Estou com um problema que, quando o ALSA gera um XRUN, os impulsos virtuais pulseaudio para a saída que defini 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

Eu, então, estou executando alguns comandos DSP que saem em três comandos aplay (aplay -v -r 48000 -f S16_LE). Em seguida, no pavucontrol, defino cada um deles para um coletor virtual separado (Virtual0 - Virtual2), que depois uso para canalizar para outro programa DSP.

O problema é que sempre que o ALSA entra em erro devido ao alto uso da CPU, a entrada de origem no pavucontrol desaparecerá brevemente e retornará um ou dois segundos depois com o coletor virtual alterado para o último que eu configurei no pavucontrol GUI (geralmente Virtual2). Então, depois de alguns atrasos em cada instância alsa, todas as fontes acabam saindo para o coletor Virtual2.

Eu não me importo com ALSA underruning de vez em quando (underruns só ocorrem raramente quando o CPU atinge o máximo - este é um Raspberry Pi), mas eu só quero que as fontes restaurem no mesmo sink.

Eu 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 set sink daquele nome, que é o último colocado na GUI.

Existe alguma coisa que eu possa fazer para impedir que a entrada de fonte desapareça por um período de tempo? Ou altere o nome da fonte do jogo para algo único?

Apenas uma nota: Curiosamente, eu também tentei produzir com o mplayer, e isso nunca falha na fonte no pavucontrol, mas o mplayer introduz uma latência inaceitável no áudio (mesmo com o cache desabilitado), então não pode ser usava. aplay and play (do sox) ambos têm o problema.

Antes dos underruns

Apósunderruns

    
por Projectile Fish 14.06.2018 / 01:33

1 resposta

0

Se alguém se deparar com um problema semelhante, acabei por encontrar a solução. Você precisa criar alguns cartões virtuais que tenham o dispositivo configurado em asound.conf e, em seguida, enviar o áudio para esses cartões.

sudo nano /etc/asound.conf

Cole em 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
}

Em seguida, execute a saída com

aplay -v -r 48000 -f S16_LE -DVirtualCard0
aplay -v -r 48000 -f S16_LE -DVirtualCard1
aplay -v -r 48000 -f S16_LE -DVirtualCard2

Agora, sempre que o dispositivo "desaparecer" por um breve período de tempo, ele voltará pelo menos ao coletor correto.

Certifique-se de criar os coletores virtuais primeiro, como descrevi no OP.

    
por 16.06.2018 / 07:28