Truyền phát HAL trên đài

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 HAL: Khi mở một phiên bộ điều chỉnh mới, phiên cũ phải được chấm dứt.
  • AIDL HAL: Vì không có phiên bộ chỉnh âm nào, nên bạn chỉ cần đặt lệnh gọi lại bộ chỉnh âm. Nếu có, bạn phải huỷ thiết lập 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: Không được đóng phiên bộ chỉnh âm không thành công và chỉ được phát hành một lần.
  • AIDL HAL: Không có bộ chỉnh và chỉ cần huỷ thiết lập lệnh gọi lại bộ chỉnh.
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ặc status (trong AIDL) ngay lập tức. Nếu Result hoặc statusOK, thì bạn phải gọi lệnh gọi lại bộ điều chỉnh tuneFailed hoặc currentProgramInfoChanged 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ỗi chunk 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 trong IBroadcastRadio. Trong khi đó, ANTENNA_DISCONNECTED_TIMEOUT_MS được đổi tên thành ANTENNA_STATE_CHANGE_TIMEOUT_MS. Thêm một const int TUNER_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 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, một 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 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ờ. TUNED cũng được đổi tên thành FLAG_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ành seekSpacing, vì scan được đổi tên thành seek trong AIDL.
  • Vì khái niệm hợp nhất được giới thiệu trong AIDL, nên MetadataKeyMetadata được xác định trong HIDL HAL không còn được sử 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ó 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_ENSEMBLEDAB_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_NAMEHD_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.