Trasmissione radio HAL

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 HAL: quando viene aperta una nuova sessione del sintonizzatore, la sessione precedente deve essere chiusa.
  • HAL AIDL: poiché non è disponibile alcuna sessione del sintonizzatore, è necessario impostare solo il callback del sintonizzatore. Se esiste, l'hook precedente non deve essere impostato.
HIDL 2.0 openSession(ITunerCallback callback) genera (Result result, ITunerSession session)
AIDL void setTunerCallback(in ITunerCallback callback)
Descrizione:
  • HAL HIDL: la chiusura di una sessione del sintonizzatore non deve avere esito negativo e deve essere emessa una sola volta.
  • HAL AIDL: non è presente alcun sintonizzatore e deve essere impostato solo il callback del sintonizzatore.
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) o status (in AIDL). Se Result o status è OK, il callback del sintonizzatore tuneFailed o currentProgramInfoChanged 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 ogni chunk 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 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.
  • Gli enum RDS e Deemphasis vengono rimossi in AIDL e definiti come const int in AmFmRegionConfig. Di conseguenza, sia fmDeemphasis che fmRds in ProgramInfo sono dichiarati come int, un risultato di calcolo in bit dei rispettivi flag. Nel frattempo, D50 e D75 vengono rinominati rispettivamente in DEEMPHASIS_D50 e DEEMPHASIS_D75.
  • Gli enum ProgramInfoFlags vengono rimossi in AIDL e definiti come const int in ProgramInfo con l'aggiunta di un prefisso FLAG_. Di conseguenza, infoFlags in ProgramInfo è dichiarato come int, un risultato del calcolo dei bit dei flag. Anche TUNED è stato rinominato in FLAG_TUNABLE per descrivere meglio la sua definizione, ovvero la stazione su cui è possibile sintonizzarsi.
  • 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 nell'HAL HIDL non vengono più utilizzati. Un'unione AIDL Metadata è definita nell'HAL AIDL. Ogni valore dell'enum precedentemente in MetadataKey ora è un campo in Metadata 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.