Dźwięk przestrzenny i monitorowanie ruchów głowy

Android 13 wprowadza standardowy sposób obsługi dźwięku przestrzennego i śledzenia ruchów głowy przez producentów OEM bez konieczności korzystania z funkcji niestandardowych ani pakietów SDK.

Dźwięk przestrzenny to technologia służąca do tworzenia pola dźwiękowego otaczającego słuchacza. Dźwięk przestrzenny umożliwia użytkownikom postrzeganie kanałów i poszczególnych dźwięków w położeniu różniącym się od fizycznego położenia przetworników urządzenia audio używanego do odtwarzania. Na przykład dźwięk przestrzenny umożliwia użytkownikowi słuchanie ścieżki dźwiękowej wielokanałowej w słuchawkach. Dzięki dźwiękowi przestrzennemu użytkownicy słuchawek mogą słyszeć dialogi z przodu, a efekty dźwiękowe z tyłu, mimo że mają tylko 2 przetworniki do odtwarzania.

Monitorowanie ruchów głowy pomaga użytkownikowi zrozumieć charakter dźwięku przestrzennego, który jest symulowany wokół jego głowy. Ta funkcja jest skuteczna tylko wtedy, gdy opóźnienie jest niskie. Opóźnienie to czas od momentu, gdy użytkownik poruszy głową, do momentu, gdy słyszy, że pozycja wirtualnego głośnika się zmienia.

Android 13 optymalizuje dźwięk przestrzenny i śledzenie ruchów głowy, oferując przetwarzanie dźwięku przestrzennego na najniższym możliwym poziomie w potoku audio, aby uzyskać jak najmniejsze opóźnienie.

Architektura

Zmodyfikowany interfejs API i ramy dźwięku w Androidzie 13 ułatwia stosowanie technologii dźwięku przestrzennego w całym ekosystemie.

Na ilustracji poniżej przedstawiono zmiany związane z dźwiękiem przestrzennym wprowadzone w architekturze potoku audio w Androidzie 13:

spatial-audio

Rysunek 1. Architektura potoku audio z użyciem procesora dźwięku przestrzennego

W nowym modelu procesor dźwięku przestrzennego jest częścią ram dźwiękowych i jest odłączony od dekodera. Przetwarza on mieszane treści audio i renderuje strumień stereo do interfejsu Audio HAL. Rozłączenie procesora dźwięku przestrzennego od dekodera umożliwia OEM-om wybór różnych dostawców dekodera i procesora dźwięku przestrzennego oraz uzyskanie pożądanej opóźnienia w obie strony w przypadku śledzenia ruchów głowy. Ten nowy model obejmuje również elementy interfejsu do obsługi śledzenia ruchów głowy.

Rysunek poniżej przedstawia architekturę systemu dotyczącego ram dźwięku w przypadku efektu dźwięku przestrzennego i śledzenia ruchów głowy:

przestrzenny łuk systemu

Rysunek 2. Architektura systemu ze sterowaniem przestrzennym i śledzeniem ruchów głowy

Wszystkie interfejsy API dźwięku przestrzennego są grupowane w publicznej klasie Spatializer na poziomie aplikacji. Klasa SpatializerHelper w usłudze audio współpracuje z komponentami interfejsu System UI, aby zarządzać funkcjami związanymi z lokalizacją w oparciu o możliwości platformy i połączonego urządzenia. Nowa klasa Spatializer w usłudze zasad dotyczących dźwięku tworzy i kontroluje przestrzenny graf audio potrzebny do miksowania wielokanałowego i przestrzennego na podstawie możliwości wyrażonych przez OEM-a, połączonych urządzeń i aktywnych przypadków użycia. Nowa klasa miksera SpatializerThread miksuje ścieżki wielokanałowe i przekazuje powstały miks do silnika efektów do postprodukcji, który renderuje wyjście stereo do interfejsu Audio HAL. W przypadku śledzenia ruchów głowy klasa SpatializerPoseController grupuje funkcje związane ze śledzeniem ruchów głowy, interfejsem do obsługi modułu czujników oraz funkcje służące do scalania i filtrowania sygnałów czujników, które są przesyłane do modułu efektów. Dane z czujnika śledzenia ruchów głowy są przesyłane przez protokół HID z sterownika Bluetooth.

