Почему 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

Это просто кажется в корне неверным. Почему контроль качества в аудиоподсистеме, следовательно, требует другой реализации для импульса или alsa, или любой другой звуковой подсистемы там?

Что мне не хватает? Почему невозможно напрямую подключиться к определенному профилю с помощью Bluez / BluezTools и т. Д.?

JL.
источник

Ответы:

2

Соединение 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 установить blueman
  2. Отредактируйте файл Bluetooth: sudo nano /etc/bluetooth/main.conf и добавьте эту строку в конце: Disable = Headset

Для каждого запуска:

  1. Перезапустите службу Bluetooth: служба sudo Перезапустите службу Bluetooth
  2. Откройте устройства из blueman в системном трее или введите blueman-manager в терминале
  3. Поиск вашего аудиоустройства Bluetooth
  4. Щелкните правой кнопкой мыши ваше устройство и подключитесь как гарнитура
  5. Перейти к звуку из настроек системы
  6. Выберите свое устройство, нажав на него один раз
  7. Теперь снова идите к Blueman-менеджеру
  8. Щелкните правой кнопкой мыши устройство Bluetooth и установите для параметра «Аудио профиль» значение « Высокое качество воспроизведения» ( приемник A2DP).

Если вы пропустили какой-либо из шагов, перейдите к шагу 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) и запись данных в файл с именем dump в домашней папке:

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
NVRM
источник