以下部分介绍了如何使用硬件抽象层 (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 | ||
---|---|---|
说明: 当调谐操作(tune、seek(在 AIDL 中)或 scan(在 HIDL 中)和 step 成功)异步失败时,由 HAL 调用。 | ||
HIDL 2.0 | oneway onCurrentProgramInfoChanged(ProgramInfo info) |
|
AIDL | void onCurrentProgramInfoChanged(in ProgramInfo info) |
|
说明: 当 tune、seek(在 AIDL 中)或 scan(在 HIDL 中)或 step 成功时调用。 | ||
HIDL 2.0 | oneway onTuneFailed(Result result, ProgramSelector selector) |
|
AIDL | void onTuneFailed(in Result result, in ProgramSelector selector) |
|
说明: 当 tune、seek(在 AIDL 中)或 scan(在 HIDL 中)或 step 成功时调用。 | ||
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 内部更新时调用(请勿在 HAL 客户端调用 setParameters 后调用)。 |
||
HIDL 2.0 | oneway onParametersUpdated(vec<VendorKeyValue> parameters) |
|
AIDL | void onParametersUpdated(in VendorKeyValue[] parameters) |
|
说明: AIDL 中的新增功能。当配置标志在 HAL 内部更新时调用(不应在 HAL 客户端调用 setConfigFlag 后调用)。 |
||
HIDL 2.0 | 不适用。 | |
AIDL | void onConfigFlagUpdated(in ConfigFlag flag, in boolean value) |
IBroadcastRadio
IBroadcastRadio
是广播无线电 HAL 的主要接口。在 HIDL 2.0 HAL 中,使用 ITunerSession
接口来调用调谐器上的操作。但是,一次最多只能有一个调谐器处于活动状态(前提是每个广播无线电 HAL 实例只有一个调谐器芯片)。ITunerSession
已从 AIDL 接口中移除,其接口已移至 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 中,由于 binder 事务缓冲区存在硬性限制,图像大小必须小于 1MB。 | ||
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) generates (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) |
|
说明: 取消待处理的 tune、scan(在 HIDL 中)或 seek(在 AIDL 中)或 step 操作。 | ||
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() |
|
说明: 获取给定配置标志的当前设置。 | ||
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)
generates, (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) |
接口说明
异步行为
由于每个调谐操作(例如,tune、scan(在 HIDL 中)或 seek(在 AIDL 中)和 step)可能非常耗时,并且线程不应长时间阻塞,因此操作应安排耗时操作稍后发生,并快速返回状态或结果。详细而言,每个操作应:
- 取消所有待处理的调谐操作。
- 检查是否可以根据方法输入和调谐器的状态来处理该操作。
- 安排调谐任务,然后立即返回
Result
(在 HIDL 中)或status
(在 AIDL 中)。如果Result
或status
为OK
,则当调谐任务失败(例如,由于超时)或完成时,必须调用调谐器回调tuneFailed
或currentProgramInfoChanged
。
同样,startProgramListUpdates
也会安排更新节目列表的耗时任务稍后进行,并快速返回状态或结果。该方法首先取消待处理的更新请求,然后安排更新任务并快速返回结果。
竞态条件
由于调谐操作(例如,tune、scan(在 HIDL 中)或 seek(在 AIDL 中)和 step)的异步行为,取消操作与调谐操作之间存在竞态条件。如果在 HAL 完成调谐操作之后且在回调完成之前调用 cancel
,则可以忽略取消,并且回调应完成并由 HAL 客户端接收。
同样,如果在 HAL 完成节目列表更新之后且在 onCurrentProgramInfoChanged
回调完成之前调用 stopProgramListUpdates
,则可以忽略 stopProgramListUpdates
,并且回调应完成。
数据大小限制
由于 binder 事务缓冲区存在硬性限制,因此在 AIDL HAL 中澄清了一些传递可能较大尺寸数据的接口方法的数据限制。
getImage
要求返回的图像小于 1MB。onProgramListUpdate
要求每个chunk
小于 500kiB。较大的节目列表必须由 HAL 实现拆分为多个数据块,并通过多个回调发送。
AIDL HAL 数据结构的变化
除了接口的变化之外,这些变化还应用于广播无线电 AIDL HAL 中定义的数据结构,这些数据结构利用了 AIDL。
Constant
枚举在 AIDL 中已移除,并在IBroadcastRadio
中定义为 const int。同时,ANTENNA_DISCONNECTED_TIMEOUT_MS
重命名为ANTENNA_STATE_CHANGE_TIMEOUT_MS
。添加了新的 const intTUNER_TIMEOUT_MS
。所有 tune、seek 和 step 操作都必须在此时间内完成。- 枚举
RDS
和Deemphasis
在 AIDL 中已移除,并在AmFmRegionConfig
中定义为 const int。相应地,ProgramInfo
中的fmDeemphasis
和fmRds
都声明为 int,即各个标志的位计算结果。同时,D50
和D75
分别重命名为DEEMPHASIS_D50
和DEEMPHASIS_D75
。 - 枚举
ProgramInfoFlags
在 AIDL 中已移除,并在ProgramInfo
中定义为 const int,并添加了前缀FLAG_
。相应地,ProgramInfo
中的infoFlags
声明为 int,即标志的位计算结果。TUNED
也重命名为FLAG_TUNABLE
,以更好地描述其定义,即可以调谐到该电台。 - 在
AmFmBandRange
中,scanSpacing
重命名为seekSpacing
,因为scan
在 AIDL 中重命名为seek
。 - 由于 union 的概念已在 AIDL 中引入,因此不再使用 HIDL HAL 中定义的
MetadataKey
和Metadata
。AIDL 联合Metadata
在 AIDL HAL 中定义。先前在MetadataKey
中的每个枚举值现在都是Metadata
中的一个字段,类型为 string 或 int,具体取决于其定义。
DAB 无线电支持
本节介绍 DAB 无线电支持。
标识符
AIDL 广播无线电 HAL 中 DAB 和 DMB 无线电的主要标识符类型是 DAB_SID_EXT
。DAB_SID_EXT
使用 32 位服务标识符 (SID),以便它可以表示 DAB 和 DMB 无线电的 SID。
除了主要标识符外,还支持辅助标识符,如 DAB_ENSEMBLE
和 DAB_FREQUENCY_KHZ
。这非常重要,因为多个 DAB 电台可以共享一个 DAB_SID_EXT
,同时具有不同的 DAB_ENSEMBLE
或 DAB_FREQUENCY_KHZ
值。为了确保节目列表更新的准确性,具有相同 DAB_SID_EXT
的电台会使用 ITunerCallback#onProgramListUpdated
一起更新。然后,此更新会中继到广播无线电服务和无线电管理器,最后通过 android.hardware.radio.ProgramList
中继到无线电应用。
元数据
下表显示了 AIDL 广播无线电 HAL 中特定于 DAB 的支持元数据
元数据字段 | 说明 |
---|---|
dabEnsembleName (缩写形式:dabEnsembleNameShort ) |
DAB 电台的合奏名称 |
dabServiceName (从 dabServiceNameShort 缩写) |
DAB 电台的服务名称 |
dabComponentName (从 dabComponentNameShort 缩写) |
DAB 电台的组件名称 |
HD 无线电支持
本节介绍 HD 无线电支持。
标识符
HD_STATION_ID_EXT
用作 HD 无线电台的主要标识符。为了进一步增强电台识别,还提供了辅助标识符,如 HD_STATION_NAME
和 HD_STATION_LOCATION
。HD_STATION_LOCATION
(提供位置信息)是在 Android 15 中引入的。
启用或停用数字无线电
从 Android 15 开始,您可以通过调整 ConfigFlag
来启用或停用数字无线电(如 HD 无线电)。要控制 FM 无线电的此设置,请使用 FORCE_ANALOG_FM
标志;对于 AM 无线电,请使用 FORCE_ANALOG_AM
标志。将标志设置为 false
会启用 HD 无线电,而设置为 true
会强制模拟 AM/FM 无线电。
可用的 HD 频道
从 Android 15 开始,HD 无线电台当前可用的 HD 频道可以用 8 位位掩码 Metadata#hdSubChannelsAvailable
在 ProgramInfo.metadata
中表示。例如,从左侧开始的位 1 的值表示 HD2 子频道对于此 HD 电台是否可用。
信号采集状态
在 Android 15 及更高版本中,无线电应用可以向用户显示 HD 无线电台的信号采集状态。这很有帮助,因为获取强大的 HD 信号有时可能需要一些时间。
为了提供此信息,系统使用 ProgramInfo.infoFlags
来跟踪状态,并通过 ITunerCallback#onCurrentProgramInfoChanged
更新无线电应用。
以下是在 ProgramInfo.infoFlags
中表示状态的方式:
- 位 6:指示是否已采集到 HD 无线电信号。
- 位 7:显示电台信息服务 (SIS) 数据是否可用。SIS 提供有关电台和正在播放内容的额外信息。
- 位 8:指示 HD 数字音频是否可用。
元数据
下表显示了 Android 15 及更高版本支持的 HD 无线电元数据。
元数据字段 | 说明 |
---|---|
commentShortDescription |
注释的简短上下文描述 |
commentActualText |
注释文本 |
commercial |
无线电广告 |
ufids |
与内容关联的唯一文件标识符 (UFID) |
hdStationNameShort |
HD 无线电台的简称或通用简称 |
hdStationNameLong |
HD 无线电台的长名称、标语或来自电台的消息。 |
紧急警报
在 Android 15 及更高版本中,HD 无线电台支持紧急警报,以告知无线电应用用户从无线电台发送的紧急警报。紧急警报 (Alert
) 遵循 通用警报协议 (CAP) 1.2 标准,并支持下表中显示的警报
警报信息 | 说明 | 可用的枚举值 |
---|---|---|
AlertStatus |
警报消息的状态 | ACTUAL 、EXERCISE 、TEST |
AlertMessageType |
紧急警报消息类型 | ALERT 、UPDATE 、CANCEL |
AlertCategory |
紧急警报消息的主题事件类别 | GEO 、MET 、SAFETY 、SECURITY 、RESCUE 、FIRE 、HEALTH 、ENV 、TRANSPORT 、INFRA 、CBRNE 、OTHER |
AlertUrgency |
紧急警报消息的主题事件的紧急程度 | IMMEDIATE 、EXPECTED 、FUTURE 、PAST 、UNKNOWN |
AlertSeverity |
紧急警报消息的主题事件的严重程度 | EXTREME 、SEVERE 、MODERATE 、MINOR 、UNKNOWN |
AlertCertainty |
紧急警报消息的主题事件的确定性 | OBSERVED 、LIKELY 、POSSIBLE 、UNLIKELY 、UNKNOWN |
Alert
(其中包含表中的信息)、警报文本消息和 AlertArea
来显示有关当前警报的信息。Alert
是 ProgramInfo
中的可选字段,以便可以通过 调谐器回调 将其从广播无线电 HAL 发送到无线电应用,以获取当前节目信息和节目列表更新。