Главная
» PC Советы
»
Создайте скрипт переключения вывода PipeWire, который будет управлять активным звуком.
Создайте скрипт переключения вывода PipeWire, который будет управлять активным звуком.
Для небольшого переключения звука в Debian используйте pactlсервер PipeWire, совместимый с PulseAudio. Приведенный ниже скрипт переключает между двумя именованными выходами, устанавливает новый выход по умолчанию и перемещает уже открытые потоки воспроизведения. Замените имена примеров приемников на точные имена, отображаемые на вашей машине.
1. Подтвердите сервер PipeWire Pulse и найдите свои выходные данные.
Компонент PipeWire pipewire-pulseпредоставляет сервер, совместимый с PulseAudio, поэтому стандартные инструменты, такие как, pactlмогут управлять его приемниками (аудиовыходами). Проверьте, к какому серверу обращается ваш клиент, и перечислите доступные приемники:
pactl info | grep -E 'Server Name|Server Version'
pactl list short sinks
Для этой процедуры в имени сервера должно быть указано PipeWire. Список приемников содержит символические имена, такие как alsa_output.pci-0000_00_1f.3.analog-stereo. Скопируйте точно два имени: по одному для каждого выхода, между которыми вы хотите переключаться. Эти имена специфичны для подключенного оборудования и аудиопрофиля; не копируйте имена из примера и не используйте числовой индекс приемника, который может меняться в течение сеанса.
Если pactlон отсутствует, Debian предоставляет его в pulseaudio-utils. Устанавливайте этот клиентский пакет только при необходимости. Если pactl infoподключение не удается или отображается другой звуковой сервер, сначала убедитесь, что в вашей пользовательской сессии запущена замена PipeWire — PulseAudio; не устанавливайте и не переключайте аудиосерверы вслепую.
Перед заполнением скрипта переключения скопируйте точные символические имена приемников из списка выходных данных в реальном времени.
2. Создайте скрипт переключения.
Создайте папку со скриптами для каждого пользователя и откройте новый файл:
Вставьте этот скрипт, заменив оба значения в SINK_Aи SINK_Bна скопированные вами имена:
#!/usr/bin/env bash
set -euo pipefail
SINK_A='alsa_output.pci-0000_00_1f.3.analog-stereo'
SINK_B='alsa_output.usb-Generic_Headset-00.analog-stereo'
command -v pactl >/dev/null || { echo "pactl is missing" >&2; exit 1; }
server_name=$(pactl info | sed -n 's/^Server Name: //p')
case "$server_name" in
*PipeWire*) ;;
*) echo "pactl is not connected to PipeWire's Pulse server" >&2; exit 1 ;;
esac
sinks=$(pactl list short sinks | awk '{print $2}')
for sink in "$SINK_A" "$SINK_B"; do
if ! grep -Fqx -- "$sink" <<< "$sinks"; then
printf 'Sink not found: %s\n' "$sink" >&2
exit 1
fi
done
current=$(pactl get-default-sink)
if [[ "$current" == "$SINK_A" ]]; then
target=$SINK_B
else
target=$SINK_A
fi
pactl set-default-sink "$target"
while IFS= read -r input_id; do
[[ -n "$input_id" ]] || continue
pactl move-sink-input "$input_id" "$target"
done < <(pactl list short sink-inputs | awk '{print $1}')
printf 'Default output: %s\n' "$target"
Перед внесением каких-либо изменений скрипт проверяет наличие обоих выходов. Он выбирает другой настроенный выход, если текущее значение по умолчанию равно SINK_A; если текущее значение по умолчанию — другой приемник, он начинает с SINK_A. set-default-sinkКоманда влияет на новые потоки, а цикл использует move-sink-inputдля маршрутизации существующих потоков воспроизведения. Если вы хотите, чтобы будущие приложения использовали только новое значение по умолчанию, удалите whileцикл; уже воспроизводимые потоки останутся на своих местах. Запускайте этот скрипт от имени того же пользователя рабочего стола, который является владельцем сессии PipeWire. Не используйте , который может подключаться через другую среду выполнения пользователя и не сможет управлять звуком вашего рабочего стола. Эти операции описаны в руководстве по pactlsudo в Debian .
Присвойте каждой переменной одно из имен приемников, указанных pactl в этой сессии Debian.
3. Сохраните, запустите и проверьте переключение.
Сохраните файл в Nano с помощью клавиши Ctrl+O, нажмите Enter, затем выйдите с помощью Ctrl+X. Отметьте исполняемый файл скрипта и запустите его:
Должно отобразиться новое значение по умолчанию для приемника. Проверьте текущее значение по умолчанию на сервере и все активные потоки воспроизведения:
pactl get-default-sink
pactl list short sink-inputs
Запустите скрипт второй раз, чтобы переключиться обратно. Для практической проверки качества звучания воспроизведите короткий аудиофрагмент во время переключения и убедитесь, что он исходит от выбранного устройства. Точные названия устройств и поведение дисплея зависят от аппаратного обеспечения, состояния Bluetooth-соединения и активных аудиопрофилей.
В скрипте указывается, какой именованный выходной параметр стал новым параметром по умолчанию.Подтвердите выбор приемника по умолчанию и убедитесь, что активный поток направлен на выбранный выход.
Когда в сценарии не происходит переключение звука
«Приемник не найден»: запустите pactl list short sinksеще раз. Возможно, из-за отключения гарнитуры или изменения профиля изменилось имя приемника; обновите соответствующую переменную.
Не удается подключиться: убедитесь, что службы пользователей PipeWire запущены и pactl infoидентифицируют сервер PipeWire Pulse. Пакет pipewire-pulse в Debian предоставляет этот заменяющий сервер, а pulseaudio-utils включает pactlклиент.
Новый аудиопоток перемещается, но текущее приложение остается на месте: перезапустите скрипт, пока этот поток виден в pactl list short sink-inputs. Некоторые приложения повторно открывают потоки или сохраняют свой собственный выбор устройства, поэтому выберите «По умолчанию» в этом приложении, если оно остается привязанным к определенному выходу.
В документации Protocol Pulse для PipeWire объясняется, почему клиенты командной строки PulseAudio могут управлять PipeWire, когда PulseAudio pipewire-pulseявляется активным сервером. Этот скрипт использует этот слой совместимости; он не настраивает аппаратные профили и не гарантирует доступность отключенного устройства.