Automatische Umschaltung von PulseAudio-Profilen basierend auf der Anzahl der Eingangskanäle

39

Ich verwende Audio über HDMI zu meinem Receiver, an den ein vollständiges 7.1-Setup angeschlossen ist. Das meiste, was ich höre, hat jedoch viel weniger Kanäle - einige sind Mono, die meisten Stereo, ein bisschen 5.1. Wenn der Receiver mit der richtigen Anzahl von Kanälen gespeist wird, hat er verschiedene DSP-Effekte, die recht gut funktionieren (z. B. beim Aufteilen eines Center-Kanals, beim Senden der Basis an den Subwoofer, beim automatischen Erkennen des Dolby-Matrix-Surrounds usw.). Dies funktioniert nicht mehr, wenn Sie ein vollständiges 7.1-Signal mit einer Reihe stiller Kanäle senden.

Die Anzahl der Ausgangskanäle in PulseAudio wird pro Karte / Senke anhand des der Karte zugewiesenen Profils konfiguriert. Sie können das zugewiesene Profil ändern mit pacmd, pactlund verschiedene GUI - Programme.

Wie kann ich festlegen, dass das Profil basierend auf der Kanalnutzung in den Eingabestreams automatisch geändert wird? Wenn die Eingabestreams beispielsweise nur von vorne links und von vorne rechts verwendet werden, wechseln Sie zum Stereoprofil. Wenn sie auch Links-Links und Rechts-Links verwenden, wechseln Sie zu Quadrophonic usw.

derobert
quelle
3
Vielleicht irre ich mich, aber ich glaube nicht, dass es überhaupt machbar ist. Pulseaudio verwaltet mehrere Streams gleichzeitig: Welches Profil wäre richtig, wenn verschiedene Streams mit unterschiedlichen Kanalnummern gleichzeitig abgespielt werden?
Alessio Gaeta
@meden Der mit der höchsten Anzahl von Kanälen, denke ich.
Derobert
Ja, natürlich, aber es wird Fälle geben, in denen Sie Ihr Ziel nicht erreichen konnten. Übrigens glaube ich nicht, dass es in Pulseaudio eine Möglichkeit gibt, ein Profil bedingt zu wechseln. Möglicherweise kann der Kodi-Leitfaden für Pulseaudio [ kodi.wiki/view/PulseAudio] hilfreich sein, um einen Hinweis zu erhalten (z. B. Passthrough verwenden und den Receiver die ganze Arbeit machen lassen, sofern er alle von Ihnen verwendeten Formate unterstützt).
Alessio Gaeta
Das ist eine interessante Frage. Ich habe nicht das Audio-Setup zur Verfügung, um dies zu testen, aber als Workaround, wenn Sie Profile für jede Instanz, die Sie sich vorstellen, erstellen, richten Sie ein Skript ein, um die Streams im Voraus zu analysieren (möglicherweise durch Abhören der Ausgabe von mediainfooder ffmpegoder avconv). und verwenden Sie dann pacmd, um das entsprechende Profil vor dem Starten Ihres Players auszuwählen. Aus logischer Sicht würde ich davon ausgehen, dass es funktioniert, vorausgesetzt, Sie spielen jeweils ein Audio.
Elder Geek
4
Es könnte sich lohnen, diese Frage als Feature-Anfrage an launchpad.net/bugs/bugtrackers/pulseaudio-bugs zu senden, wenn sie dort noch nicht eingereicht wurde. Es wäre eine interessante Funktion und Puls Audio könnte dies wahrscheinlich intern besser lösen als mit einem externen Skript.
Alexander

Antworten:

1

Dies ist nur ein Konzept und keine vollständige Lösung:

Möglicherweise können Sie Ereignisse patcl subscribeselbst verwalten, indem Sie pulsaudio-Clients Konfigurationen zuweisen (z. B. wenn der Movie Player eine Verbindung herstellt, wechseln Sie zur 7.1-Konfiguration, andernfalls verwenden Sie die Stereokonfiguration). Sie erhalten einen konstanten Strom von Ereignissen patcl subscribe, die Sie verarbeiten können, indem Sie Clientverbindungen beobachten. Dann können Sie einfach pactl / pacmd aufrufen, um das Profil zu ändern.

Beispielausgabe von 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

Beachten Sie, dass Sie immer noch Probleme haben, Fälle zu behandeln, in denen Sie mehrere Clients mit einer unterschiedlichen Anzahl von Kanälen haben.

Darüber hinaus ist der obige Ansatz eher begrenzt. Die Einstellungen pro Anwendung reichen nicht aus, um die tatsächliche Anzahl der verwendeten Kanäle der Anwendung zu ermitteln (z. B. kann vlc ein 5.1- oder 7.1-Video abspielen). Ich habe keine Möglichkeit gefunden, die tatsächlich verwendeten Kanäle eines pulseaudio-Clients über pactl abzurufen, aber ich habe hier möglicherweise einige Optionen verpasst. Alternativ können Sie sich auch in die Videoplayer-Anwendung einbinden und die fehlenden Bits dort abrufen.

Till Schäfer
quelle
Mit pactl list | grep format.channelssollten Sie in der Lage sein, die max herauszufinden. Anzahl der verwendeten Kanäle (und weitere Informationen). Die Verwendung dieser Informationen in einem Skript, das von abonnierten Ereignissen ausgelöst wird, kann zu einer Lösung führen.
lächerlich