Obsługa dźwięku w aparacie słuchowym przez Bluetooth LE

Urządzenia wspomagające słuch (HA) mogą mieć ulepszone funkcje ułatwień dostępu na urządzeniach mobilnych z Androidem, korzystając z kanałów L2CAP (orientowanych na połączenie) w technologii Bluetooth Low Energy (BLE). CoC używa elastycznego bufora z kilkoma pakietami audio, aby utrzymać stały przepływ dźwięku nawet w przypadku utraty pakietów. Ten bufor zapewnia jakość dźwięku dla aparatów słuchowych kosztem opóźnienia.

Projekt CoC odwołuje się do specyfikacji Bluetooth Core w wersji 5 (BT). Aby zachować zgodność ze specyfikacjami podstawowymi, wszystkie wartości wielobajtowe na tej stronie należy odczytać w postaci little-endian.

Terminologia

  • Centralny – urządzenie z Androidem, które skanuje reklamy przez Bluetooth.
  • Urządzenie peryferyjne – aparat słuchowy, który wysyła pakiety reklamowe przez Bluetooth.

Topologia sieci i architektura systemu

W przypadku korzystania z CoC w przypadku aparatów słuchowych topologia sieci zakłada jedno urządzenie centralne i 2 peryferyjne (po jednym po lewej i po prawej stronie), jak pokazano na rysunku 1. System audio Bluetooth traktuje lewe i prawe urządzenia peryferyjne jako pojedynczy odbiornik audio. Jeśli urządzenie peryferyjne jest niedostępne z powodu mono lub utraty połączenia, urządzenie centralne łączy lewy i prawy kanał audio oraz przesyła dźwięk do pozostałych urządzeń peryferyjnych. Jeśli centrala utraci połączenie z obu urządzeniami peryferyjnymi, uzna, że połączenie z urządzeniem audio zostało utracone. W takich przypadkach centrala kieruje dźwięk do innego wyjścia.


Rysunek 1. Topologia parowania aparatów słuchowych z urządzeniami mobilnymi z Androidem za pomocą CoC przez BLE

Gdy centrala nie przesyła strumieniowo danych audio do urządzenia peryferyjnego i może utrzymywać połączenie BLE, nie powinna się odłączać od tego urządzenia. Utrzymanie połączenia umożliwia przesyłanie danych do serwera GATT znajdującego się na urządzeniu peryferyjnym.

Podczas parowania i podłączania urządzeń słuchowych centrala:

  • śledzić ostatnio sparowane urządzenia peryferyjne po lewej i po prawej stronie;
  • Zakładaj, że urządzenia peryferyjne są używane, jeśli istnieje prawidłowe parowanie. Gdy połączenie zostanie utracone, centrala będzie próbować połączyć się z sparowanym urządzeniem lub nawiązać z nim połączenie ponownie.
  • Zakładamy, że urządzenia peryferyjne nie są już używane, jeśli parowanie zostało usunięte.

W wymienionych powyżej przypadkach parowanie odnosi się do rejestrowania zestawu aparatów słuchowych z danym identyfikatorem UUID i oznaczeniem lewy/prawy w systemie operacyjnym, a nie do procesu parowania Bluetooth.

Wymagania systemowe

Aby prawidłowo wdrożyć CoC i zapewnić użytkownikom dobre wrażenia, systemy Bluetooth w urządzeniach centralnych i peryferyjnych muszą:

  • wdrożyć zgodny kontroler BT w wersji 4.2 lub nowszej. Zdecydowanie zalecamy korzystanie z bezpiecznych połączeń LE.
  • centralny obsługujący co najmniej 2 jednoczesne łącza LE z parametrami opisanymi w sekcji Format i synchronizacja pakietów audio;
  • urządzenia peryferyjne obsługują co najmniej 1 połączenie LE z parametrami opisanymi w Format i czas trwania pakietu audio.
  • mieć kontrolę przepływu na podstawie kredytu LE [BT Vol 3, Part A, Sec 10.1]. Urządzenia muszą obsługiwać rozmiar MTU i MPS wynoszący co najmniej 167 bajtów w przypadku CoC oraz muszą być w stanie buforować do 8 pakietów.
  • mieć rozszerzenie długości danych LE [BT Vol 6, Part B, Sec 5.1.9] z ładunkiem o długości co najmniej 167 bajtów.
  • urządzenie centralne musi obsługiwać polecenie aktualizacji połączenia LE HCI i spełniać wymagania dotyczące niezerowych parametrów maximum_CE_Lengthminimum_CE_Length;
  • centrala musi utrzymywać przepustowość danych dla 2 połączeń LE CoC z 2 różnymi urządzeniami peryferyjnymi z uwzględnieniem interwałów połączenia i rozmiarów pakietów danych w formacie i zgodnie z harmonogramem pakietów audio.
  • urządzenie peryferyjne ustawia parametry MaxRxOctetsMaxRxTime w ramkach LL_LENGTH_REQ lub LL_LENGTH_RSP na najmniejsze wymagane wartości, które są niezbędne do obsługi tych specyfikacji. Umożliwia to centralnemu harmonogramowi czasu optymalizację przy obliczaniu czasu potrzebnego na otrzymanie klatki.

