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 estructuras de datos e interfaces a nivel del hardware para implementar la radio de transmisión, como la radio AM/FM y DAB.
Interfaces de 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 para el 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 identificador de cierre genérico para quitar una devolución de llamada que no necesita una interfaz activa.
ICloseHandle | ||
---|---|---|
Descripción: Cierra la manija. | ||
HIDL 2.0 | close() |
|
AIDL | void close() |
ITunerCallback
ITunerCallback
es la interfaz de devolución de llamada que llama el HAL de radio de transmisión para enviar actualizaciones al servicio de cliente del HAL.
ITunerCallback | ||
---|---|---|
Descripción: La HAL llama a este método cuando falla de forma asíncrona una operación de ajuste (tune, seek [en AIDL] o scan [en HIDL] y step se completan correctamente). | ||
HIDL 2.0 | oneway onCurrentProgramInfoChanged(ProgramInfo info) |
|
AIDL | void onCurrentProgramInfoChanged(in ProgramInfo info) |
|
Descripción: Se llama cuando se sintoniza, se busca (en AIDL) o se explora (en HIDL), o bien cuando se realiza un paso correctamente. | ||
HIDL 2.0 | oneway onTuneFailed(Result result, ProgramSelector selector) |
|
AIDL | void onTuneFailed(in Result result, in ProgramSelector selector) |
|
Descripción: Se llama cuando se sintoniza, se busca (en AIDL) o se explora (en HIDL), o bien cuando se realiza un paso correctamente. | ||
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 | void 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 internamente en el HAL (no se invoca después de llamar a setParameters por el cliente del HAL). |
||
HIDL 2.0 | oneway onParametersUpdated(vec<VendorKeyValue> parameters) |
|
AIDL | void onParametersUpdated(in VendorKeyValue[] parameters) |
|
Descripción: Es una novedad en AIDL. Se llama cuando la marca de configuración se actualiza internamente en la HAL (no se debe invocar después de llamar a setConfigFlag por parte del cliente de la HAL). |
||
HIDL 2.0 | No aplicable. | |
AIDL | void onConfigFlagUpdated(in ConfigFlag flag, in boolean value) |
IBroadcastRadio
IBroadcastRadio
es la interfaz principal para la HAL de radio de transmisión. En el HAL de HIDL 2.0, usa la interfaz ITunerSession
para el sintonizador para llamar a las operaciones. Sin embargo, como máximo, un sintonizador está activo a la vez (siempre que cada instancia del HAL de radio de transmisión solo tenga un chip de sintonizador).
Se quitó ITunerSession
de las interfaces de AIDL y sus interfaces se movieron a IBroadcastRadio
.
IBroadcastRadio | ||
---|---|---|
Descripción: Obtiene 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 de 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 fijo en el búfer de transacción del 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 específico. | ||
HIDL 2.0 | tune(ProgramSelector program) generates (Result result) |
|
AIDL | void tune(in ProgramSelector program) |
|
Descripción: Busca el siguiente programa válido en el aire. 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 hacia el 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 las operaciones pendientes de sintonización, análisis (en HIDL) o búsqueda (en AIDL), o bien las operaciones de pasos. | ||
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: Deja de enviar 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 valores de 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, sintonizar, explorar (en HIDL) o buscar (en AIDL) y avanzar) puede llevar mucho tiempo y el subproceso no debe bloquearse durante mucho tiempo, la operación debe programar las operaciones que consumen mucho tiempo para que se produzcan más tarde y devolver rápidamente un estado o 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, devuelve
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 ajuste haya fallado (por ejemplo, debido a un tiempo de espera agotado) o se haya completado.
Del mismo modo, startProgramListUpdates
también programa la tarea que requiere mucho tiempo de actualizar la lista de programas para que se realice más adelante y para que se muestre rápidamente un estado o resultado. Primero, el método cancela las solicitudes de actualización pendientes y, luego, programa la tarea de actualización y muestra el resultado rápidamente.
Condición de carrera
Debido al comportamiento asíncrono de las operaciones de sintonización (por ejemplo, sintonizar, explorar [en HIDL] o buscar [en AIDL] y avanzar), 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 debe completarse y ser recibida por el cliente del HAL.
Del mismo modo, 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 onCurrentProgramInfoChanged
, se puede ignorar stopProgramListUpdates
y se debe completar la devolución de llamada.
Límite de tamaño de datos
Dado que existe un límite estricto en el búfer de transacciones del binder, en el HAL de AIDL se aclara el límite de datos para algunos métodos de interfaz que pasan datos de un tamaño potencialmente grande.
getImage
requiere que la imagen devuelta tenga un tamaño inferior a 1 MB.onProgramListUpdate
requiere que cadachunk
sea inferior a 500 KiB. Las listas de programas más grandes deben dividirse en varios fragmentos por la implementación de HAL y enviarse a través de varias devoluciones de llamada.
Cambios en las estructuras de datos de la HAL de AIDL
Además de los cambios en las interfaces, estos cambios se aplicaron a las estructuras de datos definidas en la HAL de AIDL de radio de transmisión, que aprovecha el AIDL.
- Se quitó la enumeración
Constant
en AIDL y se definió como const int enIBroadcastRadio
. Mientras tanto, se cambió el nombre deANTENNA_DISCONNECTED_TIMEOUT_MS
aANTENNA_STATE_CHANGE_TIMEOUT_MS
. Se agrega un nuevo int constanteTUNER_TIMEOUT_MS
. Todas las operaciones de sintonización, búsqueda y paso deben completarse dentro de este período. - Se quitaron las enumeraciones
RDS
yDeemphasis
en AIDL y se definieron como const int enAmFmRegionConfig
. En consecuencia, tantofmDeemphasis
comofmRds
enProgramInfo
se declaran como int, un resultado de cálculo de bits de las marcas respectivas. Mientras tanto, se cambió el nombre deD50
yD75
aDEEMPHASIS_D50
yDEEMPHASIS_D75
, respectivamente. - Se quitaron las enumeraciones
ProgramInfoFlags
en AIDL y se definieron como const int enProgramInfo
con un prefijoFLAG_
agregado. Del mismo modo,infoFlags
enProgramInfo
se declara como int, un resultado de cálculo de bits de marcas.TUNED
también se renombra comoFLAG_TUNABLE
para describir mejor su definición de que la estación se puede sintonizar. - En
AmFmBandRange
, se cambió el nombre descanSpacing
aseekSpacing
, ya quescan
se cambió aseek
en AIDL. - Dado que el concepto de unión se introdujo en AIDL, ya no se usan
MetadataKey
yMetadata
definidos en la HAL de HIDL. Se define una unión de AIDLMetadata
en la 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 radio 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 de DAB
pueden compartir un DAB_SID_EXT
y tener diferentes valores de DAB_ENSEMBLE
o DAB_FREQUENCY_KHZ
. Para garantizar actualizaciones precisas de la lista 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, finalmente, a la app de radio a través de android.hardware.radio.ProgramList
.
Metadatos
En la siguiente tabla, se muestran los metadatos admitidos específicos de DAB en el HAL de radio de transmisión de AIDL:
Campo de metadatos | Descripción |
---|---|
dabEnsembleName (forma abreviada: dabEnsembleNameShort ) |
Nombre del conjunto de la estación de DAB |
dabServiceName (abreviado de dabServiceNameShort ) |
Nombre del servicio de la estación DAB |
dabComponentName (abreviado 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
sirve como 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
s. 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 se establece la marca en false
, se habilita la radio HD, mientras que si se establece en true
, se fuerza la radio analógica AM/FM.
Canales en HD disponibles
A partir de Android 15, los canales en 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 desde 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 mostrar a los usuarios el estado de adquisición de la señal de las estaciones de radio HD. Esto es útil porque, a veces, adquirir una señal HD potente puede tardar unos instantes.
Para proporcionar esta información, el sistema usa ProgramInfo.infoFlags
para hacer un seguimiento del estado y actualiza la app de radio a través de ITunerCallback#onCurrentProgramInfoChanged.
.
Así 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 la estación (SIS). El SIS proporciona información adicional sobre la estación y lo que se está reproduciendo.
- Bit 8: Indica si el audio digital en HD está 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 |
Breve descripción del contexto del comentario |
commentActualText |
Texto del comentario |
commercial |
Comercial de radio |
ufids |
Identificadores únicos de archivos (UFID) asociados con el contenido |
hdStationNameShort |
El nombre corto o el nombre corto universal de la estación de radio HD |
hdStationNameLong |
Nombre largo, lema o mensaje de la estación de radio HD. |
Alertas de emergencia
En Android 15 y versiones posteriores, se admiten las alertas de emergencia para las estaciones de radio HD, de modo que se informe a los usuarios de las apps de radio sobre las alertas de emergencia enviadas desde las estaciones de radio.
La alerta de emergencia (Alert
) sigue el estándar del Protocolo de alerta común (CAP) 1.2 y admite las alertas que se muestran en la siguiente tabla:
Información de la alerta | Descripción | Valores de enumeración disponibles |
---|---|---|
AlertStatus |
Estado del mensaje de alerta | ACTUAL , EXERCISE , TEST |
AlertMessageType |
Tipo de mensaje de alerta de emergencia | ALERT , UPDATE , CANCEL |
AlertCategory |
Categoría del evento temático del mensaje de alerta de emergencia | GEO , MET , SAFETY , SECURITY ,
RESCUE , FIRE , HEALTH , ENV ,
TRANSPORT , INFRA , CBRNE , OTHER |
AlertUrgency |
Urgencia del evento temático del mensaje de alerta de emergencia | IMMEDIATE , EXPECTED , FUTURE , PAST , UNKNOWN |
AlertSeverity |
Gravedad del evento sujeto del mensaje de alerta de emergencia | EXTREME , SEVERE , MODERATE , MINOR , UNKNOWN |
AlertCertainty |
Certeza del evento temático del mensaje de alerta de emergencia | OBSERVED , LIKELY , POSSIBLE , UNLIKELY , UNKNOWN |
Alert
(que contiene la información de la tabla), mensajes de texto de alerta y AlertArea
para mostrar información sobre la alerta actual.
Alert
es un campo opcional en ProgramInfo
para que se pueda enviar desde el HAL de transmisión de radio a las apps de radio a través de devoluciones de llamada del sintonizador para la información del programa actual y las actualizaciones de la lista de programas.