Автоматическое переключение профилей PulseAudio на основе количества входных каналов

39

Я передаю звук через HDMI на мой ресивер, к которому подключена полная настройка 7.1. Тем не менее, большинство из того, что я слушаю, имеет гораздо меньше каналов - некоторые моно, большинство стерео, немного 5.1. Когда на приемник подается правильное количество каналов, он имеет различные эффекты DSP, которые работают довольно хорошо (например, при разделении центрального канала, при отправке базы на сабвуфер, автоматическом обнаружении объемного звучания матрицы Dolby и т. Д.). Это перестает работать, если вы посылаете полный сигнал 7.1 с кучей тихих каналов.

Количество выходных каналов в PulseAudio настраивается для каждой карты / приемника в соответствии с профилем, назначенным для карты. Вы можете изменить назначенный профиль с pacmd, pactlи различными программами с графическим интерфейсом.

Как я могу настроить его для автоматического изменения профиля в зависимости от использования канала во входном потоке (ах)? Например, если входные потоки используют только передний левый и передний правый, переключитесь на стереофонический профиль. Если они также используют back-left и back-right, переключитесь на квадрофонический и т. Д.

derobert
источник
3
Может быть, я ошибаюсь, но я не думаю, что это вообще возможно. Pulseaudio управляет несколькими потоками одновременно: какой профиль будет правильным, если разные потоки с разными номерами каналов воспроизводятся вместе?
Алессио Гаэта
@ meden Тот, у кого наибольшее количество каналов.
Дероберт
Да, конечно, но все же будут случаи, когда вы не смогли достичь своей цели. Кстати, я не думаю, что в Pulseaudio есть способ условно переключить профиль. Может быть, руководство Kodi по Pulseaudio [ kodi.wiki/view/PulseAudio] могло бы быть полезным, чтобы получить некоторую подсказку (например, использовать passthrough и позволить вашему приемнику выполнять всю работу при условии, что он поддерживает все форматы, которые вы используете).
Алессио Гаэта
Это интересный вопрос. У меня нет настройки звука, чтобы проверить это, но в качестве обходного пути, если вам нужно было создать профили для каждого предполагаемого экземпляра, настройте сценарий для предварительного анализа потоков (возможно, с помощью вывода результатов mediainfoили ffmpegили или avconv) и затем используйте, pacmdчтобы выбрать соответствующий профиль перед запуском проигрывателя. С логической точки зрения я ожидаю, что он будет работать, если вы проигрываете один звук за раз.
Старейшина Гик
4
Возможно, стоит отправить этот вопрос в виде запроса функции на launchpad.net/bugs/bugtrackers/pulseaudio-bugs, если он еще не был представлен там. Это была бы интересная функция, и импульсный звук мог бы решить эту проблему лучше, чем при использовании внешнего скрипта.
Александр

Ответы:

1

Это просто концепция, а не полное решение:

Вы можете выполнять свою собственную обработку событий, patcl subscribeесли сможете назначать конфигурации клиентам pulsaudio (например, если подключается видеоплеер, вы переключаетесь на конфигурацию 7.1, в противном случае вы используете стереофоническую конфигурацию). Вы получите постоянный поток событий, с patcl subscribeкоторым вы можете справиться, наблюдая за клиентскими подключениями. Затем вы можете просто вызвать pactl / pacmd, чтобы изменить профиль.

Пример вывода подписки на pactl:

$ 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

Обратите внимание, что у вас все еще есть проблема для обработки случаев, когда у вас есть несколько клиентов с разным количеством каналов.

Кроме того, вышеуказанный подход довольно ограничен. Настройки для каждого приложения недостаточны для определения реального количества используемых каналов приложения (например, vlc может воспроизводить видео 5.1 или 7.1). Я не нашел способа получить число фактически используемых каналов в клиенте pulseaudio через pactl, но я мог бы пропустить некоторые варианты здесь. Кроме того, вы также можете подключиться к самому приложению видеоплеера и получить там пропущенные биты.

Тиль Шефер
источник
С pactl list | grep format.channelsвами должна быть возможность узнать макс. Количество используемых каналов (и больше информации). Использование этой информации в сценарии, инициируемом подписанными событиями, может привести к решению.
Ридги