Zaleca się, aby urządzenie centralne i peryferyjne obsługiwało interfejs PHY 2 MB zgodnie ze specyfikacją BT 5.0. Centrala musi obsługiwać łącza audio o szybkości co najmniej 64 kbit/s w przypadku PHY 1 M i 2 M. Nie należy używać PHY BLE o długim zasięgu.

CoC używa standardowych mechanizmów Bluetooth do szyfrowania warstwy łącza i skoku częstotliwości.

Usługi ASHA GATT

Urządzenie peryferyjne musi implementować usługę serwera GATT Audio Streaming for Hearing Aid (ASHA) opisaną poniżej. Urządzenie peryferyjne musi reklamować tę usługę w ogólnym trybie wykrywania, aby umożliwić urządzeniu centralnemu rozpoznanie odbiornika audio. Wszystkie operacje strumieniowego przesyłania dźwięku LE wymagają szyfrowania. Strumieniowe przesyłanie dźwięku przez BLE ma następujące cechy:

Cecha Właściwości Opis
ReadOnlyProperties Przeczytaj Zobacz Właściwości tylko do odczytu.
AudioControlPoint Write i Write without Response Punkt kontrolny strumienia audio. Zobacz AudioControlPoint.
AudioStatusPoint Odczyt/powiadomienie Pole raportu stanu punktu sterowania dźwiękiem. Patrz AudioStatusPoint.
Głośność Write without Response Bajt w zakresie od -128 do 0 określający stopień tłumienia, który ma zostać zastosowany do strumieniowanego sygnału audio, w zakresie od -48 dB do 0 dB. Ustawienie -128 należy interpretować jako całkowite wyciszenie, czyli najniższy poziom głośności bez wyciszenia to -127, co odpowiada tłumieniu -47,625 dB. W przypadku ustawienia 0 strumień tonów sinusoidalnych od szyny do szyny musi odpowiadać wejściu o 100 dBSPL w urządzeniu słuchowym. Centrala będzie przesyłać strumień w nominalnej pełnej skali i używać tej zmiennej do ustawiania żądanego poziomu prezentacji w peryferyjnym.
LE_PSM_OUT Przeczytaj PSM używany do łączenia kanału audio. Dobierane z zakresu dynamicznego [BT Vol 3, Part A, Sec 4.22]

Identyfikatory UUID przypisane do usługi i jej cech:

Identyfikator UUID usługi: {0xFDF0}

Cecha UUID
ReadOnlyProperties {6333651e-c481-4a3e-9169-7c902aad37bb}
AudioControlPoint {f0d4de7e-4a88-476c-9d9f-1937b0996cc0}
AudioStatus {38663f1a-e711-4cac-b641-326b56404837}
Głośność {00e4ca9e-ab14-41e4-8823-f9e70c7e91df}
LE_PSM_OUT {2d410339-82b6-42aa-b34e-e2e01df8cc1a}

Oprócz usługi ASHA GATT urządzenie peryferyjne musi również implementować usługę informacji o urządzeniu, aby umożliwić urządzeniu centralnemu wykrywanie nazw producenta i urządzenia peryferyjnego.

ReadOnlyProperties

Właściwości ReadOnlyProperties mają te wartości:

Bajt Opis
0 Wersja – musi być równa 0x01.
1 Patrz DeviceCapabilities.
2-9 Patrz HiSyncId.
10 Zobacz FeatureMap.
11-12 RenderDelay. Czas w milisekundach od momentu, gdy urządzenie peryferyjne odbierze ramkę audio, do momentu wyrenderowania danych wyjściowych. Te bajty mogą służyć do opóźniania filmu w celu zsynchronizowania go z dźwiękiem.
13-14 Zarezerwowany do użycia w przyszłości. inicjować na 0;
15-16 Obsługiwane identyfikatory kodeków. Jest to maska bitowa obsługiwanych identyfikatorów kodeków. Wartość 1 w pozycji bitowej odpowiada obsługiwanemu kodekowi. Na przykład 0x0002 wskazuje, że kodek G.722 przy częstotliwości 16 kHz jest obsługiwany. Wszystkie pozostałe bity mają wartość 0.

