LINUX.ORG.RU

Bluetooth наушники и восстановление уровня громкости при переподключении

 , , , ,


2

1

Имеется набор софта в Debian 14

Pipewire 1.6.8
Cinnamon 6.6.9
Blueman-manager 2.4.4
Стандартная крутилка громкости Cinnamon панельки 

Имеется неудобство

  • 1 - изначально системный звук стоит на 50%
  • 2 - при подключении наушников A10S выставляю громкость 15% в крутилке панели
  • 3 - отключаю наушники, звук автоматом выставляется на 50% назад
  • 4 - подключаю наушники с вероятностью 50 на 50 выставляется либо снова 15% либо 82%, а порой просто в 100%

Короче при переподключении наушников, если повезёт громкость восстановится какая была задана, а если не повезёт, «гиперзвук» удаляет по барабанным перепонкам так что как бы не случился инфаркт жопы.

Вопрос, кто из перечисленного набора управляет восстановлением звука? Факт того что иногда-то оно восстанавливает правильно, заставляет думать что стоит копнуть и узнать где ломается, но куда именно копать сходу непонятно.

И да, наушники очень бюджетные, и есть вероятность что это наушники шлют микшеру звука значения от балды, а он просто исполняет.
Если это так, то как дебажить Bluetooth?


Update: Дебажить как минимум отчасти можно через btmon устанавливается в составе пакета bluez


Пока написал костыль, который просто сбрасывает звук на 15% при подключении конкретного устройства Жить можно, но это такое…

#!/usr/bin/env lua
----------------------------------
local device = '41:42:D4:D3:3B:AE'
local volume = 0.15
local connected = false
----------------------------------
while(true) do
    os.execute('sleep 3')
    ---
    local  pipe = io.popen('bluetoothctl devices Connected')
    if not pipe then
       os.execute("notify-send 'Failed get Bluetooth Devices: Exit'")
       os.exit(1)
    end
    ---
    local data = pipe:read('*a')
    pipe:close()
    if not data then
       os.execute("notify-send 'Failed get Bluetooth Devices: Exit'")
       os.exit(1)
    end
    ---
    if data:find(device,1,true) then
       if not connected then
          connected = true
          os.execute("notify-send 'Bluetooth: Set Volume' "..(volume*100).."%")
          local s = os.execute('wpctl set-volume @DEFAULT_AUDIO_SINK@ '..volume)
          if s ~= 0 and s ~= true then
             os.execute("notify-send 'Failed set Bluetooth Volume: Exit'")
             os.exit(1)
          end
       end
   else
       print("Bluetooth: Wait Device "..device)
       connected = false
   end
end

Проверил в Debian 13, такая же херня.


  • Да, пробовал по новой делать сопряжение
  • Да, сбрасывал наушники до заводских настроек
  • Нет, ничего не конфигурировал со звуком в конфигах

