Le sezioni seguenti descrivono come utilizzare il livello di astrazione hardware (HAL) per implementare la radio.
Interfaccia HAL radio di trasmissione
L'HAL radio di trasmissione fornisce strutture di dati e interfacce a livello di hardware per implementare la radio di trasmissione, ad esempio le radio AM/FM e DAB.
Interfacce HIDL 2.0 e AIDL
L'HAL radio di trasmissione utilizza le interfacce descritte nelle sezioni seguenti.
IAnnouncementListener
IAnnouncementListener
è l'interfaccia di callback per l'ascoltatore di annunci, che può essere registrato nell'HAL radio per la trasmissione per ricevere gli annunci. L'interfaccia ha i seguenti metodi:
IAnnouncementListener | ||
---|---|---|
Descrizione: viene chiamato ogni volta che l'elenco degli annunci è cambiato. | ||
HIDL 2.0 | oneway onListUpdated(vec<Announcement> announcements) |
|
AIDL | oneway void onListUpdated(in Announcement[] announcements) |
ICloseHandle
ICloseHandle
è il 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 radio per la trasmissione per inviare aggiornamenti al servizio client HAL.
ITunerCallback | ||
---|---|---|
Descrizione: viene chiamata dall'HAL quando un'operazione di sintonizzazione (tune, seek (in AIDL) o scan (in HIDL) e il passaggio riesce) non va a buon fine in modo asincrono. | ||
HIDL 2.0 | oneway onCurrentProgramInfoChanged(ProgramInfo info) |
|
AIDL | void onCurrentProgramInfoChanged(in ProgramInfo info) |
|
Descrizione: viene chiamato quando l'operazione di sintonizzazione, ricerca (in AIDL) o scansione (in HIDL) o il passaggio va a buon fine. | ||
HIDL 2.0 | oneway onTuneFailed(Result result, ProgramSelector selector) |
|
AIDL | void onTuneFailed(in Result result, in ProgramSelector selector) |
|
Descrizione: viene chiamato quando l'operazione di sintonizzazione, ricerca (in AIDL) o scansione (in HIDL) o il passaggio va a buon fine. | ||
HIDL 2.0 | oneway onCurrentProgramInfoChanged(ProgramInfo info) |
|
AIDL | void onCurrentProgramInfoChanged(in ProgramInfo info) |
|
Descrizione: viene chiamato quando l'elenco dei programmi viene aggiornato. La dimensione di ogni chunk deve essere limitata a 500 KB. | ||
HIDL 2.0 | oneway onProgramListUpdated(ProgramListChunk chunk) |
|
AIDL | oneway onProgramListUpdated(ProgramListChunk chunk) |
|
Descrizione: viene chiamato quando l'antenna è collegata o scollegata. | ||
HIDL 2.0 | oneway onAntennaStateChange(bool connected) |
|
AIDL | void onCurrentProgramInfoChanged(in ProgramInfo info) |
|
Descrizione: viene chiamato quando i valori dei parametri specifici del fornitore vengono aggiornati internamente in HAL (non chiamare dopo aver chiamato setParameters dal client HAL). |
||
HIDL 2.0 | oneway onParametersUpdated(vec<VendorKeyValue> parameters) |
|
AIDL | void onParametersUpdated(in VendorKeyValue[] parameters) |
|
Descrizione: novità in AIDL. Viene chiamato quando il flag di configurazione viene aggiornato internamente nell'HAL (non deve essere invocato 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 radio di trasmissione. Nell'HAL HIDL 2.0, utilizza l'interfaccia ITunerSession
con il sintonizzatore per chiamare le operazioni. Tuttavia, al massimo un sintonizzatore è attivo alla volta (a condizione che ogni istanza HAL radio di trasmissione abbia un solo chip sintonizzatore).
ITunerSession
è stato rimosso dalle interfacce AIDL e le sue interfacce sono state spostate in
IBroadcastRadio
.
IBroadcastRadio | ||
---|---|---|
Descrizione: visualizza la descrizione di un modulo e delle sue funzionalità. | ||
HIDL 2.0 | getProperties() generates (Properties properties) |
|
AIDL | Properties getProperties() |
|
Descrizione: recupera la configurazione della regione AM/FM attuale o possibile. | ||
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, le dimensioni dell'immagine devono essere inferiori a 1 MB a causa di un limite rigido del buffer delle transazioni del binder. | ||
HIDL 2.0 | getImage(uint32_t id) generates (vec<uint8_t> image) |
|
AIDL | byte[] getImage(in int id) |
|
Descrizione: registra l'ascoltatore di annunci. | ||
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 la radio su un programma specificato. | ||
HIDL 2.0 | tune(ProgramSelector program) generates (Result result) |
|
AIDL | void tune(in ProgramSelector program) |
|
Descrizione: cerca il prossimo programma valido trasmesso. 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) |
|
Descrizione: passaggi che portano al canale adiacente, che non può essere occupato da nessun programma. | ||
HIDL 2.0 | step(bool directionUp) generates (Result result) |
|
AIDL | void step(in boolean directionUp) |
|
Descrizione: annulla la sintonizzazione, la ricerca (in HIDL) o la ricerca (in AIDL) in attesa o le operazioni di avanzamento. | ||
HIDL 2.0 | cancel() |
|
AIDL | void cancel() |
|
Descrizione: applica un filtro all'elenco dei programmi e inizia a inviare gli aggiornamenti dell'elenco tramite il callback onProgramListUpdated . |
||
HIDL 2.0 | startProgramListUpdates(ProgramFilter filter) generates (Result result) |
|
AIDL | void startProgramListUpdates(in ProgramFilter filter) |
|
Descrizione: interrompe l'invio di aggiornamenti dell'elenco dei programmi. | ||
HIDL 2.0 | stopProgramListUpdates() |
|
AIDL | void stopProgramListUpdates() |
|
Descrizione: recupera l'impostazione corrente 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 sintonizzazione (ad esempio sintonizzazione, ricerca (in HIDL) o ricerca (in AIDL) e passaggio) potrebbe essere dispendiosa in termini di tempo e il thread non deve essere bloccato per molto tempo, l'operazione deve pianificare le operazioni che richiedono tempo in modo che vengano eseguite in un secondo momento e restituire rapidamente uno stato o un risultato. In dettaglio, ogni operazione deve:
- Annullare 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 poi restituisci immediatamente
Result
(in HIDL) ostatus
(in AIDL). SeResult
ostatus
èOK
, il callback del sintonizzatoretuneFailed
ocurrentProgramInfoChanged
deve essere chiamato quando l'attività di sintonizzazione è andata a buon fine (ad esempio a causa di un timeout) o è completata.
Analogamente, startProgramListUpdates
pianifica anche l'attività di aggiornare l'elenco dei programmi, che richiede molto tempo, in modo che venga eseguita 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.
Condizione di gara
A causa del comportamento asincrono delle operazioni di sintonizzazione (ad esempio tune, scan (in HIDL) o seek (in AIDL) e step), esiste una condizione di gara 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.
Analogamente, se stopProgramListUpdates
viene chiamato dopo che l'HAL ha completato un aggiornamento dell'elenco di programmi e prima del completamento del callback onCurrentProgramInfoChanged
, stopProgramListUpdates
può essere ignorato e il callback dovrebbe essere completato.
Limite di dimensioni dei dati
Poiché esiste un limite massimo per il buffer delle transazioni del binder, il limite di dati per alcuni metodi di interfaccia che trasmettono dati di dimensioni potenzialmente grandi è chiarito nell'HAL AIDL.
getImage
richiede che l'immagine restituita sia inferiore a 1 MB.onProgramListUpdate
richiede che ognichunk
abbia dimensioni inferiori a 500 KB. Gli elenchi di programmi più grandi devono essere suddivisi dall'implementazione HAL in più chunk e inviati tramite più callback.
Modifiche alle strutture di dati HAL AIDL
Oltre alle modifiche alle interfacce, queste modifiche sono state applicate alle strutture di dati definite nell'HAL AIDL della radio di trasmissione, che sfrutta l'AIDL.
- L'enum
Constant
viene rimosso in AIDL e definito 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. - Gli enum
RDS
eDeemphasis
vengono rimossi in AIDL e definiti come const int inAmFmRegionConfig
. Di conseguenza, siafmDeemphasis
chefmRds
inProgramInfo
sono dichiarati come int, un risultato di calcolo in bit dei rispettivi flag. Nel frattempo,D50
eD75
vengono rinominati rispettivamente inDEEMPHASIS_D50
eDEEMPHASIS_D75
. - Gli enum
ProgramInfoFlags
vengono rimossi in AIDL e definiti come const int inProgramInfo
con l'aggiunta di un prefissoFLAG_
. Di conseguenza,infoFlags
inProgramInfo
è dichiarato come int, un risultato del calcolo dei bit dei flag. AncheTUNED
è stato rinominato inFLAG_TUNABLE
per descrivere meglio la sua definizione, ovvero la stazione su cui è possibile sintonizzarsi. - In
AmFmBandRange
,scanSpacing
viene rinominato inseekSpacing
, poichéscan
viene rinominato inseek
in AIDL. - Poiché il concetto di unione è introdotto in AIDL,
MetadataKey
eMetadata
definiti nell'HAL HIDL non vengono più utilizzati. Un'unione AIDLMetadata
è definita nell'HAL AIDL. Ogni valore dell'enum precedentemente inMetadataKey
ora è un campo inMetadata
di tipo stringa o int, a seconda delle relative definizioni.
Supporto della radio DAB
Questa sezione descrive il supporto della radio DAB.
Identificatori
Il tipo di identificatore principale per le radio DAB e DMB nell'HAL Broadcast Radio AIDL è
DAB_SID_EXT
. DAB_SID_EXT
utilizza identificatori di servizi (SID) a 32 bit in modo da poter rappresentare
gli SID sia delle radio DAB che DMB.
Oltre agli identificatori principali, sono supportati 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 degli elenchi di programmi, le stazioni con lo stesso DAB_SID_EXT
vengono aggiornate insieme utilizzando ITunerCallback#onProgramListUpdated
. Questo aggiornamento viene poi trasmesso al servizio radio di trasmissione e a Radio Manager e infine all'app radio tramite android.hardware.radio.ProgramList
.
Metadati
La tabella seguente mostra i metadati supportati specifici per DAB nell'HAL Broadcast Radio AIDL:
Campo dei 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 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 della stazione, vengono forniti anche identificatori secondari come HD_STATION_NAME
e HD_STATION_LOCATION
. HD_STATION_LOCATION
, che fornisce informazioni sulla posizione, è stata introdotta in Android 15.
Attivare o disattivare la radio digitale
A partire da Android 15, puoi attivare o disattivare la radio digitale (ad esempio la radio HD) modificando
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
.
L'impostazione del flag su false
attiva la radio HD, mentre l'impostazione su
true
forza 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 stazione HD.
Stato di acquisizione degli indicatori
In Android 15 e versioni successive, le app radio possono mostrare agli utenti lo stato di acquisizione del segnale delle stazioni radio HD. Questa opzione è utile perché a volte l'acquisizione di un segnale HD forte può richiedere alcuni istanti.
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 in ProgramInfo.infoFlags
:
- Bit 6: indica se è stato acquisito il segnale radio HD.
- Bit 7: indica se sono disponibili i dati del servizio di informazioni sulla stazione (SIS). SIS fornisce informazioni aggiuntive sulla stazione e sui contenuti in riproduzione.
- Bit 8: indica se è disponibile l'audio digitale HD.
Metadati
La tabella seguente mostra i metadati della radio HD supportati per Android 15 e versioni successive.
Campo dei metadati | Descrizione |
---|---|
commentShortDescription |
Breve descrizione del contesto del commento |
commentActualText |
Testo del commento |
commercial |
Spot radio |
ufids |
Identificatori file univoci (UFID) associati ai contenuti |
hdStationNameShort |
Il nome breve o il nome breve universale della stazione radio HD |
hdStationNameLong |
Il nome lungo della stazione radio HD, lo slogan o un messaggio della stazione. |