Dlaczego pulseaudio obsługuje połączenie jakości dźwięku z urządzeniem BT?


11

Jestem nowy w Linuksie i nowy w skryptach Bluetooth. Do tej pory odkryłem:

  1. Bluez to domyślny stos BT.
  2. BluezTools to zestaw narzędzi, których można używać do łatwiejszej interakcji z Bluez
  3. DBus to interfejs, z którym łączy się Bluez podczas bezpośredniej interakcji ze sprzętem.
  4. PulseAudio to podsystem odpowiedzialny za wytwarzanie dźwięku w systemie.

To ma sens. Powiedzmy, że mam zestaw słuchawek BlueTooth, czego oczekiwałbym (wszystko po sparowaniu i zaufaniu), aby móc wydać polecenie, które może połączyć się bezpośrednio z określonym profilem w słuchawkach BT.

Ścieżka techniczna, o której myślę, mogłaby wyglądać następująco:

  1. Włącz słuchawki.
  2. Wydaj polecenie BluezTools - na przykład bt-audio -c
  3. Poczekaj, aż urządzenie połączy się z usługą, której szukam
  4. PulseAudio powinien teraz wybrać nowe urządzenie wyjściowe
  5. Wydaj inne polecenie, aby zmienić dźwięk z obecnego na nowy dźwięk wyjściowy (słuchawki BT).
  6. Ciesz się płynnym słuchaniem.

To wszystko wydaje się logiczne, ale rzeczywista implementacja nie jest taka i szukam DLACZEGO, aby lepiej zrozumieć problem i spróbować go naprawić.

Oto, co się właściwie dzieje:

  1. Włącz słuchawki.
  2. Wydaj polecenie BluezTools - na przykład bt-audio -c
  3. Poczekaj, aż urządzenie połączy się z usługą, której szukam
  4. PulseAudio powinien teraz wybrać nowe urządzenie wyjściowe
  5. Wydaj polecenie PulseAudio, aby zmienić profil audio z jakości telefonu na wysoką wierność.

Pozwól mi trochę rozwinąć tę kwestię. Zestaw słuchawkowy Bluetooth oferuje 2 tryby jakości (telefon i wysoką wierność). Tylko 1 nadaje się do słuchania muzyki.

Spodziewałbym się, że słuchawki BT prezentują każdy tryb jakości jako usługę, prawda? To założenie może się mylić, ale oczekiwałbym czegoś takiego

bt-audio -c highFidelityProfile

lub

bt-audio -changeProfile highFidelityProfile

Zamiast tego wydaje się, że Bluez po prostu obsługuje połączenie RAW z urządzeniem, i stamtąd musisz wydać: pacmd set-card-profile $ INDEX a2dp

To po prostu wydaje się zasadniczo błędne. Dlaczego kontrola jakości w podsystemie audio wymaga w związku z tym innej implementacji dla impulsu, alsa lub jakiegokolwiek innego podsystemu dźwięku?

czego mi brakuje? Dlaczego nie można połączyć się bezpośrednio z określonym profilem za pomocą Bluez / BluezTools itp.?

Odpowiedzi:


3

Połączenie Bluetooth ma znaczne opóźnienia w porównaniu z prostymi przewodowymi słuchawkami lub głośnikami. Co więcej, opóźnienie połączenia może się różnić w zależności od właściwości odbiornika bluetooth, a może nawet siły sygnału radiowego podczas poruszania się użytkownika.

Interfejs między aplikacją a PulseAudio może być tak prosty, jak: „oto niektóre dane audio PCM; zagraj to”. Ale może być również bardziej skomplikowane; coś w stylu „Oto dane audio PCM; zagraj to i powiedz mi co 50 ms, jak daleko zaszedłeś, abym mógł powiedzieć ci, abyś przeskoczył do przodu, jeśli wygląda na to, że nie możesz zsynchronizować się ze strumieniem wideo Gram. Och, musisz też zmienić próbkę, ponieważ dane mają częstotliwość próbkowania, której Twój sprzęt nie obsługuje bezpośrednio ”. W tym drugim przypadku PulseAudio musi być w stanie przekazać aplikacji informację zwrotną z urządzenia audio, aby poprawnie określić, jak daleko dane audio są odtwarzane w danym momencie.

