Pulseaudio loopback разгрузить аудио устройства вывода

12

Я пытаюсь выяснить, как выгрузить импульсно-звуковые выходы обратной связи. Я использую pulseaudio для создания петлевого микса, чтобы захватить микрофон и системный звук для потоковой передачи. Каждый раз, когда я запускаю свой скрипт, который имеет этот код:

pactl load-module module-null-sink sink_name=mix 
pactl load-module module-loopback sink=mix
pactl load-module module-loopback sink=mix

avconv ...

pactl unload-module module-loopback

после закрытия он оставляет два устройства вывода. Команда unload-module избавляет от записи, но я не могу найти команду для выходов.

AkBKukU
источник

Ответы:

17

Подходящий способ выгрузки модулей

Выгрузка модуля, загруженного в Pulse Audio, производится по порядковому номеру модуля, который указывается при загрузке:

pactl load-module module-null-sink sink_name=test
24

В приведенном выше примере сервер Pulseaudio загрузил модуль с индексом id 24. Этот модуль может быть выгружен с помощью следующей команды:

pactl unload-module 24

Ваш скрипт должен будет проанализировать вывод pactl.

Если мы не знаем номер модуля, мы можем выполнить следующую команду, которая отобразит номер и имя модуля:

pactl list short modules

Более новые версии также позволяют выгружать по имени:

pactl unload-module <name>

Быстрый и грязный метод

Если pulseaudio установлен как демон, вызывающий автоматически (который должен быть задан по умолчанию), мы можем быстро выгрузить все модули, загруженные после входа в систему, со сбросом сервера PulseAudio для загрузки модулей по умолчанию, определенных в нашем default.pa, запустив:

pulseaudio -k

Это эффективно выгружает все модули из вашего скрипта и загружает приемник по умолчанию для вывода.

Takkat
источник
Стоит отметить, что не все приложения будут восстановлены после обрезания их потоков.
Аурелия
Получите номер модуля по имени приемника: MODULE_NUMBER=$(pacmd list-sinks | grep -E "^\s*name:|^\s*module:" | grep -A 1 -E "^\s*name: <MY-SINK-NAME>" | grep -oP "module: \K[0-9]+")где MY-SINK-NAMEэто то, что он говорит. Держите < >в коде!
KrisWebDev
1
@KrisWebDev: спасибо, добавил строку о том, как получить индексы модулей для более общего подхода.
Таккат
Великая, то это будет выглядеть так : pactl list short modules | grep "sink_name=MY-SINK-NAME" | cut -f1 | xargs -L1 pactl unload-module. Преимущество заключается в удалении ВСЕХ названных модулей MY-SINK-NAME(имена приемников не являются уникальными).
KrisWebDev