En las siguientes secciones, se describe cómo trabajar con la capa de abstracción de hardware (HAL) para implementar la radio de transmisión.
Interfaz de HAL de radio de transmisión
El HAL de radio de transmisión proporciona interfaces y estructuras de datos a nivel del hardware para implementar la radio de transmisión, como AM/FM y DAB.
Interfaces HIDL 2.0 y AIDL
El HAL de radio de transmisión usa las interfaces que se describen en las siguientes secciones.
IAnnouncementListener
IAnnouncementListener
es la interfaz de devolución de llamada del objeto de escucha de anuncios, que se puede registrar en el HAL de radio de transmisión para recibir anuncios. La interfaz tiene los siguientes métodos:
IAnnouncementListener | ||
---|---|---|
Descripción: Se llama cada vez que cambia la lista de anuncios. | ||
HIDL 2.0 | oneway onListUpdated(vec<Announcement> announcements) |
|
AIDL | oneway void onListUpdated(in Announcement[] announcements) |
ICloseHandle
ICloseHandle
es el controlador de cierre genérico para quitar una devolución de llamada que no necesita una interfaz activa.
ICloseHandle | ||
---|---|---|
Descripción: Cierra el mango. | ||
HIDL 2.0 | close() |
|
AIDL | void close() |
ITunerCallback
ITunerCallback
es la interfaz de devolución de llamada a la que llama el HAL de radio de transmisión para enviar actualizaciones al servicio de cliente de HAL.
ITunerCallback | ||
---|---|---|
Descripción: El HAL lo llama cuando falla de forma asíncrona una operación de ajuste (ajuste, búsqueda [en AIDL] o escaneo [en HIDL] y el paso se realiza correctamente). | ||
HIDL 2.0 | oneway onCurrentProgramInfoChanged(ProgramInfo info) |
|
AIDL | void onCurrentProgramInfoChanged(in ProgramInfo info) |
|
Descripción: Se llama cuando se realiza la sintonización, el salto (en AIDL) o el escaneo (en HIDL), o cuando se realiza correctamente el paso. | ||
HIDL 2.0 | oneway onTuneFailed(Result result, ProgramSelector selector) |
|
AIDL | void onTuneFailed(in Result result, in ProgramSelector selector) |
|
Descripción: Se llama cuando se realiza la sintonización, el salto (en AIDL) o el escaneo (en HIDL), o cuando se realiza correctamente el paso. | ||
HIDL 2.0 | oneway onCurrentProgramInfoChanged(ProgramInfo info) |
|
AIDL | void onCurrentProgramInfoChanged(in ProgramInfo info) |
|
Descripción: Se llama cuando se actualiza la lista de programas. El tamaño de cada fragmento debe limitarse a 500 KiB. | ||
HIDL 2.0 | oneway onProgramListUpdated(ProgramListChunk chunk) |
|
AIDL | oneway onProgramListUpdated(ProgramListChunk chunk) |
|
Descripción: Se llama cuando la antena está conectada o desconectada. | ||
HIDL 2.0 | oneway onAntennaStateChange(bool connected) |
|
AIDL | void onCurrentProgramInfoChanged(in ProgramInfo info) |
|
Descripción: Se llama cuando los valores de los parámetros específicos del proveedor se actualizan de forma interna en HAL (no invocar después de que el cliente de HAL llame a setParameters ). |
||
HIDL 2.0 | oneway onParametersUpdated(vec<VendorKeyValue> parameters) |
|
AIDL | void onParametersUpdated(in VendorKeyValue[] parameters) |
|
Descripción: Novedad de AIDL. Se llama cuando la marca de configuración se actualiza de forma interna en el HAL (no se debe invocar después de que el cliente de HAL llame a setConfigFlag ). |
||
HIDL 2.0 | No aplicable. | |
AIDL | void onConfigFlagUpdated(in ConfigFlag flag, in boolean value) |
IBroadcastRadio
IBroadcastRadio
es la interfaz principal del HAL de radio de transmisión. En el HAL de HIDL 2.0, usa la interfaz ITunerSession
al sintonizador para llamar a las operaciones. Sin embargo, como máximo, un sintonizador está activo a la vez (siempre que cada instancia de HAL de radio de transmisión tenga solo un chip de sintonizador).
Se quitó ITunerSession
de las interfaces de AIDL y sus interfaces se movieron a IBroadcastRadio
.
IBroadcastRadio | ||
---|---|---|
Descripción: Obtén la descripción de un módulo y sus capacidades. | ||
HIDL 2.0 | getProperties() generates (Properties properties) |
|
AIDL | Properties getProperties() |
|
Descripción: Recupera la configuración actual o posible de la región AM/FM. | ||
HIDL 2.0 | getAmFmRegionConfig(bool full) generates (Result result, AmFmRegionConfig
config) |
|
AIDL | AmFmRegionConfig getAmFmRegionConfig(bool full) |
|
Descripción: Recupera la configuración actual de la región de DAB. | ||
HIDL 2.0 | getDabRegionConfig() generates (Result result, vec<DabTableEntry>
config) |
|
AIDL | DabTableEntry[] getDabRegionConfig() |
|
Descripción: Obtiene una imagen de la caché del módulo de radio. En AIDL, el tamaño de la imagen debe ser inferior a 1 MB debido a un límite estricto en el búfer de transacciones de Binder. | ||
HIDL 2.0 | getImage(uint32_t id) generates (vec<uint8_t> image) |
|
AIDL | byte[] getImage(in int id) |
|
Descripción: Registra el objeto de escucha de anuncios. | ||
HIDL 2.0 | registerAnnouncementListener(vec<AnnouncementType>
enabled,IAnnouncementListener listener) generates (Result result, ICloseHandle
closeHandle) |
|
AIDL | ICloseHandle registerAnnouncementListener(in IAnnouncementListener listener, in
AnnouncementType[] enabled) |
|
Descripción:
|
||
HIDL 2.0 | openSession(ITunerCallback callback) genera
(Result result, ITunerSession session) |
|
AIDL | void setTunerCallback(in ITunerCallback callback) |
|
Descripción:
|
||
HIDL 2.0 | close() |
|
AIDL | unsetTunerCallback() |
|
Descripción: Sintoniza un programa especificado. | ||
HIDL 2.0 | tune(ProgramSelector program) generates (Result result) |
|
AIDL | void tune(in ProgramSelector program) |
|
Descripción: Busca el siguiente programa válido que se está transmitiendo. Para evitar confusiones en AIDL, se cambió el nombre de scan a seek .
|
||
HIDL 2.0 | scan(bool directionUp, bool skipSubChannel) generates (Result result) |
|
AIDL | void seek(in boolean directionUp, in boolean skipSubChannel) |
|
Descripción: Pasos al canal adyacente, que puede no estar ocupado por ningún programa. | ||
HIDL 2.0 | step(bool directionUp) generates (Result result) |
|
AIDL | void step(in boolean directionUp) |
|
Descripción: Cancela la sintonización pendiente, el análisis (en HIDL) o el salto (en AIDL), o las operaciones de paso. | ||
HIDL 2.0 | cancel() |
|
AIDL | void cancel() |
|
Descripción: Aplica un filtro a la lista de programas y comienza a enviar actualizaciones de la lista de programas a través de la devolución de llamada onProgramListUpdated . |
||
HIDL 2.0 | startProgramListUpdates(ProgramFilter filter) generates (Result result) |
|
AIDL | void startProgramListUpdates(in ProgramFilter filter) |
|
Descripción: Detiene el envío de actualizaciones de la lista de programas. | ||
HIDL 2.0 | stopProgramListUpdates() |
|
AIDL | void stopProgramListUpdates() |
|
Descripción: Recupera el parámetro de configuración actual de una marca de configuración determinada. | ||
HIDL 2.0 | isConfigFlagSet(ConfigFlag flag) generates (Result result, bool value) |
|
AIDL | boolean isConfigFlagSet(in ConfigFlag flag) |
|
Descripción: Establece la marca de configuración determinada. | ||
HIDL 2.0 | setConfigFlag(ConfigFlag flag, bool value) generates (Result result) |
|
AIDL | void setConfigFlag(in ConfigFlag flag, boolean value) |
|
Descripción: Establece valores de parámetros específicos del proveedor. | ||
HIDL 2.0 | setParameters(vec<VendorKeyValue> parameters)
genera, (vec<VendorKeyValue> results) |
|
AIDL | VendorKeyValue[] setParameters(in VendorKeyValue[] parameters) |
|
Descripción: Recupera los valores de los parámetros específicos del proveedor. | ||
HIDL 2.0 | getParameters(vec<string> keys) generates (vec<VendorKeyValue>
parameters) |
|
AIDL | VendorKeyValue[] getParameters(in String[] keys) |
Aclaraciones sobre la interfaz
Comportamiento asíncrono
Dado que cada operación de ajuste (por ejemplo, sintonización, escaneo [en HIDL] o búsqueda [en AIDL] y paso) puede llevar mucho tiempo y el subproceso no debe bloquearse durante mucho tiempo, la operación debe programar operaciones que requieran mucho tiempo para que se produzcan más adelante y mostrar rápidamente un estado o un resultado. En detalle, cada operación debe hacer lo siguiente:
- Cancela todas las operaciones de ajuste pendientes.
- Verifica si la operación se puede procesar según las entradas del método y el estado del sintonizador.
- Programa la tarea de ajuste y, luego, muestra
Result
(en HIDL) ostatus
(en AIDL) de inmediato. SiResult
ostatus
esOK
, se debe llamar a la devolución de llamada del sintonizadortuneFailed
ocurrentProgramInfoChanged
cuando la tarea de sintonización falle (por ejemplo, debido a un tiempo de espera) o se complete.
Del mismo modo, startProgramListUpdates
también programa la tarea que requiere más tiempo de actualizar la lista de programas para que se realice más adelante y mostrar rápidamente un estado o un resultado. El método primero cancela las solicitudes de actualización pendientes y, luego, programa la tarea de actualización y muestra rápidamente el resultado.
Condición de carrera
Debido al comportamiento asíncrono de las operaciones de sintonización (por ejemplo, sintonización, escaneo (en HIDL) o búsqueda (en AIDL) y paso), existe una condición de carrera entre la cancelación de la operación y las operaciones de sintonización. Si se llama a cancel
después de que el HAL completa una operación de ajuste y antes de que se complete la devolución de llamada, se puede ignorar la cancelación y la devolución de llamada debería completarse y recibirse por parte del cliente de HAL.
De manera similar, si se llama a stopProgramListUpdates
después de que el HAL completa una actualización de la lista de programas y antes de que se complete la devolución de llamada de onCurrentProgramInfoChanged
, se puede ignorar stopProgramListUpdates
y se debe completar la devolución de llamada.
Límite de tamaño de los datos
Dado que hay un límite estricto en el búfer de transacciones de Binder, el límite de datos para algunos métodos de interfaz que pasan datos de un tamaño potencialmente grande se aclara en el HAL de AIDL.
getImage
requiere que la imagen que se devuelve sea inferior a 1 MB.onProgramListUpdate
requiere que cadachunk
sea inferior a 500 KiB. La implementación de HAL debe dividir las listas de programas más grandes en varios fragmentos y enviarlas a través de varias devoluciones de llamada.
Cambios en las estructuras de datos de HAL de AIDL
Además de los cambios en las interfaces, estos cambios se aplicaron a las estructuras de datos definidas en el HAL de AIDL de radiodifusión, que aprovecha el AIDL.
- Se quitó la enumeración
Constant
en AIDL y se definió como const int enIBroadcastRadio
. Mientras tanto, el nombre deANTENNA_DISCONNECTED_TIMEOUT_MS
cambia aANTENNA_STATE_CHANGE_TIMEOUT_MS
. Se agregó un nuevo const intTUNER_TIMEOUT_MS
. Todas las operaciones de sintonización, búsqueda y paso deben completarse dentro de este tiempo. - Se quitaron los enum
RDS
yDeemphasis
en AIDL y se definieron como const int enAmFmRegionConfig
. En consecuencia, tantofmDeemphasis
comofmRds
enProgramInfo
se declaran como int, un resultado de procesamiento de bits de las marcas correspondientes. Mientras tanto, los nombres deD50
yD75
cambiaron aDEEMPHASIS_D50
yDEEMPHASIS_D75
, respectivamente. - Se quitan los enum
ProgramInfoFlags
en AIDL y se definen como const int enProgramInfo
con un prefijoFLAG_
agregado. En consecuencia,infoFlags
enProgramInfo
se declara como int, un resultado de procesamiento de bits de marcas. El nombre deTUNED
también cambia aFLAG_TUNABLE
para describir mejor su definición a la que se puede sintonizar la estación. - En
AmFmBandRange
,scanSpacing
cambia de nombre aseekSpacing
, ya quescan
cambia de nombre aseek
en AIDL. - Dado que se introduce el concepto de unión en AIDL, ya no se usan
MetadataKey
niMetadata
definidos en la HAL de HIDL. Se define una unión de AIDLMetadata
en el HAL de AIDL. Cada valor de enumeración que antes estaba enMetadataKey
ahora es un campo enMetadata
con el tipo de cadena o int, según sus definiciones.
Compatibilidad con radios DAB
En esta sección, se describe la compatibilidad con la radio DAB.
Identificadores
El tipo de identificador principal para la radio DAB y DMB en el HAL de radio de transmisión de AIDL es DAB_SID_EXT
. DAB_SID_EXT
usa identificadores de servicio (SID) de 32 bits para poder representar el SID de la radio DAB y DMB.
Además de los identificadores principales, se admiten identificadores secundarios, como DAB_ENSEMBLE
y DAB_FREQUENCY_KHZ
. Esto es importante porque varias estaciones DAB pueden compartir un DAB_SID_EXT
y tener diferentes valores de DAB_ENSEMBLE
o DAB_FREQUENCY_KHZ
. Para garantizar actualizaciones precisas de las listas de programas, las estaciones con el mismo DAB_SID_EXT
se actualizan juntas con ITunerCallback#onProgramListUpdated
. Luego, esta actualización se retransmite al servicio de radio de transmisión y al administrador de radio, y, por último, a la app de radio a través de android.hardware.radio.ProgramList
.
Metadatos
En la siguiente tabla, se muestran los metadatos compatibles específicos de DAB en el HAL de radio de transmisión AIDL:
Campo de metadatos | Descripción |
---|---|
dabEnsembleName (forma abreviada: dabEnsembleNameShort ) |
Nombre del conjunto de la estación DAB |
dabServiceName (abreviatura de dabServiceNameShort ) |
Nombre del servicio de la estación DAB |
dabComponentName (abreviatura de dabComponentNameShort ) |
Nombre del componente de la estación DAB |
Compatibilidad con HD Radio
En esta sección, se describe la compatibilidad con la radio HD.
Identificadores
HD_STATION_ID_EXT
funciona como el identificador principal de las estaciones de radio HD. Para mejorar aún más la identificación de la estación, también se proporcionan identificadores secundarios, como HD_STATION_NAME
y HD_STATION_LOCATION
. HD_STATION_LOCATION
, que proporciona información de ubicación, se introdujo en Android 15.
Cómo habilitar o inhabilitar la radio digital
A partir de Android 15, puedes habilitar o inhabilitar la radio digital (como la radio HD) ajustando los ConfigFlag
. Para controlar este parámetro de configuración de la radio FM, usa la marca FORCE_ANALOG_FM
. Para la radio AM, usa la marca FORCE_ANALOG_AM
.
Si estableces la marca en false
, se habilita la radio HD, mientras que si la estableces en true
, se fuerza la radio AM/FM analógica.
Canales en HD disponibles
A partir de Android 15, los canales HD disponibles actualmente para una estación de radio HD se pueden representar con una máscara de bits de 8 bits, Metadata#hdSubChannelsAvailable
, en ProgramInfo.metadata
. Por ejemplo, el valor del bit 1 de la izquierda representa si el subcanal HD2 está disponible para esta estación HD.
Estado de adquisición de la señal
En Android 15 y versiones posteriores, las apps de radio pueden mostrarles a los usuarios el estado de adquisición de señal de las estaciones de radio HD. Esto es útil porque adquirir una señal HD potente puede tardar unos momentos.
Para proporcionar esta información, el sistema usa ProgramInfo.infoFlags
para hacer un seguimiento del estado y actualizar la app de radio a través de ITunerCallback#onCurrentProgramInfoChanged.
.
A continuación, se muestra cómo se representa el estado en ProgramInfo.infoFlags
:
- Bit 6: Indica si se adquirió la señal de radio HD.
- Bit 7: Muestra si hay datos disponibles del servicio de información de estaciones (SIE). El SIS proporciona información adicional sobre la estación y lo que se está reproduciendo.
- Bit 8: Indica si hay audio digital HD disponible.
Metadatos
En la siguiente tabla, se muestran los metadatos de radio HD compatibles con Android 15 y versiones posteriores.
Campo de metadatos | Descripción |
---|---|
commentShortDescription |
Descripción breve del contexto del comentario |
commentActualText |
Texto del comentario |
commercial |
Comercial de radio |
ufids |
Los identificadores de archivos únicos (UFID) asociados con el contenido |
hdStationNameShort |
El nombre corto o universal de la estación de radio HD |
hdStationNameLong |
El nombre completo, el eslogan o un mensaje de la estación de radio HD |