HAL de transmisión de radio

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:
  • HAL de HIDL: Cuando se abre una nueva sesión de sintonizador, se debe finalizar la sesión anterior.
  • HAL de AIDL: Como no hay ninguna sesión de sintonizador disponible, solo se debe configurar la devolución de llamada del sintonizador. Si existe, se debe anular la devolución de llamada anterior.
HIDL 2.0 openSession(ITunerCallback callback) genera (Result result, ITunerSession session)
AIDL void setTunerCallback(in ITunerCallback callback)
Descripción:
  • HAL de HIDL: El cierre de una sesión de sintonizador no debe fallar y solo se debe emitir una vez.
  • HAL de AIDL: No hay sintonizador y solo se debe anular el ajuste de la devolución de llamada del sintonizador.
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) o status (en AIDL) de inmediato. Si Result o status es OK, se debe llamar a la devolución de llamada del sintonizador tuneFailed o currentProgramInfoChanged 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 cada chunk 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 en IBroadcastRadio. Mientras tanto, se cambió el nombre de ANTENNA_DISCONNECTED_TIMEOUT_MS a ANTENNA_STATE_CHANGE_TIMEOUT_MS. Se agrega un nuevo int constante TUNER_TIMEOUT_MS. Todas las operaciones de sintonización, búsqueda y paso deben completarse dentro de este período.
  • Se quitaron las enumeraciones RDS y Deemphasis en AIDL y se definieron como const int en AmFmRegionConfig. En consecuencia, tanto fmDeemphasis como fmRds en ProgramInfo se declaran como int, un resultado de cálculo de bits de las marcas respectivas. Mientras tanto, se cambió el nombre de D50 y D75 a DEEMPHASIS_D50 y DEEMPHASIS_D75, respectivamente.
  • Se quitaron las enumeraciones ProgramInfoFlags en AIDL y se definieron como const int en ProgramInfo con un prefijo FLAG_ agregado. Del mismo modo, infoFlags en ProgramInfo se declara como int, un resultado de cálculo de bits de marcas. TUNED también se renombra como FLAG_TUNABLE para describir mejor su definición de que la estación se puede sintonizar.
  • En AmFmBandRange, se cambió el nombre de scanSpacing a seekSpacing, ya que scan se cambió a seek en AIDL.
  • Dado que el concepto de unión se introdujo en AIDL, ya no se usan MetadataKey y Metadata definidos en la HAL de HIDL. Se define una unión de AIDL Metadata en la HAL de AIDL. Cada valor de enumeración que antes estaba en MetadataKey ahora es un campo en Metadata 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 ConfigFlags. 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
Puedes usar 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.