DeviceCapabilities

Bit Opis
0 Strona urządzenia (0: lewa, 1: prawa)
1 Wskazuje, czy urządzenie jest samodzielne i odbiera dane mono, czy jest częścią zestawu (0: mono, 1: stereo).
2 Urządzenie obsługuje CSIS (0: nieobsługiwane, 1: obsługiwane)
3-7 Zarezerwowane (ustawione na 0)

HiSyncID

To pole musi być unikalne dla wszystkich urządzeń binaural, ale musi być takie samo w przypadku lewego i prawego zestawu.

Bajt Opis
0-1 Identyfikator producenta. Jest to identyfikator firmy przypisany przez BTSIG.
2-7 Unikalny identyfikator identyfikujący zestaw aparatów słuchowych. Ten identyfikator musi być taki sam w przypadku lewego i prawego urządzenia peryferyjnego.

FeatureMap

Bit Opis
0 Obsługiwanie strumieniowego przesyłania wyjścia audio LE CoC (Tak/Nie).
1-7 Zarezerwowane (ustaw na 0).

Identyfikatory kodeków

Jeśli bit jest ustawiony, oznacza to, że dany kodek jest obsługiwany.

ID / Numer bitu Kodek i częstotliwość próbkowania Wymagana szybkość transmisji bitów Czas renderowania klatki Wymagany w centralnym (C) lub peryferyjnym (P)
0 Zarezerwowany Zarezerwowany Zarezerwowany Zarezerwowany
1 G.722 @ 16 kHz 64 kbit/s Zmienna C i P
Numery 2–15 są zarezerwowane.
0 jest również zarezerwowany.

AudioControlPoint

Nie można używać tego punktu kontrolnego, gdy łańcuch zaufania LE jest zamknięty. Aby dowiedzieć się, jak to zrobić, zapoznaj się z artykułem Rozpoczynanie i zatrzymywanie strumienia audio.

Kod operacji Argumenty Procedura GATT Opis
«Start»
  • uint8_t codec
  • uint8_t audiotype
  • int8_t volume
  • int8_t otherstate
Napisz z odpowiedzią, a otrzymasz dodatkową informację o stanie za pomocą charakterystyki AudioStatusPoint. Instrukcja dla urządzenia peryferyjnego, aby zresetować kodek i rozpocząć odtwarzanie ramki 0. Pole kodek wskazuje identyfikator kodeka, którego należy użyć do odtwarzania. Na przykład pole kodeka ma wartość „1” w przypadku G.722 przy 16 kHz.

Pole bitowe typu audio wskazuje typy audio występujące w strumieniu:
  • 0 – nieznany
  • 1 – dzwonek
  • 2 – rozmowa telefoniczna
  • 3 – multimedia
Pole otherstate wskazuje, czy druga strona binaural urządzeń jest połączona. Gdy inne urządzenie peryferyjne jest podłączone, wartość tego pola wynosi 1, a w przeciwnym razie – 0.

Urządzenie peryferyjne nie może prosić o aktualizacje połączenia, dopóki nie otrzyma kodu operacji «Stop».
«Stop» Brak Napisz z odpowiedzią, a otrzymasz dodatkową informację o stanie za pomocą charakterystyki AudioStatusPoint. Instrukcja dla urządzenia peryferyjnego, aby zatrzymało renderowanie dźwięku. Po zatrzymaniu należy rozpocząć nową sekwencję konfiguracji dźwięku, aby ponownie go wyrenderować.
«Status»
  • uint8_t connected
Pisanie bez odpowiedzi Informuje połączone urządzenie peryferyjne o aktualizacji stanu innego urządzenia peryferyjnego. Połączone pole wskazuje typ aktualizacji:
  • 0 – inne urządzenie peryferyjne zostało odłączone.
  • 1 – inne podłączone urządzenie peryferyjne
  • 2 – nastąpiła aktualizacja parametru połączenia LE w jednym z połączeń

AudioStatusPoint

Pole raportu stanu punktu sterowania dźwiękiem

Kody operacji Opis
0 Stan OK
-1 Nieznane polecenie
-2 Nieprawidłowe parametry

Reklamy usługi GATT ASHA

Identyfikator UUID usługi musi znajdować się w pakiecie reklamy. W ramce reklamy lub skanowania urządzenia peryferyjne muszą mieć dane usługi:

