Transmisión de radio HAL

En las siguientes secciones, se describe cómo trabajar con la capa de abstracción de hardware (HAL) para hacer lo siguiente: implementar la radiodifusión.

Interfaz de HAL de transmisión de radio

La HAL de radio de transmisión proporciona estructuras de datos e interfaces a nivel de hardware para implementar la radio de transmisión, como AM/FM y DAB.

Interfaces de AIDL y HIDL 2.0

La HAL de radio de transmisión usa las interfaces que se describen en las siguientes secciones.

IPromptListener

IAnnouncementListener es la interfaz de devolución de llamada para el objeto de escucha de anuncios, que pueden registrarse en la HAL de la transmisión de radio para recibir anuncios. La interfaz tiene lo siguiente métodos:

IPromptListener
Descripción: Se llama siempre que se haya completado la lista de anuncios cambió.
HIDL 2.0 oneway onListUpdated(vec<Announcement> announcements)
AIDL oneway void onListUpdated(in Announcement[] announcements)

ICloseHandle

ICloseHandle es el controlador de cierre genérico que permite quitar una devolución de llamada que no necesita un elemento. interfaz activa.

ICloseHandle
Descripción: Cierra el controlador.
HIDL 2.0 close()
AIDL void close()

ITunerCallback

ITunerCallback es la interfaz de devolución de llamada a la que llama la HAL de radio de transmisión para enviar actualizaciones al servicio de cliente HAL.

ITunerCallback
Descripción: La HAL lo llama cuando se realiza una operación de ajuste. (ajustar, buscar (en AIDL) o escanear (en HIDL) y los pasos se realizarán correctamente) falla de forma asíncrona.
HIDL 2.0 oneway onCurrentProgramInfoChanged(ProgramInfo info)
AIDL void onCurrentProgramInfoChanged(in ProgramInfo info)
Descripción: Se llama cuando se realiza un ajuste, una búsqueda (en AIDL) o una búsqueda (en HIDL), o si el paso tiene éxito.
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 un ajuste, una búsqueda (en AIDL) o una búsqueda (en HIDL), o si el paso tiene éxito.
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 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 se conecta la antena o desconectado.
HIDL 2.0 oneway onAntennaStateChange(bool connected)
AIDL void onCurrentProgramInfoChanged(in ProgramInfo info)
Descripción: Se llama cuando se proporciona un parámetro específico del proveedor se actualizan internamente en la HAL (no los invoques después de llamar a setParameters por el cliente HAL).
HIDL 2.0 oneway onParametersUpdated(vec<VendorKeyValue> parameters)
AIDL void onParametersUpdated(in VendorKeyValue[] parameters)
Descripción: Novedad en el AIDL. Se llama cuando la marca de configuración se se actualiza de forma interna en la HAL (no se debe invocado después de llamar a setConfigFlag por el cliente 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 HIDL 2.0 HAL, usa la interfaz ITunerSession para el sintonizador a fin de llamar a operaciones. Sin embargo, en la mayoría de un sintonizador está activo a la vez (siempre que cada instancia de HAL de radio de transmisión solo tenga un sintonizador ). Se quitó ITunerSession de las interfaces del AIDL y se movieron sus interfaces a IBroadcastRadio

iBroadcastRadio
Descripción:Obtén la descripción de un módulo y su capacidades de integración.
HIDL 2.0 getProperties() generates (Properties properties)
AIDL Properties getProperties()
Descripción: Recupera la AM/FM actual o posible. configuración de la región.
HIDL 2.0 getAmFmRegionConfig(bool full) generates (Result result, AmFmRegionConfig config)
AIDL AmFmRegionConfig getAmFmRegionConfig(bool full)
Descripción:Recupera la región del DAB actual configuración.
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 el 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 sesión anterior.
  • HAL del AIDL: Como no hay una sesión del sintonizador disponible, solo se debe establecer la devolución de llamada del sintonizador. Si existe, no se debe establecer 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 de sintonizador no debe fallar y solo se debe emitir una vez.
  • HAL de AIDL: No hay sintonizador y solo debe desactivarse la devolución de llamada del sintonizador.
HIDL 2.0 close()
AIDL unsetTunerCallback()
Descripción:Se ajusta a 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 el AIDL, Se cambió el nombre de scan por seek.
HIDL 2.0 scan(bool directionUp, bool skipSubChannel) generates (Result result)
AIDL void seek(in boolean directionUp, in boolean skipSubChannel)
Descripción: Pasos para ir al canal adyacente, que no pueden que puede ocupar ningún programa.
HIDL 2.0 step(bool directionUp) generates (Result result)
AIDL void step(in boolean directionUp)
Descripción: Cancela el ajuste, la búsqueda (en HIDL) o la búsqueda pendientes. (en AIDL) o las operaciones de pasos.
HIDL 2.0 cancel()
AIDL void cancel()
Descripción: Aplica un filtro a la lista de programas. comienza a enviar actualizaciones de la lista de programas a 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 la configuración actual de un determinado config.
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 los valores de los 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, ajuste, análisis (en HIDL) o búsqueda (en AIDL) y paso) puede puede consumir mucho tiempo y el subproceso no debe bloquearse por mucho tiempo, la operación debe programar operaciones que requieren mucho tiempo para que ocurran más tarde y que devuelvan rápidamente un estado o resultado. En detalle, cada operación debe:

  • Cancela todas las operaciones de ajuste pendientes.
  • Comprueba si la operación se puede procesar según las entradas del método y el estado de la decodificador.
  • Programa la tarea de ajuste y, luego, muestra Result (en HIDL). status (en AIDL) de inmediato. Si Result o status es OK, la devolución de llamada del sintonizador Se debe llamar a tuneFailed o currentProgramInfoChanged cuando el ajuste la tarea falló (por ejemplo, debido a un tiempo de espera) o se completó.

