Вопрос или проблема
Я пытаюсь разобраться в конфигурации PipeWire/WirePlumber. У меня уже есть один нерешенный вопрос:
PipeWire не удается создать узлы для всех устройств ALSA
Я выяснил, как обойти эту проблему, создав выходы (Sinks) для всех моих устройств ALSA путем настройки PipeWire. В pipewire.conf
я могу просто добавить в context.objects
:
{ factory = adapter
args = {
factory.name = api.alsa.pcm.sink
node.name = "Yamaha"
node.description = "AV-ресивер Yamaha RX-A760"
media.class = "Audio/Sink"
api.alsa.path = "hdmi:0"
alsa.card = "0"
alsa.device = "3"
audio.channels = 6
}
}
{ factory = adapter
args = {
factory.name = api.alsa.pcm.sink
node.name = "Sony TV"
node.description = "Телевизор Sony Bravia"
media.class = "Audio/Sink"
api.alsa.path = "hdmi:0"
alsa.card = "0"
alsa.device = "7"
audio.channels = 2
}
}
{ factory = adapter
args = {
factory.name = api.alsa.pcm.sink
node.name = "FM 90"
node.description = "FM-передатчик высокой мощности на выходе"
media.class = "Audio/Sink"
api.alsa.path = "hw:0"
alsa.card = "0"
alsa.device = "0"
audio.channels = 2
}
}
{ factory = adapter
args = {
factory.name = api.alsa.pcm.sink
node.name = "FM 107.9"
node.description = "FM-передатчик низкой мощности на USB"
media.class = "Audio/Sink"
api.alsa.path = "hw:1"
alsa.card = "1"
alsa.device = "0"
audio.channels = 2
}
}
И вуаля, у меня есть аудиовыходы. Я могу даже воспроизводить на них музыку. Я довольно доволен.
Но есть одна проблема. Это конфигурация PipeWire, и она чувствительна к USB-устройству, которое я настроил. Я заметил, что если оно не подключено, PipeWire не запускается, выдает ошибку.
Мне кажется, что WirePlumber — это место, где следует выполнять такую настройку, так как он более отзывчив к доступности USB-устройств. Я понимаю, что он настраивается с помощью Lua-скриптов, но мне не удалось найти базовый пример того, как создать аудиовыход ALSA с помощью WirePlumber.
Мне интересно, как вышеуказанная конфигурация будет выглядеть как Lua-скрипт для WirePlumber?
Ответ или решение
Создание узлов ALSA с помощью WirePlumber: полное руководство
WirePlumber — это управляемый средой выполнения PipeWire, который позволяет гибко настраивать и управлять потоками мультимедиа, включая создание и управление аудиоузлами. Одной из ключевых задач при использовании WirePlumber является создание аудиовыходов (или «синков») для ALSA-устройств на основе конфигурации ваших аудиоустройств, как это было сделано в примере конфигурации PipeWire.
Зачем использовать WirePlumber?
WirePlumber позволяет более динамично управлять мультимедийными узлами, адаптируя их к изменяющимся условиям, таким как подключение и отключение USB-устройств. Это дает преимущества по сравнению с статической конфигурацией в PipeWire, где, как вы упомянули, могут возникать ошибки при отсутствии определенных устройств.
Пример создания аудиосинков ALSA с помощью WirePlumber
Ниже приведён пример скрипта на Lua, который соответствует вашей конфигурации PipeWire, превращая её в скрипт для WirePlumber.
-- Основной блок, создающий ALSA-синк
function create_sink(description, node_name, alsa_path, card, device, channels)
local props = {
["node.name"] = node_name,
["node.description"] = description,
["media.class"] = "Audio/Sink",
["api.alsa.path"] = alsa_path,
["alsa.card"] = card,
["alsa.device"] = device,
["audio.channels"] = channels,
}
-- Создаем адаптер для ALSA
local adapter = pw.create_factory("adapter", props)
return adapter
end
-- Создаем аудиосинк для Yamaha RX-A760
create_sink("Yamaha RX-A760 AV Receiver", "Yamaha", "hdmi:0", "0", "3", 6)
-- Создаем аудиосинк для Sony Bravia TV
create_sink("Sony Bravia Television", "Sony TV", "hdmi:0", "0", "7", 2)
-- Создаем аудиосинк для FM 90
create_sink("High Power FM Transmitter on Line Out", "FM 90", "hw:0", "0", "0", 2)
-- Создаем аудиосинк для FM 107.9
create_sink("Low Power FM Transmitter on USB", "FM 107.9", "hw:1", "1", "0", 2)
Объяснение скрипта
-
Функция create_sink: Эта функция позволяет создавать аудиосинк с заданными параметрами, такие как описание устройства, имя узла и параметры ALSA. Она создаёт адаптер, используя указанные свойства.
-
Создание синков: Вызовы функции create_sink для каждого устройства формируют синки, используя параметры, которые вы предоставили в конфигурации PipeWire.
-
Динамичность: В отличие от статической конфигурации, WirePlumber позволяет динамически добавлять или убирать устройства в зависимости от их подключения, уменьшая вероятность ошибок при запуске.
Как активировать конфигурацию WirePlumber
Для того чтобы активировать этот скрипт, необходимо сохранить его в виде файла с расширением .lua
и указать его в конфигурации WirePlumber. Можно сделать это, добавив ссылку на ваш файл в конфигурационный файл WirePlumber, который может находиться в /etc/xdg/wireplumber/
или в вашем домашнем каталоге.
Заключение
Использование WirePlumber для создания ALSA узлов обеспечивает большую гибкость и устойчивость к изменениям в подключённых устройствах. Перемещение от статической конфигурации PipeWire к динамической конфигурации на основе Lua в WirePlumber значительно улучшает управление мультимедийными потоками. Надеюсь, этот пример поможет вам успешно создать необходимые узлы и адаптировать их к вашим потребностям.