HAL radio di trasmissione

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 HAL: quando viene aperta una nuova sessione del sintonizzatore, la sessione precedente deve essere terminata.
  • AIDL HAL: poiché non è disponibile alcuna sessione del tuner, è necessario impostare solo il callback del tuner. Se esiste, il vecchio callback deve essere annullato.
HIDL 2.0 openSession(ITunerCallback callback) genera (Result result, ITunerSession session)
AIDL void setTunerCallback(in ITunerCallback callback)
Descrizione:
  • HIDL HAL: la chiusura di una sessione del sintonizzatore non deve avere esito negativo e deve essere emessa una sola volta.
  • AIDL HAL: non è presente alcun sintonizzatore e deve essere annullata solo la richiamata del sintonizzatore.
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) o status (in AIDL). Se Result o status è OK, il callback del sintonizzatore tuneFailed o currentProgramInfoChanged 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 ogni chunk 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 in IBroadcastRadio. Nel frattempo, ANTENNA_DISCONNECTED_TIMEOUT_MS viene rinominato in ANTENNA_STATE_CHANGE_TIMEOUT_MS. Viene aggiunto un nuovo const int TUNER_TIMEOUT_MS. Tutte le operazioni di sintonizzazione, ricerca e avanzamento devono essere completate entro questo periodo di tempo.
  • Le enumerazioni RDS e Deemphasis vengono rimosse in AIDL e definite come const int in AmFmRegionConfig. Di conseguenza, sia fmDeemphasis che fmRds in ProgramInfo vengono dichiarati come int, un risultato di calcolo bit dei rispettivi flag. Nel frattempo, D50 e D75 vengono rinominati DEEMPHASIS_D50 e DEEMPHASIS_D75, rispettivamente.
  • L'enumerazione ProgramInfoFlags viene rimossa in AIDL e definita come const int in ProgramInfo con l'aggiunta di un prefisso FLAG_. Di conseguenza, infoFlags in ProgramInfo viene dichiarato come int, un risultato di calcolo bit dei flag. TUNED viene rinominato anche in FLAG_TUNABLE per descrivere meglio la sua definizione di stazione che può essere sintonizzata.
  • In AmFmBandRange, scanSpacing viene rinominato in seekSpacing, poiché scan viene rinominato in seek in AIDL.
  • Poiché il concetto di unione è introdotto in AIDL, MetadataKey e Metadata definiti in HIDL HAL non vengono più utilizzati. Un'unione AIDL Metadata è definita in AIDL HAL. Ogni valore enum precedentemente presente in MetadataKey ora è un campo in Metadata 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
Puoi utilizzare 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.