W związku z tym sensowne jest, aby PulseAudio było dość głęboko zaangażowane w przetwarzanie audio Bluetooth: im więcej jest interweniujących warstw, tym więcej możliwości buforowania danych bez zachowania dokładnego sprzężenia zwrotnego, co powoduje utratę synchronizacji warg.

W rzeczywistości, zanim istniał PulseAudio, istniał backend ALSA dla dźwięku Bluetooth, ale był przestarzały. Myślę, że problem polegał na tym, że interfejsy ALSA w tym czasie były zaprojektowane głównie dla tradycyjnych kart dźwiękowych, a radzenie sobie z potencjalnie zmienną latencją audio Bluetooth było trudne.

Interfejsy PulseAudio zostały zaprojektowane od podstaw, aby obsługiwać różne urządzenia dźwiękowe, a nawet przełączać strumienie audio między nimi podczas odtwarzania strumienia, więc wydaje mi się, że ma też dość zaawansowaną koncepcję opóźnień audio.

Tak, mógł zostać zaimplementowany w BlueZ, a nie jako moduł PulseAudio; ale wtedy BlueZ musiałby przedstawić interfejs audio dla aplikacji. A ponieważ PulseAudio chce obsłużyć „cały” dźwięk w systemie (aby móc przesyłać dźwięk, który aktualnie odtwarzasz z głośników do Bluetooth lub odwrotnie w locie), musiałby współpracować z PulseAudio jakoś tak.


2

Myślę, że w końcu znalazłem rozwiązanie (przetestowane na dwóch systemach Linux Mint), choć nie mam pojęcia, dlaczego muszę wykonać te dokładne kroki:

Pierwsze kroki:

  1. Zainstaluj blueman: sudo apt-get install blueman
  2. Edytuj plik Bluetooth: sudo nano /etc/bluetooth/main.conf i dodaj tę linię na końcu: Wyłącz = zestaw słuchawkowy

Dla każdego przebiegu:

  1. Uruchom ponownie usługę bluetooth: ponownie uruchom usługę bluetooth
  2. Otwórz Urządzenia od blueman w zasobniku systemowym lub wpisz blueman-manager w terminalu
  3. Wyszukaj swoje urządzenie audio Bluetooth
  4. Kliknij urządzenie prawym przyciskiem myszy i podłącz jako zestaw słuchawkowy
  5. Idź do dźwięku z ustawień systemowych
  6. Wybierz swoje urządzenie, klikając je raz
  7. Teraz ponownie idź do blueman-manager
  8. Kliknij prawym przyciskiem myszy urządzenie Bluetooth i ustaw Profil audio na Odtwarzanie wysokiej jakości (zlew A2DP)

Jeśli przegapisz którykolwiek z kroków, przejdź do kroku 1 i spróbuj ponownie. Daj mi znać, czy to działa.

Edycja : W Linux Mint 19 domyślny menedżer bluetooth działa idealnie z odtwarzaniem High Fidelity, nie wymaga żadnej konfiguracji !!


0

Chociaż może różnić się w zależności od konfiguracji, oto kilka dobrze przetestowanych poleceń.

Musisz ustawić urządzenie jako godne zaufania. Można to zrobić za pomocą GUI.

Przeglądarka sdptool poda wiele szczegółów na temat dostępnych protokołów i kanałów na urządzeniu docelowym.

Łatwiej jest ustawić zlew audio bluetooth a2p podczas korzystania z jednoczesnych wyjść audio, aby go skonfigurować, zobacz narzędzie paprefs .

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

Uruchom urządzenie, i tak powinno być hci0:

sudo hciconfig hci0 up

Lista zdalnych urządzeń:

sudo rfkill list

Lista sieci bluetooth:

hcitool scan

Przeglądaj dostępne protokoły:

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

Podłącz urządzenie:

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

Wyślij plik:

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

Odbierz plik:

sudo bt-obex -s /

Skanuj / poczekaj na dane na kanale (tutaj kanał 19) i zapisz dane w pliku o nazwie zrzut, w folderze domowym:

sudo apt install bluez-hcidump

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

Alternatywa: czasami przydatna do parowania:

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.