广播电台 HAL

下面几部分介绍了如何使用硬件抽象层 (HAL) 实现以下目的: 实现广播电台功能。

广播电台 HAL 接口

广播电台 HAL 在硬件级别提供数据结构和接口, 实现广播电台功能,例如 AM/FM 和 DAB 电台。

HIDL 2.0 和 AIDL 接口

广播电台 HAL 使用下面几部分中介绍的接口。

IAnnouncementListener

IAnnouncementListener 是通知监听器的回调接口, 可以在广播电台 HAL 上注册以接收通知。该界面具有以下特征 方法:

IAnnouncementListener
说明:每当通知列表包含以下内容时调用 已更改。
HIDL 2.0 oneway onListUpdated(vec<Announcement> announcements)
AIDL oneway void onListUpdated(in Announcement[] announcements)

ICloseHandle

ICloseHandle 是通用关闭句柄,用于移除不需要 活动接口

ICloseHandle
说明:关闭手柄。
HIDL 2.0 close()
AIDL void close()

ITunerCallback

ITunerCallback 是由广播电台 HAL 调用的回调接口,用于 向 HAL 客户端服务发送更新。

ITunerCallback
说明:在执行调参操作时由 HAL 调用 (调谐、搜寻(使用 AIDL)或扫描(使用 HIDL)且步骤成功时异步失败。
HIDL 2.0 oneway onCurrentProgramInfoChanged(ProgramInfo info)
AIDL void onCurrentProgramInfoChanged(in ProgramInfo info)
说明:在调谐、跳转(使用 AIDL)或扫描时调用 (在 HIDL 中),或者步骤成功完成。
HIDL 2.0 oneway onTuneFailed(Result result, ProgramSelector selector)
AIDL void onTuneFailed(in Result result, in ProgramSelector selector)
说明:在调谐、跳转(使用 AIDL)或扫描时调用 (在 HIDL 中),或者步骤成功完成。
HIDL 2.0 oneway onCurrentProgramInfoChanged(ProgramInfo info)
AIDL void onCurrentProgramInfoChanged(in ProgramInfo info)
说明:在节目列表更新时调用; 每个分块的大小不应超过 500kiB。
HIDL 2.0 oneway onProgramListUpdated(ProgramListChunk chunk)
AIDL oneway onProgramListUpdated(ProgramListChunk chunk)
说明:在连接天线或天线时调用 已断开连接。
HIDL 2.0 oneway onAntennaStateChange(bool connected)
AIDL void onCurrentProgramInfoChanged(in ProgramInfo info)
说明:在供应商专用参数时调用 值在 HAL 内部更新(不要在调用 setParameters(由 HAL 客户端提供)。
HIDL 2.0 oneway onParametersUpdated(vec<VendorKeyValue> parameters)
AIDL void onParametersUpdated(in VendorKeyValue[] parameters)
说明:AIDL 中的新功能。在配置标志处于以下状态时调用 (不应 在 HAL 客户端调用 setConfigFlag 之后调用)。
HIDL 2.0 不适用。
AIDL void onConfigFlagUpdated(in ConfigFlag flag, in boolean value)

IBroadcastRadio

IBroadcastRadio 是广播电台 HAL 的主要接口。在 HIDL 中 2.0 HAL,请使用调谐器的 ITunerSession 接口来调用操作。然而,在 一次最多只有一个调谐器处于活跃状态(前提是每个广播电台 HAL 实例只有一个调谐器) 条状标签)。 从 AIDL 接口中移除了 ITunerSession,并将其接口移至 IBroadcastRadio

IBroadcastRadio
说明:获取模块的说明及其 功能。
HIDL 2.0 getProperties() generates (Properties properties)
AIDL Properties getProperties()
说明:提取当前或可能的 AM/FM 区域配置。
HIDL 2.0 getAmFmRegionConfig(bool full) generates (Result result, AmFmRegionConfig config)
AIDL AmFmRegionConfig getAmFmRegionConfig(bool full)
说明:提取当前的 DAB 区域 配置。
HIDL 2.0 getDabRegionConfig() generates (Result result, vec<DabTableEntry> config)
AIDL DabTableEntry[] getDabRegionConfig()
说明:从电台模块缓存中获取图片。 采用 AIDL 时,图片必须小于 1MB 因为 binder 事务缓冲区存在硬性限制。
HIDL 2.0 getImage(uint32_t id) generates (vec<uint8_t> image)
AIDL byte[] getImage(in int id)
说明:注册通知监听器。
HIDL 2.0 registerAnnouncementListener(vec<AnnouncementType> enabled,IAnnouncementListener listener) generates (Result result, ICloseHandle closeHandle)
AIDL ICloseHandle registerAnnouncementListener(in IAnnouncementListener listener, in AnnouncementType[] enabled)
说明
  • HIDL HAL:打开新的调谐器会话时,必须终止旧的会话。
  • AIDL HAL:由于没有可用的调谐器会话,因此只需设置调谐器回调。 如果调谐器回调已存在,则应取消设置旧回调。
HIDL 2.0 openSession(ITunerCallback callback)生成 (Result result, ITunerSession session)
AIDL void setTunerCallback(in ITunerCallback callback)
说明
  • HIDL HAL:关闭调谐器会话不得失败,并且只能发出一次该命令。
  • AIDL HAL:没有调谐器,只需要取消设置调谐器回调。
HIDL 2.0 close()
AIDL unsetTunerCallback()
说明:调谐到指定的节目。
HIDL 2.0 tune(ProgramSelector program) generates (Result result)
AIDL void tune(in ProgramSelector program)
说明:在 。为了避免对 AIDL 造成混淆, scan 已重命名为 seek
HIDL 2.0 scan(bool directionUp, bool skipSubChannel) generates (Result result)
AIDL void seek(in boolean directionUp, in boolean skipSubChannel)
说明:相邻信道的步骤(可能未 被任何程序占用。
HIDL 2.0 step(bool directionUp) generates (Result result)
AIDL void step(in boolean directionUp)
说明:取消待处理的调谐、扫描(使用 HIDL)或跳转 (采用 AIDL)或步进运算。
HIDL 2.0 cancel()
AIDL void cancel()
说明:对计划列表应用过滤条件,以及 开始通过以下时间发送节目列表更新: onProgramListUpdated 回调。
HIDL 2.0 startProgramListUpdates(ProgramFilter filter) generates (Result result)
AIDL void startProgramListUpdates(in ProgramFilter filter)
说明:停止发送节目列表更新。
HIDL 2.0 stopProgramListUpdates()
AIDL void stopProgramListUpdates()
说明:提取给定实例的当前设置 config 标志。
HIDL 2.0 isConfigFlagSet(ConfigFlag flag) generates (Result result, bool value)
AIDL boolean isConfigFlagSet(in ConfigFlag flag)
说明:设置给定配置标志。
HIDL 2.0 setConfigFlag(ConfigFlag flag, bool value) generates (Result result)
AIDL void setConfigFlag(in ConfigFlag flag, boolean value)
说明:设置供应商特定的参数值。
HIDL 2.0 setParameters(vec<VendorKeyValue> parameters)

生成

(vec<VendorKeyValue> results)
AIDL VendorKeyValue[] setParameters(in VendorKeyValue[] parameters)
说明:检索供应商特定的参数值。
HIDL 2.0 getParameters(vec<string> keys) generates (vec<VendorKeyValue> parameters)
AIDL VendorKeyValue[] getParameters(in String[] keys)

接口说明

异步行为

由于每项调谐操作(例如调谐、扫描(使用 HIDL)或搜寻(使用 AIDL)和步进可能 非常耗时,且不应长时间阻塞线程,那么操作应 将耗时的操作安排在稍后执行,并快速返回状态或结果。具体而言, 每个操作都应:

  • 取消所有待处理的调谐操作。
  • 检查是否可以根据方法输入和 调谐器。
  • 调度调谐任务,然后返回 Result(采用 HIDL)或 status(采用 AIDL)。 如果 ResultstatusOK,则调谐器回调 调参时必须调用 tuneFailedcurrentProgramInfoChanged。 任务失败(例如由于超时)或已完成。

同样,startProgramListUpdates 还会安排 将节目列表更新为稍后进行,并快速返回状态或结果。方法 首先会取消待处理的更新请求,然后安排更新任务, 结果。

竞态条件

由于调谐操作(例如调谐、扫描(在 HIDL 中)或搜寻)的异步行为 和步),则取消操作和调参之间存在竞态条件 操作。如果在 HAL 完成调谐操作之后、之前调用 cancel 回调完成,可忽略取消操作,且应完成回调并收到回调 由 HAL 客户端发出。

同样,如果在 HAL 完成一个程序后调用 stopProgramListUpdatesonCurrentProgramInfoChanged 回调完成之前, 可以忽略 stopProgramListUpdates,且回调应完成。

数据大小限制

由于 binder 事务缓冲区存在硬性限制,因此某些接口的数据限制 在 AIDL HAL 中阐明了传递可能较大数据的方法。

  • getImage 要求返回的图片小于 1MB。
  • onProgramListUpdate 要求每个 chunk 小于 500kiB。 较大的节目列表必须由 HAL 实现拆分为多个块,并通过 多个回调

AIDL HAL 数据结构的变更

除了接口的更改外,这些更改也应用于数据结构 广播电台 AIDL HAL 中定义的广播电台 AIDL HAL,它利用 AIDL。

  • Constant 枚举已从 AIDL 中移除,并在 IBroadcastRadio。同时,ANTENNA_DISCONNECTED_TIMEOUT_MS 已重命名 至 ANTENNA_STATE_CHANGE_TIMEOUT_MS。新的常量整数 TUNER_TIMEOUT_MS 是 已添加。所有调谐、搜寻和步进操作都必须在这段时间内完成。
  • 枚举 RDSDeemphasis 已从 AIDL 中移除,并定义为常量整数 在 AmFmRegionConfig 中。相应地,fmDeemphasisProgramInfo 中的 fmRds 声明为整数,这是 相应标志同时,D50D75 已重命名为 DEEMPHASIS_D50DEEMPHASIS_D75
  • 枚举 ProgramInfoFlags 已从 AIDL 中移除,并在 添加了前缀为 FLAG_ProgramInfo。相应地 ProgramInfo 中的 infoFlags 声明为整数,这是位计算结果 旗帜。TUNED 也已重命名为 FLAG_TUNABLE,以更好地描述 其定义。
  • AmFmBandRange 中,scanSpacing 已重命名为 seekSpacing,因为 scan 在 AIDL 中已重命名为 seek
  • 由于 AIDL 中引入了并集的概念,因此 MetadataKey 和 HIDL HAL 中定义的 Metadata 已不再使用。AIDL 并集 Metadata 在 AIDL HAL 中定义。以前在 MetadataKey 中的每个枚举值现在都是 将 Metadata 设置为字符串或整数类型,具体取决于其定义。