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:
|
||
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: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. SiResult
ostatus
esOK
, la devolución de llamada del sintonizador Se debe llamar atuneFailed
ocurrentProgramInfoChanged
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 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 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 enIBroadcastRadio
Mientras tanto, se cambia el nombre deANTENNA_DISCONNECTED_TIMEOUT_MS
aANTENNA_STATE_CHANGE_TIMEOUT_MS
. Un nuevo valor constanteTUNER_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
yDeemphasis
, y se definieron como int int. enAmFmRegionConfig
. En consecuencia,fmDeemphasis
y LasfmRds
enProgramInfo
se declaran como int, un resultado de cálculo de bits de las marcas respectivas. Mientras tanto, se cambiaron los nombres deD50
yD75
aDEEMPHASIS_D50
yDEEMPHASIS_D75
, respectivamente. - Se quitan del AIDL las enumeraciones
ProgramInfoFlags
y se definen como int int en Se agregóProgramInfo
con un prefijoFLAG_
. En consecuencia,infoFlags
enProgramInfo
se declara como int, un resultado de cálculo de bits. de marcas. También se cambió el nombre deTUNED
porFLAG_TUNABLE
para describirlo mejor. la definición de que se puede sintonizar la estación. - En
AmFmBandRange
, se cambia el nombre descanSpacing
aseekSpacing
, ya que se cambió el nombre descan
aseek
en el AIDL. - Dado que el concepto de unión se introduce en el AIDL,
MetadataKey
y LosMetadata
definidos en la HAL de HIDL ya no se usan. Una unión del AIDLMetadata
se define en la HAL del AIDL. Cada valor de enumeración que antes se encontraba enMetadataKey
ahora es un campo enMetadata
con tipo de cadena o int, según sus definiciones.