Как получить правильные профили Pulseaudio для отображения без перезапуска Pulseaudio?
Иногда микрофон USB-гарнитуры исчезает из списка устройств ввода. Повторное подключение гарнитуры не работает, но убийство Pulseaudio делает:
pulseaudio -k
Когда Pulseaudio запускается обратно, моя USB-гарнитура обнаруживается как под устройствами ввода и вывода, так и работает нормально.
Проблема в том, что при убийстве Pulseaudio также происходит сбой всех приложений, использующих его, или они остаются без звука. Это означает, что мне нужно перезапустить Skype, Steam, XChat, любой запущенный видеоплеер (сбой SMPlayer), любые запущенные игры и т. Д.
Есть ли способ принудительно перезагрузить все устройства, не убивая работающий экземпляр Pulseaudio?
Интересно, что когда я перезапустил Pulseaudio, чтобы моя USB-гарнитура заработала, при повторном подключении гарнитуры будет отображаться только устройство вывода. Мне нужно перезапустить Pulseaudio с подключенной гарнитурой, чтобы устройство ввода появилось.
Изменить: Проверено pavuvontrol
в разделе "Конфигурация":
После перезапуска Pulseaudio в списке появляется дополнительный профиль, оканчивающийся на "+ Digital Stereo Input" (или что-то в этом роде) и выбранный по умолчанию.
1 ответ
Некоторое время я мучился с той же проблемой, и, наконец, у меня появилась возможность взглянуть на нее. Оказывается, у меня работает выгрузка и перезагрузка модуля Pulseaudio, отвечающего за аудиоустройство.
Разгрузка и перезагрузка модуля вручную
В окне терминала введите команду
pacmd list-cards
и на выходе найдите аудиоустройство, в котором отсутствуют профили. Вы, вероятно, получите несколько карт, и вам нужно найти правильную. Моя выглядит так:
[...]
index: 8
name: <alsa_card.usb-Logitech_Logitech_USB_Headset-00-Headset>
driver: <module-alsa-card.c>
owner module: 27
properties:
alsa.card = "1"
alsa.card_name = "Logitech USB Headset"
[... more output ...]
[...]
Из вашего вывода найдите строку "владелец модуля". Это модуль, который вам нужно выгрузить, но сначала вам нужно посмотреть на его параметры, чтобы вы могли перезагрузить его. Введите команду
pacmd list-modules
и найдите модуль, управляющий вашей картой. Опять же, соответствующая часть вывода в моем случае выглядит следующим образом (индекс соответствует модулю владельца из вывода списка карт pacmd):
[...]
index: 27
name: <module-alsa-card>
argument: <device_id="1" name="usb-Logitech_Logitech_USB_Headset-00-Headset" card_name="alsa_card.usb-Logitech_Logitech_USB_Headset-00-Headset" namereg_fail=false tsched=yes fixed_latency_range=no ignore_dB=no deferred_volume=yes use_ucm=yes card_properties="module-udev-detect.discovered=1">
used: 2
load once: no
properties:
[... more output ...]
[...]
Вам понадобится имя модуля и аргументы для его перезагрузки.
Чтобы выгрузить модуль, введите команду (замените индекс модуля соответствующим значением из вашего вывода)
pacmd unload-module module-index
Чтобы перезагрузить модуль после его выгрузки, введите команду
pacmd load-module module-name module-arguments
Замените имя модуля и аргументы модуля значениями из вывода списка модулей pacmd. Оставьте угловые скобки.
Теперь модуль должен быть перезагружен, и, если повезет, ваши профили гарнитуры вернулись.
Применение автоматизации
Вышеперечисленные шаги - большая работа, если вам нужно часто перезагружать ваше устройство, так как индекс модуля постоянно меняется, и вам нужно искать его каждый раз. Я написал сценарий оболочки для себя, чтобы автоматизировать худшее из этого:
#!/bin/bash
if [ -z "$1" ]; then
echo "Pulseaudio has these cards:"
pacmd list-cards | grep 'name: '
exit 0
fi
MODULE_INDEX=`pacmd list-modules | tac | grep -A 10 -e "argument: .*$1" | grep 'index:' | head -n 1 | cut -d ':' -f 2 | tr -d ' '`
MODULE_NAME=`pacmd list-modules | tac | grep -A 10 -e "argument: .*$1" | grep 'name:' | head -n 1 | cut -d ':' -f 2 | tr -d '<>'`
MODULE_ARGUMENTS=`pacmd list-modules | tac | grep -e "argument: .*$1" | head -n 1 | cut -d ':' -f 2 | tr -d '<>'`
echo "Module index is $MODULE_INDEX"
echo "Module name: $MODULE_NAME"
echo "Module args: $MODULE_ARGUMENTS"
if [ -z "$MODULE_INDEX" ]; then echo "Could not find module index"; exit 0; fi
if [ -z "$MODULE_NAME" ]; then echo "Could not find module name"; exit 0; fi
if [ -z "$MODULE_ARGUMENTS" ]; then echo "Could not find module arguments"; exit 0; fi
echo "Unloading module"
pacmd unload-module $MODULE_INDEX
echo ""
echo "Reloading module"
pacmd load-module $MODULE_NAME $MODULE_ARGUMENTS
echo ""
При запуске без аргументов скрипт перечисляет карты, о которых знает Pulseaudio. Когда часть имени карты указана в качестве аргумента, сценарий пытается выгрузить и перезагрузить соответствующий модуль Pulseaudio.