LINUX.ORG.RU

Настройка pulseaudio для работы с bluetooth-наушниками

 ,


0

1

Есть ноут с archlinux+i3 на борту.

В общем, пока не было блютус-наушников, всё работало примерно так: по дефолту звук идёт на динамики, если втыкаю проводные уши, звук идёт на уши. У обоих девайсов из коробки различный набор настроек громкости, так что если замутить динамики и воткнуть уши, которые в прошлый раз были включены на полную громкость, звук пойдёт на полную громкость. Синк пульсы выглядит вот так:

$ pactl list sinks
Sink #0
	State: IDLE
	Name: alsa_output.pci-0000_05_00.6.analog-stereo
	Description: Family 17h (Models 10h-1fh) HD Audio Controller Analog Stereo
	Driver: module-alsa-card.c
	Sample Specification: s16le 2ch 44100Hz
	Channel Map: front-left,front-right
	Owner Module: 7
	Mute: no
	Volume: front-left: 65504 / 100% / -0.01 dB,   front-right: 65504 / 100% / -0.01 dB
	        balance 0.00
	Base Volume: 65536 / 100% / 0.00 dB
	Monitor Source: alsa_output.pci-0000_05_00.6.analog-stereo.monitor
	Latency: 100765 usec, configured 100136 usec
	Flags: HARDWARE HW_MUTE_CTRL HW_VOLUME_CTRL DECIBEL_VOLUME LATENCY 
	Properties:
		alsa.resolution_bits = "16"
		device.api = "alsa"
		device.class = "sound"
		alsa.class = "generic"
		alsa.subclass = "generic-mix"
		alsa.name = "ALC257 Analog"
		alsa.id = "ALC257 Analog"
		alsa.subdevice = "0"
		alsa.subdevice_name = "subdevice #0"
		alsa.device = "0"
		alsa.card = "1"
		alsa.card_name = "HD-Audio Generic"
		alsa.long_card_name = "HD-Audio Generic at 0xd05c0000 irq 78"
		alsa.driver_name = "snd_hda_intel"
		device.bus_path = "pci-0000:05:00.6"
		sysfs.path = "/devices/pci0000:00/0000:00:08.1/0000:05:00.6/sound/card1"
		device.bus = "pci"
		device.vendor.id = "1022"
		device.vendor.name = "Advanced Micro Devices, Inc. [AMD]"
		device.product.id = "15e3"
		device.product.name = "Family 17h (Models 10h-1fh) HD Audio Controller"
		device.string = "front:1"
		device.buffering.buffer_size = "17664"
		device.buffering.fragment_size = "2944"
		device.access_mode = "mmap"
		device.profile.name = "analog-stereo"
		device.profile.description = "Analog Stereo"
		device.description = "Family 17h (Models 10h-1fh) HD Audio Controller Analog Stereo"
		alsa.mixer_name = "Realtek ALC257"
		alsa.components = "HDA:10ec0257,17aa5127,00100001"
		module-udev-detect.discovered = "1"
		device.icon_name = "audio-card-pci"
	Ports:
		analog-output-speaker: Speakers (priority: 10000, not available)
		analog-output-headphones: Headphones (priority: 9900, available)
	Active Port: analog-output-headphones
	Formats:
		pcm

В i3blocks висел такой скриптик, которого с одним синком вполне хватало:

#!/bin/bash
vol=$(pactl list sinks | grep "^\sVolume:" | sed "s/^.*\s\([0-9]\+%\).*$/\1/")
mute=$(pactl list sinks | grep "^\sMute:" | sed "s/^.*:\s\([a-z]\+\).*$/\1/")
[ $mute = "no" ] && echo "V: $vol" || echo "V: -"

Потом появились bluetooth-уши. Подключал вроде просто через bluetoothctl, звук появился из коробки. При подключении они зачем-то создают свой синк:

Sink #9
	State: IDLE
	Name: bluez_sink.3B_94_CC_98_2C_0F.a2dp_sink
	Description: T12
	Driver: module-bluez5-device.c
	Sample Specification: s16le 2ch 48000Hz
	Channel Map: front-left,front-right
	Owner Module: 34
	Mute: no
	Volume: front-left: 26204 /  40% / -23.89 dB,   front-right: 26204 /  40% / -23.89 dB
	        balance 0.00
	Base Volume: 65536 / 100% / 0.00 dB
	Monitor Source: bluez_sink.3B_94_CC_98_2C_0F.a2dp_sink.monitor
	Latency: 59641 usec, configured 43666 usec
	Flags: HARDWARE DECIBEL_VOLUME LATENCY 
	Properties:
		bluetooth.protocol = "a2dp_sink"
		device.description = "T12"
		device.string = "3B:94:CC:98:2C:0F"
		device.api = "bluez"
		device.class = "sound"
		device.bus = "bluetooth"
		device.form_factor = "headset"
		bluez.path = "/org/bluez/hci0/dev_3B_94_CC_98_2C_0F"
		bluez.class = "0x240404"
		bluez.alias = "T12"
		device.icon_name = "audio-headset-bluetooth"
		device.intended_roles = "phone"
	Ports:
		headset-output: Headset (priority: 0, available)
	Active Port: headset-output
	Formats:
		pcm

Скрипт ломается, т.к. теперь синка два. Но это ничего, скрипт я поправлю. Что ещё хуже, приложения типа mpv приходится перезапускать, чтобы те начали пускать звук по bt-ушам.

Вопрос: какой кусок софта (bluez, alsa, pulseaudio, …) за автоматическую настройку синков отвечает и что конкретно мне нужно писать в конфигах, чтобы ликвидировать указанную проблему?

Я не очень шарю в пульсе, но по логике это прекратится, если как-то пихнуть уши в качестве порта в нулевой синк, при этом предотвратив создание нового синка. Тогда получится вообще круто, т.к. можно будет указать bt-ушам самый высокий приоритет, чтобы проводные уши и динамики отключались сами.


Вопрос: какой кусок софта (bluez, alsa, pulseaudio, …) за автоматическую настройку синков отвечает и что конкретно мне нужно писать в конфигах, чтобы ликвидировать указанную проблему?

За синки и вывод в них отвечает пульса. Можно попробовать подключить в файл настроек пульсаудио «load-module module-switch-on-connect» (/etc/pulse/default.pa)

Но, на сколько я помню, свежая пульса должна автоматически перекидывать потоки на новую железку с более высоким приоритетом без этого модуля. Под рукой нет подходящей железки для теста.

Еще можно посмотреть на это: https://www.freedesktop.org/wiki/Software/PulseAudio/FAQ/#index40h3

Это старый скрипт для смены карты вывода с перекидыванием текущих потоков. Из него можно слепить подходящий костыль, если больше ничего не поможет (чтобы избежать перезагрузки mpv).

altwazar ★★★ ()
Последнее исправление: altwazar (всего исправлений: 1)
Ответ на: комментарий от altwazar

Хм, вроде модуль работает. Без модуля не перекидывало, хотя пульса должна быть свежая (обновлялся не меньше пары недель назад). Спасибо.

tsmx ()

я написал скрипт, перекидывающий всё по хоткею на нужный синк, типа такого:

ponymix move "$target_sink" --device="$input"

ponymix есть в репах арча, меню можно показать в терминале+fzf. (module-switch-on-connect работает, но иногда мне хочется переключать синки и вручную)

Lrrr ★★★ ()
Последнее исправление: Lrrr (всего исправлений: 1)
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.