广播无线电 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
说明: 当调谐操作(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 HAL:当新的调谐器会话打开时,旧会话必须终止。
  • AIDL HAL:由于没有可用的调谐器会话,因此只需要设置调谐器回调。如果存在旧的回调,则应取消设置。
HIDL 2.0 openSession(ITunerCallback callback) generates (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)
说明: 取消待处理的 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 中)。如果 ResultstatusOK,则当调谐任务失败(例如,由于超时)或完成时,必须调用调谐器回调 tuneFailedcurrentProgramInfoChanged

同样,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 int TUNER_TIMEOUT_MS。所有 tune、seek 和 step 操作都必须在此时间内完成。
  • 枚举 RDSDeemphasis 在 AIDL 中已移除,并在 AmFmRegionConfig 中定义为 const int。相应地,ProgramInfo 中的 fmDeemphasisfmRds 都声明为 int,即各个标志的位计算结果。同时,D50D75 分别重命名为 DEEMPHASIS_D50DEEMPHASIS_D75
  • 枚举 ProgramInfoFlags 在 AIDL 中已移除,并在 ProgramInfo 中定义为 const int,并添加了前缀 FLAG_。相应地,ProgramInfo 中的 infoFlags 声明为 int,即标志的位计算结果。TUNED 也重命名为 FLAG_TUNABLE,以更好地描述其定义,即可以调谐到该电台。
  • AmFmBandRange 中,scanSpacing 重命名为 seekSpacing,因为 scan 在 AIDL 中重命名为 seek
  • 由于 union 的概念已在 AIDL 中引入,因此不再使用 HIDL HAL 中定义的 MetadataKeyMetadata。AIDL 联合 Metadata 在 AIDL HAL 中定义。先前在 MetadataKey 中的每个枚举值现在都是 Metadata 中的一个字段,类型为 string 或 int,具体取决于其定义。

DAB 无线电支持

本节介绍 DAB 无线电支持。

标识符

AIDL 广播无线电 HAL 中 DAB 和 DMB 无线电的主要标识符类型是 DAB_SID_EXTDAB_SID_EXT 使用 32 位服务标识符 (SID),以便它可以表示 DAB 和 DMB 无线电的 SID。

除了主要标识符外,还支持辅助标识符,如 DAB_ENSEMBLEDAB_FREQUENCY_KHZ。这非常重要,因为多个 DAB 电台可以共享一个 DAB_SID_EXT,同时具有不同的 DAB_ENSEMBLEDAB_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_NAMEHD_STATION_LOCATIONHD_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#hdSubChannelsAvailableProgramInfo.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 警报消息的状态 ACTUALEXERCISETEST
AlertMessageType 紧急警报消息类型 ALERTUPDATECANCEL
AlertCategory 紧急警报消息的主题事件类别 GEOMETSAFETYSECURITYRESCUEFIREHEALTHENVTRANSPORTINFRACBRNEOTHER
AlertUrgency 紧急警报消息的主题事件的紧急程度 IMMEDIATEEXPECTEDFUTUREPASTUNKNOWN
AlertSeverity 紧急警报消息的主题事件的严重程度 EXTREMESEVEREMODERATEMINORUNKNOWN
AlertCertainty 紧急警报消息的主题事件的确定性 OBSERVEDLIKELYPOSSIBLEUNLIKELYUNKNOWN
您可以使用 Alert(其中包含表中的信息)、警报文本消息和 AlertArea 来显示有关当前警报的信息。AlertProgramInfo 中的可选字段,以便可以通过 调谐器回调 将其从广播无线电 HAL 发送到无线电应用,以获取当前节目信息和节目列表更新。