Чому pulseaudio обробляє з'єднання якості звуку з BT-пристроєм?


11

Я новачок в Linux і також новий в сценаріях Bluetooth. Я відкрив для себе наступне:

  1. Bluez - це стек BT за замовчуванням.
  2. BluezTools - це набір утиліт, за допомогою яких можна легше взаємодіяти з Bluez
  3. DBus - це інтерфейс, з яким підключається Bluez, безпосередньо взаємодіючи з обладнанням.
  4. PulseAudio - це підсистема, відповідальна за виробництво звуку в системі.

Це має сенс. Тож скажімо, у мене є набір навушників BlueTooth, що я б очікував - це все (після пари та довіри), щоб можна було випустити команду, яка зможе підключитися безпосередньо до певного профілю в навушниках BT.

Маю на увазі технічний шлях, який би я мав на увазі:

  1. Увімкніть навушники
  2. Видайте команду BluezTools - наприклад, bt-audio -c
  3. Зачекайте, коли пристрій підключиться до послуги, яку я перебуваю після
  4. Тепер PulseAudio повинен забрати новий вихідний пристрій
  5. Випустіть ще одну команду, щоб змінити звук з того, що було на новий вихідний аудіо (навушники BT).
  6. Насолоджуйтесь безпроблемним прослуховуванням.

Це все здається логічним, але реальна реалізація не така, і я шукаю ЧОМУ, тому я можу краще зрозуміти проблему і спробувати її виправити.

Ось що насправді відбувається:

  1. Увімкніть навушники
  2. Видайте команду BluezTools - наприклад, bt-audio -c
  3. Зачекайте, коли пристрій підключиться до послуги, яку я перебуваю після
  4. Тепер PulseAudio повинен забрати новий вихідний пристрій
  5. Видайте команду PulseAudio для зміни звукового профілю з якості телефону на високу точність.

Дозвольте мені трохи розширити цю проблему. Гарнітура Bluetooth пропонує 2 режими якості (телефон і висока вірність). Лише 1 справді підходить для прослуховування музики.

Я б очікував, що навушники BT виставляють кожен режим якості як послугу, це правильно? Це припущення може бути помилковим, але я б очікував чогось подібного

bt-audio -c highFidelityProfile

або

bt-audio -changeProfile highFidelityProfile

Натомість здається, що Bluez просто обробляє з'єднання RAW до пристрою, і звідти вам потрібно видати: pacmd set-card-profile $ INDEX a2dp

Це просто здається принципово неправильним. Чому контроль якості в аудіосистемі, отже, вимагає іншої реалізації для імпульсу або альси, або будь-якої іншої підсистеми звуку?

Що я пропускаю? Чому не можливо підключитися безпосередньо до певного профілю за допомогою Bluez / BluezTools тощо?

Відповіді:


3

Bluetooth-з'єднання має значну затримку порівняно з простими дротовими навушниками або динаміками. Більше того, затримка підключення може змінюватись, залежно від властивостей Bluetooth-приймача та, можливо, навіть сили радіосигналу, коли користувач рухається.

Інтерфейс між програмою та PulseAudio може бути таким же простим, як "ось деякі аудіодані PCM; відтворюйте це". Але це може бути і складніше; щось на кшталт "Ось деякі аудіодані PCM; відтворюйте це і кажіть мені кожні 50 мс, як далеко ви дійшли, щоб я міг сказати вам пропуститись вперед, якщо це схоже на те, що ви випадаєте з синхронізації з потоком відео Я граю. О, і вам також доведеться переутворювати їх, оскільки дані мають вибірковий показник, який апаратне забезпечення не підтримуватиме прямо ». В останньому випадку PulseAudio повинен мати можливість надати додатку деякий зворотний зв'язок із аудіопристроєм, щоб правильно визначити, наскільки насправді відтворюються аудіодані в будь-який момент часу.

Як результат, PulseAudio має сенс досить глибоко брати участь у обробці аудіо Bluetooth: чим більше втручаються шарів, тим більше можливостей для завантаження даних без підтримання точного зворотного зв’язку, внаслідок чого губи синхронізуються.

