HAL phát sóng radio

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 HAL: Khi một phiên bộ chỉnh mới được mở, phiên cũ phải được chấm dứt.
  • AIDL HAL: Vì không có phiên bộ chỉnh nào, nên bạn chỉ cần đặt lệnh gọi lại bộ chỉnh. Nếu có, bạn nên huỷ đặt lệnh gọi lại cũ.
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 HAL: Việc đóng một phiên bộ chỉnh phải không bị lỗi và chỉ được phát hành một lần.
  • HAL AIDL: Không có bộ chỉnh và chỉ cần huỷ đặt lệnh gọi lại bộ chỉnh.
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ặc status (trong AIDL) ngay lập tức. Nếu Result hoặc statusOK, thì lệnh gọi lại của bộ chỉnh tuneFailed hoặc currentProgramInfoChanged 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ỗi chunk 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 trong IBroadcastRadio. Trong khi đó, ANTENNA_DISCONNECTED_TIMEOUT_MS được đổi tên thành ANTENNA_STATE_CHANGE_TIMEOUT_MS. Một const int TUNER_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 RDSDeemphasis bị xoá trong AIDL và được xác định là const int trong AmFmRegionConfig. Tương ứng, cả fmDeemphasisfmRds trong ProgramInfo đề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 đó, D50D75 lần lượt được đổi tên thành DEEMPHASIS_D50DEEMPHASIS_D75.
  • Enum ProgramInfoFlags sẽ bị xoá trong AIDL và được xác định là const int trong ProgramInfo với tiền tố FLAG_ được thêm vào. Tương ứng, infoFlags trong ProgramInfo đượ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ành FLAG_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ành seekSpacing, vì scan được đổi tên thành seek trong AIDL.
  • Vì khái niệm về union được giới thiệu trong AIDL, nên MetadataKeyMetadata được xác định trong HIDL HAL không còn được dùng nữa. Một liên kết AIDL Metadata được xác định trong AIDL HAL. Mỗi giá trị enum trước đây trong MetadataKey hiện là một trường trong Metadata 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_ENSEMBLEDAB_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_NAMEHD_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
Bạn có thể sử dụng 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.