Ви під’єднуєте гарнітуру. Вона підключається. Музика грає. Потім ви відкриваєте додаток для зустрічі й список мікрофонів виглядає ніби привид.
Або навпаки: мікрофон працює, але «High Fidelity (A2DP)» зник, і ви залишилися з телефонною якістю звуку, ніби його пропускають через факс.
Це не помилка користувача. Це заплутане перетинання Bluetooth-профілів, кодеків, драйверів ядра, BlueZ і того аудіосервера, який у вас запущений сьогодні.
Секрет у тому, щоб перестати сприймати «Bluetooth-аудіо» як одну річ. Це кілька взаємовиключних режимів із різними шляхами транспорту й політикою.
Ментальна модель: профілі, ролі та чому опції зникають
Коли люди кажуть «моя Bluetooth-гарнітура», вони зазвичай мають на увазі «малий комп’ютер, який може говорити кількома Bluetooth-діалектами, іноді одночасно, часто з перебоями».
Ваша ОС тоді обирає, який діалект використовувати, виходячи з того, що, на її думку, вам потрібно: високоякісний вихід, двосторонній звук, економія енергії або «щоб сьогодні нічого не падало».
Дві ключові істини
-
Високоякісне стерео відтворення (A2DP) і мікрофон гарнітури (HSP/HFP) зазвичай — різні профілі.
Багато гарнітур не можуть одночасно забезпечити високоякісний стерео вихід і вхід мікрофона через класичний Bluetooth. -
Вибір профілю — це політика, а не фатальна випадковість.
Щось у вашій системі (BlueZ + аудіосервер + демон політики) вирішує, який профіль активувати.
Якщо ця політика ламана, опції зникають з інтерфейсу, ніби їх ніколи не було.
Що зазвичай означає «зникло»
«Відсутній A2DP» або «відсутній мікрофон» рідко означає, що у гарнітури немає цієї функції. Частіше:
- профіль не виставлено, бо в аудіостеку відсутній модуль/плагін кодека;
- демон Bluetooth запущено, але аудіосервер не погодив профіль;
- проблеми з прошивкою/драйвером перешкоджають створенню транспорту (ви бачите підключення, але аудіоточок не працює);
- політика зафіксувала неправильний профіль, бо якийсь додаток колись запросив мікрофон;
- підтримка hands-free присутня, але відключена через відсутність бекенду телефонії (поширено в Linux).
Цитата, яку варто повісити на стіну кожному, хто це дебажить:
«Сподівання — не стратегія.»
— генерал Гордон Р. Салліван
Ваше завдання тут: замінити надію на відтворювану діагностику.
Цікаві факти & коротка історія (що насправді допомагає в діагностиці)
- A2DP з’явився, щоб стандартизувати стерео-аудіо. Раннє Bluetooth-аудіо було здебільшого орієнтоване на телефонні гарнітури; підтримка «музики» з’явилася пізніше, і це видно в сучасному розриві функцій.
- SBC є обов’язковим для A2DP, а не «кращим кодеком». Якщо ви отримуєте SBC, це може бути просто єдиний спільний кодек, погоджений сторонами — не доказ того, що ваша система «низької якості».
- HSP/HFP були спроєктовані для вузькосмугової голосової передачі. «Шлях для гарнітури» історично припускав приблизно 8 кГц голосу. Широкосмугова мова з’явилася пізніше і досі нерівномірно підтримується пристроями.
- Bluetooth-аудіо в Linux раніше було функцією PulseAudio, нашитою поверх BlueZ. Старі налаштування використовували окремі модулі; сучасні покладаються на PipeWire/WirePlumber та SPA-плагіни.
- BlueZ навмисно уникає ролі «аудіосервера». Він дає Bluetooth-елементи; ваш аудіосервер обирає профілі, кодеки та маршрути.
- mSBC (широкосмуговий) для HFP — це поле перемовин з підводними каменями. Деякі гарнітури заявляють підтримку, а потім некоректно поводяться. Результат: «мікрофон зник» або «підключено, але немає звуку».
- LE Audio (LC3) — це новий світ, а не латка. Він змінює транспорт і можливості. На Linux підтримка швидко покращується, але не очікуйте єдиної підтримки по всіх дистрибутивах та ядрах ще.
- Деякі USB Bluetooth-адаптери постачаються з погано протестованими комбінаціями прошивки. Та сама сім’я чипсетів може поводитися по-різному в різних версіях прошивки; «працює на моєму ноуті» — не гарантія.
Жарт №1: Bluetooth — єдина радіотехнологія, яку можуть блокувати людське тіло і корпоративна політика одночасно.
Швидкий план діагностики: перевірте по черзі
Коли опції відсутні, вам хочеться швидко знайти вузьке місце: апарат/драйвер, демон Bluetooth, аудіосервер або політика.
Робіть ці кроки в порядку. Не імпровізуйте.
Перший крок: підтвердіть, що ОС бачить контролер і він у нормі
- Якщо контролер заблокований, жодні профілі не матимуть значення.
- Якщо прошивка не завантажується, ви отримаєте ненадійні з’єднання й відсутні кінцеві аудіоточники.
Другий крок: підтвердіть, що BlueZ бачить сервіси гарнітури
- Ви шукаєте рекламовані UUID, що відповідають аудіопрофілям.
- Якщо гарнітура не рекламує HFP/HSP, ви не отримаєте мікрофонний профіль (окрім LE Audio, що окрема історія).
Третій крок: підтвердіть, що аудіосервер запущений і має підтримку Bluetooth
- PipeWire потребує свого SPA-плагіна для Bluetooth; PulseAudio — своїх Bluetooth-модулів.
- WirePlumber (або інший менеджер сесій) приймає політичні рішення, що приховують/показують профілі.
Четвертий крок: перевірте погоджений профіль і чому його обрали
- Якщо у вас A2DP, але немає мікрофона: ви в музичному профілі.
- Якщо мікрофон є, але немає A2DP: ймовірно, активований HSP/HFP (або політика зафіксувала вас там).
- Якщо немає ні того, ні того: збій при створенні транспортів або відсутність плагінів.
П’ятий крок: шукайте помилки кодеків і транспорту в логах
- Помилки, що згадують SBC/aptX/LDAC або «transport acquire», вказують на інтеграцію аудіостека.
- Помилки з HCI timeouts вказують на проблеми з контролером/прошивкою/радіо.
Реальність профілів: A2DP vs HSP/HFP vs LE Audio (і що «мікрофон» насправді означає)
A2DP (Advanced Audio Distribution Profile)
A2DP — це для високоякісного стерео-виходу. Подумайте про музику, відео, системні звуки.
Він не призначений для перенесення мікрофонного вхідного сигналу у класичному розумінні.
Тож коли в інтерфейсі видно «A2DP Sink» і ви питаєте, куди подівся мікрофон: його там ніколи й не було.
A2DP зазвичай працює з кодеками на кшталт SBC (базовий) і опціонально AAC, aptX, aptX HD, LDAC та іншими залежно від пристрою й підтримки стека.
Доступність кодека впливає на якість і затримку, але не додає підтримки мікрофона.
HSP/HFP (Headset Profile / Hands-Free Profile)
HSP/HFP призначені для двостороннього голосового зв’язку. Саме тут у більшості класичних Bluetooth-гарнітур з’являється мікрофон.
Вартість: якість виходу зазвичай падає до моно, вузькосмугової та сильніших стиснень. Широкосмуг (mSBC) іноді покращує ситуацію.
Якщо ваш додаток для зустрічей потребує мікрофона, система може автоматично переключити гарнітуру в HFP.
Це не зловмисність. Це єдиний спосіб отримати вхід мікрофона на класичному Bluetooth для багатьох гарнітур.
Причина, чому опція «A2DP» зникає, — система не може одночасно використовувати обидва режими так, як ви очікуєте.
LE Audio (LC3) і чому це змінює дискусію
LE Audio покликаний підтримувати гнучкіші аудіопотоки, кращу ефективність і сучасні кодеки (LC3).
Він може покращити двосторонній аудіодосвід, але потрібна підтримка на всіх рівнях:
контролер, ядро, BlueZ, аудіосервер і прошивка гарнітури. Хоча б одна слабка ланка — і ви повертаєтеся до класичних профілів.
Чому інтерфейс трохи бреше
Десктопні аудіо-інтерфейси часто подають профілі як «режими якості», але це насправді різні сервіси з різними транспортними шляхами.
Деякі інтерфейси ховають профілі, що не активувалися, що створює враження, ніби гарнітура «не підтримує» їх.
Можливо, підтримує. Але ваш стек — ні.
Жарт №2: Профіль «Hands-Free» названий так для водіїв, бо ваші руки будуть дуже зайняті його лагодженням.
Linux-аудіостеки: PulseAudio vs PipeWire vs WirePlumber (хто керує)
На сучасних Linux-десктопах зазвичай є:
- BlueZ для керування Bluetooth-пристроями та транспортними кінцевими точками.
- PipeWire як аудіо-двигун (часто замінює PulseAudio і іноді JACK-маршрутизацію).
- WirePlumber (або інший менеджер сесій) для застосування політики: який пристрій, який профіль, які маршрути.
У старіших налаштуваннях ви можете мати:
- PulseAudio як аудіо-двигун з Bluetooth-модулями.
- Додаткові інтеграційні елементи, що відрізняються між дистрибутивами.
Чому це важливо
Відсутність профілів часто спричинена тим, що неправильний компонент приймає рішення:
BlueZ бачить пристрій, але PipeWire не завантажує Bluetooth-плагін; або WirePlumber блокує HFP, бо не знаходить бекенд телефонії; або у PulseAudio відсутній потрібний модуль.
Політика — місце, де «раніше працювало» помирає
Демони політики запам’ятовують уподобання, реагують на відкриття додатками потоків вводу і намагаються зберегти стабільність.
Стабільність — це добре. Але стабільність також може означати «застрягло».
Коли система фіксує гарнітуру в HFP, бо браузер колись запросив мікрофон, вона просто виконує інструкцію.
Практичні завдання (команди, що означає вивід, та подальші дії)
Команди нижче припускають Linux-систему з systemd. Підлаштуйте імена сервісів під ваш дистроїт.
Кожне завдання включає: команду, інтерпретацію виводу та рішення.
Завдання 1: Перевірити, чи Bluetooth заблоковано (rfkill)
cr0x@server:~$ rfkill list
0: hci0: Bluetooth
Soft blocked: no
Hard blocked: no
Значення: Якщо будь-який блок показує «yes», контролер може існувати, але не працюватиме.
Рішення: Якщо soft blocked, розблокуйте. Якщо hard blocked, перевірте апаратний перемикач BIOS або клавішу на ноутбуку.
Завдання 2: Перевірити, що контролер увімкнений (bluetoothctl)
cr0x@server:~$ bluetoothctl show
Controller 24:EE:9A:12:34:56 (public)
Name: cr0x-laptop
Powered: yes
Discoverable: no
Pairable: yes
Значення: «Powered: yes» — базова умова. Якщо «Powered: no», інші кроки не мають значення.
Рішення: Якщо powered — no, виконайте bluetoothctl power on і перевірте, чому він був вимкнений (політика, енергозбереження).
Завдання 3: Підтвердити, що ядро бачить HCI і драйвери завантажено
cr0x@server:~$ lsmod | grep -E 'btusb|bluetooth'
btusb 69632 0
bluetooth 851968 22 btrtl,btintel,btbcm,btusb
Значення: Для USB-контролерів зазвичай потрібен btusb. Відсутні модулі можуть означати, що донгл не підтримується або заблокований.
Рішення: Якщо нічого не показано, впевніться, що пристрій є в USB/PCI і що модулі ядра не в чорному списку.
Завдання 4: Перевірити на помилки прошивки/драйвера в dmesg
cr0x@server:~$ dmesg -T | grep -iE 'bluetooth|btusb|firmware' | tail -n 20
[Tue Feb 4 10:12:21 2026] Bluetooth: hci0: Firmware revision 0x2b
[Tue Feb 4 10:12:21 2026] Bluetooth: hci0: Found device firmware: intel/ibt-20-1-3.sfi
[Tue Feb 4 10:12:22 2026] Bluetooth: hci0: Malformed MSFT vendor event: 0x02
Значення: Знайдена прошивка — добре. Повторювані таймаути, «failed to load firmware» або HCI reset вказують на проблеми з контролером/прошивкою.
Рішення: Якщо прошивка відсутня, встановіть пакет прошивки для вашого дистроюта. Якщо таймаути повторюються, спробуйте інший донгл або оновіть ядро/прошивку.
Завдання 5: Перевірити стан служби BlueZ
cr0x@server:~$ systemctl status bluetooth --no-pager
● bluetooth.service - Bluetooth service
Loaded: loaded (/usr/lib/systemd/system/bluetooth.service; enabled)
Active: active (running)
Docs: man:bluetoothd(8)
Main PID: 842 (bluetoothd)
Значення: Якщо не активна, парування може «нібито» працювати через кеш, але аудіо кінцеві точки не працюватимуть коректно.
Рішення: Якщо служба впала, перевірте логи і перезапустіть; виправте конфіг або відсутні залежності.
Завдання 6: Переглянути логи BlueZ на предмет помилок профілю/транспорту
cr0x@server:~$ journalctl -u bluetooth -b --no-pager | tail -n 40
Feb 04 10:21:08 cr0x-laptop bluetoothd[842]: Endpoint registered: sender=:1.62 path=/MediaEndpoint/A2DPSink/sbc
Feb 04 10:21:08 cr0x-laptop bluetoothd[842]: Endpoint registered: sender=:1.62 path=/MediaEndpoint/A2DPSink/aac
Feb 04 10:22:11 cr0x-laptop bluetoothd[842]: src/service.c:btd_service_connect() a2dp-sink profile connect failed for 88:C9:E8:AA:BB:CC: Protocol not available
Значення: «Endpoint registered» свідчить, що аудіосервер зареєстрував A2DP-ендпоїнти в BlueZ. «Protocol not available» зазвичай означає відсутність підтримки транспорту або збій у перемовинах.
Рішення: Якщо ендпоїнти ніколи не реєструються, зосередьтеся на інтеграції PipeWire/PulseAudio з Bluetooth. Якщо підключення не вдається, перевіряйте невідповідність кодеків/профілів або політику.
Завдання 7: Переконатися, що PipeWire запущено (поширено на сучасних десктопах)
cr0x@server:~$ systemctl --user status pipewire --no-pager
● pipewire.service - PipeWire Multimedia Service
Loaded: loaded (/usr/lib/systemd/user/pipewire.service; enabled)
Active: active (running)
Значення: Якщо PipeWire не запущено, інтерфейс профілів буде пустим або оманливим.
Рішення: Запустіть/увімкніть його, або якщо ви навмисно використовуєте PulseAudio, переконайтеся, що PulseAudio запущено і PipeWire не напіввстановлений.
Завдання 8: Переконатися, що WirePlumber запущено (двигун політики)
cr0x@server:~$ systemctl --user status wireplumber --no-pager
● wireplumber.service - Multimedia Service Session Manager
Loaded: loaded (/usr/lib/systemd/user/wireplumber.service; enabled)
Active: active (running)
Значення: Без менеджера сесій пристрої можуть з’являтися, але не маршрутизуватися й не мати застосованих профілів.
Рішення: Якщо неактивний, запустіть його; якщо ви використовуєте альтернативний менеджер сесій, підтвердіть, що він встановлений і налаштований.
Завдання 9: Перелічити аудіопристрої PipeWire і подивитися доступні профілі
cr0x@server:~$ wpctl status
PipeWire 'pipewire-0' [1.2.7, cr0x@server, cookie:123456]
└─ Clients:
34. WirePlumber [1.2.7]
Audio
├─ Devices:
│ 52. Bluetooth Headset [bluez5]
├─ Sinks:
│ 78. Bluetooth Headset [vol: 0.62]
├─ Sources:
│ 81. Bluetooth Headset [vol: 1.00]
Значення: Наявність пристрою — добре. Якщо пристрій є, але джерело відсутнє, шлях мікрофона не створено (ймовірно, HFP/HSP не активовано або заблоковано).
Рішення: Якщо є лише sink, перевірте, чи HFP вимкнено або не підтримується. Якщо ні того, ні того — BlueZ підключено, але PipeWire не створив вузли.
Завдання 10: Переглянути деталі пристрою щодо стану профілю
cr0x@server:~$ wpctl inspect 52 | sed -n '1,120p'
id 52, type PipeWire:Interface:Device
media.class = "Audio/Device"
device.name = "bluez_card.88_C9_E8_AA_BB_CC"
device.description = "Bluetooth Headset"
bluez5.profile = "a2dp-sink"
bluez5.address = "88:C9:E8:AA:BB:CC"
Значення: Ви явно в a2dp-sink. Ось чому мікрофон може бути відсутній або недоступний.
Рішення: Якщо вам потрібен мікрофон, переключіться на профіль HFP/HSP (якщо доступний) або використайте окремий мікрофон.
Завдання 11: Переключити профілі (PipeWire/WirePlumber)
cr0x@server:~$ wpctl set-profile 52 handsfree-head-unit
Profile set
Значення: Якщо команда вдалась, ви повинні побачити появу вузла джерела і зникнення або погіршення A2DP.
Рішення: Якщо невдача, профіль недоступний; підтвердіть, що гарнітура рекламує HFP/HSP і ваш стек його підтримує.
Завдання 12: Перевірити доступні системі профілі
cr0x@server:~$ pactl list cards short
52 bluez_card.88_C9_E8_AA_BB_CC module-bluez5-device.c
Значення: Навіть у системах з PipeWire інструменти сумісності PulseAudio можуть показувати карти.
Рішення: Використайте цю назву карти для запитів профілів і портів через pactl list card.
Завдання 13: Перелічити профілі карти (що реально вибирається)
cr0x@server:~$ pactl list card bluez_card.88_C9_E8_AA_BB_CC | sed -n '/Profiles:/,/Active Profile:/p'
Profiles:
a2dp-sink: High Fidelity Playback (A2DP Sink) (sinks: 1, sources: 0, priority: 40, available: yes)
headset-head-unit: Headset Head Unit (HSP/HFP) (sinks: 1, sources: 1, priority: 30, available: yes)
Active Profile: a2dp-sink
Значення: Це ключовий момент. Він показує, чи система вважає, що HSP/HFP існує.
Рішення: Якщо HSP/HFP показує «available: no», гарнітура може не рекламувати його, політика його відключила або бекенд відсутній.
Завдання 14: Переключити профіль за допомогою pactl (працює через сумісність PipeWire-Pulse теж)
cr0x@server:~$ pactl set-card-profile bluez_card.88_C9_E8_AA_BB_CC headset-head-unit
Значення: Якщо після цього з’явиться мікрофон, «відсутній мікрофон» був просто «не той профіль».
Рішення: Вирішіть, чи приймаєте ви якість гарнітури під час дзвінків. Якщо ні — використовуйте окремий мікрофон і залишайте A2DP.
Завдання 15: Перевірити, чи гарнітура рекламує правильні UUID (bluetoothctl)
cr0x@server:~$ bluetoothctl info 88:C9:E8:AA:BB:CC
Device 88:C9:E8:AA:BB:CC (public)
Name: Bluetooth Headset
Paired: yes
Trusted: yes
Connected: yes
UUID: Audio Sink (0000110b-0000-1000-8000-00805f9b34fb)
UUID: Handsfree (0000111e-0000-1000-8000-00805f9b34fb)
UUID: AV Remote Control (0000110e-0000-1000-8000-00805f9b34fb)
Значення: «Audio Sink» відповідатиме A2DP. «Handsfree» — HFP. Якщо Handsfree/Headset UUID відсутні, мікрофонний профіль може ніколи не з’явитися.
Рішення: Якщо UUID відсутні, не звинувачуйте Linux — перевірте режим гарнітури (деякі мають перемикачі «геймінг» vs «телефон») або особливості виробника.
Завдання 16: Скинути ненадійне парування (видалити й знову пару чисто)
cr0x@server:~$ bluetoothctl
[bluetooth]# disconnect 88:C9:E8:AA:BB:CC
Successful disconnected
[bluetooth]# remove 88:C9:E8:AA:BB:CC
Device has been removed
[bluetooth]# scan on
Discovery started
[bluetooth]# pair 88:C9:E8:AA:BB:CC
Pairing successful
[bluetooth]# trust 88:C9:E8:AA:BB:CC
Changing 88:C9:E8:AA:BB:CC trust succeeded
[bluetooth]# connect 88:C9:E8:AA:BB:CC
Connection successful
Значення: Це очищає старі кешовані сервіси і може виправити випадки, коли «профіль зник після оновлення».
Рішення: Якщо повторне парування відновлює профілі, проблема була у корупції стану або застарілому виявленні сервісів, а не у відсутньому драйвері.
Завдання 17: Дивитися логи в реальному часі під час перемикання профілів
cr0x@server:~$ journalctl --user -u pipewire -u wireplumber -f
Feb 04 10:31:42 cr0x-laptop wireplumber[1290]: bluez5: activating profile headset-head-unit
Feb 04 10:31:42 cr0x-laptop pipewire[1210]: bluez5-device: transport acquire 88:C9:E8:AA:BB:CC
Feb 04 10:31:42 cr0x-laptop pipewire[1210]: spa.bluez5: Failed to set codec configuration: Not supported
Значення: «Failed to set codec configuration» часто означає, що гарнітура та стек не погодили голосовий кодек (mSBC vs CVSD) або можливості неправильно повідомлені.
Рішення: Примусово оберіть простіший кодек, якщо можливо (відключити mSBC у конфігурації), або оновіть BlueZ/PipeWire, або прийміть, що HFP цієї гарнітури на цьому стеку не працює.
Завдання 18: Перевірити, що не запущено конфліктні аудіосервери
cr0x@server:~$ ps -ef | grep -E 'pipewire|pulseaudio' | grep -v grep
cr0x 1210 1090 0 10:18 ? 00:00:02 /usr/bin/pipewire
cr0x 1211 1090 0 10:18 ? 00:00:01 /usr/bin/pipewire-pulse
Значення: Це нормально для налаштувань з PipeWire (PipeWire надає сумісність PulseAudio).
Якщо ви також бачите окремий демон pulseaudio, може початися «третя війна».
Рішення: Виберіть один стек. Не запускайте обидва, якщо не любите діагностувати фантомні пристрої.
Завдання 19: Перевірити Bluetooth-модулі PulseAudio (для старих систем)
cr0x@server:~$ pactl list modules short | grep -E 'bluez|bluetooth'
28 module-bluetooth-policy
29 module-bluetooth-discover
Значення: Якщо ці модулі не завантажені, ви можете отримати парування, але без аудіокарт/профілів.
Рішення: Завантажте їх (тимчасово) або виправте конфіг PulseAudio, щоб завантажувати їх при старті.
Завдання 20: Перевірити підказки щодо доступності кодеків (властивості PipeWire)
cr0x@server:~$ wpctl inspect 52 | grep -iE 'a2dp|codec|bluez5'
bluez5.profile = "handsfree-head-unit"
bluez5.codec = "CVSD"
Значення: Побачити CVSD означає, що ви в голосовому профілі з базовим кодеком. Це не «погано», це «очікувано».
Рішення: Якщо mSBC ламає дзвінки, віддавайте перевагу стабільності CVSD. Якість без надійного з’єднання марна.
Завдання 21: Перевірити стан енергоменеджменту Bluetooth-адаптера (поширене джерело глюків)
cr0x@server:~$ cat /sys/module/bluetooth/parameters/disable_ertm
N
Значення: Деякі пристрої мають проблеми з певними режимами зв’язку; параметри на кшталт ERTM можуть впливати на стабільність (залежно від ядра/версії).
Рішення: Не міняйте параметри ядра навмання. Змінюйте лише якщо можете відтворити проблему і повернути назад, бажано в контрольованому середовищі.
Завдання 22: Перевірити, що ALSA не є вузьким місцем (для не-Bluetooth мікрофонів)
cr0x@server:~$ arecord -l
**** List of CAPTURE Hardware Devices ****
card 2: Webcam [USB Webcam], device 0: USB Audio [USB Audio]
Subdevices: 1/1
Subdevice #0: subdevice #0
Значення: Якщо мікрофон гарнітури ненадійний, використання окремого USB-мікрофона/мікрофона вебкамери може бути практичним обхідним шляхом.
Рішення: На зустрічах віддавайте пріоритет надійності: залишайте A2DP для виходу і використовуйте окремий пристрій захоплення.
Типові помилки: симптом → корінна причина → виправлення
1) Симптом: «A2DP зник; показується тільки Headset/HFP»
- Корінна причина: Якийсь додаток відкрив потік вводу, політика переключила на HFP і залишилася в цьому режимі.
- Виправлення: Переключіть профіль назад на A2DP за допомогою
wpctl set-profileабоpactl set-card-profile. Потім відмовте в доступі до мікрофона додаткам, яким він не потрібен.
2) Симптом: «Опція мікрофона зовсім відсутня»
- Корінна причина: Гарнітура не рекламує UUID HSP/HFP в поточному режимі, або бекенд HFP відключено в вашому стеку.
- Виправлення: Перевірте UUID за допомогою
bluetoothctl info. Якщо їх немає — змініть режим/прошивку гарнітури. Якщо є — перевірте конфіг PipeWire/WirePlumber на предмет включення HFP.
3) Симптом: «Підключено, але немає звуку через A2DP»
- Корінна причина: Не вдається отримати транспорт; невідповідність переговорів кодека; або аудіосервер не зареєстрував ендпоїнти в BlueZ.
- Виправлення: Перегляньте
journalctl -u bluetoothі логи PipeWire. Підтвердіть реєстрацію ендпоїнтів. Спробуйте переключитися на інший кодек (чи повернутися до SBC) і повторно з’єднатися/перепарувати.
4) Симптом: «Звук працює, мікрофон працює, але якість жахлива»
- Корінна причина: Голосовий кодек HSP/HFP (CVSD) вузькосмуговий за дизайном, а вихід часто монофоничний.
- Виправлення: Використовуйте A2DP для виходу і окремий мікрофон; або спробуйте широку смугу (mSBC), якщо стабільно; або перейдіть на LE Audio-обладнання від кінця до кінця.
5) Симптом: «Перемикання профілю не вдається: Not supported / Protocol not available»
- Корінна причина: Відсутній плагін/модуль Bluetooth-аудіо або невідповідність версій між BlueZ та аудіосервером.
- Виправлення: Переконайтеся, що встановлено SPA-плагін Bluetooth для PipeWire; підтвердіть роботу служб; оновіть до сумісного набору (ядро/BlueZ/PipeWire). Перезавантажте, якщо компоненти оновлювалися під час сесії.
6) Симптом: «Після перезавантаження працює, після сну ламається»
- Корінна причина: Баги управління живленням контролера; гонка при повторному підключенні; застарілий стан транспорту.
- Виправлення: Перезапускайте користувацькі аудіосервіси (
systemctl --user restart pipewire wireplumber) і переключайте Bluetooth. Якщо трапляється часто — спробуйте новіше ядро/прошивку або інший адаптер.
7) Симптом: «Гарнітура підключається до ноутбука, але мікрофон ніколи не з’являється в додатках для зустрічей»
- Корінна причина: Пескодавлення дозволів додатка або налаштувань порталу; джерело існує, але не вибране; або додаток у деяких режимах показує лише ALSA-пристрої.
- Виправлення: Перевірте існування джерела за допомогою
wpctl status. Виберіть його явно в додатку. Перевірте запити на дозвіл і налаштування.
Чеклісти / покроковий план
Чекліст A: «Мені потрібен A2DP для музики і мікрофон гарнітури не важливий»
- Встановіть профіль A2DP:
pactl set-card-profile ... a2dp-sink. - Виберіть окремий мікрофон: мікрофон вебкамери або USB-мікрофон; підтвердіть через
arecord -l. - У додатках для зустрічей явно виберіть окремий мікрофон.
- Відкличте дозвіл на мікрофон для випадкових вкладок браузера та «корисних» чат-додатків.
Суб’єктивна порада: це найнадійніша конфігурація для робочих дзвінків на класичному Bluetooth сьогодні.
Це не елегантно. Це стабільно.
Чекліст B: «Мені потрібен мікрофон гарнітури для дзвінків, погоджуюся на нижчу якість виходу»
- Підтвердіть, що гарнітура рекламує Handsfree/Headset UUID через
bluetoothctl info. - Переключіться на режим гарнітури:
wpctl set-profile ... handsfree-head-unit. - Дивіться логи під час перемикання; якщо з’являються помилки кодека, віддавайте перевагу стабільності CVSD над mSBC.
- Спочатку протестуйте в простому рекордері (не в браузері), щоб ізолювати проблеми додатка.
Чекліст C: «Профілі пропали; потрібно їх повернути»
- Перевірте стан контролера:
rfkill list,bluetoothctl show, рядки прошивки вdmesg. - Перевірте стан BlueZ і логи:
systemctl status bluetooth,journalctl -u bluetooth. - Перевірте аудіосервіси:
systemctl --user status pipewire wireplumber. - Перевірте профілі карти:
pactl list card .... - Видаліть і повторно спарьте пристрій, щоб оновити виявлення сервісів.
Чекліст D: «Працює на одному ноутбуці, не працює на іншому»
- Порівняйте версії ядра та BlueZ (важливі ті самі мажорні версії).
- Порівняйте версії PipeWire/WirePlumber і чи встановлені Bluetooth-плагіни.
- Порівняйте Bluetooth-адаптер (вбудований vs донгл) та логи прошивки.
- Не ігноруйте радіооточення: порти USB 3 і інтерференція на 2.4 ГГц можуть погіршувати стабільність.
Три корпоративні міні-історії з практики
Міні-історія 1: Інцидент через неправильне припущення
Середня компанія видала «стандартну гарнітуру» для гібридної роботи. У техспецифікації було «Bluetooth, шумозаглушення, підтримка на Linux».
Це було звичайне корпоративне оптимістичне припущення: якщо вона під’єднується, то працює.
У перший день загальної наради потік заявок: «Мій мікрофон зник». Люди чули нараду, але ніхто не міг говорити.
IT спочатку звинуватили клієнт конференцій. Розумно, але баг відтворювався у трьох різних додатках.
Неправильне припущення: вони думали, що A2DP означає наявність мікрофона. Вони стандартизувалися на «High Fidelity» виході і ніколи не перевірили двосторонній звук.
Десктопні образи були налаштовані на пріоритет A2DP і не перемикалися в HFP, бо попередня гарнітура мала нестабільний HFP.
Виправлення було нудним, але ефективним: задокументувати компроміс, надати скрипт для перемикання профілю в один клік і видати дешевий USB-мікрофон командам, що часто телефонують.
Для частини користувачів вони обрали дротові гарнітури через затримки й проблеми зі зміною профілю.
Після цього вони оновили тест прийняття обладнання: «Чи можете ви записати 30 секунд звуку з мікрофона гарнітури під час підключення без ручного лазіння в інтерфейс?»
Закупівля була не в захваті. Операції — в захваті.
Міні-історія 2: Оптимізація, що дала зворотний ефект
Інша організація намагалася «оптимізувати витрату батареї» на ноутбуках, агресивно налаштувавши управління живленням.
Фліт змінив налаштування сну й швидко вимикав радіо в режимі проста.
Непередбачувана наслідкова дія: повторні підключення Bluetooth після сну почали змагатися зі стартом користувацької сесії.
BlueZ підключав гарнітуру, але PipeWire/WirePlumber пропускали початкове виявлення сервісів.
Користувачі бачили підключений пристрій без профілів або A2DP з’являвся, але не міг отримати транспорт.
Інженери спробували виправити це, додавши цикли перезапуску («якщо не вдається — перезапустити служби»). Це погіршило ситуацію.
Тепер у перші хвилини після пробудження система метушилася: перепідключення, демонтаж, повторна реєстрація ендпоїнтів і інколи залишення гарнітури в битому стані.
Виправлення було простим: перестати бути надто хитрими. Вони пом’якшили політику вимикання радіо і додали невелику детерміністичну паузу перед застосуванням політики до щойно підключених Bluetooth-аудіопристроїв.
Також додали спостережуваність: логи навколо змін профілів, а не лише «Bluetooth підключено».
Батарея все ще була в порядку. Надійність нарад різко покращилася. І черга заявок більше не виглядала як DDoS.
Міні-історія 3: Нудна, але правильна практика, що врятувала день
Компанія з суворою SRE-культурою трактувала «десктопний образ» як продукт. Вони версіонували його, тестували і розгортали за кільцями.
Нудно. Але ефективно. І рідко.
Коли вони почали міграцію від PulseAudio до PipeWire, не зробили це чи не зробили «в один мах».
Вони провели пілотні групи, зібрали список Bluetooth-гарнітур, які вживали, і перевірили доступність профілів для кожного: кодеки A2DP, поведінку HFP, suspend/resume.
Під час розгортання одне оновлення змінило пріоритет кодеків Bluetooth за замовчуванням. Невелика група гарнітур погодила «кращий» кодек і потім падала під час дзвінка.
Пілотна група помітила це за години, з логами, що показували помилки конфігурації кодека під час активації профілю.
Нудна практика: у них був регресійний тест, що фактично переключав профілі, записував звук і перевіряв наявність вузлів у PipeWire.
Ніякої магії. Прості, повторювані перевірки.
Вони зафіксували пріоритет кодека на відомо-надійній базі для тієї класи гарнітур і рухалися далі тільки після перевірки стабільності.
Ніхто не писав тріумфального блогу. Система підтримки була тиха. Ось справжня перемога.
FAQ
1) Чому мій мікрофон гарнітури зникає, коли я обираю «High Fidelity (A2DP)»?
Тому що A2DP призначений для відтворення, а не для захоплення звуку. Для класичних Bluetooth-гарнітур захоплення мікрофона зазвичай потребує HSP/HFP, що часто замінює A2DP.
2) Чому A2DP зникає, коли я вмикаю мікрофон?
Перемикання в HSP/HFP активує інший транспорт, оптимізований для голосу. Багато гарнітур не можуть одночасно давати стерео A2DP вихід і мікрофон на класичному Bluetooth.
3) Моя гарнітура підтримує мікрофон на телефоні. Чому не на моєму Linux-ноутбуці?
Телефони зазвичай мають витончені стеки HFP і тюнінг від виробника. На Linux підтримка HFP залежить від BlueZ + аудіосервера + конфігурації політик. Відсутність плагінів або відключені бекенди можуть приховувати HFP повністю.
4) Як дізнатися, чи гарнітура рекламує сервіси Hands-Free?
Використайте bluetoothctl info <MAC> і шукайте UUID на кшталт «Handsfree» або «Headset». Якщо їх немає, ОС їх не вигадуватиме.
5) PipeWire запущено. Чому у мене все одно немає Bluetooth-профілів?
PipeWire потребує підтримки Bluetooth через свої SPA-плагіни і менеджер сесій, такий як WirePlumber, для застосування політики. Якщо ендпоїнти не реєструються в логах BlueZ, шар інтеграції відсутній або зламаний.
6) Чи варто використовувати mSBC для кращої якості дзвінків?
Якщо він стабільно працює на вашій гарнітурі та стеку — так. Якщо ви бачите помилки конфігурації кодека або обриви — використовуйте CVSD. Надійність важливіша за теоретичну якість у реальних нарадах.
7) Чи можу я змусити систему залишатися в A2DP і при цьому використовувати мікрофон гарнітури?
Зазвичай ні для класичного Bluetooth. Прагматичний підхід: залишати A2DP для виходу і використовувати окремий мікрофон (USB/вебкам). Або перейти на обладнання з LE Audio кінця до кінця.
8) Чому все працює, поки я не відкрию вкладку в браузері, після чого профілі змінюються?
Браузер запросив доступ до мікрофона; політика переключила на голосо-здатний профіль. Відмовляйте у доступі до мікрофона де можливо або вручну повертайтеся до A2DP після дзвінка.
9) Який найшвидший спосіб побачити, який профіль активний?
У PipeWire: wpctl inspect Bluetooth-пристрою і перевірте bluez5.profile. У pactl: подивіться «Active Profile» під pactl list card.
10) Чи потрібно перезавантажувати систему, щоб виправити це?
Зазвичай ні. Перезапуск користувацьких сервісів (pipewire, wireplumber) і повторне парування гарнітури часто очищають застарілий стан. Перезавантажуйте лише якщо оновлювали ядро/прошивку.
Висновок: наступні кроки, що не марнують вашого дня
Сприймайте відсутні опції мікрофона/Bluetooth A2DP як збій перемовин, а не як містичне прокляття.
Спочатку перевірте контролер і BlueZ. Потім перевірте аудіосервер і політику. Далі подивіться, який профіль активний і чому.
Інтерфейс користувача — останнє місце для початку налагодження, а не перше.
Практичні наступні кроки
-
Запустіть
bluetoothctl infoі підтвердіть, що пристрій рекламує очікувані аудіосервіси. -
Запустіть
pactl list cardабоwpctl inspectі підтвердіть, які профілі доступні і який активний. -
Якщо вам потрібна надійність під час дзвінків, оберіть одне з:
- A2DP для виходу + окремий мікрофон (нудно, але ефективно), або
- режим гарнітури HFP (нижча якість, але інтегровано), або
- шлях оновлення до LE Audio (найкраще в майбутньому, нині — нерівномірно).
- Якщо перемикання профілів не вдається, перестаньте випадково тікати по налаштуваннях і читайте логи під час перемикання. Рядки помилок зазвичай підказують, який шар зламаний.
Bluetooth-аудіо — це стек рішень. Зробіть ці рішення явними, і проблема «відсутньої опції» перетвориться назад на інженерну задачу.