Le sezioni seguenti descrivono come utilizzare l'hardware abstraction layer (HAL) per implementare la radio broadcast.
Interfaccia HAL della radio di trasmissione
L'HAL della radio broadcast fornisce strutture di dati e interfacce a livello hardware per implementare la radio broadcast, come la radio AM/FM e DAB.
Interfacce HIDL 2.0 e AIDL
L'HAL della radio broadcast utilizza le interfacce descritte nelle sezioni seguenti.
IAnnouncementListener
IAnnouncementListener è l'interfaccia di callback per il listener di annunci, che
può essere registrato su HAL della radio di trasmissione per ricevere annunci. L'interfaccia ha i seguenti
metodi:
| IAnnouncementListener | ||
|---|---|---|
| Description: Called whenever the announcement list has changed. | ||
| HIDL 2.0 | oneway onListUpdated(vec<Announcement> announcements) |
|
| AIDL | oneway void onListUpdated(in Announcement[] announcements) |
|
ICloseHandle
ICloseHandle è l'handle di chiusura generico per rimuovere un callback che non richiede un'interfaccia attiva.
| ICloseHandle | ||
|---|---|---|
| Descrizione: chiudi la maniglia. | ||
| HIDL 2.0 | close() |
|
| AIDL | void close() |
|
ITunerCallback
ITunerCallback è l'interfaccia di callback chiamata dall'HAL della radio di trasmissione per
inviare aggiornamenti al servizio client HAL.
| ITunerCallback | ||
|---|---|---|
| Description: Called by the HAL when a tuning operation (tune, seek (in AIDL) or scan (in HIDL) and step succeeds) fails asynchronously. | ||
| HIDL 2.0 | oneway onCurrentProgramInfoChanged(ProgramInfo info) |
|
| AIDL | void onCurrentProgramInfoChanged(in ProgramInfo info) |
|
| Description: Called when tune, seek (in AIDL) or scan (in HIDL), or step succeeds. | ||
| HIDL 2.0 | oneway onTuneFailed(Result result, ProgramSelector selector) |
|
| AIDL | void onTuneFailed(in Result result, in ProgramSelector selector) |
|
| Description: Called when tune, seek (in AIDL) or scan (in HIDL), or step succeeds. | ||
| HIDL 2.0 | oneway onCurrentProgramInfoChanged(ProgramInfo info) |
|
| AIDL | void onCurrentProgramInfoChanged(in ProgramInfo info) |
|
| Descrizione: chiamato quando l'elenco dei programmi viene aggiornato; la dimensione di ogni blocco deve essere limitata a 500 KiB. | ||
| HIDL 2.0 | oneway onProgramListUpdated(ProgramListChunk chunk) |
|
| AIDL | void onProgramListUpdated(ProgramListChunk chunk) |
|
| Descrizione: chiamato quando l'antenna è connessa o disconnessa. | ||
| HIDL 2.0 | oneway onAntennaStateChange(bool connected) |
|
| AIDL | void onCurrentProgramInfoChanged(in ProgramInfo info) |
|
Description: Called when vendor-specific parameter
values are updated internally in HAL (do not invoke after calling
setParameters by HAL client). |
||
| HIDL 2.0 | oneway onParametersUpdated(vec<VendorKeyValue> parameters) |
|
| AIDL | void onParametersUpdated(in VendorKeyValue[] parameters) |
|
Descrizione: novità di AIDL. Chiamato quando il flag di configurazione viene
aggiornato internamente nell'HAL (non deve essere
richiamato dopo aver chiamato setConfigFlag dal client HAL). |
||
| HIDL 2.0 | Non applicabile. | |
| AIDL | void onConfigFlagUpdated(in ConfigFlag flag, in boolean value) |
|
IBroadcastRadio
IBroadcastRadio è l'interfaccia principale per l'HAL della radio di trasmissione. Nell'HAL HIDL
2.0, utilizza l'interfaccia ITunerSession del sintonizzatore per chiamare le operazioni. Tuttavia, al
massimo un sintonizzatore è attivo contemporaneamente (a condizione che ogni istanza HAL di broadcast radio abbia un solo chip
sintonizzatore).
ITunerSession è stato rimosso dalle interfacce AIDL e le sue interfacce sono state spostate in
IBroadcastRadio.
| IBroadcastRadio | ||
|---|---|---|
| Descrizione: ottieni la descrizione di un modulo e delle sue funzionalità. | ||
| HIDL 2.0 | getProperties() generates (Properties properties) |
|
| AIDL | Properties getProperties() |
|
| Descrizione: recupera la configurazione attuale o possibile della regione AM/FM. | ||
| HIDL 2.0 | getAmFmRegionConfig(bool full) generates (Result result, AmFmRegionConfig
config) |
|
| AIDL | AmFmRegionConfig getAmFmRegionConfig(bool full) |
|
| Descrizione: recupera la configurazione attuale della regione DAB. | ||
| HIDL 2.0 | getDabRegionConfig() generates (Result result, vec<DabTableEntry>
config) |
|
| AIDL | DabTableEntry[] getDabRegionConfig() |
|
| Descrizione:recupera un'immagine dalla cache del modulo radio. In AIDL, la dimensione dell'immagine deve essere inferiore a 1 MB a causa di un limite rigido per il buffer delle transazioni del binder. | ||
| HIDL 2.0 | getImage(uint32_t id) generates (vec<uint8_t> image) |
|
| AIDL | byte[] getImage(in int id) |
|
| Description: Registers the announcement listener. | ||
| HIDL 2.0 | registerAnnouncementListener(vec<AnnouncementType>
enabled,IAnnouncementListener listener) generates (Result result, ICloseHandle
closeHandle) |
|
| AIDL | ICloseHandle registerAnnouncementListener(in IAnnouncementListener listener, in
AnnouncementType[] enabled) |
|
Descrizione:
|
||
| HIDL 2.0 | openSession(ITunerCallback callback) genera
(Result result, ITunerSession session) |
|
| AIDL | void setTunerCallback(in ITunerCallback callback) |
|
Descrizione:
|
||
| HIDL 2.0 | close() |
|
| AIDL | unsetTunerCallback() |
|
| Descrizione: sintonizza un programma specifico. | ||
| HIDL 2.0 | tune(ProgramSelector program) generates (Result result) |
|
| AIDL | void tune(in ProgramSelector program) |
|
Descrizione: cerca il successivo programma valido
in onda. Per evitare confusione in AIDL,
scan viene rinominato in seek.
|
||
| HIDL 2.0 | scan(bool directionUp, bool skipSubChannel) generates (Result result) |
|
| AIDL | void seek(in boolean directionUp, in boolean skipSubChannel) |
|
| Description: Steps to the adjacent channel, which may not be occupied by any program. | ||
| HIDL 2.0 | step(bool directionUp) generates (Result result) |
|
| AIDL | void step(in boolean directionUp) |
|
| Descrizione: annulla le operazioni di sintonia, scansione (in HIDL) o ricerca (in AIDL) o passo in sospeso. | ||
| HIDL 2.0 | cancel() |
|
| AIDL | void cancel() |
|
Descrizione: applica un filtro all'elenco dei programmi e
inizia a inviare aggiornamenti dell'elenco dei programmi tramite
il callback onProgramListUpdated. |
||
| HIDL 2.0 | startProgramListUpdates(ProgramFilter filter) generates (Result result) |
|
| AIDL | void startProgramListUpdates(in ProgramFilter filter) |
|
| Descrizione: interrompe l'invio degli aggiornamenti dell'elenco dei programmi. | ||
| HIDL 2.0 | stopProgramListUpdates() |
|
| AIDL | void stopProgramListUpdates() |
|
| Descrizione: recupera l'impostazione attuale di un determinato flag di configurazione. | ||
| HIDL 2.0 | isConfigFlagSet(ConfigFlag flag) generates (Result result, bool value) |
|
| AIDL | boolean isConfigFlagSet(in ConfigFlag flag) |
|
| Descrizione: imposta il flag di configurazione specificato. | ||
| HIDL 2.0 | setConfigFlag(ConfigFlag flag, bool value) generates (Result result) |
|
| AIDL | void setConfigFlag(in ConfigFlag flag, boolean value) |
|
| Descrizione:imposta i valori dei parametri specifici del fornitore. | ||
| HIDL 2.0 | setParameters(vec<VendorKeyValue> parameters)
genera, (vec<VendorKeyValue> results) |
|
| AIDL | VendorKeyValue[] setParameters(in VendorKeyValue[] parameters) |
|
| Descrizione: recupera i valori dei parametri specifici del fornitore. | ||
| HIDL 2.0 | getParameters(vec<string> keys) generates (vec<VendorKeyValue>
parameters) |
|
| AIDL | VendorKeyValue[] getParameters(in String[] keys) |
|
Chiarimenti sull'interfaccia
Comportamento asincrono
Poiché ogni operazione di sintonia (ad esempio, sintonizzazione, scansione (in HIDL) o ricerca (in AIDL) e passo) potrebbe richiedere molto tempo e il thread non deve essere bloccato a lungo, l'operazione deve pianificare le operazioni che richiedono molto tempo in un secondo momento e restituire rapidamente uno stato o un risultato. Nel dettaglio, ogni operazione deve:
- Annulla tutte le operazioni di ottimizzazione in attesa.
- Controlla se l'operazione può essere elaborata in base agli input del metodo e allo stato del sintonizzatore.
- Pianifica l'attività di ottimizzazione e restituisci immediatamente
Result(in HIDL) ostatus(in AIDL). SeResultostatusèOK, il callback del sintonizzatoretuneFailedocurrentProgramInfoChangeddeve essere chiamato quando l'attività di sintonizzazione non è riuscita (ad esempio a causa di un timeout) o è stata completata.
Analogamente, startProgramListUpdates pianifica anche l'attività dispendiosa in termini di tempo di
aggiornamento dell'elenco dei programmi in modo che avvenga in un secondo momento e restituisca rapidamente uno stato o un risultato. Il metodo
annulla prima le richieste di aggiornamento in attesa, quindi pianifica l'attività di aggiornamento e restituisce rapidamente il
risultato.
Race condition
A causa del comportamento asincrono delle operazioni di sintonia (ad esempio, sintonizzazione, scansione (in HIDL) o ricerca
(in AIDL) e passaggio), esiste una condizione di competizione tra l'annullamento dell'operazione e le operazioni di sintonizzazione. Se cancel viene chiamato dopo che l'HAL ha completato un'operazione di ottimizzazione e prima
del completamento del callback, l'annullamento può essere ignorato e il callback deve essere completato e ricevuto
dal client HAL.
Allo stesso modo, se stopProgramListUpdates viene chiamato dopo che l'HAL ha completato un aggiornamento dell'elenco dei programmi e prima del completamento del callback onCurrentProgramInfoChanged, stopProgramListUpdates può essere ignorato e il callback deve essere completato.
Limite delle dimensioni dei dati
Poiché esiste un limite rigido per il buffer delle transazioni del binder, il limite di dati per alcuni metodi di interfaccia che passano dati di dimensioni potenzialmente grandi è chiarito nell'HAL AIDL.
getImagerichiede che l'immagine restituita sia inferiore a 1 MB.onProgramListUpdaterichiede che ognichunksia inferiore a 500 KiB. Gli elenchi di programmi più grandi devono essere suddivisi dall'implementazione HAL in più blocchi e inviati tramite più callback.
Modifiche alle strutture di dati AIDL HAL
Oltre alle modifiche alle interfacce, queste modifiche sono state applicate alle strutture di dati definite in broadcast radio AIDL HAL, che sfrutta AIDL.
- L'enumerazione
Constantviene rimossa in AIDL e definita come const int inIBroadcastRadio. Nel frattempo,ANTENNA_DISCONNECTED_TIMEOUT_MSviene rinominato inANTENNA_STATE_CHANGE_TIMEOUT_MS. Viene aggiunto un nuovo const intTUNER_TIMEOUT_MS. Tutte le operazioni di sintonizzazione, ricerca e avanzamento devono essere completate entro questo periodo di tempo. - Le enumerazioni
RDSeDeemphasisvengono rimosse in AIDL e definite come const int inAmFmRegionConfig. Di conseguenza, siafmDeemphasischefmRdsinProgramInfovengono dichiarati come int, un risultato di calcolo bit dei rispettivi flag. Nel frattempo,D50eD75vengono rinominatiDEEMPHASIS_D50eDEEMPHASIS_D75, rispettivamente. - L'enumerazione
ProgramInfoFlagsviene rimossa in AIDL e definita come const int inProgramInfocon l'aggiunta di un prefissoFLAG_. Di conseguenza,infoFlagsinProgramInfoviene dichiarato come int, un risultato di calcolo bit dei flag.TUNEDviene rinominato anche inFLAG_TUNABLEper descrivere meglio la sua definizione di stazione che può essere sintonizzata. - In
AmFmBandRange,scanSpacingviene rinominato inseekSpacing, poichéscanviene rinominato inseekin AIDL. - Poiché il concetto di unione è introdotto in AIDL,
MetadataKeyeMetadatadefiniti in HIDL HAL non vengono più utilizzati. Un'unione AIDLMetadataè definita in AIDL HAL. Ogni valore enum precedentemente presente inMetadataKeyora è un campo inMetadatacon tipo stringa o intero, a seconda delle definizioni.
Supporto radio DAB
Questa sezione descrive il supporto della radio DAB.
Identificatori
Il tipo di identificatore principale per la radio DAB e DMB nell'HAL Broadcast Radio AIDL è
DAB_SID_EXT. DAB_SID_EXT utilizza identificatori di servizio (SID) a 32 bit per poter rappresentare
il SID della radio DAB e DMB.
Oltre agli identificatori principali, sono supportati anche identificatori secondari come DAB_ENSEMBLE e
DAB_FREQUENCY_KHZ. Questo è importante perché più stazioni DAB
possono condividere un DAB_SID_EXT pur avendo valori DAB_ENSEMBLE
o DAB_FREQUENCY_KHZ diversi. Per garantire aggiornamenti accurati dell'elenco dei programmi, le emittenti con lo stesso DAB_SID_EXT vengono aggiornate insieme utilizzando ITunerCallback#onProgramListUpdated. Questo aggiornamento viene poi trasmesso al servizio radiofonico di trasmissione e a Radio Manager e infine all'app radio tramite android.hardware.radio.ProgramList.
Metadati
La tabella seguente mostra i metadati specifici per DAB supportati in AIDL Broadcast Radio HAL:
| Campo metadati | Descrizione |
|---|---|
dabEnsembleName (forma abbreviata: dabEnsembleNameShort) |
Nome dell'ensemble della stazione DAB |
dabServiceName (abbreviazione di dabServiceNameShort) |
Nome del servizio della stazione DAB |
dabComponentName (abbreviazione di dabComponentNameShort) |
Nome del componente della stazione DAB |
Supporto della radio HD
Questa sezione descrive il supporto della radio HD.
Identificatori
HD_STATION_ID_EXT funge da identificatore principale per le stazioni radio HD. Per migliorare ulteriormente l'identificazione delle stazioni, vengono forniti anche identificatori secondari come HD_STATION_NAME e HD_STATION_LOCATION. HD_STATION_LOCATION, che
fornisce informazioni sulla posizione, è stato introdotto in Android 15.
Attivare o disattivare la radio digitale
A partire da Android 15, puoi attivare o disattivare la radio digitale (come la radio HD) regolando
ConfigFlag. Per controllare questa impostazione per la radio FM, utilizza il flag FORCE_ANALOG_FM; per la radio AM, utilizza il flag FORCE_ANALOG_AM.
Se imposti il flag su false, viene attivata la radio HD, mentre se lo imposti su
true viene forzata la radio AM/FM analogica.
Canali HD disponibili
A partire da Android 15, i canali HD attualmente disponibili per una stazione radio HD possono
essere rappresentati da una maschera di bit di 8 bit, Metadata#hdSubChannelsAvailable,
in ProgramInfo.metadata. Ad esempio, il valore del bit 1 da sinistra indica se
il sottocanale HD2 è disponibile per questa emittente HD.
Stato acquisizione segnale
In Android 15 e versioni successive, le app radio possono mostrare agli utenti lo stato di acquisizione del segnale delle stazioni radio HD. Questa operazione è utile perché l'acquisizione di un segnale HD forte a volte può richiedere alcuni minuti.
Per fornire queste informazioni, il sistema utilizza ProgramInfo.infoFlags per monitorare lo stato e aggiorna l'app radio tramite ITunerCallback#onCurrentProgramInfoChanged..
Ecco come viene rappresentato lo stato all'interno di ProgramInfo.infoFlags:
- Bit 6: indica se è stato acquisito il segnale radio HD.
- Bit 7: indica se i dati del servizio informazioni sulle stazioni (SIS) sono disponibili. SIS fornisce informazioni aggiuntive sulla stazione e sui contenuti in riproduzione.
- Bit 8: indica se l'audio digitale HD è disponibile.
Metadati
La tabella seguente mostra i metadati della radio HD supportati per Android 15 e versioni successive.
| Campo metadati | Descrizione |
|---|---|
commentShortDescription |
Breve descrizione del contesto del commento |
commentActualText |
Testo del commento |
commercial |
Pubblicità radiofonica |
ufids |
Identificatori univoci dei file (UFID) associati ai contenuti |
hdStationNameShort |
Il nome breve o il nome breve universale della stazione radio HD |
hdStationNameLong |
Il nome esteso, lo slogan o un messaggio della stazione radio HD. |
Avvisi di emergenza
In Android 15 e versioni successive, gli avvisi di emergenza sono supportati per le stazioni radio HD per
informare gli utenti delle app radio degli avvisi di emergenza inviati dalle stazioni radio.
L'avviso di emergenza (Alert) segue lo
standard Common Alerting Protocol (CAP) 1.2
e supporta gli avvisi mostrati nella tabella seguente:
| Informazioni sull'avviso | Descrizione | Valori enum disponibili |
|---|---|---|
AlertStatus |
Stato del messaggio di avviso | ACTUAL, EXERCISE e TEST |
AlertMessageType |
Tipo di messaggio di avviso di emergenza | ALERT, UPDATE e CANCEL |
AlertCategory |
Categoria dell'evento oggetto del messaggio di avviso di emergenza | GEO, MET, SAFETY, SECURITY,
RESCUE, FIRE, HEALTH, ENV,
TRANSPORT, INFRA, CBRNE, OTHER |
AlertUrgency |
Urgenza dell'evento oggetto del messaggio di avviso di emergenza | IMMEDIATE, EXPECTED, FUTURE, PAST e UNKNOWN |
AlertSeverity |
Gravità dell'evento oggetto del messaggio di avviso di emergenza | EXTREME, SEVERE, MODERATE, MINOR e UNKNOWN |
AlertCertainty |
Certezza dell'evento oggetto del messaggio di avviso di emergenza | OBSERVED, LIKELY, POSSIBLE, UNLIKELY e UNKNOWN |
Alert (che contiene le informazioni nella tabella), i messaggi di avviso
e AlertArea per mostrare informazioni sull'avviso corrente.
Alert è un campo facoltativo in ProgramInfo in modo che possa essere inviato da
Broadcast Radio HAL alle app radio tramite callback del tuner per le informazioni
sul programma corrente e gli aggiornamenti dell'elenco dei programmi.