Dźwięk w wysokiej rozdzielczości

Wersja Android 10 zawiera te ulepszenia dotyczące dźwięku w wysokiej rozdzielczości:

  • Float: kodery i ekstraktory WAV i FLAC zostały zaktualizowane, aby obsługiwać liczby zmiennoprzecinkowe (24 i więcej bitów bezstratnej precyzji). Efekty downmix i Virtualizer zostały zaktualizowane do typu float. Zaktualizowana dokładność jest dozwolona przez MediaPlayer (NuPlayer).
  • Wysoka częstotliwość: kodery i wyodrębniarki WAV oraz FLAC zostały zaktualizowane, aby obsługiwać 192 kHz. Domyślne efekty dostarczane przez Androida są testowane pod kątem obsługi 192 kHz przy standardowych częstotliwościach. Dozwolone standardowe częstotliwości to 88,2 kHz, 96 kHz, 176,4 kHz i 192 kHz.
  • Wielokanałowy: domyślne efekty odtwarzania na Androidzie są testowane pod kątem obsługi wielu kanałów do 8 kanałów.
  • Czas trwania: informacje o czasie trwania są zawarte w ramach audio.

Od Androida 9 te ulepszenia nie wymagają implementacji przez partnera:

  • Liczba jednoczesnych ścieżek wyjściowych klienta zwiększa się z 14 do 40, ponieważ ograniczone instancje klienta AudioTrack stanowiły problem w przypadku aplikacji na Androida 8.x.
  • Maksymalna pamięć klienta/serwera zwiększa się z 4 MB do 32 MB (w zależności od łącznej pamięci urządzenia), aby umożliwić odtwarzanie większej liczby ścieżek audio w wysokiej rozdzielczości.
  • Zwiększenie łącznej liczby ścieżek mieszanych z 32 do 256, aby zapobiec rywalizacji o zasoby między aplikacjami a interfejsem systemu.

Zmiany efektu wyjściowego

Informacje o zmianach w wersji Androida 11 znajdziesz w artykule Efekty dźwiękowe.

Przed wydaniem Androida 9 przetwarzanie łańcucha efektów było implementowane w formacie próbki stereo int16. Ta metoda miała kilka ograniczeń:

  • Wszystkie efekty wyjściowe wymuszają konwersję danych audio z punktu ruchomego na int16, co powoduje utratę dokładności.
  • Efekty wyjściowe zostały odrzucone przez wyjściowe złącza z większą niż 2 liczbą kanałów.

W wersji Androida 9 ulepszony został przetwarzający łańcuch efektów, aby obsługiwał wielokanałowy format zmiennoprzecinkowy. Najważniejsze kwestie:

  • Efekty oprogramowania na Androida zostały już przeniesione do formatu stereo float.
  • Starsze efekty są obsługiwane za pomocą adapterów formatu, które w razie potrzeby konwertują typ danych float na int16.

Implementowanie efektów wyjściowych

Referencyjna implementacja efektów wyjściowych jest dostępna na stronie frameworks/av/media/libeffects.

Partnerzy implementujący własne niestandardowe efekty wyjściowe powinni wykonać te czynności w przypadku wersji Android 10:

  • Zaktualizuj efekty wyjściowe, aby obsługiwały format wielokanałowej liczby zmiennoprzecinkowej:
    • Obsługa przetwarzania typu Int16 nie jest już wymagana.
    • Obsługuje liczbę kanałów wyjściowych od 2 do 8 (w celu zapewnienia zgodności w przyszłości rozważ liczbę od 1 do 30).
    • Obsługa liczby kanałów wejściowych odpowiadających liczbie kanałów wyjściowych w przypadku efektów wstawiania. Efekty pomocnicze nadal będą widzieć kanał wejściowy o liczbie 1 (mono).
    • Obsługuje zarówno maski pozycji kanału (kanoniczne), jak i maski indeksu kanału (1 << n) - 1.
  • Jeśli musisz nadal obsługiwać starsze efekty wyjściowe dostawcy i nie możesz ich zaktualizować, zweryfikuj starszy kod w ten sposób:
    • Starsze efekty wyjściowe (wstawiane) muszą odrzucać nieobsługiwane konfiguracje w EFFECT_CMD_SET_CONFIG.
      • Sprawdź, czy format jest int16.
      • Sprawdź, czy maski kanałów wejściowych i wyjściowych są stereo.
      • Jeśli którykolwiek z testów się nie powiedzie, zwracaj -EINVAL.
    • Starsze efekty wyjściowe (pomocnicze) są konfigurowane przez AudioFlingera za pomocą maski kanału wejściowego mono i potencjalnie maski kanału wyjściowego wielokanałowego, w zależności od tego, czy urządzenie wyjściowe jest wielokanałowe. Musi on odrzucić nieobsługiwane konfiguracje w  EFFECT_CMD_SET_CONFIG.
      • Sprawdź, czy format jest int16.
      • Sprawdź, czy maska kanału wejściowego jest mono, a maska kanału wyjściowego stereo.
      • Jeśli którykolwiek z testów się nie powiedzie, zwracaj -EINVAL.
    • Weryfikuj starszy kod. Nie zakładaj, że wszystko działa.