以下各節說明如何使用硬體抽象層 (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 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() |
|
| 說明:擷取指定設定旗標的目前設定。 | ||
| 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 中) 或搜尋 (在 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 intTUNER_TIMEOUT_MS。所有調整、搜尋和步進作業都必須在這段時間內完成。 - AIDL 中已移除列舉
RDS和Deemphasis,並在AmFmRegionConfig中定義為 const int。因此,ProgramInfo中的fmDeemphasis和fmRds都會宣告為 int,也就是各個旗標的位元運算結果。同時,D50和D75分別重新命名為DEEMPHASIS_D50和DEEMPHASIS_D75。 - AIDL 中已移除列舉
ProgramInfoFlags,並在ProgramInfo中定義為 const int,且新增了FLAG_前置字串。因此,infoFlags中的ProgramInfo會宣告為 int,也就是旗標的位元運算結果。TUNED也重新命名為FLAG_TUNABLE,以更清楚說明電台可調到的定義。 - 在
AmFmBandRange中,scanSpacing會重新命名為seekSpacing,因為scan在 AIDL 中會重新命名為seek。 - 由於 AIDL 導入了「聯集」的概念,因此不再使用 HIDL HAL 中定義的
MetadataKey和Metadata。AIDL 聯集Metadata定義於 AIDL HAL 中。先前位於MetadataKey中的每個列舉值,現在都是Metadata中的欄位,類型為字串或整數,視定義而定。
支援 DAB 廣播
本節說明 DAB 廣播支援。
ID
AIDL Broadcast Radio HAL 中 DAB 和 DMB 廣播的主要 ID 類型為 DAB_SID_EXT。DAB_SID_EXT 使用 32 位元服務 ID (SID),因此可以代表 DAB 和 DMB 廣播的 SID。
除了主要 ID 外,系統也支援 DAB_ENSEMBLE 和 DAB_FREQUENCY_KHZ 等次要 ID。這點很重要,因為多個 DAB 電台可以共用 DAB_SID_EXT,但具有不同的 DAB_ENSEMBLE 或 DAB_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_NAME 和 HD_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 |
快訊訊息的狀態 | 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 中的選用欄位,因此可透過 Tuner 回呼從 Broadcast Radio HAL 傳送至電台應用程式,以取得目前的節目資訊和節目清單更新。