Các phần sau đây mô tả cách làm việc với lớp trừu tượng phần cứng (HAL) để triển khai đài phát thanh truyền tin.
Giao diện HAL của đài phát
HAL phát thanh truyền tin 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 phát thanh truyền tin, chẳng hạn như đài phát thanh AM/FM và DAB.
Giao diện HIDL 2.0 và AIDL
HAL phát thanh truyền tin 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 thanh truyền tin để nhận thông báo. Giao diện này có các phương thức sau:
IAnnouncementListener | ||
---|---|---|
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à tay cầm đóng chung để xoá một lệnh gọi lại không cần giao diện đang hoạt động.
ICloseHandle | ||
---|---|---|
Mô tả: Đóng tay cầm. | ||
HIDL 2.0 | close() |
|
AIDL | void close() |
ITunerCallback
ITunerCallback
là giao diện gọi lại do HAL phát thanh truyền tin gọi để gửi thông tin cập nhật đến dịch vụ ứng dụng HAL.
ITunerCallback | ||
---|---|---|
Mô tả: Được HAL gọi khi một thao tác điều chỉnh (điều chỉ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 một cách không đồng bộ. | ||
HIDL 2.0 | oneway onCurrentProgramInfoChanged(ProgramInfo info) |
|
AIDL | void onCurrentProgramInfoChanged(in ProgramInfo info) |
|
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) |
|
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) |
|
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 phần phải được giới hạn ở mức 500kiB. | ||
HIDL 2.0 | oneway onProgramListUpdated(ProgramListChunk chunk) |
|
AIDL | oneway 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 ứng dụng HAL gọi setParameters ). |
||
HIDL 2.0 | oneway onParametersUpdated(vec<VendorKeyValue> parameters) |
|
AIDL | void onParametersUpdated(in VendorKeyValue[] parameters) |
|
Mô tả: 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 ứng dụng HAL 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 phát thanh truyền tin. 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 đa chỉ có một bộ thu sóng hoạt động cùng một lúc (miễn là mỗi thực thể HAL đài phát thanh chỉ có một khối bộ thu sóng).
ITunerSession
đã bị xoá khỏi giao diện AIDL và các giao diện của giao diện này đã được chuyển sang IBroadcastRadio
.
IBroadcastRadio | ||
---|---|---|
Mô tả: Nhận 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() |
|
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) |
|
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 đài. Trong AIDL, kích thước hình ảnh phải nhỏ hơn 1 MB do giới hạn cứng trên 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) |
|
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() |
|
Mô tả: Điều chỉnh theo một chương trình cụ thể. | ||
HIDL 2.0 | tune(ProgramSelector program) generates (Result result) |
|
AIDL | void tune(in ProgramSelector program) |
|
Mô tả: Tìm kiếm chương trình hợp lệ tiếp theo đang phát 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ề. Kênh này không được có bất kỳ 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 điều chỉnh, quét (trong HIDL) hoặc tìm kiếm (trong AIDL) hoặc các thao tác bước đang chờ xử lý. | ||
HIDL 2.0 | cancel() |
|
AIDL | void cancel() |
|
Mô tả: Áp dụng bộ lọc cho danh sách chương trình và bắt đầu gửi nội dung 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) |
|
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) |
|
Mô tả: Đặt 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) |
|
Mô tả: Truy xuất 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) |
Thông tin 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ể mất nhiều thời gian và luồng không được bị chặn trong thời gian dài, nên thao tác này sẽ 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 toán tử phải:
- Huỷ tất cả thao tác điều chỉnh đang chờ xử lý.
- Kiểm tra xem có thể xử lý thao tác dựa trên phương thức đầu vào và trạng thái của bộ điều 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ì bạn phải gọi lệnh gọi lại bộ điều chỉnhtuneFailed
hoặccurrentProgramInfoChanged
khi tác vụ điều chỉ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 nhiều thời gian là cập nhật danh sách chương trình để thực hiện sau và nhanh chóng trả về trạng thái hoặc kết quả. Trước tiên, phương thức này 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 đ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), nên có một điều kiện tương tranh giữa việc huỷ thao tác và các thao tác điều chỉ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ì bạn có thể bỏ qua lệnh huỷ 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, bạn có thể bỏ qua stopProgramListUpdates
và lệnh gọi lại sẽ hoàn tất.
Giới hạn kích thước dữ liệu
Vì có giới hạn cứng đối với vùng đệm giao dịch liên kết, nên giới hạn dữ liệu cho một số phương thức giao diện truyền dữ liệu có thể có kích thước lớn được làm rõ trong AIDL HAL.
getImage
yêu cầu hình ảnh được trả về có kích thước dưới 1 MB.onProgramListUpdate
yêu cầu mỗichunk
phải có kích thước nhỏ hơn 500 kiB. Các danh sách chương trình lớn hơn phải được chia theo cách triển khai HAL thành nhiều phần và gửi qua nhiều lệnh gọi lại.
Thay đổi trong cấu trúc dữ liệu AIDL HAL
Ngoài những thay đổi trong giao diện, các 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 broadcast radio AIDL HAL, tận dụng AIDL.
- Xoá enum
Constant
trong AIDL và xác định là const int trongIBroadcastRadio
. Trong khi đó,ANTENNA_DISCONNECTED_TIMEOUT_MS
được đổi tên thànhANTENNA_STATE_CHANGE_TIMEOUT_MS
. Thêm một const intTUNER_TIMEOUT_MS
mới. Tất cả thao tác điều chỉnh, tua và bước phải được hoàn tất 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, một 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
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ờ.TUNED
cũng được đổi tên thànhFLAG_TUNABLE
để mô tả rõ hơn định nghĩa của đài mà bạn có thể đ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 hợp nhất được giới thiệu trong AIDL, nên
MetadataKey
vàMetadata
được xác định trong HIDL HAL không còn được sử 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ó loại chuỗi hoặc int, tuỳ thuộc vào định nghĩa của các giá trị đó.
Hỗ trợ đài phát thanh DAB
Phần này mô tả tính năng hỗ trợ đài DAB.
Giá trị nhận dạng
Loại giá trị 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ể đại diện cho SID của cả đài DAB và DMB.
Ngoài giá trị nhận dạng chính, các giá trị nhận dạng phụ như DAB_ENSEMBLE
và DAB_FREQUENCY_KHZ
cũng được hỗ trợ. Điều này rất quan trọng vì nhiều đài DAB có thể chia sẻ 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 ITunerCallback#onProgramListUpdated
. Sau đó, nội dung cập nhật này được chuyển tiếp đến Dịch vụ phát thanh truyền tin và Trình quản lý đài phát thanh, cuối cùng là đến ứng dụng phát thanh 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 viết tắt: dabEnsembleNameShort ) |
Tên nhóm của đài DAB |
dabServiceName (viết tắt từ dabServiceNameShort ) |
Tên dịch vụ của đài DAB |
dabComponentName (viết tắt từ dabComponentNameShort ) |
Tên thành phần của đài DAB |
Hỗ trợ đài HD
Phần này mô tả tính năng hỗ trợ đài 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 tính năng nhận dạng trạm, các giá trị nhận dạng phụ như HD_STATION_NAME
và HD_STATION_LOCATION
cũng được cung cấp. HD_STATION_LOCATION
cung cấp thông tin vị trí được giới thiệu trong Android 15.
Bật hoặc tắt đài kỹ thuật số
Kể từ Android 15, bạn có thể bật hoặc tắt đài phát thanh kỹ thuật số (như đài phát thanh 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 sử dụng cờ FORCE_ANALOG_FM
; đối với đài AM, hãy sử dụng cờ FORCE_ANALOG_AM
.
Việc đặt cờ thành false
sẽ bật đài phát thanh HD, còn việc đặt cờ thành true
sẽ buộc đài phát thanh AM/FM tương tự.
Có kênh HD
Kể từ Android 15, các kênh HD hiện có cho đài phát thanh HD có thể được biểu thị bằng mặt nạ bit 8 bit, Metadata#hdSubChannelsAvailable
, trong ProgramInfo.metadata
. Ví dụ: giá trị của bit 1 từ trái sang biểu thị liệu kênh phụ HD2 có sẵn cho đài HD này hay không.
Trạng thái thu tín hiệu
Trong các phiên bản Android 15 trở lên, ứng dụng đài phát thanh có thể cho người dùng biết trạng thái thu tín hiệu của các đài phát thanh HD. Điều này rất hữu ích vì đôi khi, bạn phải mất vài phút để có đượ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 thanh thông qua ITunerCallback#onCurrentProgramInfoChanged.
Dưới đâ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 thanh HD có được thu nhận hay không.
- Bit 7: Cho biết liệu có dữ liệu Dịch vụ thông tin trạm (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 thấy siêu dữ liệu đài HD được hỗ trợ cho các phiên bản Android 15 trở lên.
Trường siêu dữ liệu | Mô tả |
---|---|
commentShortDescription |
Nội dung mô tả ngắ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) liên kết với nội dung |
hdStationNameShort |
Tên ngắn của đài phát thanh HD hoặc tên ngắn phổ biến |
hdStationNameLong |
Tên dài, khẩu hiệu hoặc thông báo của đài phát thanh HD. |