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 ekstraktory WAV i 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.
  • Timing: 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 Androidzie 11 znajdziesz w artykule Efekty dźwiękowe.

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

  • Wszystkie efekty wyjściowe wymuszają konwersję danych audio o pływającej przecinku 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ł format wielokanałowej liczby zmiennoprzecinkowej. Najważniejsze kwestie:

  • Efekty oprogramowania na Androida zostały już przeniesione do formatu stereo float.
  • Starsze efekty są obsługiwane przez adaptery formatów, które w razie potrzeby konwertują wartości zmiennoprzecinkowe na zmiennoprzecinkowe 16-bitowe.

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 Androida 10:

  • Zaktualizuj efekty wyjściowe, aby obsługiwały format wielokanałowej liczby zmiennoprzecinkowej:
    • Obsługa 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 z liczbą 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 (wstawianie) 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 mono kanału wejściowego i potencjalnie wielokanałowych masek kanałów wyjściowych, w zależności od tego, czy odbiornik wyjściowy jest wielokanałowy. Musi 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.