Radio HAL z transmisją

W poniższych sekcjach znajdziesz informacje o tym, jak korzystać z warstwy abstrakcji sprzętowej (HAL) do implementowania radia nadawczego.

Interfejs HAL radia nadawczego

Interfejs HAL dla radia DAB zapewnia struktury danych i interfejsy na poziomie sprzętu, aby umożliwić implementację radia DAB, AM/FM i DAB.

interfejsy HIDL 2.0 i AIDL;

Interfejs HAL radia nadawczego korzysta z interfejsów opisanych w następnych sekcjach.

IAnnouncementListener

IAnnouncementListener to interfejs wywołania zwrotnego dla odbiornika ogłoszeń, który może być zarejestrowany w radioodbiorniku HAL, aby odbierać ogłoszenia. Interfejs zawiera te metody:

IAnnouncementListener
Opis: jest wywoływany, gdy lista ogłoszeń ulegnie zmianie.
HIDL 2.0 oneway onListUpdated(vec<Announcement> announcements)
AIDL oneway void onListUpdated(in Announcement[] announcements)

ICloseHandle

ICloseHandle to ogólne zamknięcie interfejsu do usuwania wywołań zwrotnych, które nie wymaga aktywnego interfejsu.

ICloseHandle
Opis: zamknij uchwyt.
HIDL 2.0 close()
AIDL void close()

ITunerCallback

ITunerCallback to interfejs wywołania zwrotnego wywoływany przez HAL radia nadawczego w celu wysyłania aktualizacji do usługi klienta HAL.

