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 2.0 | openSession(ITunerCallback callback) generuje(Result result, ITunerSession session) |
|
AIDL | void setTunerCallback(in ITunerCallback callback) |
|
Opis:
|
||
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) lubstatus
(w AIDL). JeśliResult
lubstatus
toOK
, funkcja wywołania zwrotnego tuneratuneFailed
lubcurrentProgramInfoChanged
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 elementchunk
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 wIBroadcastRadio
. NazwaANTENNA_DISCONNECTED_TIMEOUT_MS
została zmieniona naANTENNA_STATE_CHANGE_TIMEOUT_MS
. Dodano nową stałą intTUNER_TIMEOUT_MS
. W tym czasie muszą zostać wykonane wszystkie operacje strojenia, przeskakiwania i krokowania. - Enum
RDS
iDeemphasis
są usunięte w AIDL i zdefiniowane jako const int wAmFmRegionConfig
. W związku z tym zarównofmDeemphasis
, jak ifmRds
w funkcjiProgramInfo
są deklarowane jako int, czyli wynik obliczeń bitowych odpowiednich flag. NazwaD50
zostanie zmieniona naDEEMPHASIS_D50
, a nazwaD75
naDEEMPHASIS_D75
. - Enum
ProgramInfoFlags
są usuwane w AIDL i definiowane jako const int wProgramInfo
z dodanym prefiksemFLAG_
. W związku z tym zmiennainfoFlags
w funkcjiProgramInfo
jest zadeklarowana jako int, czyli wynik obliczeń bitowych flag. NazwaTUNED
została zmieniona naFLAG_TUNABLE
, aby lepiej odzwierciedlała definicję stacji, na którą można przełączyć się z innej. - W
AmFmBandRange
elementscanSpacing
został przemianowany naseekSpacing
, ponieważ w AIDL elementscan
został przemianowany naseek
. - Ponieważ w AIDL wprowadzono pojęcie zbioru, elementy
MetadataKey
iMetadata
zdefiniowane w HIDL HAL nie są już używane. Zbiór AIDLMetadata
jest zdefiniowany w HAL AIDL. Każda wartość typu enum, która wcześniej znajdowała się w poluMetadataKey
, jest teraz polem w poluMetadata
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. |