Radio siaran HAL

Bagian berikut ini menjelaskan cara menggunakan lapisan abstraksi hardware (HAL) untuk mengimplementasikan radio siaran.

Antarmuka HAL radio siaran

{i>Broadcast radio HAL<i} menyediakan struktur dan antarmuka data pada tingkat perangkat keras untuk mengimplementasikan radio siaran, seperti radio AM/FM dan DAB.

Antarmuka HIDL 2.0 dan AIDL

HAL radio siaran menggunakan antarmuka yang dijelaskan di bagian berikut.

IPengumumanListener

IAnnouncementListener adalah antarmuka callback untuk pemroses pengumuman, yang dapat didaftarkan di radio siaran HAL untuk menerima pengumuman. Antarmuka tersebut memiliki metode:

IPengumumanListener
Deskripsi: Dipanggil setiap kali daftar pengumuman memiliki ubah.
HIDL 2.0 oneway onListUpdated(vec<Announcement> announcements)
AIDL oneway void onListUpdated(in Announcement[] announcements)

ICloseHandle

ICloseHandle adalah handle penutup umum untuk menghapus callback yang tidak memerlukan callback antarmuka aktif.

ICloseHandle
Deskripsi: Menutup tuas.
HIDL 2.0 close()
AIDL void close()

Callback ITuner

ITunerCallback adalah antarmuka callback yang dipanggil oleh HAL radio siaran untuk mengirim pembaruan ke layanan klien HAL.

Callback ITuner
Deskripsi: Dipanggil oleh HAL saat operasi tuning (tuning, mencari (di AIDL) atau memindai (dalam HIDL) dan langkah berhasil) gagal secara asinkron.
HIDL 2.0 oneway onCurrentProgramInfoChanged(ProgramInfo info)
AIDL void onCurrentProgramInfoChanged(in ProgramInfo info)
Deskripsi: Dipanggil saat men-tuning, mencari (dalam AIDL), atau memindai (dalam 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 men-tuning, mencari (dalam AIDL), atau memindai (dalam HIDL), atau langkah berhasil.
HIDL 2.0 oneway onCurrentProgramInfoChanged(ProgramInfo info)
AIDL void onCurrentProgramInfoChanged(in ProgramInfo info)
Deskripsi: Dipanggil saat daftar program diperbarui; tindakan setiap potongan 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 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 siaran radio HAL. Di HIDL 2.0 HAL, menggunakan antarmuka ITunerSession ke tuner untuk memanggil operasi. Namun, pada sebagian besar tuner aktif pada satu waktu (asalkan setiap instance HAL radio siaran hanya memiliki satu tuner {i>chip<i}). ITunerSession dihapus dari antarmuka AIDL dan antarmukanya dipindahkan ke IBroadcastRadio.

IBroadcastRadio
Deskripsi: Mendapatkan deskripsi modul dan kemampuan IT.
HIDL 2.0 getProperties() generates (Properties properties)
AIDL Properties getProperties()
Deskripsi: Mengambil AM/FM saat ini atau yang memungkinkan konfigurasi region.
HIDL 2.0 getAmFmRegionConfig(bool full) generates (Result result, AmFmRegionConfig config)
AIDL AmFmRegionConfig getAmFmRegionConfig(bool full)
Deskripsi: Mengambil region DAB saat ini konfigurasi Anda.
HIDL 2.0 getDabRegionConfig() generates (Result result, vec<DabTableEntry> config)
AIDL DabTableEntry[] getDabRegionConfig()
Deskripsi: Mendapatkan gambar dari cache modul radio. Dalam AIDL, ukuran gambar harus kurang dari 1 MB karena adanya batas keras pada {i>buffer <i}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 disetel. Jika ada, callback lama harus tidak disetel.
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 sekali.
  • AIDL HAL: Tidak ada tuner dan hanya callback tuner yang perlu dibatalkan penetapannya.
HIDL 2.0 close()
AIDL unsetTunerCallback()
Deskripsi: Menyesuaikan program tertentu.
HIDL 2.0 tune(ProgramSelector program) generates (Result result)
AIDL void tune(in ProgramSelector program)
Deskripsi: Mencari program valid berikutnya di air. Untuk menghindari kebingungan dalam 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 diperlukan oleh program apa pun.
HIDL 2.0 step(bool directionUp) generates (Result result)
AIDL void step(in boolean directionUp)
Deskripsi: Membatalkan pencarian, pemindaian (dalam HIDL), atau pencarian yang tertunda (di AIDL), atau operasi langkah.
HIDL 2.0 cancel()
AIDL void cancel()
Deskripsi: Menerapkan filter ke daftar program dan mulai mengirimkan 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 item tertentu flag konfigurasi.
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)

