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 urządzeń 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 pozycjach różniących się od fizycznych pozycji 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 sceny dźwiękowej przestrzennej symulowanej 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 rysunku poniżej pokazano zmiany w architekturze ścieżki audio wprowadzone 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 zawiera również elementy do obsługi ramki czujników do ś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:

spatial-sys-arch

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 funkcjami łączenia i filtrowania sygnałów czujników, które są przesyłane do silnika 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 zintegrowanych interfejsów API deweloperom 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 oblicanie pozycji głowy, które może być wykorzystane przez silnik 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 artykule 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 ma czujnik śledzenia ruchów głowy.

Domyślne ustawienia dźwięku przestrzennego są zawsze włączone, jeśli funkcja jest obsługiwana. 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 efektów przestrzennych OEM musi skonfigurować swoją platformę pod kątem 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 do telefonu.
  • 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 następujący sposób:

    PRODUCT_PROPERTY_OVERRIDES += \
         ro.audio.spatializer_enabled=true
    

    Spowoduje to zainicjowanie obsługi przez AudioService dźwięku 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 znajdziesz w artykule effect_spatializer.h.

Rekomendacje

Zalecamy, aby producenci sprzętu podczas implementacji stosowali się do 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ć dobry UX.
  • 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 monitorowanie ruchów głowy jest wyłączone, oraz wyłącza monitorowanie 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.

Nieprawidłowe wdrożenie algorytmów lokalizacji lub śledzenia ruchów głowy może spowodować niespełnienie zalecanej wartości opóźnienia w obiejściach podanej w Rekomendacjach.