廣播電台 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
說明:當非同步調整作業 (調整、搜尋 (在 AIDL 中) 或掃描 (在 HIDL 中) 和步驟成功) 失敗時,HAL 會呼叫這個函式。
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)
說明:節目清單更新時會呼叫此方法,每個區塊的大小應限制為 500 KiB。
HIDL 2.0 oneway onProgramListUpdated(ProgramListChunk chunk)
AIDL void 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 中,由於繫結器交易緩衝區的硬性限制,圖片大小必須小於 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)生成 (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()
說明:擷取指定設定旗標的目前設定。
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 中) 或搜尋 (在 AIDL 中) 和步進) 的非同步行為,取消作業和調整作業之間存在競爭條件。如果在 HAL 完成調整作業後,且回呼完成前呼叫 cancel,系統可能會忽略取消作業,回呼應會完成並由 HAL 用戶端接收。

同樣地,如果 HAL 完成節目清單更新後,且 onCurrentProgramInfoChanged 回呼完成前呼叫 stopProgramListUpdates,則 stopProgramListUpdates 可以忽略,且回呼應會完成。

資料大小限制

由於繫結器交易緩衝區有硬性限制,AIDL HAL 會明確指出部分介面方法傳遞可能很大的資料時的資料限制。

  • getImage 傳回的圖片必須小於 1 MB。
  • onProgramListUpdate 要求每個 chunk 的大小不得超過 500 KiB。 較大的程式清單必須由 HAL 實作分割為多個區塊,並透過多個回呼傳送。

AIDL HAL 資料結構異動

除了介面變更外,這些變更也已套用至廣播電台 AIDL HAL 中定義的資料結構,可充分運用 AIDL。

  • AIDL 中已移除 Constant 列舉,並在 IBroadcastRadio 中定義為 const int。同時,ANTENNA_DISCONNECTED_TIMEOUT_MS 已重新命名為 ANTENNA_STATE_CHANGE_TIMEOUT_MS。新增了新的 const int TUNER_TIMEOUT_MS。所有調整、搜尋和步進作業都必須在這段時間內完成。
  • AIDL 中已移除列舉 RDSDeemphasis,並在 AmFmRegionConfig 中定義為 const int。因此,ProgramInfo 中的 fmDeemphasisfmRds 都會宣告為 int,也就是各個旗標的位元運算結果。同時,D50D75 分別重新命名為 DEEMPHASIS_D50DEEMPHASIS_D75
  • AIDL 中已移除列舉 ProgramInfoFlags,並在 ProgramInfo 中定義為 const int,且新增了 FLAG_ 前置字串。因此,infoFlags 中的 ProgramInfo 會宣告為 int,也就是旗標的位元運算結果。TUNED 也重新命名為 FLAG_TUNABLE,以更清楚說明電台可調到的定義。
  • AmFmBandRange 中,scanSpacing 會重新命名為 seekSpacing,因為 scan 在 AIDL 中會重新命名為 seek
  • 由於 AIDL 導入了「聯集」的概念,因此不再使用 HIDL HAL 中定義的 MetadataKeyMetadata。AIDL 聯集 Metadata 定義於 AIDL HAL 中。先前位於 MetadataKey 中的每個列舉值,現在都是 Metadata 中的欄位,類型為字串或整數,視定義而定。

支援 DAB 廣播

本節說明 DAB 廣播支援。

ID

AIDL Broadcast Radio HAL 中 DAB 和 DMB 廣播的主要 ID 類型為 DAB_SID_EXTDAB_SID_EXT 使用 32 位元服務 ID (SID),因此可以代表 DAB 和 DMB 廣播的 SID。

除了主要 ID 外,系統也支援 DAB_ENSEMBLEDAB_FREQUENCY_KHZ 等次要 ID。這點很重要,因為多個 DAB 電台可以共用 DAB_SID_EXT,但具有不同的 DAB_ENSEMBLEDAB_FREQUENCY_KHZ 值。為確保節目表更新準確無誤,系統會使用 ITunerCallback#onProgramListUpdated,一併更新 DAB_SID_EXT 相同的電台。這項更新隨後會轉送至 Broadcast Radio Service 和 Radio Manager,最後透過 android.hardware.radio.ProgramList 傳送至電台應用程式。

中繼資料

下表列出 AIDL Broadcast Radio HAL 中支援的 DAB 專屬中繼資料:

中繼資料欄位 說明
dabEnsembleName (縮寫形式:dabEnsembleNameShort) DAB 電台的組合名稱
dabServiceName (dabServiceNameShort 的縮寫) DAB 電台的服務名稱
dabComponentName (dabComponentNameShort 的縮寫) DAB 電台的元件名稱

支援 HD 電台

本節說明 HD Radio 支援。

ID

HD_STATION_ID_EXT 是 HD 電台的主要 ID。為進一步提升電台識別度,系統也會提供 HD_STATION_NAMEHD_STATION_LOCATION 等次要 ID。HD_STATION_LOCATION,這項功能可提供位置資訊,已在 Android 15 中推出。

啟用或停用數位電台

從 Android 15 開始,你可以調整 ConfigFlags,啟用或停用數位廣播 (例如 HD Radio)。如要控制 FM 收音機的這項設定,請使用 FORCE_ANALOG_FM 標記;如要控制 AM 收音機的這項設定,請使用 FORCE_ANALOG_AM 標記。將旗標設為 false 可啟用 HD Radio,設為 true 則會強制使用類比 AM/FM Radio。

提供 HD 高畫質頻道

從 Android 15 開始,目前適用於 HD 廣播電台的 HD 頻道可以由 8 位元的位元遮罩 Metadata#hdSubChannelsAvailable 表示,ProgramInfo.metadata。舉例來說,從左算起第 1 個位元的值代表這個 HD 電台是否提供 HD2 子頻道。

訊號擷取狀態

在 Android 15 以上版本中,電台應用程式可向使用者顯示 HD 電台的訊號擷取狀態。因為有時需要幾秒鐘才能取得強烈的 HD 訊號,這項功能就派得上用場。

為提供這項資訊,系統會使用 ProgramInfo.infoFlags 追蹤狀態,並透過 ITunerCallback#onCurrentProgramInfoChanged. 更新電台應用程式。

以下說明 ProgramInfo.infoFlags 中狀態的表示方式:

  • 位元 6:指出是否已取得 HD 廣播訊號。
  • 第 7 位:顯示車站資訊服務 (SIS) 資料是否可用。 SIS 會提供電台和播放內容的額外資訊。
  • 位元 8:說明是否提供 HD 數位音訊。

中繼資料

下表列出 Android 15 以上版本支援的 HD Radio 中繼資料。

中繼資料欄位 說明
commentShortDescription 簡短說明留言的背景脈絡
commentActualText 留言文字
commercial 電台廣告
ufids 與內容相關聯的專屬檔案 ID (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 中的選用欄位,因此可透過 Tuner 回呼從 Broadcast Radio HAL 傳送至電台應用程式,以取得目前的節目資訊和節目清單更新。