przesunięcie bajtów, Nazwa Opis
0 Długość reklamy >= 0x09
1 Typ reklamy 0x16 (dane usługi – UUID 16-bitowy)
2–3 Identyfikator UUID usługi 0xFDF0 (little-endian)

Uwaga: to jest tymczasowy identyfikator.
4 Wersja protokołu 0x01
5 Funkcja
  • 0 – lewo (0) lub prawo (1)
  • 1 – jedno (0) lub 2 urządzenia (1).
  • 2 – urządzenie obsługuje CSIS (<0: nieobsługiwane, 1: obsługiwane)
  • 3–7 – zarezerwowane. Te bity muszą być równe 0.
6-9 Obcięty HiSyncID 4 najbardziej znaczące bajty identyfikatora HiSyncId. Te bajty powinny być najbardziej losową częścią identyfikatora.

Urządzenia peryferyjne muszą mieć typ danych Pełna nazwa lokalna, który wskazuje nazwę aparatu słuchowego. Ta nazwa będzie używana w interfejsie urządzenia mobilnego, aby użytkownik mógł wybrać właściwe urządzenie. Nazwa nie powinna wskazywać, czy jest to lewy czy prawy kanał, ponieważ te informacje są podawane w DeviceCapabilities.

Jeśli urządzenia peryferyjne umieszczają nazwę i typy danych usługi ASHA w tym samym typie ramki (ADV lub SCAN RESP), te dwa typy danych („Pełna nazwa lokalna” i „Dane usługi dla usługi ASHA”) powinny pojawiać się w tym samym okienku. Dzięki temu skaner urządzenia mobilnego może uzyskać oba rodzaje danych w tym samym wyniku skanowania.

Podczas początkowego parowania ważne jest, aby urządzenia peryferyjne reklamowały się z wystarczającą szybkością, aby urządzenie mobilne mogło szybko je wykryć i z nimi nawiązać połączenie.

Synchronizacja urządzeń peryferyjnych po lewej i po prawej stronie

Aby korzystać z Bluetooth na urządzeniach mobilnych z Androidem, urządzenia peryferyjne muszą być zsynchronizowane. Odtwarzanie na lewym i prawym urządzeniu peryferyjnym musi być zsynchronizowane w czasie. Oba urządzenia peryferyjne muszą odtwarzać próbki dźwięku z tego samego źródła w tym samym czasie.

Urządzenia peryferyjne mogą synchronizować czas za pomocą sekwencyjnego numeru dodawanego do każdego pakietu danych audio. Urządzenie centralne zapewnia, że pakiety audio, które mają być odtwarzane w tym samym czasie na każdym z urządzeń peryferyjnych, mają ten sam numer sekwencji. Numer sekwencji zwiększa się o 1 po każdym pakiecie audio. Każdy numer sekwencji ma 8 bitów, więc numery sekwencji będą się powtarzać co 256 pakietów audio. Ponieważ rozmiar pakietu audio i częstotliwość próbkowania są stałe w przypadku każdego połączenia, oba urządzenia peryferyjne mogą określić czas odtwarzania. Więcej informacji o pakietach audio znajdziesz w sekcji Format i synchronizacja pakietów audio.

Urządzenie centralne pomaga, przekazując urządzenia binauralne sygnały sterujące, gdy może być potrzebna synchronizacja. Te wyzwalacze informują każde urządzenie peryferyjne o stanie sparowanego urządzenia peryferyjnego, gdy tylko wystąpi operacja, która może wpłynąć na synchronizację. Aktywatory:

  • W ramach polecenia «Start» usługi AudioControlPoint podany jest bieżący stan połączenia drugiej strony urządzeń binaural.
  • Za każdym razem, gdy na jednym z peryferyjnych urządzeń nastąpi połączenie, rozłączenie lub operacja aktualizacji parametrów połączenia, polecenie «Status» z AudioControlPoint zostanie wysłane do drugiej strony urządzeń binauralnych.

Format i synchronizacja pakietów audio

