Troca automática de perfis PulseAudio com base na contagem de canais de entrada (s)

39

Estou executando o áudio através de HDMI no meu receptor, que possui uma configuração 7.1 completa conectada a ele. No entanto, a maioria das coisas que ouço tem muito menos canais - alguns são mono, outros são estéreo, outros são 5.1. Quando o receptor é alimentado com o número certo de canais, ele possui vários efeitos DSP que funcionam bastante bem (por exemplo, na divisão de um canal central, no envio de base para o subwoofer, na detecção automática de surround de matriz Dolby, etc.). Isso deixa de funcionar se você enviar um sinal 7.1 completo com vários canais silenciosos.

O número de canais de saída no PulseAudio é configurado, por cartão / coletor, pelo perfil atribuído ao cartão. Você pode alterar o perfil atribuído pacmd, pactle vários programas gráficos.

Como posso configurá-lo para alterar automaticamente o perfil com base no uso do canal no (s) fluxo (s) de entrada? Por exemplo, se os fluxos de entrada estiverem usando apenas a frente esquerda e a frente direita, mude para o perfil estéreo. Se eles estiverem usando as costas esquerda e traseira direita, mude para quadrofônico etc.

derobert
fonte
3
Talvez eu esteja errado, mas não acho viável. O Pulseaudio gerencia vários fluxos de uma só vez: qual perfil estaria correto se fluxos diferentes com números de canais diferentes estivessem tocando juntos?
Alessio Gaeta
@meden Aquele com o maior número de canais, eu acho.
derobert
Sim, é claro, mas ainda haverá casos em que você não poderá alcançar seu objetivo. BTW, não acho que haja uma maneira no Pulseaudio de mudar condicionalmente um perfil. Talvez o guia Kodi para o Pulseaudio [ kodi.wiki/view/PulseAudio] possa ser útil para ter alguma dica (por exemplo, usando passagem e deixar seu receptor fazer todo o trabalho, desde que ele suporte todos os formatos que você usa).
Alessio Gaeta
Esta é uma pergunta interessante. Não tenho a configuração de áudio disponível para testar isso, mas, como alternativa, se você criar perfis para cada instância que você imagina, configure um script para analisar os fluxos com antecedência (talvez exibindo a saída de mediainfoor ffmpegou avconv) e use pacmdpara selecionar o perfil apropriado antes de iniciar o player. Do ponto de vista lógico, espero que funcione, desde que você esteja reproduzindo um áudio por vez.
Elder Geek
4
Pode valer a pena enviar esta pergunta como uma solicitação de recurso em launchpad.net/bugs/bugtrackers/pulseaudio-bugs se ainda não tiver sido enviada lá. Seria um recurso interessante e o áudio de pulso provavelmente poderia resolver isso melhor internamente do que usando um script externo.
Alexander Alexander

Respostas:

1

Este é apenas um conceito e nenhuma solução completa:

Você pode administrar seus próprios eventos patcl subscribese puder atribuir configurações a clientes pulsaudio (por exemplo, se o reprodutor de filmes se conectar, você alterna para a configuração 7.1, caso contrário, usa a configuração estéreo). Você obterá um fluxo constante de eventos patcl subscribe, dos quais poderá lidar observando as conexões do cliente. Então você pode simplesmente chamar pactl / pacmd para alterar o perfil.

Exemplo de saída do pactl subscrever:

$ pactl subscribe 
Event 'change' on sink #0
Event 'remove' on sink-input #93
Event 'change' on sink #0
Event 'change' on source #0
Event 'change' on sink #0
Event 'change' on source #0
Event 'new' on sink-input #98
Event 'change' on sink-input #98

Observe que você ainda tem o problema de lidar com casos em que você tem vários clientes com um número diferente de canais.

Além disso, a abordagem acima é bastante limitada. As configurações por aplicativo não são suficientes para detectar o número real de canais usados ​​do aplicativo (por exemplo, o vlc pode reproduzir um vídeo 5.1 ou 7.1). Não encontrei uma maneira de obter o número de canais realmente usados ​​de um cliente pulseaudio sobre o pactl, mas talvez eu tenha perdido algumas opções aqui. Como alternativa, você também pode conectar-se ao aplicativo de reprodutor de vídeo e obter o formulário de bits ausentes lá.

Até Schäfer
fonte
Com pactl list | grep format.channelsvocê deve ser capaz de descobrir o max. Nº de canais usados ​​(e mais informações também). O uso dessas informações em um script acionado por eventos registrados pode levar a uma solução.
ridgy