Bagian berikut menjelaskan cara menggunakan lapisan abstraksi hardware (HAL) untuk menerapkan radio siaran.
Antarmuka HAL radio siaran
HAL radio Broadcast 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 memiliki metode berikut:
IAnnouncementListener | ||
---|---|---|
Deskripsi: Dipanggil setiap kali daftar pengumuman telah berubah. | ||
HIDL 2.0 | oneway onListUpdated(vec<Announcement> announcements) |
|
AIDL | oneway void onListUpdated(in Announcement[] announcements) |
ICloseHandle
ICloseHandle
adalah handle penutup generik untuk menghapus callback yang tidak memerlukan
antarmuka aktif.
ICloseHandle | ||
---|---|---|
Deskripsi: Tutup 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 penyetelan (penyetelan, penelusuran (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 penyetelan, pencarian (di AIDL) atau pemindaian (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 penyetelan, pencarian (di AIDL) atau pemindaian (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 potongan harus dibatasi hingga 500 kiB. | ||
HIDL 2.0 | oneway onProgramListUpdated(ProgramListChunk chunk) |
|
AIDL | void 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 dipanggil 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 tanda 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 ketat pada buffer 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: Menyesuaikan ke program tertentu. | ||
HIDL 2.0 | tune(ProgramSelector program) generates (Result result) |
|
AIDL | void tune(in ProgramSelector program) |
|
Deskripsi: Mencari program valid berikutnya di
udara. 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 channel 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 operasi penyetelan, pemindaian (di HIDL), atau pencarian (di AIDL), atau langkah yang tertunda. | ||
HIDL 2.0 | cancel() |
|
AIDL | void cancel() |
|
Deskripsi: Menerapkan filter ke daftar program dan
mulai mengirim update daftar program melalui
callback onProgramListUpdated . |
||
HIDL 2.0 | startProgramListUpdates(ProgramFilter filter) generates (Result result) |
|
AIDL | void startProgramListUpdates(in ProgramFilter filter) |
|
Deskripsi: Berhenti mengirim update daftar program. | ||
HIDL 2.0 | stopProgramListUpdates() |
|
AIDL | void stopProgramListUpdates() |
|
Deskripsi: Mengambil setelan saat ini dari tanda konfigurasi tertentu. | ||
HIDL 2.0 | isConfigFlagSet(ConfigFlag flag) generates (Result result, bool value) |
|
AIDL | boolean isConfigFlagSet(in ConfigFlag flag) |
|
Deskripsi: Menetapkan tanda konfigurasi yang diberikan. | ||
HIDL 2.0 | setConfigFlag(ConfigFlag flag, bool value) generates (Result result) |
|
AIDL | void setConfigFlag(in ConfigFlag flag, boolean value) |
|
Deskripsi: Menetapkan nilai parameter khusus vendor. | ||
HIDL 2.0 | setParameters(vec<VendorKeyValue> parameters)
membuat, (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 penyetelan (misalnya, menyetel, memindai (di HIDL) atau mencari (di AIDL), dan melangkah) mungkin memakan waktu dan thread tidak boleh diblokir dalam 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 penyetelan 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 dengan cepat menampilkan status atau hasil. Metode
pertama-tama membatalkan permintaan update yang tertunda, lalu menjadwalkan tugas update dan dengan cepat menampilkan
hasilnya.
Kondisi race
Karena perilaku asinkron operasi penyetelan (misalnya, penyetelan, pemindaian (di HIDL) atau pencarian
(di AIDL), dan langkah), terdapat kondisi persaingan antara pembatalan operasi dan operasi
penyetelan. Jika cancel
dipanggil setelah HAL menyelesaikan operasi penyetelan 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 buffer transaksi binder, batas data untuk beberapa metode antarmuka yang meneruskan data berukuran besar dijelaskan dalam AIDL HAL.
getImage
memerlukan gambar yang ditampilkan berukuran 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 pada struktur data yang ditentukan dalam 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
. Oleh karena itu,fmDeemphasis
danfmRds
diProgramInfo
dideklarasikan sebagai int, hasil komputasi bit dari masing-masing tanda. 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. Oleh karena itu,infoFlags
diProgramInfo
dideklarasikan sebagai int, hasil komputasi bit flag.TUNED
juga diganti namanya menjadiFLAG_TUNABLE
, untuk mendeskripsikan definisinya dengan lebih baik bahwa stasiun dapat disetel ke frekuensi tersebut. - Di
AmFmBandRange
,scanSpacing
diganti namanya menjadiseekSpacing
, karenascan
diganti namanya menjadiseek
di AIDL. - Karena konsep gabungan diperkenalkan di AIDL,
MetadataKey
danMetadata
yang ditentukan di HIDL HAL tidak lagi digunakan. Gabungan 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 AIDL Broadcast Radio HAL 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
juga didukung. Hal ini penting karena beberapa stasiun DAB
dapat berbagi DAB_SID_EXT
sambil 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
. Kemudian, update ini diteruskan ke Broadcast Radio Service dan Radio Manager, 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 singkat: dabEnsembleNameShort ) |
Nama ansambel 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 lebih meningkatkan identifikasi stasiun, 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 mengaktifkan radio AM/FM analog.
Saluran HD tersedia
Mulai Android 15, saluran HD yang saat ini tersedia untuk stasiun radio HD dapat
direpresentasikan oleh mask bit 8 bit, Metadata#hdSubChannelsAvailable
,
di ProgramInfo.metadata
. Misalnya, nilai bit 1 dari kiri menunjukkan apakah subchannel HD2 tersedia untuk stasiun HD ini.
Status akuisisi sinyal
Di Android 15 dan versi yang lebih tinggi, aplikasi radio dapat menampilkan status perolehan sinyal 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 memperbarui aplikasi radio melalui
ITunerCallback#onCurrentProgramInfoChanged.
Berikut cara status ditampilkan dalam ProgramInfo.infoFlags
:
- Bit 6: Menunjukkan apakah sinyal radio HD telah diperoleh.
- Bit 7: Menampilkan apakah data Station Information Service (SIS) tersedia. SIS memberikan informasi tambahan tentang stasiun dan media 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 singkat konteks komentar |
commentActualText |
Teks komentar |
commercial |
Iklan radio |
ufids |
ID file unik (UFID) yang terkait dengan konten |
hdStationNameShort |
Nama singkat atau nama singkat universal stasiun radio HD |
hdStationNameLong |
Nama panjang, slogan, atau pesan dari stasiun radio HD. |
Peringatan darurat
Di Android 15 dan yang lebih tinggi, peringatan darurat didukung untuk stasiun radio HD guna
memberi tahu pengguna aplikasi radio tentang peringatan darurat yang dikirim dari stasiun radio.
Pemberitahuan darurat (Alert
) mengikuti
Standar Common Alerting Protocol (CAP) 1.2
dan mendukung pemberitahuan yang ditampilkan dalam tabel berikut:
Informasi pemberitahuan | Deskripsi | Nilai enum yang tersedia |
---|---|---|
AlertStatus |
Status pesan pemberitahuan | ACTUAL , EXERCISE , TEST |
AlertMessageType |
Jenis pesan peringatan darurat | ALERT , UPDATE , CANCEL |
AlertCategory |
Kategori peristiwa subjek pesan peringatan darurat | GEO , MET , SAFETY , SECURITY ,
RESCUE , FIRE , HEALTH , ENV ,
TRANSPORT , INFRA , CBRNE , OTHER |
AlertUrgency |
Urgensi peristiwa subjek pesan peringatan darurat | IMMEDIATE , EXPECTED , FUTURE , PAST , UNKNOWN |
AlertSeverity |
Tingkat keparahan peristiwa subjek pesan peringatan darurat | EXTREME , SEVERE , MODERATE , MINOR , UNKNOWN |
AlertCertainty |
Kepastian peristiwa subjek pesan peringatan darurat | OBSERVED , LIKELY , POSSIBLE , UNLIKELY , UNKNOWN |
Alert
(yang berisi informasi dalam tabel), pesan teks pemberitahuan,
dan AlertArea
untuk menampilkan informasi tentang pemberitahuan saat ini.
Alert
adalah kolom opsional di ProgramInfo
sehingga dapat dikirim dari
Broadcast Radio HAL ke aplikasi radio melalui callback tuner untuk info program saat ini dan pembaruan daftar program.