Dźwięk w wysokiej rozdzielczości

Wersja Androida 10 zawiera te ulepszenia dźwięku o wysokiej rozdzielczości:

  • Liczba zmiennoprzecinkowa: kodeki i ekstraktory WAV i FLAC zostały zaktualizowane, aby obsługiwać liczby zmiennoprzecinkowe (ponad 24 bity precyzji bezstratnej). Efekty Downmix i Virtualizer zostały zaktualizowane do formatu zmiennoprzecinkowego. Zaktualizowana precyzja jest dozwolona przez MediaPlayer (NuPlayer).
  • Wysoka częstotliwość: kodeki i ekstraktory WAV i FLAC zostały zaktualizowane, aby obsługiwać częstotliwość 192 kHz. Domyślne efekty dostarczane przez Androida są testowane pod kątem obsługi częstotliwości 192 kHz przy standardowych częstotliwościach. Dozwolone częstotliwości standardowe to 88,2 kHz, 96 kHz, 176,4 kHz i 192 kHz.
  • Wielokanałowe: domyślne efekty odtwarzania na Androidzie są testowane pod kątem obsługi wielokanałowej do 8 kanałów.
  • Timing: informacje o czasie są uwzględniane w całym frameworku audio.

Od Androida 9 poniższe ulepszenia nie wymagają implementacji przez partnera:

  • Liczba równoczesnych ścieżek wyjściowych klienta wzrasta z 14 do 40, ponieważ ograniczone instancje klienta AudioTrack były problemem w przypadku aplikacji na Androida 8.x.
  • Maksymalna pamięć klienta/serwera wzrasta z 4 MB do 32 MB (w zależności od całkowitej pamięci urządzenia), co pozwala na odtwarzanie większej liczby ścieżek audio w wysokiej rozdzielczości.
  • Łączna liczba ścieżek mieszanych wzrasta z 32 do 256, aby zapobiec konfliktom o zasoby między aplikacjami a interfejsem systemu.

Zmiany efektu wyjściowego

Zmiany w wersji Androida 11 znajdziesz w sekcji Efekty dźwiękowe.

Przed wprowadzeniem Androida 9 przetwarzanie łańcucha efektów było realizowane w formacie próbek stereo int16. Miało to kilka ograniczeń:

  • Wszystkie efekty wyjściowe wymuszały konwersję danych audio zmiennoprzecinkowych na 16-bitowe liczby całkowite, co powodowało utratę precyzji.
  • Efekty wyjściowe zostały odrzucone przez urządzenia wyjściowe z liczbą kanałów większą niż 2.

W wersji Androida 9 potok przetwarzania łańcucha efektów został ulepszony, aby obsługiwać wielokanałowy format zmiennoprzecinkowy. Najważniejsze kwestie:

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

Wdrażanie efektów wyjściowych

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

Partnerzy wdrażający własne niestandardowe efekty wyjściowe powinni wykonać te czynności w przypadku Androida 10:

  • Zaktualizuj efekty wyjściowe, aby obsługiwały wielokanałowy format zmiennoprzecinkowy:
    • Obsługa przetwarzania Int16 nie jest już wymagana.
    • Obsługa liczby kanałów wyjściowych od 2 do 8 (w przyszłości może być od 1 do 30).
    • Obsługa liczby kanałów wejściowych odpowiadającej liczbie kanałów wyjściowych w przypadku efektów wstawiania. Efekty pomocnicze nadal mają 1 kanał wejściowy (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ć, sprawdź starszy kod w ten sposób:
    • Starsze efekty wyjściowe (wstawianie) muszą odrzucać nieobsługiwane konfiguracje w EFFECT_CMD_SET_CONFIG.
      • Sprawdź, czy format to int16.
      • Sprawdź, czy maski kanałów wejściowych i wyjściowych są stereo.
      • Jeśli którykolwiek z tych warunków nie zostanie spełniony, zwróć -EINVAL.
    • Starsze efekty wyjściowe (pomocnicze) są konfigurowane przez AudioFlinger z maską wejściowego kanału mono i potencjalnie maskami wyjściowych kanałów wielokanałowych, w zależności od tego, czy odbiornik wyjściowy jest wielokanałowy. Musi odrzucać nieobsługiwane konfiguracje w  EFFECT_CMD_SET_CONFIG.
      • Sprawdź, czy format to int16.
      • Sprawdź, czy maska kanału wejściowego jest mono, a maska kanału wyjściowego jest stereo.
      • Jeśli którykolwiek z tych warunków nie zostanie spełniony, zwróć -EINVAL.
    • Zweryfikuj starszy kod. Nie zakładaj, że wszystko działa.