下面几部分介绍了如何使用硬件抽象层 (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 2.0 | openSession(ITunerCallback callback) 生成
(Result result, ITunerSession session) |
|
AIDL | void setTunerCallback(in ITunerCallback callback) |
|
说明:
|
||
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)。 如果Result
或status
为OK
,则调谐器回调 调参时必须调用tuneFailed
或currentProgramInfoChanged
。 任务失败(例如由于超时)或已完成。
同样,startProgramListUpdates
还会安排
将节目列表更新为稍后进行,并快速返回状态或结果。方法
首先会取消待处理的更新请求,然后安排更新任务,
结果。
竞态条件
由于调谐操作(例如调谐、扫描(在 HIDL 中)或搜寻)的异步行为
和步),则取消操作和调参之间存在竞态条件
操作。如果在 HAL 完成调谐操作之后、之前调用 cancel
回调完成,可忽略取消操作,且应完成回调并收到回调
由 HAL 客户端发出。
同样,如果在 HAL 完成一个程序后调用 stopProgramListUpdates
在 onCurrentProgramInfoChanged
回调完成之前,
可以忽略 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
是 已添加。所有调谐、搜寻和步进操作都必须在这段时间内完成。- 枚举
RDS
和Deemphasis
已从 AIDL 中移除,并定义为常量整数 在AmFmRegionConfig
中。相应地,fmDeemphasis
和ProgramInfo
中的fmRds
声明为整数,这是 相应标志同时,D50
和D75
已重命名为DEEMPHASIS_D50
和DEEMPHASIS_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
设置为字符串或整数类型,具体取决于其定义。