Del mismo modo, startProgramListUpdates también programa la lenta tarea de actualizar la lista de programas para que se lleve a cabo más tarde y para devolver 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 devuelve resultado.

Condición de carrera

Debido al comportamiento asíncrono de las operaciones de ajuste (por ejemplo, ajuste, análisis (en HIDL) o búsqueda (en AIDL) y el paso), existe una condición de carrera entre la cancelación de la operación y el ajuste las operaciones. Si se llama a cancel después de que la HAL completa una operación de ajuste y antes de se completa la devolución de llamada, se puede ignorar la cancelación, y esta debe completarse y recibirse por el cliente HAL.

De manera similar, si se llama a stopProgramListUpdates después de que la HAL completa un programa actualización de la lista y antes de que se complete la devolución de llamada onCurrentProgramInfoChanged, stopProgramListUpdates se puede ignorar, y la devolución de llamada debería completarse.

Límite de tamaño de los datos

Como hay un límite estricto en el búfer de transacciones de Binder, el límite de datos para algunas interfaces los métodos que pasan datos de un tamaño potencialmente grande se aclaran en la HAL del AIDL

  • getImage requiere que la imagen se muestre de menos de 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 múltiples devoluciones de llamada.

Cambios en las estructuras de datos de la HAL del AIDL

Además de los cambios en las interfaces, estos cambios se aplicaron a las estructuras de datos definido en la HAL del AIDL de la radio de transmisión, que aprovecha el AIDL.

  • Se quita la enumeración Constant del AIDL y se define como const int en IBroadcastRadio Mientras tanto, se cambia el nombre de ANTENNA_DISCONNECTED_TIMEOUT_MS a ANTENNA_STATE_CHANGE_TIMEOUT_MS. Un nuevo valor constante TUNER_TIMEOUT_MS es agregado. Todas las operaciones de ajuste, búsqueda y paso deben completarse dentro de este tiempo.
  • Se quitaron del AIDL las enumeraciones RDS y Deemphasis, y se definieron como int int. en AmFmRegionConfig. En consecuencia, fmDeemphasis y Las fmRds en ProgramInfo se declaran como int, un resultado de cálculo de bits de las marcas respectivas. Mientras tanto, se cambiaron los nombres de D50 y D75 a DEEMPHASIS_D50 y DEEMPHASIS_D75, respectivamente.
  • Se quitan del AIDL las enumeraciones ProgramInfoFlags y se definen como int int en Se agregó ProgramInfo con un prefijo FLAG_. En consecuencia, infoFlags en ProgramInfo se declara como int, un resultado de cálculo de bits. de marcas. También se cambió el nombre de TUNED por FLAG_TUNABLE para describirlo mejor. la definición de que se puede sintonizar la estación.
  • En AmFmBandRange, se cambia el nombre de scanSpacing a seekSpacing, ya que se cambió el nombre de scan a seek en el AIDL.
  • Dado que el concepto de unión se introduce en el AIDL, MetadataKey y Los Metadata definidos en la HAL de HIDL ya no se usan. Una unión del AIDL Metadata se define en la HAL del AIDL. Cada valor de enumeración que antes se encontraba en MetadataKey ahora es un campo en Metadata con tipo de cadena o int, según sus definiciones.