Conmutación automática de los perfiles de PulseAudio según el recuento de canales de entrada

39

Estoy ejecutando audio a través de HDMI a mi receptor, que tiene una configuración 7.1 completa conectada. Sin embargo, la mayoría de las cosas que escucho tienen muchos menos canales: algunos son mono, la mayoría son estéreo, un poco es 5.1. Cuando el receptor se alimenta con el número correcto de canales, tiene varios efectos DSP que funcionan bastante bien (por ejemplo, al dividir un canal central, al enviar la base al subwoofer, la detección automática de sonido envolvente de matriz Dolby, etc.). Esto deja de funcionar si le envía una señal 7.1 completa con un montón de canales silenciosos.

El número de canales de salida en PulseAudio se configura, por tarjeta / receptor, por el perfil asignado a la tarjeta. Puede cambiar el perfil asignado con pacmd, pactly varios programas de interfaz gráfica de usuario.

¿Cómo puedo configurarlo para cambiar automáticamente el perfil en función del uso del canal en las secuencias de entrada? Por ejemplo, si las transmisiones de entrada solo se usan en la parte frontal izquierda y frontal derecha, cambie al perfil estéreo. Si también están usando back-left y back-right, cambie a quadrophonic, etc.

derobert
fuente
3
Tal vez me equivoque, pero no creo que sea factible en absoluto. Pulseaudio gestiona múltiples transmisiones a la vez: ¿qué perfil sería correcto si se reproducen juntas diferentes transmisiones con diferentes números de canales?
Alessio Gaeta
@meden El que tiene el mayor número de canales, supongo.
derobert
Sí, por supuesto, pero aún habrá casos en los que no podría lograr su objetivo. Por cierto, no creo que haya una manera en Pulseaudio para cambiar condicionalmente un perfil. Tal vez la guía de Kodi para Pulseaudio [ kodi.wiki/view/PulseAudio] podría ser útil para tener alguna pista (es decir, usar passthrough y dejar que su receptor haga todo el trabajo, siempre que sea compatible con todos los formatos que use).
Alessio Gaeta
Esta es una pregunta interesante. No tengo la configuración de audio disponible para probar esto, pero como solución alternativa, si fueras a crear perfiles para cada instancia que imaginas, configura un script para analizar las transmisiones por adelantado (tal vez ajustando la salida de mediainfoor ffmpego avconv) y luego use pacmdpara seleccionar el perfil apropiado antes de iniciar su reproductor. Desde un punto de vista lógico, esperaría que funcione siempre que esté reproduciendo un audio a la vez.
Élder Geek
44
Podría valer la pena enviar esta pregunta como una solicitud de función en launchpad.net/bugs/bugtrackers/pulseaudio-bugs si aún no se ha enviado allí. Sería una característica interesante y el audio de pulso probablemente podría resolver esto mejor internamente que mediante el uso de un script externo.
Alexander

Respuestas:

1

Esto es solo un concepto y no una solución completa:

Es posible que pueda hacer su propio manejo de eventos patcl subscribesi puede asignar configuraciones a clientes pulsaudio (por ejemplo, si el reproductor de películas se conecta, cambia a la configuración 7.1, de lo contrario usa la configuración estéreo). Obtendrá un flujo constante de eventos de los patcl subscribeque puede manejar observando las conexiones del cliente. Luego puede llamar a pactl / pacmd para cambiar el perfil.

Ejemplo de salida de pactl subscribe:

$ 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

Tenga en cuenta que todavía tiene el problema de manejar casos en los que tiene varios clientes con un número diferente de canales.

Además, el enfoque anterior es bastante limitado. La configuración por aplicación no es suficiente para detectar el número real de canales utilizados de la aplicación (por ejemplo, vlc podría reproducir un video 5.1 o 7.1). No he encontrado una manera de obtener el número de canales realmente utilizados de un cliente de pulseaudio a través de pactl, pero podría haber perdido algunas opciones aquí. Alternativamente, también puede conectarse a la aplicación del reproductor de video y obtener los bits faltantes allí.

Hasta Schäfer
fuente
Con pactl list | grep format.channelsusted debería poder averiguar el máximo. Número de canales utilizados (y más información también). Usar esa información en un script activado por eventos suscritos podría conducir a una solución.
ridículo