Создание узлов ALSA с WirePlumber

Вопрос или проблема

Я пытаюсь разобраться в конфигурации 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)

Объяснение скрипта

  1. Функция create_sink: Эта функция позволяет создавать аудиосинк с заданными параметрами, такие как описание устройства, имя узла и параметры ALSA. Она создаёт адаптер, используя указанные свойства.

  2. Создание синков: Вызовы функции create_sink для каждого устройства формируют синки, используя параметры, которые вы предоставили в конфигурации PipeWire.

  3. Динамичность: В отличие от статической конфигурации, WirePlumber позволяет динамически добавлять или убирать устройства в зависимости от их подключения, уменьшая вероятность ошибок при запуске.

Как активировать конфигурацию WirePlumber

Для того чтобы активировать этот скрипт, необходимо сохранить его в виде файла с расширением .lua и указать его в конфигурации WirePlumber. Можно сделать это, добавив ссылку на ваш файл в конфигурационный файл WirePlumber, который может находиться в /etc/xdg/wireplumber/ или в вашем домашнем каталоге.

Заключение

Использование WirePlumber для создания ALSA узлов обеспечивает большую гибкость и устойчивость к изменениям в подключённых устройствах. Перемещение от статической конфигурации PipeWire к динамической конфигурации на основе Lua в WirePlumber значительно улучшает управление мультимедийными потоками. Надеюсь, этот пример поможет вам успешно создать необходимые узлы и адаптировать их к вашим потребностям.

Оцените материал
Добавить комментарий

Капча загружается...