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 setParametersby 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 setConfigFlagdal 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, scanviene rinominato inseek. | ||
| 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 ogni- chunksia 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 didabServiceNameShort) | Nome del servizio della stazione DAB | 
| dabComponentName(abbreviazione didabComponentNameShort) | 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,EXERCISEeTEST | 
| AlertMessageType | Tipo di messaggio di avviso di emergenza | ALERT,UPDATEeCANCEL | 
| 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,PASTeUNKNOWN | 
| AlertSeverity | Gravità dell'evento oggetto del messaggio di avviso di emergenza | EXTREME,SEVERE,MODERATE,MINOReUNKNOWN | 
| AlertCertainty | Certezza dell'evento oggetto del messaggio di avviso di emergenza | OBSERVED,LIKELY,POSSIBLE,UNLIKELYeUNKNOWN | 
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.
  
  
  
