Transmisión de radio HAL

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:
  • HAL de HIDL: Cuando se abre una nueva sesión del sintonizador, se debe finalizar la anterior.
  • AIDL HAL: 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: Cerrar una sesión del sintonizador no debe fallar y solo se debe emitir una vez.
  • AIDL HAL: No hay sintonizador y solo se debe anular la devolución de llamada del sintonizador.
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) 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 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 cada chunk 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 en IBroadcastRadio. Mientras tanto, el nombre de ANTENNA_DISCONNECTED_TIMEOUT_MS cambia a ANTENNA_STATE_CHANGE_TIMEOUT_MS. Se agregó un nuevo const int TUNER_TIMEOUT_MS. Todas las operaciones de sintonización, búsqueda y paso deben completarse dentro de este tiempo.
  • Se quitaron los enum 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 procesamiento de bits de las marcas correspondientes. Mientras tanto, los nombres de D50 y D75 cambiaron a DEEMPHASIS_D50 y DEEMPHASIS_D75, respectivamente.
  • Se quitan los enum ProgramInfoFlags en AIDL y se definen como const int en ProgramInfo con un prefijo FLAG_ agregado. En consecuencia, infoFlags en ProgramInfo se declara como int, un resultado de procesamiento de bits de marcas. El nombre de TUNED también cambia a FLAG_TUNABLE para describir mejor su definición a la que se puede sintonizar la estación.
  • En AmFmBandRange, scanSpacing cambia de nombre a seekSpacing, ya que scan cambia de nombre a seek en AIDL.
  • Dado que se introduce el concepto de unión en AIDL, ya no se usan MetadataKey ni Metadata definidos en la HAL de HIDL. Se define una unión de AIDL Metadata en el 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 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