Zmiany w architekturze ścieżki audio w Androidzie 13 poprawiają:

  • Zmniejszenie opóźnienia między procesorem dźwięku przestrzennego a słuchawkami.
  • Udostępnianie ujednoliconych interfejsów API przeznaczonych dla deweloperów aplikacji.
  • kontrolowanie stanu śledzenia głowy za pomocą interfejsów API systemu;
  • wykrywanie czujników śledzenia ruchów głowy i powiązanie ich z aktywnymi urządzeniami audio;
  • Łączenie sygnałów z różnych czujników i obliczanie pozycji głowy na potrzeby silnika efektu przestrzennego.

Funkcje takie jak kompensacja błędów, wykrywanie bezruchu i ograniczenie szybkości można implementować za pomocą biblioteki narzędzi do śledzenia ruchów głowy.

Interfejsy API dźwięku przestrzennego

Android 13 oferuje system dźwięku przestrzennego i interfejsy API dla programistów.

Producenci OEM mogą dostosować działanie aplikacji na podstawie dostępności i stanu włączenia funkcji, który jest ustawiany przez interfejsy API systemu. Aplikacje mogą też konfigurować atrybuty audio, aby wyłączyć dźwięk przestrzenny z powodów estetycznych lub wskazać, że strumień audio został już przetworzony na potrzeby dźwięku przestrzennego.

Interfejsy API dla deweloperów znajdziesz w Spatializer.

Producenci OEM mogą używać interfejsów API systemu do implementowania interfejsu użytkownika ustawień dźwięku i Bluetooth, który umożliwia użytkownikowi kontrolowanie stanu dźwięku przestrzennego i funkcji śledzenia ruchów głowy na urządzeniu. Użytkownik może włączyć lub wyłączyć dźwięk przestrzenny w przypadku głośników i słuchawek przewodowych w interfejsie ustawień Dźwięków. Ustawienie dźwięku przestrzennego dla głośnika jest dostępne tylko wtedy, gdy implementacja efektu dźwięku przestrzennego obsługuje tryb transauralny.

Użytkownik może też włączyć lub wyłączyć dźwięk przestrzenny i śledzenie ruchów głowy w ustawieniach urządzenia Bluetooth dla każdego urządzenia. Ustawienie śledzenia ruchów głowy jest dostępne tylko wtedy, gdy zestaw słuchawkowy Bluetooth wykrywa czujnik do śledzenia ruchów głowy.

Jeśli funkcja dźwięku przestrzennego jest obsługiwana, domyślne ustawienia dźwięku przestrzennego są zawsze włączone. Pełną listę interfejsów API systemu znajdziesz w artykule Spatializer.java.

Do interfejsu Sensor HAL dodano nowy typ czujnika śledzenia ruchów głowy Sensor.TYPE_HEAD_TRACKER. Czujnik ten jest udostępniany przez interfejs Sensor HAL jako czujnik dynamiczny przez Bluetooth lub USB.

Integracja dźwięku przestrzennego

Oprócz wdrożenia silnika efektu przestrzennego producenci OEM muszą skonfigurować swoją platformę do obsługi dźwięku przestrzennego.

Wymagania