ITunerCallback
Opis: wywoływany przez HAL, gdy operacja strojenia (tune, seek (w AIDL) lub skanowania (w HIDL) i krok (step) zakończy się niepowodzeniem w tle.
HIDL 2.0 oneway onCurrentProgramInfoChanged(ProgramInfo info)
AIDL void onCurrentProgramInfoChanged(in ProgramInfo info)
Opis: wywoływany, gdy funkcja tune, seek (w AIDL) lub scan (w HIDL) zakończy się powodzeniem.
HIDL 2.0 oneway onTuneFailed(Result result, ProgramSelector selector)
AIDL void onTuneFailed(in Result result, in ProgramSelector selector)
Opis: wywoływany, gdy funkcja tune, seek (w AIDL) lub scan (w HIDL) zakończy się powodzeniem.
HIDL 2.0 oneway onCurrentProgramInfoChanged(ProgramInfo info)
AIDL void onCurrentProgramInfoChanged(in ProgramInfo info)
Opis: wywoływany po zaktualizowaniu listy programów; rozmiar każdego fragmentu powinien być ograniczony do 500 KB.
HIDL 2.0 oneway onProgramListUpdated(ProgramListChunk chunk)
AIDL oneway onProgramListUpdated(ProgramListChunk chunk)
Opis: jest wywoływany, gdy antena jest połączona lub rozłączona.
HIDL 2.0 oneway onAntennaStateChange(bool connected)
AIDL void onCurrentProgramInfoChanged(in ProgramInfo info)
Opis: wywoływany, gdy wartości parametrów specyficznych dla dostawcy są aktualizowane wewnętrznie w HAL (nie wywołuj po wywołaniu setParameters przez klienta HAL).
HIDL 2.0 oneway onParametersUpdated(vec<VendorKeyValue> parameters)
AIDL void onParametersUpdated(in VendorKeyValue[] parameters)
Opis: nowość w AIDL. Wywoływany, gdy flaga konfiguracji jest aktualizowana wewnętrznie w HAL (nie należy go wywoływać po wywołaniu setConfigFlag przez klienta HAL).
HIDL 2.0 Nie dotyczy.
AIDL void onConfigFlagUpdated(in ConfigFlag flag, in boolean value)

IBroadcastRadio

IBroadcastRadio to główny interfejs HAL radia nadawczego. W interfejsie HAL HIDL 2.0 użyj interfejsu ITunerSession do tunera, aby wywołać operacje. Jednak zazwyczaj w danym momencie aktywny jest tylko jeden tuner (pod warunkiem, że każda instancja HAL radia internetowego ma tylko jeden układ scalony tunera). Interfejs ITunerSession został usunięty z interfejsów AIDL, a jego interfejsy zostały przeniesione do interfejsów IBroadcastRadio.

IBroadcastRadio
Opis: opis modułu i jego możliwości.
HIDL 2.0 getProperties() generates (Properties properties)
AIDL Properties getProperties()
Opis: pobiera bieżącą lub możliwą konfigurację regionu AM/FM.
HIDL 2.0 getAmFmRegionConfig(bool full) generates (Result result, AmFmRegionConfig config)
AIDL AmFmRegionConfig getAmFmRegionConfig(bool full)
Opis: pobiera bieżącą konfigurację regionu DAB.
HIDL 2.0 getDabRegionConfig() generates (Result result, vec<DabTableEntry> config)
AIDL DabTableEntry[] getDabRegionConfig()
Opis: pobiera obraz z pamięci podręcznej modułu radiowego. W AIDL rozmiar obrazu musi być mniejszy niż 1 MB ze względu na sztywny limit bufora transakcji bindera.
HIDL 2.0 getImage(uint32_t id) generates (vec<uint8_t> image)
AIDL byte[] getImage(in int id)
Opis: rejestruje detekcję ogłoszenia.
HIDL 2.0 registerAnnouncementListener(vec<AnnouncementType> enabled,IAnnouncementListener listener) generates (Result result, ICloseHandle closeHandle)
AIDL ICloseHandle registerAnnouncementListener(in IAnnouncementListener listener, in AnnouncementType[] enabled)
Opis:
  • HIDL HAL: gdy otwierana jest nowa sesja tunera, stara sesja musi zostać zakończona.
  • AIDL HAL: ponieważ nie ma dostępnej sesji tunera, należy ustawić tylko wywołanie zwrotne tunera. Jeśli istnieje, należy zresetować stary adres wywołania zwrotnego.
HIDL 2.0 openSession(ITunerCallback callback) generuje(Result result, ITunerSession session)
AIDL void setTunerCallback(in ITunerCallback callback)
Opis:
  • HIDL HAL: zamykanie sesji tunera nie może się nie udać i musi być wydawane tylko raz.
  • AIDL HAL: nie ma tunera, więc należy tylko anulować wywołanie zwrotne tunera.
HIDL 2.0 close()
AIDL unsetTunerCallback()
Opis: dostosowuje się do określonego programu.
HIDL 2.0 tune(ProgramSelector program) generates (Result result)
AIDL void tune(in ProgramSelector program)
Opis: wyszukuje następny prawidłowy program w transmisji. Aby uniknąć nieporozumień w AIDL, scan został przemianowany na seek.
HIDL 2.0 scan(bool directionUp, bool skipSubChannel) generates (Result result)
AIDL void seek(in boolean directionUp, in boolean skipSubChannel)
Opis: kroki do sąsiedniego kanału, który nie może być zajęty przez żaden program.
HIDL 2.0 step(bool directionUp) generates (Result result)
AIDL void step(in boolean directionUp)
Opis: anuluje oczekujące dostrojenie, skanowanie (w HIDL) lub przesuwanie (w AIDL) lub operacje krokowe.
HIDL 2.0 cancel()
AIDL void cancel()
Opis: powoduje zastosowanie filtra do listy programów i rozpoczęcie wysyłania aktualizacji listy programów za pomocą wywołania zwrotnego onProgramListUpdated.
HIDL 2.0 startProgramListUpdates(ProgramFilter filter) generates (Result result)
AIDL void startProgramListUpdates(in ProgramFilter filter)
Opis: przestaje wysyłać aktualizacje listy programów.
HIDL 2.0 stopProgramListUpdates()
AIDL void stopProgramListUpdates()
Opis: pobiera bieżące ustawienie danej flagi konfiguracji.
HIDL 2.0 isConfigFlagSet(ConfigFlag flag) generates (Result result, bool value)
AIDL boolean isConfigFlagSet(in ConfigFlag flag)
Opis: ustawia daną flagę konfiguracji.
HIDL 2.0 setConfigFlag(ConfigFlag flag, bool value) generates (Result result)
AIDL void setConfigFlag(in ConfigFlag flag, boolean value)
Opis: umożliwia ustawianie wartości parametrów związanych z dostawcą.
HIDL 2.0 setParameters(vec<VendorKeyValue> parameters)

generuje,

(vec<VendorKeyValue> results)
AIDL VendorKeyValue[] setParameters(in VendorKeyValue[] parameters)
Opis: pobiera wartości parametrów związanych z poszczególnymi dostawcami.
HIDL 2.0 getParameters(vec<string> keys) generates (vec<VendorKeyValue> parameters)
AIDL VendorKeyValue[] getParameters(in String[] keys)

Wyjaśnienia dotyczące interfejsu

Zachowanie asynchroniczne

Ponieważ każda operacja strojenia (np. strojenie, skanowanie (w HIDL) lub przesuwanie (w AIDL) i krok) może być czasochłonna, a wątek nie powinien być blokowany przez długi czas, operacja powinna zaplanować wykonanie czasochłonnych operacji na później i szybko zwrócić stan lub wynik. Szczegółowo każda operacja powinna:

  • Anuluj wszystkie oczekujące operacje dostrajania.
  • Sprawdź, czy operacja może zostać wykonana na podstawie danych wejściowych metody i stanu tunera.
  • Zaplanuj zadanie dostrajania, a potem natychmiast zwracaj Result (w HIDL) lub status (w AIDL). Jeśli Result lub status to OK, funkcja wywołania zwrotnego tunera tuneFailed lub currentProgramInfoChanged musi zostać wywołana, gdy zadanie strojenia nie powiodło się (na przykład z powodu przekroczenia czasu oczekiwania) lub zostało ukończone.

Podobnie startProgramListUpdates planuje czasochłonne zadanie polegające na aktualizowaniu listy programów, które ma się odbywać później, oraz szybkim zwracaniu stanu lub wyniku. Metoda ta najpierw anuluje oczekujące żądania aktualizacji, a następnie planuje zadanie aktualizacji i szybko zwraca wynik.

Warunek wyścigu

Ze względu na asynchroniczne działanie operacji dostrajania (np. dostrajania, skanowania (w HIDL) lub przesunięcia (w AIDL) i kroczenia) istnieje warunek wyścigu między anulowaniem operacji a operacjami dostrajania. Jeśli funkcja cancel zostanie wywołana po zakończeniu operacji dostrajania przez HAL i przed zakończeniem wywołania zwrotnego, anulowanie może zostać zignorowane, a wywołanie zwrotne powinno zostać zakończone i otrzymane przez klienta HAL.

Podobnie, jeśli funkcja stopProgramListUpdates zostanie wywołana po zakończeniu przez HAL aktualizacji listy programów i przed zakończeniem wywołania zwrotnego onCurrentProgramInfoChanged, można zignorować funkcję stopProgramListUpdates, a wywołanie zwrotne onCurrentProgramInfoChanged powinno zostać zakończone.

Limit rozmiaru danych

Ponieważ bufor transakcji bindera ma sztywny limit, limit danych dla niektórych metod interfejsu przekazujących dane o potencjalnie dużym rozmiarze został sprecyzowany w interfejsie AIDL HAL.

  • getImage wymaga, aby zwrócony obraz miał rozmiar poniżej 1 MB.
  • onProgramListUpdate wymaga, aby każdy element chunk miał rozmiar mniejszy niż 500 KiB. Większe listy programów muszą być dzielone przez implementację HAL na kilka fragmentów i wysyłane za pomocą wielu wywołań zwrotnych.

Zmiany w strukturach danych AIDL HAL

Oprócz zmian w interfejsach te zmiany zostały zastosowane do struktur danych zdefiniowanych w interfejsie API AIDL dla radia nadawczego, który korzysta z interfejsu AIDL.

  • Enum Constant został usunięty z AIDL i zdefiniowany jako const int w IBroadcastRadio. Nazwa ANTENNA_DISCONNECTED_TIMEOUT_MS została zmieniona na ANTENNA_STATE_CHANGE_TIMEOUT_MS. Dodano nową stałą int TUNER_TIMEOUT_MS. W tym czasie muszą zostać wykonane wszystkie operacje strojenia, przeskakiwania i krokowania.
  • Enum RDSDeemphasis są usunięte w AIDL i zdefiniowane jako const int w AmFmRegionConfig. W związku z tym zarówno fmDeemphasis, jak i fmRds w funkcji ProgramInfo są deklarowane jako int, czyli wynik obliczeń bitowych odpowiednich flag. Nazwa D50 zostanie zmieniona na DEEMPHASIS_D50, a nazwa D75 na DEEMPHASIS_D75.
  • Enum ProgramInfoFlags są usuwane w AIDL i definiowane jako const int w ProgramInfo z dodanym prefiksem FLAG_. W związku z tym zmienna infoFlags w funkcji ProgramInfo jest zadeklarowana jako int, czyli wynik obliczeń bitowych flag. Nazwa TUNED została zmieniona na FLAG_TUNABLE, aby lepiej odzwierciedlała definicję stacji, na którą można przełączyć się z innej.
  • AmFmBandRange element scanSpacing został przemianowany na seekSpacing, ponieważ w AIDL element scan został przemianowany na seek.
  • Ponieważ w AIDL wprowadzono pojęcie zbioru, elementy MetadataKeyMetadata zdefiniowane w HIDL HAL nie są już używane. Zbiór AIDL Metadata jest zdefiniowany w HAL AIDL. Każda wartość typu enum, która wcześniej znajdowała się w polu MetadataKey, jest teraz polem w polu Metadata o typie string lub int, w zależności od ich definicji.

Obsługa radia DAB

W tej sekcji opisujemy obsługę radia DAB.

Identyfikatory

Podstawowym typem identyfikatora radia DAB i DMB w interfejsie API dla radia w sieci jest DAB_SID_EXT. DAB_SID_EXT używa 32-bitowych identyfikatorów usług (SID), aby reprezentować SID zarówno radia DAB, jak i DMB.

Oprócz identyfikatorów głównych obsługiwane są również identyfikatory dodatkowe, takie jak DAB_ENSEMBLE i DAB_FREQUENCY_KHZ. Jest to ważne, ponieważ wiele stacji DAB może mieć tę samą wartość DAB_SID_EXT, ale różne wartości DAB_ENSEMBLE lub DAB_FREQUENCY_KHZ. Aby zapewnić dokładne aktualizacje listy programów, stacje z tym samym DAB_SID_EXT są aktualizowane razem za pomocą atrybutu ITunerCallback#onProgramListUpdated. Ta aktualizacja jest następnie przekazywana do usługi przesyłania danych radiowych i menedżera radia, a następnie do aplikacji radia za pomocą interfejsu android.hardware.radio.ProgramList.

Metadane

Tabela poniżej zawiera obsługiwane metadane dotyczące DAB w interfejsie HAL radia DAB:

Pole metadanych Opis
dabEnsembleName (postać skrócona: dabEnsembleNameShort) Nazwa zespołu stacji DAB
dabServiceName (skrócona forma dabServiceNameShort) Nazwa usługi stacji DAB
dabComponentName (skrócona forma dabComponentNameShort) Nazwa komponentu stacji DAB

HD radio rupport

W tej sekcji opisano obsługę radia HD.

Identyfikatory

HD_STATION_ID_EXT służy jako podstawowy identyfikator stacji radiowych HD. Aby dodatkowo zwiększyć dokładność identyfikacji stacji, podajemy też dodatkowe identyfikatory, takie jak HD_STATION_NAME i HD_STATION_LOCATION. HD_STATION_LOCATION, który dostarcza informacje o lokalizacji, został wprowadzony w Androidzie 15.

Włączanie i wyłączanie radia cyfrowego

Począwszy od Androida 15 możesz włączać i wyłączać radio cyfrowe (np. radio HD) za pomocą ConfigFlag. Aby kontrolować to ustawienie w przypadku radia FM, użyj flagi FORCE_ANALOG_FM, a w przypadku radia AM – flagi FORCE_ANALOG_AM. Ustawienie flagi na false włącza radio HD, a ustawienie jej na true powoduje użycie analogowego radia AM/FM.

Dostępne kanały HD

Począwszy od Androida 15, kanały HD dostępne obecnie dla stacji radiowej HD mogą być reprezentowane za pomocą maski bitowej o długości 8 bitów (Metadata#hdSubChannelsAvailable) w ProgramInfo.metadata. Na przykład wartość bitu 1 z lewej strony wskazuje, czy dla tej stacji HD dostępny jest kanał HD2.

Stan pozyskiwania sygnału

W Androidzie 15 i nowszych aplikacje radiowe mogą wyświetlać użytkownikom stan odbioru sygnału stacji radiowych HD. Jest to przydatne, ponieważ uzyskanie silnego sygnału HD może zająć kilka chwil.

Aby uzyskać te informacje, system używa ProgramInfo.infoFlags do śledzenia stanu i aktualizuje aplikację radia za pomocą ITunerCallback#onCurrentProgramInfoChanged..

Oto jak stan jest przedstawiany w ProgramInfo.infoFlags:

  • Bit 6: wskazuje, czy sygnał radia HD został odebrany.
  • Bit 7: pokazuje, czy dane usługi informacji o stacji (SIS) są dostępne. SIS zawiera dodatkowe informacje o stacji i odtwarzanym utworze.
  • Bit 8: określa, czy dostępny jest cyfrowy dźwięk HD.

Metadane

Poniższa tabela zawiera obsługiwane metadane radia HD w Androidzie 15 i nowszych wersjach.

Pole metadanych Opis
commentShortDescription Krótki opis kontekstu komentarza
commentActualText Tekst komentarza
commercial reklama radiowa,
ufids Unikalne identyfikatory plików (UFID) powiązane z treściami.
hdStationNameShort Skrócona nazwa stacji radiowej HD lub uniwersalna skrócona nazwa
hdStationNameLong Pełna nazwa stacji radiowej HD, slogan lub wiadomość od stacji.