Các phần sau đây mô tả cách hoạt động với lớp trừu tượng phần cứng (HAL) để triển khai đài phát sóng.
Giao diện HAL của đài phát
HAL đài phát sóng cung cấp các cấu trúc dữ liệu và giao diện ở cấp phần cứng để triển khai đài phát sóng, chẳng hạn như đài AM/FM và DAB.
Giao diện HIDL 2.0 và AIDL
HAL đài phát sử dụng các giao diện được mô tả trong các phần sau.
IAnnouncementListener
IAnnouncementListener
là giao diện gọi lại cho trình nghe thông báo. Bạn có thể đăng ký giao diện này trên HAL đài phát để nhận thông báo. Giao diện này có các phương thức sau:
IAnnouncementListener | ||
---|---|---|
Nội dung mô tả: Được gọi bất cứ khi nào danh sách thông báo thay đổi. | ||
HIDL 2.0 | oneway onListUpdated(vec<Announcement> announcements) |
|
AIDL | oneway void onListUpdated(in Announcement[] announcements) |
ICloseHandle
ICloseHandle
là trình xử lý đóng chung để xoá một lệnh gọi lại không cần giao diện đang hoạt động.
ICloseHandle | ||
---|---|---|
Nội dung mô tả: Đóng tay cầm. | ||
HIDL 2.0 | close() |
|
AIDL | void close() |
ITunerCallback
ITunerCallback
là giao diện gọi lại được HAL đài phát gọi để gửi thông tin cập nhật đến dịch vụ ứng dụng HAL.
ITunerCallback | ||
---|---|---|
Nội dung mô tả: Được HAL gọi khi một thao tác dò kênh (dò kênh, tìm kiếm (trong AIDL) hoặc quét (trong HIDL) và bước thành công) không thành công theo cách không đồng bộ. | ||
HIDL 2.0 | oneway onCurrentProgramInfoChanged(ProgramInfo info) |
|
AIDL | void onCurrentProgramInfoChanged(in ProgramInfo info) |
|
Nội dung mô tả: Được gọi khi điều chỉnh, tìm kiếm (trong AIDL) hoặc quét (trong HIDL) hoặc bước thành công. | ||
HIDL 2.0 | oneway onTuneFailed(Result result, ProgramSelector selector) |
|
AIDL | void onTuneFailed(in Result result, in ProgramSelector selector) |
|
Nội dung mô tả: Được gọi khi điều chỉnh, tìm kiếm (trong AIDL) hoặc quét (trong HIDL) hoặc bước thành công. | ||
HIDL 2.0 | oneway onCurrentProgramInfoChanged(ProgramInfo info) |
|
AIDL | void onCurrentProgramInfoChanged(in ProgramInfo info) |
|
Nội dung mô tả: Được gọi khi danh sách chương trình được cập nhật; kích thước của mỗi đoạn phải được giới hạn ở mức 500 kiB. | ||
HIDL 2.0 | oneway onProgramListUpdated(ProgramListChunk chunk) |
|
AIDL | void onProgramListUpdated(ProgramListChunk chunk) |
|
Mô tả: Được gọi khi ăng-ten được kết nối hoặc ngắt kết nối. | ||
HIDL 2.0 | oneway onAntennaStateChange(bool connected) |
|
AIDL | void onCurrentProgramInfoChanged(in ProgramInfo info) |
|
Mô tả: Được gọi khi các giá trị tham số dành riêng cho nhà cung cấp được cập nhật nội bộ trong HAL (không gọi sau khi gọi setParameters bằng ứng dụng HAL). |
||
HIDL 2.0 | oneway onParametersUpdated(vec<VendorKeyValue> parameters) |
|
AIDL | void onParametersUpdated(in VendorKeyValue[] parameters) |
|
Mô tả: Tính năng mới trong AIDL. Được gọi khi cờ cấu hình được cập nhật nội bộ trong HAL (không được gọi sau khi HAL client gọi setConfigFlag ). |
||
HIDL 2.0 | Không có. | |
AIDL | void onConfigFlagUpdated(in ConfigFlag flag, in boolean value) |
IBroadcastRadio
IBroadcastRadio
là giao diện chính cho HAL đài phát sóng. Trong HIDL 2.0 HAL, hãy sử dụng giao diện ITunerSession
cho bộ chỉnh để gọi các thao tác. Tuy nhiên, tại một thời điểm, tối đa chỉ có một bộ chỉnh hoạt động (miễn là mỗi phiên bản HAL đài phát chỉ có một chip bộ chỉnh).
ITunerSession
đã bị xoá khỏi các giao diện AIDL và các giao diện của nó đã được chuyển sang IBroadcastRadio
.
IBroadcastRadio | ||
---|---|---|
Nội dung mô tả: Lấy nội dung mô tả về một mô-đun và các chức năng của mô-đun đó. | ||
HIDL 2.0 | getProperties() generates (Properties properties) |
|
AIDL | Properties getProperties() |
|
Nội dung mô tả: Tìm nạp cấu hình vùng AM/FM hiện tại hoặc có thể có. | ||
HIDL 2.0 | getAmFmRegionConfig(bool full) generates (Result result, AmFmRegionConfig
config) |
|
AIDL | AmFmRegionConfig getAmFmRegionConfig(bool full) |
|
Nội dung mô tả: Tìm nạp cấu hình vùng DAB hiện tại. | ||
HIDL 2.0 | getDabRegionConfig() generates (Result result, vec<DabTableEntry>
config) |
|
AIDL | DabTableEntry[] getDabRegionConfig() |
|
Mô tả: Lấy hình ảnh từ bộ nhớ đệm của mô-đun radio. Trong AIDL, kích thước hình ảnh phải nhỏ hơn 1 MB do giới hạn cứng đối với vùng đệm giao dịch liên kết. | ||
HIDL 2.0 | getImage(uint32_t id) generates (vec<uint8_t> image) |
|
AIDL | byte[] getImage(in int id) |
|
Nội dung mô tả: Đăng ký trình nghe thông báo. | ||
HIDL 2.0 | registerAnnouncementListener(vec<AnnouncementType>
enabled,IAnnouncementListener listener) generates (Result result, ICloseHandle
closeHandle) |
|
AIDL | ICloseHandle registerAnnouncementListener(in IAnnouncementListener listener, in
AnnouncementType[] enabled) |
|
Nội dung mô tả:
|
||
HIDL 2.0 | openSession(ITunerCallback callback) tạo ra
(Result result, ITunerSession session) |
|
AIDL | void setTunerCallback(in ITunerCallback callback) |
|
Nội dung mô tả:
|
||
HIDL 2.0 | close() |
|
AIDL | unsetTunerCallback() |
|
Nội dung mô tả: Chuyển đến một chương trình cụ thể. | ||
HIDL 2.0 | tune(ProgramSelector program) generates (Result result) |
|
AIDL | void tune(in ProgramSelector program) |
|
Nội dung mô tả: Tìm kiếm chương trình hợp lệ tiếp theo trên sóng. Để tránh nhầm lẫn trong AIDL, scan được đổi tên thành seek .
|
||
HIDL 2.0 | scan(bool directionUp, bool skipSubChannel) generates (Result result) |
|
AIDL | void seek(in boolean directionUp, in boolean skipSubChannel) |
|
Mô tả: Các bước để đến kênh liền kề, có thể không có chương trình nào. | ||
HIDL 2.0 | step(bool directionUp) generates (Result result) |
|
AIDL | void step(in boolean directionUp) |
|
Mô tả: Huỷ các thao tác dò kênh, quét (trong HIDL) hoặc tìm kiếm (trong AIDL) hoặc thao tác từng bước đang chờ xử lý. | ||
HIDL 2.0 | cancel() |
|
AIDL | void cancel() |
|
Nội dung mô tả: Áp dụng bộ lọc cho danh sách chương trình và bắt đầu gửi thông tin cập nhật danh sách chương trình qua lệnh gọi lại onProgramListUpdated . |
||
HIDL 2.0 | startProgramListUpdates(ProgramFilter filter) generates (Result result) |
|
AIDL | void startProgramListUpdates(in ProgramFilter filter) |
|
Nội dung mô tả: Ngừng gửi thông tin cập nhật về danh sách chương trình. | ||
HIDL 2.0 | stopProgramListUpdates() |
|
AIDL | void stopProgramListUpdates() |
|
Mô tả: Tìm nạp chế độ cài đặt hiện tại của một cờ cấu hình nhất định. | ||
HIDL 2.0 | isConfigFlagSet(ConfigFlag flag) generates (Result result, bool value) |
|
AIDL | boolean isConfigFlagSet(in ConfigFlag flag) |
|
Mô tả: Đặt cờ cấu hình đã cho. | ||
HIDL 2.0 | setConfigFlag(ConfigFlag flag, bool value) generates (Result result) |
|
AIDL | void setConfigFlag(in ConfigFlag flag, boolean value) |
|
Nội dung mô tả: Đặt các giá trị tham số dành riêng cho nhà cung cấp. | ||
HIDL 2.0 | setParameters(vec<VendorKeyValue> parameters)
tạo, (vec<VendorKeyValue> results) |
|
AIDL | VendorKeyValue[] setParameters(in VendorKeyValue[] parameters) |
|
Nội dung mô tả: Truy xuất các giá trị tham số dành riêng cho nhà cung cấp. | ||
HIDL 2.0 | getParameters(vec<string> keys) generates (vec<VendorKeyValue>
parameters) |
|
AIDL | VendorKeyValue[] getParameters(in String[] keys) |
Nội dung làm rõ về giao diện
Hành vi không đồng bộ
Vì mỗi thao tác điều chỉnh (ví dụ: điều chỉnh, quét (trong HIDL) hoặc tìm kiếm (trong AIDL) và bước) có thể tốn nhiều thời gian và luồng không được chặn trong thời gian dài, nên thao tác này phải lên lịch các thao tác tốn nhiều thời gian để diễn ra sau và nhanh chóng trả về trạng thái hoặc kết quả. Cụ thể, mỗi thao tác phải:
- Huỷ tất cả các thao tác dò kênh đang chờ xử lý.
- Kiểm tra xem thao tác có thể được xử lý dựa trên các giá trị đầu vào của phương thức và trạng thái của bộ chỉnh hay không.
- Lên lịch cho tác vụ điều chỉnh rồi trả về
Result
(trong HIDL) hoặcstatus
(trong AIDL) ngay lập tức. NếuResult
hoặcstatus
làOK
, thì lệnh gọi lại của bộ chỉnhtuneFailed
hoặccurrentProgramInfoChanged
phải được gọi khi tác vụ dò kênh không thành công (ví dụ: do hết thời gian chờ) hoặc hoàn tất.
Tương tự, startProgramListUpdates
cũng lên lịch cho tác vụ tốn thời gian là cập nhật danh sách chương trình diễn ra sau và nhanh chóng trả về trạng thái hoặc kết quả. Phương thức này trước tiên sẽ huỷ các yêu cầu cập nhật đang chờ xử lý, sau đó lên lịch cho tác vụ cập nhật và nhanh chóng trả về kết quả.
Tình huống tương tranh
Do hành vi không đồng bộ của các thao tác dò kênh (ví dụ: dò kênh, quét (trong HIDL) hoặc tìm kiếm (trong AIDL) và bước), nên có một điều kiện xung đột giữa việc huỷ thao tác và các thao tác dò kênh. Nếu cancel
được gọi sau khi HAL hoàn tất một thao tác điều chỉnh và trước khi lệnh gọi lại hoàn tất, thì lệnh huỷ có thể bị bỏ qua và lệnh gọi lại sẽ hoàn tất và được ứng dụng HAL nhận.
Tương tự, nếu stopProgramListUpdates
được gọi sau khi HAL hoàn tất quá trình cập nhật danh sách chương trình và trước khi lệnh gọi lại onCurrentProgramInfoChanged
hoàn tất, thì stopProgramListUpdates
có thể bị bỏ qua và lệnh gọi lại sẽ hoàn tất.
Hạn mức kích thước dữ liệu
Vì có giới hạn cố định đối với vùng đệm giao dịch liên kết, nên giới hạn dữ liệu đối với một số phương thức giao diện truyền dữ liệu có kích thước lớn có thể được làm rõ trong AIDL HAL.
getImage
yêu cầu hình ảnh trả về phải nhỏ hơn 1 MB.onProgramListUpdate
yêu cầu mỗichunk
phải nhỏ hơn 500 kiB. Các danh sách chương trình lớn hơn phải được triển khai HAL chia thành nhiều khối và gửi qua nhiều lệnh gọi lại.
Các thay đổi về cấu trúc dữ liệu AIDL HAL
Ngoài những thay đổi về giao diện, những thay đổi này cũng được áp dụng cho các cấu trúc dữ liệu được xác định trong AIDL HAL của đài phát thanh, tận dụng AIDL.
- Enum
Constant
bị xoá trong AIDL và được xác định là const int trongIBroadcastRadio
. Trong khi đó,ANTENNA_DISCONNECTED_TIMEOUT_MS
được đổi tên thànhANTENNA_STATE_CHANGE_TIMEOUT_MS
. Một const intTUNER_TIMEOUT_MS
mới được thêm vào. Bạn phải hoàn tất tất cả các thao tác dò kênh, tìm kiếm và bước trong khoảng thời gian này. - Enum
RDS
vàDeemphasis
bị xoá trong AIDL và được xác định là const int trongAmFmRegionConfig
. Tương ứng, cảfmDeemphasis
vàfmRds
trongProgramInfo
đều được khai báo là int, kết quả tính toán bit của các cờ tương ứng. Trong khi đó,D50
vàD75
lần lượt được đổi tên thànhDEEMPHASIS_D50
vàDEEMPHASIS_D75
. - Enum
ProgramInfoFlags
sẽ bị xoá trong AIDL và được xác định là const int trongProgramInfo
với tiền tốFLAG_
được thêm vào. Tương ứng,infoFlags
trongProgramInfo
được khai báo là int, kết quả tính toán bit của các cờ.TUNED
cũng được đổi tên thànhFLAG_TUNABLE
để mô tả rõ hơn định nghĩa của nó rằng đài có thể được điều chỉnh. - Trong
AmFmBandRange
,scanSpacing
được đổi tên thànhseekSpacing
, vìscan
được đổi tên thànhseek
trong AIDL. - Vì khái niệm về union được giới thiệu trong AIDL, nên
MetadataKey
vàMetadata
được xác định trong HIDL HAL không còn được dùng nữa. Một liên kết AIDLMetadata
được xác định trong AIDL HAL. Mỗi giá trị enum trước đây trongMetadataKey
hiện là một trường trongMetadata
có kiểu chuỗi hoặc số nguyên, tuỳ thuộc vào định nghĩa của chúng.
Hỗ trợ đài phát DAB
Phần này mô tả chế độ hỗ trợ đài phát DAB.
Giá trị nhận dạng
Loại mã nhận dạng chính cho đài DAB và DMB trong AIDL Broadcast Radio HAL là DAB_SID_EXT
. DAB_SID_EXT
sử dụng giá trị nhận dạng dịch vụ (SID) 32 bit để có thể biểu thị SID của cả đài DAB và DMB.
Ngoài giá trị nhận dạng chính, chúng tôi còn hỗ trợ các giá trị nhận dạng phụ như DAB_ENSEMBLE
và DAB_FREQUENCY_KHZ
. Điều này rất quan trọng vì nhiều đài DAB có thể dùng chung một DAB_SID_EXT
trong khi có các giá trị DAB_ENSEMBLE
hoặc DAB_FREQUENCY_KHZ
khác nhau. Để đảm bảo danh sách chương trình được cập nhật chính xác, các đài có cùng DAB_SID_EXT
sẽ được cập nhật cùng nhau bằng cách sử dụng ITunerCallback#onProgramListUpdated
. Sau đó, thông tin cập nhật này sẽ được chuyển tiếp đến Broadcast Radio Service (Dịch vụ đài phát sóng) và Radio Manager (Trình quản lý đài phát), rồi cuối cùng là đến ứng dụng đài phát thông qua android.hardware.radio.ProgramList
.
Metadata
Bảng sau đây cho thấy siêu dữ liệu được hỗ trợ dành riêng cho DAB trong AIDL Broadcast Radio HAL:
Trường siêu dữ liệu | Mô tả |
---|---|
dabEnsembleName (dạng rút gọn: dabEnsembleNameShort ) |
Tên nhóm trạm DAB |
dabServiceName (viết tắt của dabServiceNameShort ) |
Tên dịch vụ của đài DAB |
dabComponentName (viết tắt của dabComponentNameShort ) |
Tên thành phần của đài DAB |
Hỗ trợ đài phát HD
Phần này mô tả khả năng hỗ trợ đài phát HD.
Giá trị nhận dạng
HD_STATION_ID_EXT
đóng vai trò là giá trị nhận dạng chính cho các đài phát thanh HD. Để tăng cường khả năng nhận dạng trạm sạc, chúng tôi cũng cung cấp các giá trị nhận dạng phụ như HD_STATION_NAME
và HD_STATION_LOCATION
. HD_STATION_LOCATION
(cung cấp thông tin vị trí) đã được ra mắt trong Android 15.
Bật hoặc tắt đài phát kỹ thuật số
Kể từ Android 15, bạn có thể bật hoặc tắt đài phát kỹ thuật số (chẳng hạn như đài phát HD) bằng cách điều chỉnh ConfigFlag
. Để kiểm soát chế độ cài đặt này cho đài FM, hãy dùng cờ FORCE_ANALOG_FM
; đối với đài AM, hãy dùng cờ FORCE_ANALOG_AM
.
Việc đặt cờ thành false
sẽ bật đài phát HD, còn việc đặt cờ thành true
sẽ buộc đài AM/FM tương tự.
Có các kênh HD
Kể từ Android 15, các kênh HD hiện có cho một đài phát thanh HD có thể được biểu thị bằng một mặt nạ bit gồm 8 bit, Metadata#hdSubChannelsAvailable
, trong ProgramInfo.metadata
. Ví dụ: giá trị của bit 1 từ bên trái cho biết liệu kênh phụ HD2 có sẵn cho đài HD này hay không.
Trạng thái thu nhận tín hiệu
Trong Android 15 trở lên, các ứng dụng radio có thể cho người dùng biết trạng thái thu nhận tín hiệu của các đài radio HD. Điều này rất hữu ích vì đôi khi bạn cần vài phút để thu được tín hiệu HD mạnh.
Để cung cấp thông tin này, hệ thống sẽ dùng ProgramInfo.infoFlags
để theo dõi trạng thái và cập nhật ứng dụng đài phát qua ITunerCallback#onCurrentProgramInfoChanged.
Sau đây là cách trạng thái được biểu thị trong ProgramInfo.infoFlags
:
- Bit 6: Cho biết liệu tín hiệu đài phát HD đã được thu nhận hay chưa.
- Bit 7: Cho biết liệu có dữ liệu của Dịch vụ thông tin trạm sạc (SIS) hay không. SIS cung cấp thêm thông tin về đài và nội dung đang phát.
- Bit 8: Cho biết liệu có âm thanh kỹ thuật số HD hay không.
Metadata
Bảng sau đây cho biết siêu dữ liệu đài phát HD được hỗ trợ cho Android 15 trở lên.
Trường siêu dữ liệu | Mô tả |
---|---|
commentShortDescription |
Nội dung mô tả ngắn gọn về ngữ cảnh của bình luận |
commentActualText |
Nội dung bình luận |
commercial |
Quảng cáo trên đài phát thanh |
ufids |
Giá trị nhận dạng tệp duy nhất (UFID) được liên kết với nội dung |
hdStationNameShort |
Tên ngắn hoặc tên ngắn chung của đài phát thanh HD |
hdStationNameLong |
Tên dài, khẩu hiệu hoặc thông điệp của đài phát thanh HD. |
Cảnh báo khẩn cấp
Trong Android 15 trở lên, cảnh báo khẩn cấp được hỗ trợ cho các đài phát thanh HD để thông báo cho người dùng ứng dụng đài phát thanh về cảnh báo khẩn cấp do các đài phát thanh gửi.
Cảnh báo khẩn cấp (Alert
) tuân theo Tiêu chuẩn Giao thức cảnh báo chung (CAP) 1.2 và hỗ trợ các cảnh báo xuất hiện trong bảng sau:
Thông tin cảnh báo | Mô tả | Các giá trị enum có sẵn |
---|---|---|
AlertStatus |
Trạng thái của thông báo cảnh báo | ACTUAL , EXERCISE , TEST |
AlertMessageType |
Loại thông báo cảnh báo khẩn cấp | ALERT , UPDATE , CANCEL |
AlertCategory |
Danh mục của sự kiện chủ đề trong thông báo cảnh báo khẩn cấp | GEO , MET , SAFETY , SECURITY ,
RESCUE , FIRE , HEALTH , ENV ,
TRANSPORT , INFRA , CBRNE , OTHER |
AlertUrgency |
Mức độ khẩn cấp của sự kiện trong thông báo cảnh báo khẩn cấp | IMMEDIATE , EXPECTED , FUTURE , PAST , UNKNOWN |
AlertSeverity |
Mức độ nghiêm trọng của sự kiện trong thông báo cảnh báo khẩn cấp | EXTREME , SEVERE , MODERATE , MINOR , UNKNOWN |
AlertCertainty |
Độ chắc chắn của sự kiện chủ đề trong thông báo cảnh báo khẩn cấp | OBSERVED , LIKELY , POSSIBLE , UNLIKELY , UNKNOWN |
Alert
(chứa thông tin trong bảng), thông báo văn bản cảnh báo và AlertArea
để hiện thông tin về cảnh báo hiện tại.
Alert
là một trường không bắt buộc trong ProgramInfo
để có thể được gửi từ Broadcast Radio HAL đến các ứng dụng đài phát thông qua lệnh gọi lại bộ chỉnh để cập nhật thông tin chương trình hiện tại và danh sách chương trình.