Aby zintegrować dźwięk przestrzenny, musisz spełnić te wymagania:

  • Interfejs HAL dźwięku i procesor DSP dźwięku muszą obsługiwać dedykowaną ścieżkę wyjściową dla dźwięku przestrzennego.
  • Aby korzystać z dźwięku przestrzennego ze śledzeniem ruchów głowy, słuchawki muszą mieć wbudowane czujniki śledzenia ruchów głowy.
  • Implementacja musi być zgodna z proponowanym standardem śledzenia ruchów głowy za pomocą protokołu HID z zestawu słuchawkowego Bluetooth na telefon.
  • Interfejs Audio HAL w wersji 7.1 jest wymagany do obsługi dźwięku przestrzennego.

Aby zintegrować dźwięk przestrzenny, wykonaj te czynności:

  1. Zadeklaruj obsługę dźwięku przestrzennego w pliku device.mk w ten sposób:

    PRODUCT_PROPERTY_OVERRIDES += \
         ro.audio.spatializer_enabled=true
    

    To powoduje, że AudioService inicjuje obsługę narzędzia przestrzennego.

  2. Zadeklaruj dedykowane wyjście dla miksu dźwięku przestrzennego w audio_policy_configuration.xml w następujący sposób:

    <audioPolicyConfiguration>
      <modules>
       <module>
         <mixPorts>
         <mixPort name="spatializer" role="source"   flags="AUDIO_OUTPUT_FLAG_SPATIALIZER">
           <profile name="sa" format="AUDIO_FORMAT_PCM_FLOAT"
             samplingRates="48000" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/>
    
  3. Zadeklaruj bibliotekę efektu przestrzennego w pliku audio_effects.xml w ten sposób:

    <audio_effects_conf>
          <libraries>
             <library name="spatializer_lib" path="libMySpatializer.so"/>
              
             </libraries>
          <effects>
           <effect name="spatializer" library="spatializer_lib" uuid="myunique-uuid-formy-spatializereffect"/>
    
  4. Dostawcy wdrażający efekt przestrzenny muszą spełniać te wymagania:

    • Podstawowa konfiguracja i sterowanie identyczne jak w przypadku innych efektów w HAL.
    • Określone parametry potrzebne do wykrycia obsługiwanych funkcji i konfiguracji, takie jak:

      • SPATIALIZER_PARAM_SUPPORTED_LEVELS
      • SPATIALIZER_PARAM_LEVEL
      • SPATIALIZER_PARAM_HEADTRACKING_SUPPORTED
      • SPATIALIZER_PARAM_HEADTRACKING_MODE
      • SPATIALIZER_PARAM_SUPPORTED_CHANNEL_MASKS
      • SPATIALIZER_PARAM_SUPPORTED_SPATIALIZATION_MODES
      • SPATIALIZER_PARAM_HEAD_TO_STAGE

    Więcej informacji: effect_spatializer.h.

Rekomendacje

Podczas wdrażania zalecamy producentom OEM stosowanie tych wytycznych:

  • Używaj dźwięku LE, gdy jest dostępny, aby ułatwić współdziałanie i osiągnąć cele dotyczące opóźnień.
  • Opóźnienie w obie strony (od wykrycia ruchu przez czujnik do otrzymania dźwięku przez słuchawki) musi być krótsze niż 150 ms, aby zapewnić dobre wrażenia użytkownika.
  • W przypadku klasycznego Bluetooth z profilem zaawansowanej dystrybucji dźwięku (A2DP):
    • Użyj kodeka o niskim opóźnieniu, takiego jak Opus.
    • Wdrożyć funkcje kontroli opóźnień w interfejsie Audio HAL. Umożliwia to optymalizację zużycia energii i wydajności, gdy śledzenie ruchów głowy jest wyłączone, oraz wyłącza śledzenie ruchów głowy w nieoptymalnych warunkach.

Weryfikacja

Aby sprawdzić funkcjonalność funkcji dźwięku przestrzennego, użyj testów CTS dostępnych w SpatializerTest.java.

Niewłaściwe wdrożenie algorytmów śledzenia przestrzennego lub śledzenia ruchów głowy może spowodować niezrealizowanie zalecanego czasu oczekiwania w obie strony, opisanego w Zaleceniach.