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). SeResult
ostatus
èOK
, il callback del sintonizzatoretuneFailed
ocurrentProgramInfoChanged
deve 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.
getImage
richiede che l'immagine restituita sia inferiore a 1 MB.onProgramListUpdate
richiede che ognichunk
sia 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
Constant
viene rimossa in AIDL e definita come const int inIBroadcastRadio
. Nel frattempo,ANTENNA_DISCONNECTED_TIMEOUT_MS
viene 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
RDS
eDeemphasis
vengono rimosse in AIDL e definite come const int inAmFmRegionConfig
. Di conseguenza, siafmDeemphasis
chefmRds
inProgramInfo
vengono dichiarati come int, un risultato di calcolo bit dei rispettivi flag. Nel frattempo,D50
eD75
vengono rinominatiDEEMPHASIS_D50
eDEEMPHASIS_D75
, rispettivamente. - L'enumerazione
ProgramInfoFlags
viene rimossa in AIDL e definita come const int inProgramInfo
con l'aggiunta di un prefissoFLAG_
. Di conseguenza,infoFlags
inProgramInfo
viene dichiarato come int, un risultato di calcolo bit dei flag.TUNED
viene rinominato anche inFLAG_TUNABLE
per descrivere meglio la sua definizione di stazione che può essere sintonizzata. - In
AmFmBandRange
,scanSpacing
viene rinominato inseekSpacing
, poichéscan
viene rinominato inseek
in AIDL. - Poiché il concetto di unione è introdotto in AIDL,
MetadataKey
eMetadata
definiti in HIDL HAL non vengono più utilizzati. Un'unione AIDLMetadata
è definita in AIDL HAL. Ogni valore enum precedentemente presente inMetadataKey
ora è un campo inMetadata
con 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.