Насправді, до існування PulseAudio раніше існував ALSA-сервер для аудіо Bluetooth, але він був застарілим. Я думаю, що проблема полягала в тому, що інтерфейси ALSA в той час були розроблені в основному для традиційних звукових карт, і мати справу з потенційно змінною затримкою звуку Bluetooth було важко.

Інтерфейси PulseAudio були розроблені з нуля для управління різними звуковими пристроями та навіть для перемикання аудіо потоків між ними під час відтворення потоку, тому, мені здається, у нього також вбудована досить вдосконалена концепція затримки звуку.

Так, це могло бути реалізовано в BlueZ, а не як модуль PulseAudio; але тоді BlueZ повинен був би представити аудіоінтерфейс для додатків. А оскільки PulseAudio хоче обробляти "все" аудіо в системі (для того, щоб мати можливість передавати аудіо, яке ви зараз відтворюєте, із динаміків на Bluetooth або навпаки під час руху), йому доведеться взаємодіяти з PulseAudio якось все одно.


2

Я думаю, що я нарешті знайшов рішення (тестувалося на двох системах Linux Mint), хоча я не маю поняття, чому мені потрібно виконувати наступні кроки:

Початкові кроки:

  1. Встановіть blueman: sudo apt-get install blueman
  2. Редагуйте файл Bluetooth: sudo nano /etc/bluetooth/main.conf та додайте цей рядок наприкінці: Вимкнути = Гарнітура

Для кожного прогону:

  1. Перезапуск служби Bluetooth: sudo служба bluetooth перезапуск
  2. Відкрийте пристрої від blueman в системному треї або введіть blueman-manager у терміналі
  3. Шукайте аудіопристрій Bluetooth
  4. Клацніть правою кнопкою миші свій пристрій і підключіться до гарнітури
  5. Перейдіть на звук із налаштувань системи
  6. Виберіть свій пристрій, натиснувши його один раз
  7. Тепер знову переходьте до блюмена-менеджера
  8. Клацніть правою кнопкою миші на пристрої Bluetooth та встановіть для профілю Аудіо високу точність відтворення (A2DP Sink)

Якщо ви пропустили будь-який з кроків, перейдіть до кроку 1 і повторіть спробу. Повідомте мене, якщо це працює.

Редагувати : У Linux Mint 19 менеджер Bluetooth за замовчуванням прекрасно працює з відтворенням у високій точності, конфігурація взагалі не потрібна !!


0

Хоча це може змінюватись у вашій конфігурації, ось кілька добре перевірених команд.

Потрібно встановити пристрій як надійний. Це можна зробити через гуї.

Перегляд sdptool надасть багато деталей про доступні протоколи та канали на цільовому пристрої.

Простіше встановити аудіомобіль Bluetooth a2p при використанні одночасних аудіовиходів, налаштувати його, дивіться інструменти paprefs .

sudo apt install bluetooth 
sudo apt install bluez bluez-tools
sudo apt install rfkill rfcomm

Запустіть пристрій, все одно він повинен бути hci0:

sudo hciconfig hci0 up

Список віддалених пристроїв:

sudo rfkill list

Список Bluetooth-мереж:

hcitool scan

Переглянути доступні протоколи:

sdptool browse 43:23:00:02:23:A7

Підключення пристрою:

sudo rfcomm connect hci0 43:23:00:02:23:A7

Надіслати файл:

sudo bt-obex -p 43:23:00:02:23:A7 ~/images/tof.png

Отримати файл:

sudo bt-obex -s /

Скануйте / чекайте даних на каналі (тут канал 19) і записуйте дані у файл, який називається дамп, у домашню папку:

sudo apt install bluez-hcidump

hcidump -i hci0 -O 19 -w ~/dump

Альтернатива: іноді корисна для створення пари:

sudo apt install bluetoothctl

bluetoothctl
power on
connect 43:23:00:02:23:A7
trust 43:23:00:02:23:A7
info 43:23:00:02:23:A7

[bluetooth]# agent on
[bluetooth]# default-agent
[bluetooth]# discoverable on
[bluetooth]# pairable on
[bluetooth]# scan on
[bluetooth]# pair 43:23:00:02:23:A7
[agent]PIN code: ####
[bluetooth]# trust 43:23:00:02:23:A7
[bluetooth]# connect 43:23:00:02:23:A7
[bluetooth]# info 43:23:00:02:23:A7
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.