Konstrukcja zapewniająca zmniejszone opóźnienia

W wersji Androida 4.1 wprowadzono wewnętrzne zmiany w zakresie ścieżki wyjściowej audio o niższym opóźnieniu . Wprowadzono minimalne zmiany w interfejsie API klienta publicznego lub interfejsie HAL. W dokumencie tym opisano początkowy projekt, który z biegiem czasu ewoluował. Dobre zrozumienie tego projektu powinno pomóc dostawcom OEM i SoC urządzeń poprawnie wdrożyć projekt na ich konkretnych urządzeniach i chipsetach. Ten artykuł nie jest przeznaczony dla twórców aplikacji.

Tworzenie ścieżki

Klient może opcjonalnie ustawić bit AUDIO_OUTPUT_FLAG_FAST w parametrze audio_output_flags_t konstruktora AudioTrack C++ lub AudioTrack::set() . Obecnie jedynymi klientami, którzy to robią, są:

Implementacja AudioTrack C++ sprawdza żądanie AUDIO_OUTPUT_FLAG_FAST i opcjonalnie może odrzucić żądanie na poziomie klienta. Jeśli zdecyduje się przekazać żądanie dalej, robi to za pomocą bitu TRACK_FAST parametru track_flags_t metody fabrycznej IAudioTrack IAudioFlinger::createTrack() .

Serwer audio AudioFlinger przegląda żądanie TRACK_FAST i opcjonalnie może odrzucić żądanie na poziomie serwera. Informuje klienta, czy żądanie zostało przyjęte, czy nie, poprzez bit CBLK_FAST bloku sterującego pamięcią współdzieloną.

Czynnikami wpływającymi na decyzję są m.in.:

  • Obecność gwintu szybkiego miksera dla tego wyjścia (patrz poniżej)
  • Śledź częstotliwość próbkowania
  • Obecność wątku klienta do wykonywania procedur obsługi wywołań zwrotnych dla tej ścieżki
  • Rozmiar bufora śledzenia
  • Dostępne miejsca szybkiej ścieżki (patrz poniżej)

Jeżeli prośba klienta została zaakceptowana, nazywa się to „szybką ścieżką”. W przeciwnym razie nazywa się to „normalnym torem”.

Nici miksujące

W momencie, gdy AudioFlinger tworzy normalny wątek miksera, decyduje, czy utworzyć również wątek szybkiego miksera. Zarówno zwykły mikser, jak i szybki mikser nie są powiązane z konkretną ścieżką, ale raczej z zestawem ścieżek. Zawsze jest normalny gwint miksera. Gwint szybkiego mieszacza, jeśli istnieje, jest podporządkowany normalnemu gwintowi mieszalnika i działa pod jego kontrolą.

Szybki mikser

Cechy

Gwint szybkiego miksera zapewnia następujące funkcje:

  • Mieszanie submiksu normalnego miksera i maksymalnie 7 szybkich ścieżek klienta
  • Tłumienie na ścieżkę

Pominięte funkcje:

  • Konwersja częstotliwości próbkowania na ścieżkę
  • Efekty na utwór
  • Efekty miksowania

Okres

Szybki mikser działa okresowo, z zalecanym okresem od dwóch do trzech milisekund (ms) lub nieco dłuższym okresem pięciu ms, jeśli jest to potrzebne do zapewnienia stabilności harmonogramu. Liczbę tę wybrano w taki sposób, aby biorąc pod uwagę cały potok buforowy, całkowite opóźnienie było rzędu 10 ms. Mniejsze wartości są możliwe, ale mogą skutkować zwiększonym zużyciem energii i ryzykiem wystąpienia usterek, w zależności od przewidywalności harmonogramu procesora. Możliwe są większe wartości, do 20 ms, ale powodują one zmniejszenie całkowitego opóźnienia, dlatego należy ich unikać.

Planowanie

Szybki mikser działa z podwyższonym priorytetem SCHED_FIFO . Wymaga bardzo mało czasu procesora, ale musi działać często i przy niskim poziomie zakłóceń w harmonogramie. Jitter wyraża zmianę czasu cyklu: jest to różnica pomiędzy rzeczywistym czasem cyklu a oczekiwanym czasem cyklu. Zbyt późny bieg spowoduje zakłócenia spowodowane niedojechaniem. Uruchomienie zbyt wcześnie spowoduje zakłócenia spowodowane zjazdem z szybkiej trasy, zanim ścieżka dostarczy dane.

Bloking

Idealnie, wątek szybkiego miksera nigdy się nie blokuje, z wyjątkiem HAL write() . Inne przypadki blokowania w szybkim mikserze są uważane za błędy. W szczególności unika się muteksów. Zamiast tego stosowane są algorytmy nieblokujące (znane również jako algorytmy bez blokady). Więcej informacji na ten temat można znaleźć w artykule Unikanie odwracania priorytetów .

Związek z innymi komponentami

Szybki mikser ma niewiele bezpośrednich interakcji z klientami. W szczególności nie widzi operacji na poziomie spoiwa, ale uzyskuje dostęp do bloku kontrolnego pamięci współdzielonej klienta.

Szybki mikser otrzymuje polecenia od normalnego miksera poprzez kolejkę stanu.

Poza pobieraniem danych o utworach interakcja z klientami odbywa się za pośrednictwem zwykłego miksera.

Głównym odbiornikiem szybkiego miksera jest HAL audio.

Normalny mikser

Cechy

Wszystkie funkcje są włączone:

  • Do 32 utworów
  • Tłumienie na ścieżkę
  • Konwersja częstotliwości próbkowania na ścieżkę
  • Przetwarzanie efektów

Okres

Okres jest obliczany jako pierwsza całkowita wielokrotność okresu szybkiego mieszacza, czyli >= 20 ms.

Planowanie

Zwykły mikser działa z podwyższonym priorytetem SCHED_OTHER .

Bloking

Zwykły mikser może blokować i często robi to na różnych muteksach, a także na rurze blokującej, aby zapisać swój sub-miks.

Związek z innymi komponentami

Zwykły mikser intensywnie współdziała ze światem zewnętrznym, włączając w to wątki segregatorów, menedżera zasad audio, wątek szybkiego miksera i ścieżki klienta.

Zlewozmywak zwykłego miksera stanowi rurę blokującą ścieżkę 0 miksera szybkiego.

Flagi

Bit AUDIO_OUTPUT_FLAG_FAST jest wskazówką. Nie ma gwarancji, że prośba zostanie spełniona.

AUDIO_OUTPUT_FLAG_FAST to koncepcja na poziomie klienta. Nie pojawia się na serwerze.

TRACK_FAST to koncepcja klient -> serwer.