Radio siaran HAL

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 HAL: Saat sesi tuner baru dibuka, sesi lama harus dihentikan.
  • AIDL HAL: Karena tidak ada sesi tuner yang tersedia, hanya callback tuner yang perlu ditetapkan. Jika ada, callback lama harus dibatalkan penetapannya.
HIDL 2.0 openSession(ITunerCallback callback) menghasilkan (Result result, ITunerSession session)
AIDL void setTunerCallback(in ITunerCallback callback)
Deskripsi:
  • HIDL HAL: Menutup sesi tuner tidak boleh gagal dan hanya boleh dikeluarkan satu kali.
  • AIDL HAL: Tidak ada tuner dan hanya callback tuner yang perlu dibatalkan penetapannya.
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) atau status (di AIDL). Jika Result atau status adalah OK, callback tuner tuneFailed atau currentProgramInfoChanged 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 setiap chunk 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 di IBroadcastRadio. Sementara itu, ANTENNA_DISCONNECTED_TIMEOUT_MS diganti namanya menjadi ANTENNA_STATE_CHANGE_TIMEOUT_MS. const int TUNER_TIMEOUT_MS baru ditambahkan. Semua operasi penyesuaian, pencarian, dan langkah harus diselesaikan dalam jangka waktu ini.
  • Enum RDS dan Deemphasis dihapus di AIDL dan ditentukan sebagai const int di AmFmRegionConfig. Demikian pula, fmDeemphasis dan fmRds di ProgramInfo dideklarasikan sebagai int, hasil komputasi bit dari flag masing-masing. Sementara itu, D50 dan D75 masing-masing diganti namanya menjadi DEEMPHASIS_D50 dan DEEMPHASIS_D75.
  • Enum ProgramInfoFlags dihapus di AIDL dan ditentukan sebagai const int di ProgramInfo dengan awalan FLAG_ ditambahkan. Demikian pula, infoFlags di ProgramInfo dideklarasikan sebagai int, hasil komputasi bit flag. TUNED juga diganti namanya menjadi FLAG_TUNABLE, untuk mendeskripsikan lebih baik definisinya yang dapat dituning ke stasiun.
  • Di AmFmBandRange, scanSpacing diganti namanya menjadi seekSpacing, karena scan diganti namanya menjadi seek di AIDL.
  • Karena konsep union diperkenalkan di AIDL, MetadataKey dan Metadata yang ditentukan di HIDL HAL tidak lagi digunakan. Union AIDL Metadata ditentukan dalam AIDL HAL. Setiap nilai enum yang sebelumnya ada di MetadataKey kini menjadi kolom di Metadata 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.