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ą:
- Natywny dźwięk dla Androida oparty na OpenSL ES lub AAudio
- Android.media.SoundPool
- android.media.ToneGenerator
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.