menghasilkan,

(vec<VendorKeyValue> results)
AIDL VendorKeyValue[] setParameters(in VendorKeyValue[] parameters)
Deskripsi: Mengambil parameter value 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 tuning (misalnya, tuning, memindai (dalam HIDL) atau mencari (dalam AIDL), dan langkah) mungkin memakan waktu dan thread tidak boleh diblokir untuk waktu yang lama, operasi harus menjadwalkan operasi yang memakan waktu untuk terjadi kemudian dan dengan cepat mengembalikan status atau hasil. Secara rinci, setiap operasi harus:

  • Batalkan semua operasi tuning yang tertunda.
  • Periksa apakah operasi dapat diproses berdasarkan input metode dan status tuner.
  • Jadwalkan tugas tuning, lalu tampilkan Result (dalam HIDL) atau status (dalam AIDL) segera. Jika Result atau status adalah OK, callback tuner tuneFailed atau currentProgramInfoChanged harus dipanggil saat tuning tugas gagal (misalnya, karena waktu tunggu habis) atau selesai.

Demikian pula, startProgramListUpdates juga menjadwalkan tugas yang memakan waktu memperbarui daftar program untuk dilakukan nanti dan untuk mengembalikan status atau hasil dengan cepat. Metode pertama-tama membatalkan permintaan pembaruan yang tertunda, lalu menjadwalkan tugas pembaruan dan hasil pengujian tersebut.

Kondisi race

Karena perilaku operasi tuning yang asinkron (misalnya, tuning, pindai (di HIDL) atau cari (di AIDL), dan langkah), ada kondisi race antara membatalkan operasi dan tuning operasional bisnis. Jika cancel dipanggil setelah HAL menyelesaikan operasi penyesuaian dan sebelum callback selesai, pembatalan bisa diabaikan dan callback harus selesai dan diterima oleh klien HAL.

Demikian pula, jika stopProgramListUpdates dipanggil setelah HAL menyelesaikan program pembaruan daftar 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 antarmuka metode yang meneruskan data dengan ukuran yang mungkin berukuran besar akan diklarifikasi dalam HAL AIDL.

  • getImage mengharuskan gambar 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 potongan dan dikirim melalui beberapa callback.

Perubahan pada struktur data HAL AIDL

Selain perubahan dalam antarmuka, perubahan ini telah diterapkan pada struktur data didefinisikan di radio siaran AIDL HAL, yang memanfaatkan AIDL.

  • Enum Constant dihapus di AIDL dan ditetapkan sebagai konstanta int di IBroadcastRadio. Sementara itu, ANTENNA_DISCONNECTED_TIMEOUT_MS diganti namanya ke ANTENNA_STATE_CHANGE_TIMEOUT_MS. Konstanta baru int TUNER_TIMEOUT_MS adalah ditambahkan. Semua operasi penyesuaian, pencarian, dan langkah harus diselesaikan dalam waktu ini.
  • Enum RDS dan Deemphasis dihapus dalam AIDL dan ditetapkan sebagai const int di AmFmRegionConfig. Dengan demikian, baik fmDeemphasis maupun fmRds di ProgramInfo dideklarasikan sebagai int, yakni hasil komputasi bit flag yang terkait. Sementara itu, D50 dan D75 diganti namanya menjadi DEEMPHASIS_D50 dan DEEMPHASIS_D75.
  • Enum ProgramInfoFlags dihapus di AIDL dan ditetapkan sebagai konstanta int di ProgramInfo dengan awalan FLAG_ yang ditambahkan. Sejalan dengan itu, infoFlags di ProgramInfo dideklarasikan sebagai int, sebuah hasil komputasi bit flag. TUNED juga diganti namanya menjadi FLAG_TUNABLE, untuk mendeskripsikan dengan lebih baik definisinya agar stasiun dapat di-tuning.
  • Di AmFmBandRange, nama scanSpacing diganti menjadi seekSpacing, karena scan diganti namanya menjadi seek di AIDL.
  • Karena konsep union diperkenalkan dalam AIDL, MetadataKey dan Metadata yang ditentukan dalam HIDL HAL tidak digunakan lagi. Gabungan AIDL Metadata didefinisikan dalam AIDL HAL. Setiap nilai enum sebelumnya di MetadataKey sekarang menjadi kolom di Metadata dengan jenis string atau int, bergantung pada definisinya.