Bagian berikut menjelaskan cara menggunakan hardware abstraction layer (HAL) untuk menerapkan radio siaran.
Antarmuka HAL radio siaran
HAL radio Siaran menyediakan struktur data dan antarmuka di tingkat hardware untuk menerapkan radio siaran, seperti radio AM/FM dan DAB.
Antarmuka HIDL 2.0 dan AIDL
HAL radio siaran menggunakan antarmuka yang dijelaskan di bagian berikut.
IAnnouncementListener
IAnnouncementListener
adalah antarmuka callback untuk pemroses pengumuman, yang
dapat didaftarkan di HAL radio siaran untuk menerima pengumuman. Antarmuka ini memiliki metode
berikut:
IAnnouncementListener | ||
---|---|---|
Deskripsi: Dipanggil setiap kali daftar pengumuman berubah. | ||
HIDL 2.0 | oneway onListUpdated(vec<Announcement> announcements) |
|
AIDL | oneway void onListUpdated(in Announcement[] announcements) |
ICloseHandle
ICloseHandle
adalah pengendali tutup generik untuk menghapus callback yang tidak memerlukan
antarmuka aktif.
ICloseHandle | ||
---|---|---|
Deskripsi: Menutup gagang. | ||
HIDL 2.0 | close() |
|
AIDL | void close() |
ITunerCallback
ITunerCallback
adalah antarmuka callback yang dipanggil oleh HAL radio siaran untuk
mengirim update ke layanan klien HAL.
ITunerCallback | ||
---|---|---|
Deskripsi: Dipanggil oleh HAL saat operasi penyesuaian (penyesuaian, pencarian (di AIDL) atau pemindaian (di HIDL) dan langkah berhasil) gagal secara asinkron. | ||
HIDL 2.0 | oneway onCurrentProgramInfoChanged(ProgramInfo info) |
|
AIDL | void onCurrentProgramInfoChanged(in ProgramInfo info) |
|
Deskripsi: Dipanggil saat menyetel, mencari (di AIDL) atau memindai (di HIDL), atau langkah berhasil. | ||
HIDL 2.0 | oneway onTuneFailed(Result result, ProgramSelector selector) |
|
AIDL | void onTuneFailed(in Result result, in ProgramSelector selector) |
|
Deskripsi: Dipanggil saat menyetel, mencari (di AIDL) atau memindai (di HIDL), atau langkah berhasil. | ||
HIDL 2.0 | oneway onCurrentProgramInfoChanged(ProgramInfo info) |
|
AIDL | void onCurrentProgramInfoChanged(in ProgramInfo info) |
|
Deskripsi: Dipanggil saat daftar program diperbarui; ukuran setiap bagian harus dibatasi hingga 500 kiB. | ||
HIDL 2.0 | oneway onProgramListUpdated(ProgramListChunk chunk) |
|
AIDL | oneway onProgramListUpdated(ProgramListChunk chunk) |
|
Deskripsi: Dipanggil saat antena terhubung atau terputus. | ||
HIDL 2.0 | oneway onAntennaStateChange(bool connected) |
|
AIDL | void onCurrentProgramInfoChanged(in ProgramInfo info) |
|
Deskripsi: Dipanggil saat nilai parameter khusus
vendor diperbarui secara internal di HAL (jangan panggil setelah memanggil
setParameters oleh klien HAL). |
||
HIDL 2.0 | oneway onParametersUpdated(vec<VendorKeyValue> parameters) |
|
AIDL | void onParametersUpdated(in VendorKeyValue[] parameters) |
|
Deskripsi: Baru di AIDL. Dipanggil saat flag konfigurasi
diperbarui secara internal di HAL (tidak boleh
dipanggil setelah memanggil setConfigFlag oleh klien HAL). |
||
HIDL 2.0 | Tidak berlaku. | |
AIDL | void onConfigFlagUpdated(in ConfigFlag flag, in boolean value) |
IBroadcastRadio
IBroadcastRadio
adalah antarmuka utama untuk HAL radio siaran. Di HAL
HIDL 2.0, gunakan antarmuka ITunerSession
ke tuner untuk memanggil operasi. Namun, paling banyak
satu tuner aktif dalam satu waktu (asalkan setiap instance HAL radio siaran hanya memiliki satu chip
tuner).
ITunerSession
dihapus dari antarmuka AIDL dan antarmukanya dipindahkan ke
IBroadcastRadio
.
IBroadcastRadio | ||
---|---|---|
Deskripsi: Mendapatkan deskripsi modul dan kemampuannya. | ||
HIDL 2.0 | getProperties() generates (Properties properties) |
|
AIDL | Properties getProperties() |
|
Deskripsi: Mengambil konfigurasi wilayah AM/FM saat ini atau yang mungkin. | ||
HIDL 2.0 | getAmFmRegionConfig(bool full) generates (Result result, AmFmRegionConfig
config) |
|
AIDL | AmFmRegionConfig getAmFmRegionConfig(bool full) |
|
Deskripsi: Mengambil konfigurasi wilayah DAB saat ini. | ||
HIDL 2.0 | getDabRegionConfig() generates (Result result, vec<DabTableEntry>
config) |
|
AIDL | DabTableEntry[] getDabRegionConfig() |
|
Deskripsi: Mendapatkan gambar dari cache modul radio. Di AIDL, ukuran gambar harus kurang dari 1 MB karena batas keras pada buffering transaksi binder. | ||
HIDL 2.0 | getImage(uint32_t id) generates (vec<uint8_t> image) |
|
AIDL | byte[] getImage(in int id) |
|
Deskripsi: Mendaftarkan pemroses pengumuman. | ||
HIDL 2.0 | registerAnnouncementListener(vec<AnnouncementType>
enabled,IAnnouncementListener listener) generates (Result result, ICloseHandle
closeHandle) |
|
AIDL | ICloseHandle registerAnnouncementListener(in IAnnouncementListener listener, in
AnnouncementType[] enabled) |
|
Deskripsi:
|
||
HIDL 2.0 | openSession(ITunerCallback callback) menghasilkan
(Result result, ITunerSession session) |
|
AIDL | void setTunerCallback(in ITunerCallback callback) |
|
Deskripsi:
|
||
HIDL 2.0 | close() |
|
AIDL | unsetTunerCallback() |
|
Deskripsi: Menyetel ke program yang ditentukan. | ||
HIDL 2.0 | tune(ProgramSelector program) generates (Result result) |
|
AIDL | void tune(in ProgramSelector program) |
|
Deskripsi: Mencari program valid berikutnya yang sedang
ditayangkan. Untuk menghindari kebingungan di AIDL,
scan diganti namanya menjadi seek .
|
||
HIDL 2.0 | scan(bool directionUp, bool skipSubChannel) generates (Result result) |
|
AIDL | void seek(in boolean directionUp, in boolean skipSubChannel) |
|
Deskripsi: Langkah-langkah ke saluran yang berdekatan, yang mungkin tidak ditempati oleh program apa pun. | ||
HIDL 2.0 | step(bool directionUp) generates (Result result) |
|
AIDL | void step(in boolean directionUp) |
|
Deskripsi: Membatalkan penyesuaian yang tertunda, pemindaian (di HIDL) atau pencarian (di AIDL), atau operasi langkah. | ||
HIDL 2.0 | cancel() |
|
AIDL | void cancel() |
|
Deskripsi: Menerapkan filter ke daftar program dan
mulai mengirim pembaruan daftar program melalui
callback onProgramListUpdated . |
||
HIDL 2.0 | startProgramListUpdates(ProgramFilter filter) generates (Result result) |
|
AIDL | void startProgramListUpdates(in ProgramFilter filter) |
|
Deskripsi: Berhenti mengirim pembaruan daftar program. | ||
HIDL 2.0 | stopProgramListUpdates() |
|
AIDL | void stopProgramListUpdates() |
|
Deskripsi: Mengambil setelan saat ini dari flag konfigurasi tertentu. | ||
HIDL 2.0 | isConfigFlagSet(ConfigFlag flag) generates (Result result, bool value) |
|
AIDL | boolean isConfigFlagSet(in ConfigFlag flag) |
|
Deskripsi: Menetapkan flag konfigurasi yang diberikan. | ||
HIDL 2.0 | setConfigFlag(ConfigFlag flag, bool value) generates (Result result) |
|
AIDL | void setConfigFlag(in ConfigFlag flag, boolean value) |
|
Deskripsi: Menetapkan parameter value khusus vendor. | ||
HIDL 2.0 | setParameters(vec<VendorKeyValue> parameters)
menghasilkan, (vec<VendorKeyValue> results) |
|
AIDL | VendorKeyValue[] setParameters(in VendorKeyValue[] parameters) |
|
Deskripsi: Mengambil nilai parameter khusus vendor. | ||
HIDL 2.0 | getParameters(vec<string> keys) generates (vec<VendorKeyValue>
parameters) |
|
AIDL | VendorKeyValue[] getParameters(in String[] keys) |
Klarifikasi antarmuka
Perilaku asinkron
Karena setiap operasi penyesuaian (misalnya, penyesuaian, pemindaian (di HIDL) atau pencarian (di AIDL), dan langkah) mungkin memakan waktu dan thread tidak boleh diblokir untuk waktu yang lama, operasi harus menjadwalkan operasi yang memakan waktu untuk terjadi nanti dan dengan cepat menampilkan status atau hasil. Secara mendetail, setiap operasi harus:
- Membatalkan semua operasi penyesuaian yang tertunda.
- Periksa apakah operasi dapat diproses berdasarkan input metode dan status tuner.
- Jadwalkan tugas penyesuaian, lalu segera tampilkan
Result
(di HIDL) ataustatus
(di AIDL). JikaResult
ataustatus
adalahOK
, callback tunertuneFailed
ataucurrentProgramInfoChanged
harus dipanggil saat tugas penyesuaian gagal (misalnya, karena waktu tunggu habis) atau selesai.
Demikian pula, startProgramListUpdates
juga menjadwalkan tugas yang memakan waktu untuk
memperbarui daftar program agar dilakukan nanti dan menampilkan status atau hasil dengan cepat. Metode ini
pertama-tama membatalkan permintaan update yang tertunda, lalu menjadwalkan tugas pembaruan dan menampilkan
hasilnya dengan cepat.
Kondisi race
Karena perilaku asinkron operasi penyesuaian (misalnya, penyesuaian, pemindaian (di HIDL) atau pencarian
(di AIDL), dan langkah), terdapat kondisi perlombaan antara membatalkan operasi dan operasi
penyesuaian. Jika cancel
dipanggil setelah HAL menyelesaikan operasi penyesuaian dan sebelum
callback selesai, pembatalan dapat diabaikan dan callback harus selesai dan diterima
oleh klien HAL.
Demikian pula, jika stopProgramListUpdates
dipanggil setelah HAL menyelesaikan update
daftar program dan sebelum callback onCurrentProgramInfoChanged
selesai,
stopProgramListUpdates
dapat diabaikan dan callback harus selesai.
Batas ukuran data
Karena ada batas pasti pada buffering transaksi binder, batas data untuk beberapa metode antarmuka yang meneruskan data dengan ukuran yang berpotensi besar akan diperjelas di AIDL HAL.
getImage
mengharuskan gambar yang ditampilkan kurang dari 1 MB.onProgramListUpdate
mengharuskan setiapchunk
berukuran kurang dari 500 kiB. Daftar program yang lebih besar harus dibagi oleh implementasi HAL menjadi beberapa bagian dan dikirim melalui beberapa callback.
Perubahan pada struktur data AIDL HAL
Selain perubahan pada antarmuka, perubahan ini telah diterapkan ke struktur data yang ditentukan di AIDL HAL radio siaran, yang memanfaatkan AIDL.
- Enum
Constant
dihapus di AIDL dan ditentukan sebagai const int diIBroadcastRadio
. Sementara itu,ANTENNA_DISCONNECTED_TIMEOUT_MS
diganti namanya menjadiANTENNA_STATE_CHANGE_TIMEOUT_MS
. const intTUNER_TIMEOUT_MS
baru ditambahkan. Semua operasi penyesuaian, pencarian, dan langkah harus diselesaikan dalam jangka waktu ini. - Enum
RDS
danDeemphasis
dihapus di AIDL dan ditentukan sebagai const int diAmFmRegionConfig
. Demikian pula,fmDeemphasis
danfmRds
diProgramInfo
dideklarasikan sebagai int, hasil komputasi bit dari flag masing-masing. Sementara itu,D50
danD75
masing-masing diganti namanya menjadiDEEMPHASIS_D50
danDEEMPHASIS_D75
. - Enum
ProgramInfoFlags
dihapus di AIDL dan ditentukan sebagai const int diProgramInfo
dengan awalanFLAG_
ditambahkan. Demikian pula,infoFlags
diProgramInfo
dideklarasikan sebagai int, hasil komputasi bit flag.TUNED
juga diganti namanya menjadiFLAG_TUNABLE
, untuk mendeskripsikan lebih baik definisinya yang dapat dituning ke stasiun. - Di
AmFmBandRange
,scanSpacing
diganti namanya menjadiseekSpacing
, karenascan
diganti namanya menjadiseek
di AIDL. - Karena konsep union diperkenalkan di AIDL,
MetadataKey
danMetadata
yang ditentukan di HIDL HAL tidak lagi digunakan. Union AIDLMetadata
ditentukan dalam AIDL HAL. Setiap nilai enum yang sebelumnya ada diMetadataKey
kini menjadi kolom diMetadata
dengan jenis string atau int, bergantung pada definisinya.
Dukungan radio DAB
Bagian ini menjelaskan dukungan radio DAB.
Pengenal
Jenis ID utama untuk radio DAB dan DMB di HAL Radio Siaran AIDL adalah
DAB_SID_EXT
. DAB_SID_EXT
menggunakan ID layanan (SID) 32-bit sehingga dapat merepresentasikan
SID radio DAB dan DMB.
Selain ID utama, ID sekunder seperti DAB_ENSEMBLE
dan
DAB_FREQUENCY_KHZ
didukung. Hal ini penting karena beberapa
saluran DAB dapat berbagi DAB_SID_EXT
sekaligus memiliki nilai DAB_ENSEMBLE
atau DAB_FREQUENCY_KHZ
yang berbeda. Untuk memastikan pembaruan daftar program yang akurat, stasiun dengan
DAB_SID_EXT
yang sama diperbarui bersama menggunakan
ITunerCallback#onProgramListUpdated
. Pembaruan ini kemudian diteruskan ke Layanan
Radio Siaran dan Pengelola Radio, dan akhirnya ke aplikasi radio melalui
android.hardware.radio.ProgramList
.
Metadata
Tabel berikut menunjukkan metadata yang didukung khusus untuk DAB di AIDL Broadcast Radio HAL:
Kolom metadata | Deskripsi |
---|---|
dabEnsembleName (bentuk singkatan: dabEnsembleNameShort ) |
Nama ensemble stasiun DAB |
dabServiceName (disingkat dari dabServiceNameShort ) |
Nama layanan stasiun DAB |
dabComponentName (disingkat dari dabComponentNameShort ) |
Nama komponen stasiun DAB |
Dukungan radio HD
Bagian ini menjelaskan dukungan radio HD.
Pengenal
HD_STATION_ID_EXT
berfungsi sebagai ID utama untuk stasiun radio HD. Untuk meningkatkan
identifikasi stasiun lebih lanjut, ID sekunder seperti HD_STATION_NAME
dan
HD_STATION_LOCATION
juga disediakan. HD_STATION_LOCATION
, yang
memberikan informasi lokasi, diperkenalkan di Android 15.
Mengaktifkan atau menonaktifkan radio digital
Mulai Android 15, Anda dapat mengaktifkan atau menonaktifkan radio digital (seperti radio HD) dengan menyesuaikan
ConfigFlag
. Untuk mengontrol setelan ini untuk radio FM, gunakan
flag FORCE_ANALOG_FM
; untuk radio AM, gunakan flag FORCE_ANALOG_AM
.
Menyetel flag ke false
akan mengaktifkan radio HD, sedangkan menyetelnya ke
true
akan memaksa radio AM/FM analog.
Saluran HD tersedia
Mulai Android 15, saluran HD yang saat ini tersedia untuk stasiun radio HD dapat
direpresentasikan oleh bit mask 8 bit, Metadata#hdSubChannelsAvailable
,
di ProgramInfo.metadata
. Misalnya, nilai bit 1 dari kiri menunjukkan apakah
subsaluran HD2 tersedia untuk stasiun HD ini.
Status akuisisi sinyal
Di Android 15 dan versi yang lebih tinggi, aplikasi radio dapat menampilkan status akuisisi sinyal dari stasiun radio HD kepada pengguna. Hal ini berguna karena mendapatkan sinyal HD yang kuat terkadang memerlukan waktu beberapa saat.
Untuk memberikan informasi ini, sistem menggunakan ProgramInfo.infoFlags
untuk melacak
status dan mengupdate aplikasi radio melalui
ITunerCallback#onCurrentProgramInfoChanged.
Berikut cara status ditampilkan dalam ProgramInfo.infoFlags
:
- Bit 6: Menunjukkan apakah sinyal radio HD telah diperoleh.
- Bit 7: Menunjukkan apakah data Station Information Service (SIS) tersedia. SIS memberikan informasi tambahan tentang stasiun dan apa yang sedang diputar.
- Bit 8: Menunjukkan apakah audio digital HD tersedia.
Metadata
Tabel berikut menunjukkan metadata radio HD yang didukung untuk Android 15 dan versi yang lebih tinggi.
Kolom metadata | Deskripsi |
---|---|
commentShortDescription |
Deskripsi konteks singkat komentar |
commentActualText |
Teks komentar |
commercial |
Iklan radio |
ufids |
ID file unik (UFID) yang terkait dengan konten |
hdStationNameShort |
Nama singkat stasiun radio HD atau nama singkat universal |
hdStationNameLong |
Nama panjang, slogan, atau pesan dari stasiun radio HD. |