Опыта с Bluetooth наушниками мало, судя по поисковикам проблема частая… Но, решения кто в лес кто по дрова.
Или это всё в порядке вещей? :(
Пишу, прежде чем пытаться рыть (если вообще стоит это делать) именно потому что опыта нет, может просто не понимаю что-то.

Всего-то надо восстановить тот общий уровень громкости который был задан 😢, вот с jack наушниками, втык/вытык/втык провод и всегда какой уровень звука был для конкретного вывода, такой и сохраняется. А тут, фигня какая-то происходит.

★★★★★

Последнее исправление: LINUX-ORG-RU (всего исправлений: 3)
Ответ на: комментарий от Infra_HDC

Ручной быдлокодинг, не пользуюсь LLM. Команды выставления звука через вареплумбер в арчвики подглядел

Пока выяснил, с той же вики что проблема может быть в конфликте аппаратного управления громкости в самих наушниках и программной передаче громкости от хоста в наушники, лечится типа через установку конфигурации wireplumber

monitor.bluez.properties = {
  bluez5.enable-hw-volume = false
}

После рестарта вареплумбера, наушники начинают циклично, подключатся и отключаться.
Так что тоже не вариант 😢.

И да у скрипта задержку лучше секунд 4~5 делать, ибо надо выставлять нужные 15% после того как будет выставлена автоматическая громкость от балды, бывает оно выставляется сразу в момент подключения наушников, но бывает спустя секунды. Короче плавающая хрень и всё больше подозрений что сами наушники и система спорят какую мол там громкость то восстанавливать, ту что наушники прислали или ту что в системе сохранилась с прошлого раза. Но это лишь догадки.

LINUX-ORG-RU ★★★★★
() автор топика

По поводу дебага блютуза

Запустил btmon он показывает и события и сырые (вроде) пакеты блутуз данных, если на наушниках прибавлять/убавлять звук то видно что передаётся на ПеКа и от него. Завтра или когда будет время, попробую сопоставить это с изначальной трассировкой блютуза с момента подключения, в теории оно должно где-то по поводу громкости с хостом общаться, хотя возможно как-то по другому… Если это всё вообще имеет смысл, пока непонятно

Uptate: Увидел в логе btmon при подключении наушников вот это

BR-ACL: Handle 21 [41:42:D4:D3:3B:AE] flags 0x02 dlen 19                                                      #1217 [hci0] 915.680390
      Channel: 67 len 15 [PSM 23 mode Basic (0x00)] {chan 3}
      AVCTP Control: Response: type 0x00 label 1 PID 0x110e
        AV/C: Interim: address 0x48 opcode 0x00
          Subunit: Panel
          Opcode: Vendor Dependent
          Company ID: 0x001958
          AVRCP: RegisterNotification pt Single len 0x0002
            EventID: 0x0d (EVENT_VOLUME_CHANGED)
            Volume: 81.89% (104/127)

Если я правильно понял, это наушники гадят, и присылают в систему задание, выставить громкость 81.89% тоесть как в шапке написано ~82%, следовательно и пока предварительно мысли в слух

  • По нормальному это не починить если
    • Нельзя задать в конфигурации blueman или кого-то кто рядом, игнорирования этого дела
    • Можно задать игнорирование, но тогда отвалится управление звука с самих наушников
    • Надо патчить блютуз хост
    • Нельзя повесить хук блютуз событий, который проигнорирует первую установку звука, но не будет трогать последующие тем самым сохраняя регулировку звука с наушников и сохраняя ранюю установку значения громкости на хосте для наушников для последующего его восстановления, после пропуска первого события установки громкости goto again

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

Пока что костыль со скриптом выглядит уже как не совсем уж и плохой вариант. В идеале конечно повесить хук, где-то и всё.

LINUX-ORG-RU ★★★★★
() автор топика
Последнее исправление: LINUX-ORG-RU (всего исправлений: 1)

Решено, через стандартный механизм «решения» этой проблемы, в скобочках, потому что это такой же по сути костыль как и исправление звука скриптом, только там мы сбрасываем звук до нужного, а тут блокируем вообще управление звуком с наушников на хосте, оставляя только саморегулировку громкости самих наушников, изначально упомянуто на арчвики

Но сходу не сработало, как написано в комментарии выше наушники начали циклически перезагружаться, но как оказалось если выставить конфигурацию и перезагрузить всю цепочку, то работает (и надеюсь не отвалится)

1

Выключить наушники убрав их в зарядник

2

bluetoothctl power off
mkdir mkdir ~/.config/wireplumber/wireplumber.conf.d/
vim ~/.config/wireplumber/wireplumber.conf.d/80-bluetooth-disable-hw-volume.conf

3аписываем

monitor.bluez.properties = {
    bluez5.enable-hw-volume = false
}

4

systemctl --user restart wireplumber
bluetoothctl power on

5

Включить наушники

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

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


А так ещё есть теоретические варианты, более близкие к феншую, вешать хук на

  • Lua сприпты Wireplumber (но будет всё равно костыль типа как выше)
  • Написать eBPF фильтр для ядра и перехватывать первое блютуз событие EVENT_VOLUME_CHANGED до Bluez
    • Но как я понял прям напрямую такое нельзя, но изподвыверта можно, что решит проблему универсально и не надо отключать управление громкостью на хосте с наушников.
  • Вроде пишут что через dbus ещё можно, навесив хук, но я не понял куда там тыкать.
  • А, и ещё для Bluez можно вроде сишные плагины писать, там тоже можно по сути дропнуть первый EVENT_VOLUME_CHANGED при подключении устройства в теории.

Оставил это как заметку самому себе, может потом потыкать попробовать. Ну или кто-то захочет, по сути с учётом что проблема встречается вроде как часто из за обилия тонны кривых наушников (к этим по мимо этой проблемы претензий ноль), было бы клёво если бы сама подсистема bluez такое учитывала и давала механизм дропа, а во всяких blueman-namanger была настройка типа Skip first EVENT_VOLUME_CHANGED [on/off] и значение по умолчанию выставлялось в отношении известных идентификаторов кривых, но массово распространённых устройств.

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

Вскрыл наушники, разглядел только A3 на чипе, судя по всему там что-то вроде Bluetrum AB5376A стоит. И в теории можно либо залезть в них по UART и что-то подшаманить по дефолтам, которые там явно как-то прописаны, или достать и видоизменить прошивку выставив тем нужное и залить. Это было бы прям идеально, пофиксить пробелему на cроне самих наушников, заставив их слать первичное выставление громкости при подключении более щадящее, а не 82%.

На правах заметки, может потом эта информация пригодится.

LINUX-ORG-RU ★★★★★
() автор топика
Последнее исправление: LINUX-ORG-RU (всего исправлений: 1)

Блютус наушники капризная штука. На JBL Live 500 обязательно тоже нужно выключать хардварную громкость, и переподключение наушников между компьютером/телефоном тоже требует особенных приседаний, типа отвязать привязать выключить включить, но я уже привык.

Самое тяжёлое, и что я до сих пор не решил, это запретить ему переключаться в режим гарнитуры, когда канал становится в 2 раза меньше, чтобы открыть второй такой же канал под микрофон. Wireplumber очень сложный, и прям неприятно с ним работать, но именно он отвечает за сохранение и восстановление уровней громкости. Там есть конфиг, который по кусочкам собирается по множеству путей, есть скрипты на луа, которые могут использовать этот конфиг, все эти скрипты могут легко крешнуть пламбера, потому что сишный интерфейс совсем без защиты от дурака, и дебажный cli режим бесполезен, потому что даже живой конфиг оттуда не прочитать.

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

В общем каждый раз когда начинаю это всё копать через пару часов бросаю, потому что информации, которую нужно перелопатить какое-то неподъёмное количество. Блютус очень сложный.

neumond ★★
()
  • Markdown
Пустая строка (два раза Enter) начинает новый абзац. Знак '>' в начале абзаца выделяет абзац курсивом цитирования.
Внимание: прочитайте описание разметки Markdown.
Используйте Ctrl-Enter для размещения комментария