Pakowanie ramek audio (bloków próbek) do pakietów pozwala instrumentowi do analizy dźwięku określać czas na podstawie punktów odniesienia czasu warstwy łącza. Aby uprościć implementację:

  • Ramka audio powinna zawsze pasować do interwału połączenia. Jeśli na przykład interwał połączenia wynosi 20 ms, a częstotliwość próbkowania to 16 kHz, to ramka audio powinna zawierać 320 próbek.
  • Częstotliwości próbkowania w systemie są ograniczone do wielokrotności 8 kHz, aby zawsze mieć w ramce pewną liczbę próbek niezależnie od czasu klatki lub interwału połączenia.
  • Bajt sekwencji musi poprzedzać ramki audio. Bajt sekwencji musi być zliczany z przewijaniem i umożliwiać urządzeniu peryferyjnemu wykrywanie niezgodności bufora lub przepełnienia.
  • Ramka audio musi zawsze mieścić się w pojedynczym pakiecie LE. Ramka audio powinna być wysyłana jako osobny pakiet L2CAP. Rozmiar PDU LL LE:
    rozmiar ładunku audio + 1 (licznik sekwencji) + 6 (4 dla nagłówka L2CAP, 2 dla SDU)
  • Zdarzenie połączenia powinno być wystarczająco duże, aby zawierać 2 pakiety audio i 2 puste pakiety dla potwierdzenia odbioru, które rezerwuje przepustowość na potrzeby retransmisji. Pamiętaj, że pakiet audio może zostać podzielony przez kontroler Bluetooth w centrali. Urządzenie peryferyjne musi mieć możliwość odbierania więcej niż 2 rozbitych pakietów audio na zdarzenie połączenia.

Aby zapewnić centrali większą elastyczność, długość pakietu G.722 nie jest określona. Długość pakietu G.722 może się zmieniać w zależności od interwału połączenia ustawianego przez centralę.

Format oktetów wyjściowych G.722 odwołuje się do Rec. ITU-T G.722 (09/2012) sekcja 1.4.4 „Multiplexer”

W przypadku wszystkich obsługiwanych kodeków urządzenie peryferyjne musi obsługiwać te parametry połączenia: Oto niepełna lista konfiguracji, które może zaimplementować centrala.

Kodek Szybkość transmisji bitów Interwał połączenia Długość CE (1 M/2 M PHY) Rozmiar ładunku audio
G.722 @ 16 kHz 64 kbit/s 20 ms 5000/3750 µs 160 bajtów

Uruchamianie i zatrzymywanie strumienia audio

Przed rozpoczęciem strumienia audio urządzenie centralne wysyła zapytania do urządzeń peryferyjnych i ustala wspólny kodeki. Następnie konfiguracja strumienia przebiega zgodnie z tą sekwencją:

  1. PSM i opcjonalnie RenderDelay są odczytywane. Te wartości mogą być przechowywane w pamięci podręcznej przez centralę.
  2. Otwarto kanał CoC L2CAP – urządzenie peryferyjne przyzna 8 punktów na początek.
  3. Aby przełączyć połączenie na parametry wymagane dla wybranego kodeka, wysyłana jest aktualizacja połączenia. Centrala może przeprowadzić tę aktualizację połączenia przed połączeniem z kontenerem w poprzednim kroku.
  4. Zarówno host centralny, jak i peryferyjny oczekują na zdarzenie zakończenia aktualizacji.
  5. Uruchom ponownie koder audio i zresetuj liczbę sekwencji pakietów do 0. Na interfejsie AudioControlPoint wysyłane jest polecenie «Start» z odpowiednimi parametrami. Przed rozpoczęciem przesyłania strumienia urządzenie centralne oczekuje na powiadomienie o udanym wykonaniu poprzedniego polecenia «Start» przez urządzenie peryferyjne. Ten czas oczekiwania daje urządzeniu peryferyjnemu czas na przygotowanie ścieżki odtwarzania dźwięku. Podczas strumieniowego przesyłania audio replika powinna być dostępna w przypadku każdego zdarzenia połączenia, mimo że bieżące opóźnienie repliki może być niezerowe.
  6. Urządzenie peryferyjne pobiera pierwszy pakiet audio z wewnętrznej kolejki (numer sekwencji 0) i odtwarza go.

Centrala wysyła polecenie «Stop», aby zamknąć strumień audio. Po wykonaniu tego polecenia urządzenie peryferyjne nie musi być dostępne w przypadku każdego zdarzenia połączenia. Aby wznowić strumieniowanie dźwięku, wykonaj powyższą sekwencję, zaczynając od kroku 5. Gdy centrala nie przesyła strumieniowo dźwięku, nadal powinna utrzymywać połączenie LE w celu obsługi usług GATT.

Urządzenie peryferyjne nie może wysyłać do centrali informacji o zmianie stanu połączenia. Aby oszczędzać energię, jednostka centralna może wysłać aktualizację połączenia do urządzenia peryferyjnego, gdy nie przesyła ono strumieniowo dźwięku.