HAL สถานีวิทยุประกาศ

ส่วนต่อไปนี้อธิบายวิธีใช้เลเยอร์การแยกแยะฮาร์ดแวร์ (HAL) เพื่อติดตั้งใช้งานวิทยุกระจายเสียง

อินเทอร์เฟซ HAL ของวิทยุกระจายเสียง

HAL ของวิทยุกระจายเสียงมีโครงสร้างข้อมูลและอินเทอร์เฟซที่ระดับฮาร์ดแวร์เพื่อใช้วิทยุกระจายเสียง เช่น วิทยุ AM/FM และ DAB

อินเทอร์เฟซ HIDL 2.0 และ AIDL

HAL วิทยุกระจายเสียงใช้อินเทอร์เฟซที่อธิบายไว้ในส่วนต่อไปนี้

IAnnouncementListener

IAnnouncementListener คืออินเทอร์เฟซการเรียกกลับสําหรับ Listener ประกาศ ซึ่งสามารถลงทะเบียนใน HAL วิทยุกระจายเสียงเพื่อรับประกาศ อินเทอร์เฟซมีวิธีการต่อไปนี้

IAnnouncementListener
คําอธิบาย: เรียกใช้ทุกครั้งที่รายการประกาศมีการเปลี่ยนแปลง
HIDL 2.0 oneway onListUpdated(vec<Announcement> announcements)
AIDL oneway void onListUpdated(in Announcement[] announcements)

ICloseHandle

ICloseHandle คือตัวแฮนเดิลการปิดทั่วไปเพื่อนำการเรียกกลับที่ไม่ต้องใช้อินเทอร์เฟซที่ใช้งานอยู่ออก

ICloseHandle
คำอธิบาย: ปิดที่จับ
HIDL 2.0 close()
AIDL void close()

ITunerCallback

ITunerCallback คืออินเทอร์เฟซการเรียกกลับที่ HAL ของวิทยุกระจายเสียงเรียกใช้เพื่อส่งการอัปเดตไปยังบริการไคลเอ็นต์ HAL

ITunerCallback
คำอธิบาย: HAL จะเรียกใช้เมื่อการดำเนินการปรับแต่ง (ปรับแต่ง กรอ (ใน AIDL) หรือสแกน (ใน HIDL) และดำเนินการเสร็จสมบูรณ์) ไม่สำเร็จแบบไม่พร้อมกัน
HIDL 2.0 oneway onCurrentProgramInfoChanged(ProgramInfo info)
AIDL void onCurrentProgramInfoChanged(in ProgramInfo info)
คําอธิบาย: เรียกใช้เมื่อปรับแต่ง กรอ (ใน AIDL) หรือสแกน (ใน HIDL) หรือขั้นตอนสําเร็จ
HIDL 2.0 oneway onTuneFailed(Result result, ProgramSelector selector)
AIDL void onTuneFailed(in Result result, in ProgramSelector selector)
คําอธิบาย: เรียกใช้เมื่อปรับแต่ง กรอ (ใน AIDL) หรือสแกน (ใน HIDL) หรือขั้นตอนสําเร็จ
HIDL 2.0 oneway onCurrentProgramInfoChanged(ProgramInfo info)
AIDL void onCurrentProgramInfoChanged(in ProgramInfo info)
คำอธิบาย: เรียกใช้เมื่อมีการอัปเดตรายการโปรแกรม ขนาดของข้อมูลแต่ละกลุ่มควรจำกัดไว้ที่ 500 KiB
HIDL 2.0 oneway onProgramListUpdated(ProgramListChunk chunk)
AIDL oneway onProgramListUpdated(ProgramListChunk chunk)
คําอธิบาย: เรียกใช้เมื่อเชื่อมต่อหรือยกเลิกการเชื่อมต่อเสาอากาศ
HIDL 2.0 oneway onAntennaStateChange(bool connected)
AIDL void onCurrentProgramInfoChanged(in ProgramInfo info)
คําอธิบาย: เรียกใช้เมื่อมีการอัปเดตค่าพารามิเตอร์เฉพาะผู้ให้บริการภายใน HAL (อย่าเรียกใช้หลังจากเรียกใช้ setParameters โดยไคลเอ็นต์ HAL)
HIDL 2.0 oneway onParametersUpdated(vec<VendorKeyValue> parameters)
AIDL void onParametersUpdated(in VendorKeyValue[] parameters)
คำอธิบาย: รายการใหม่ใน AIDL เรียกใช้เมื่อมีการอัปเดต Flag config ภายใน HAL (ไม่ควรเรียกใช้หลังจากไคลเอ็นต์ HAL เรียกใช้ setConfigFlag)
HIDL 2.0 ไม่สามารถใช้งาน
AIDL void onConfigFlagUpdated(in ConfigFlag flag, in boolean value)

IBroadcastRadio

IBroadcastRadio เป็นอินเทอร์เฟซหลักสำหรับ HAL วิทยุกระจายเสียง ใน HAL ของ HIDL 2.0 ให้ใช้อินเทอร์เฟซ ITunerSession กับจูนเนอร์เพื่อเรียกการดำเนินการ อย่างไรก็ตาม จะมีตัวรับสัญญาณที่ทำงานอยู่ได้สูงสุด 1 ตัวพร้อมกัน (ในกรณีที่อินสแตนซ์ HAL ของวิทยุกระจายเสียงแต่ละอินสแตนซ์มีชิปตัวรับสัญญาณเพียง 1 ชิป) ระบบนำ ITunerSession ออกจากอินเทอร์เฟซ AIDL และย้ายอินเทอร์เฟซของ ITunerSession ไปยัง IBroadcastRadio

IBroadcastRadio
คําอธิบาย: ดูคําอธิบายของโมดูลและความสามารถของโมดูล
HIDL 2.0 getProperties() generates (Properties properties)
AIDL Properties getProperties()
คำอธิบาย: ดึงข้อมูลการกำหนดค่าภูมิภาค AM/FM ปัจจุบันหรือที่เป็นไปได้
HIDL 2.0 getAmFmRegionConfig(bool full) generates (Result result, AmFmRegionConfig config)
AIDL AmFmRegionConfig getAmFmRegionConfig(bool full)
คำอธิบาย: ดึงข้อมูลการกำหนดค่าภูมิภาค DAB ในปัจจุบัน
HIDL 2.0 getDabRegionConfig() generates (Result result, vec<DabTableEntry> config)
AIDL DabTableEntry[] getDabRegionConfig()
คําอธิบาย: รับรูปภาพจากแคชของโมดูลวิทยุ ใน AIDL ขนาดรูปภาพต้องน้อยกว่า 1 MB เนื่องจากมีข้อจำกัดที่เข้มงวดเกี่ยวกับบัฟเฟอร์ธุรกรรม Binder
HIDL 2.0 getImage(uint32_t id) generates (vec<uint8_t> image)
AIDL byte[] getImage(in int id)
คําอธิบาย: ลงทะเบียน Listener ของประกาศ
HIDL 2.0 registerAnnouncementListener(vec<AnnouncementType> enabled,IAnnouncementListener listener) generates (Result result, ICloseHandle closeHandle)
AIDL ICloseHandle registerAnnouncementListener(in IAnnouncementListener listener, in AnnouncementType[] enabled)
คำอธิบาย:
  • HIDL HAL: เมื่อเปิดเซสชันตัวรับสัญญาณใหม่ เซสชันเก่าจะต้องสิ้นสุดลง
  • AIDL HAL: เนื่องจากไม่มีเซสชันตัวรับสัญญาณ คุณจึงต้องตั้งค่าเฉพาะการเรียกกลับของตัวรับสัญญาณ หากมีอยู่แล้ว ก็ควรยกเลิกการตั้งค่าการเรียกกลับเดิม
HIDL 2.0 openSession(ITunerCallback callback) สร้างขึ้น (Result result, ITunerSession session)
AIDL void setTunerCallback(in ITunerCallback callback)
คำอธิบาย:
  • HIDL HAL: การปิดเซสชันตัวรับสัญญาณต้องไม่ล้มเหลวและต้องออกเพียงครั้งเดียว
  • AIDL HAL: ไม่มีจูนเนอร์และจะต้องยกเลิกการตั้งค่าเฉพาะการเรียกกลับของจูนเนอร์เท่านั้น
HIDL 2.0 close()
AIDL unsetTunerCallback()
คําอธิบาย: ปรับเป็นโปรแกรมที่ระบุ
HIDL 2.0 tune(ProgramSelector program) generates (Result result)
AIDL void tune(in ProgramSelector program)
คำอธิบาย: เลื่อนหารายการถัดไปที่ถูกต้องซึ่งกำลังออกอากาศ scan เปลี่ยนชื่อเป็น seek เพื่อไม่ให้เกิดความสับสนใน AIDL
HIDL 2.0 scan(bool directionUp, bool skipSubChannel) generates (Result result)
AIDL void seek(in boolean directionUp, in boolean skipSubChannel)
คำอธิบาย: ขั้นตอนไปยังช่องข้างเคียง ซึ่งไม่มีโปรแกรมใดใช้อยู่
HIDL 2.0 step(bool directionUp) generates (Result result)
AIDL void step(in boolean directionUp)
คำอธิบาย: ยกเลิกการปรับแต่งที่รอดำเนินการ การสแกน (ใน HIDL) หรือการกรอ (ใน AIDL) หรือการดำเนินการตามขั้นตอน
HIDL 2.0 cancel()
AIDL void cancel()
คําอธิบาย: ใช้ตัวกรองกับรายการโปรแกรม และเริ่มส่งการอัปเดตรายการโปรแกรมผ่านonProgramListUpdated callback
HIDL 2.0 startProgramListUpdates(ProgramFilter filter) generates (Result result)
AIDL void startProgramListUpdates(in ProgramFilter filter)
คำอธิบาย: หยุดส่งการอัปเดตรายการโปรแกรม
HIDL 2.0 stopProgramListUpdates()
AIDL void stopProgramListUpdates()
คําอธิบาย: ดึงข้อมูลการตั้งค่าปัจจุบันของ Flag การกําหนดค่าที่ระบุ
HIDL 2.0 isConfigFlagSet(ConfigFlag flag) generates (Result result, bool value)
AIDL boolean isConfigFlagSet(in ConfigFlag flag)
คําอธิบาย: ตั้งค่า Flag การกําหนดค่าที่ระบุ
HIDL 2.0 setConfigFlag(ConfigFlag flag, bool value) generates (Result result)
AIDL void setConfigFlag(in ConfigFlag flag, boolean value)
คําอธิบาย: กําหนดค่าพารามิเตอร์เฉพาะผู้ให้บริการ
HIDL 2.0 setParameters(vec<VendorKeyValue> parameters)

สร้าง

(vec<VendorKeyValue> results)
AIDL VendorKeyValue[] setParameters(in VendorKeyValue[] parameters)
คําอธิบาย: ดึงค่าพารามิเตอร์เฉพาะผู้ให้บริการ
HIDL 2.0 getParameters(vec<string> keys) generates (vec<VendorKeyValue> parameters)
AIDL VendorKeyValue[] getParameters(in String[] keys)

การชี้แจงเกี่ยวกับอินเทอร์เฟซ

ลักษณะการทํางานแบบอะซิงโครนัส

เนื่องจากการดำเนินการปรับแต่งแต่ละรายการ (เช่น ปรับแต่ง สแกน (ใน HIDL) หรือกรอ (ใน AIDL) และขั้นตอน) อาจใช้เวลานานและไม่ควรบล็อกเธรดเป็นเวลานาน การดำเนินการจึงควรกำหนดเวลาการดำเนินการที่ใช้เวลานานให้เกิดขึ้นในภายหลังและแสดงสถานะหรือผลลัพธ์อย่างรวดเร็ว โดยการดำเนินการแต่ละรายการควรมีลักษณะดังนี้

  • ยกเลิกการปรับแต่งที่รอดำเนินการทั้งหมด
  • ตรวจสอบว่าระบบประมวลผลการดำเนินการได้หรือไม่โดยอิงตามอินพุตของเมธอดและสถานะของโปรแกรมปรับแต่ง
  • ตั้งเวลางานการปรับแต่ง แล้วแสดงผล Result (ใน HIDL) หรือ status (ใน AIDL) ทันที หาก Result หรือ status เป็น OK จะต้องเรียกใช้การเรียกกลับของโปรแกรมปรับแต่ง tuneFailed หรือ currentProgramInfoChanged เมื่องานการปรับแต่งไม่สำเร็จ (เช่น หมดเวลา) หรือเสร็จสมบูรณ์

ในทํานองเดียวกัน startProgramListUpdates ยังกําหนดเวลางานที่ต้องใช้เวลาในการอัปเดตรายการโปรแกรมให้ดําเนินการในภายหลังและแสดงสถานะหรือผลลัพธ์อย่างรวดเร็ว โดยวิธีนี้จะยกเลิกคําขออัปเดตที่รอดําเนินการก่อน จากนั้นจึงกําหนดเวลางานอัปเดตและแสดงผลลัพธ์อย่างรวดเร็ว

ภาวะแข่งขัน

เนื่องจากลักษณะการทำงานแบบไม่พร้อมกันของการดำเนินการปรับแต่ง (เช่น ปรับแต่ง สแกน (ใน HIDL) หรือกรอ (ใน AIDL) และขั้นตอน) จึงมีเงื่อนไขการแข่งขันระหว่างการยกเลิกการดำเนินการกับการดำเนินการปรับแต่ง หากมีการเรียก cancel หลังจากที่ HAL ทำการจูนเสร็จสิ้นและก่อนที่การเรียกกลับจะเสร็จสมบูรณ์ ระบบจะละเว้นการยกเลิกและระบบจะเรียกกลับให้เสร็จสมบูรณ์และส่งไปยังไคลเอ็นต์ HAL

ในทํานองเดียวกัน หากมีการเรียก stopProgramListUpdates หลังจากที่ HAL อัปเดตรายการโปรแกรมเสร็จแล้ว และก่อนที่การเรียกกลับ onCurrentProgramInfoChanged จะเสร็จสมบูรณ์ ระบบจะละเว้น stopProgramListUpdates และควรทําการเรียกกลับให้เสร็จสมบูรณ์

ขีดจำกัดขนาดข้อมูล

เนื่องจากบัฟเฟอร์ธุรกรรม Binder มีขีดจำกัดสูงสุด ขีดจำกัดของข้อมูลสำหรับเมธอดอินเทอร์เฟซบางรายการที่ส่งข้อมูลที่มีขนาดใหญ่ได้จะระบุไว้ใน AIDL HAL

  • getImage กำหนดให้รูปภาพที่แสดงผลมีขนาดไม่เกิน 1 MB
  • onProgramListUpdate กําหนดให้ chunk แต่ละรายการมีขนาดไม่เกิน 500 KiB รายการโปรแกรมขนาดใหญ่ต้องแยกตามการใช้งาน HAL ออกเป็นหลายกลุ่มและส่งผ่านการเรียกกลับหลายรายการ

การเปลี่ยนแปลงโครงสร้างข้อมูล AIDL HAL

นอกจากการเปลี่ยนแปลงอินเทอร์เฟซแล้ว การเปลี่ยนแปลงเหล่านี้ยังมีผลกับโครงสร้างข้อมูลที่กําหนดไว้ใน AIDL HAL ของวิทยุกระจายเสียง ซึ่งใช้ประโยชน์จาก AIDL

  • Constant enum ถูกนำออกจาก AIDL และกำหนดเป็น const int ใน IBroadcastRadio ในระหว่างนี้ ANTENNA_DISCONNECTED_TIMEOUT_MS จะเปลี่ยนชื่อเป็น ANTENNA_STATE_CHANGE_TIMEOUT_MS เพิ่ม const int TUNER_TIMEOUT_MS ใหม่ การดำเนินการปรับ เลื่อน และข้ามทั้งหมดต้องเสร็จสิ้นภายในเวลานี้
  • นํา Enum RDS และ Deemphasis ออกใน AIDL และกำหนดเป็น const int ใน AmFmRegionConfig ดังนั้น ทั้ง fmDeemphasis และ fmRds ใน ProgramInfo จึงได้รับการประกาศเป็น int ซึ่งเป็นผลลัพธ์การคำนวณแบบบิตของ Flag ที่เกี่ยวข้อง ในระหว่างนี้ D50 และ D75 จะเปลี่ยนชื่อเป็น DEEMPHASIS_D50 และ DEEMPHASIS_D75 ตามลำดับ
  • นํา Enum ProgramInfoFlags ออกจาก AIDL และกำหนดเป็น const int ใน ProgramInfo พร้อมเพิ่มคำนำหน้า FLAG_ ด้วยเหตุนี้ infoFlags ใน ProgramInfo จึงได้รับการประกาศเป็น int ซึ่งเป็นผลลัพธ์การคำนวณแบบบิตของ Flags นอกจากนี้ เรายังได้เปลี่ยนชื่อ TUNED เป็น FLAG_TUNABLE เพื่ออธิบายคำจำกัดความของสถานีที่ปรับได้ได้ดียิ่งขึ้น
  • ใน AmFmBandRange ระบบจะเปลี่ยนชื่อ scanSpacing เป็น seekSpacing เนื่องจาก scan เปลี่ยนชื่อเป็น seek ใน AIDL
  • เนื่องจากมีการใช้แนวคิด union ใน AIDL จึงไม่มีการนํา MetadataKey และ Metadata ที่กําหนดไว้ใน HIDL HAL มาใช้อีกต่อไป ยูเนียน AIDL Metadata จะกำหนดไว้ใน AIDL HAL ค่า enum แต่ละค่าก่อนหน้านี้ใน MetadataKey ตอนนี้เป็นฟิลด์ใน Metadata ที่มีประเภทสตริงหรือ int โดยขึ้นอยู่กับคําจํากัดความ

การรองรับวิทยุ DAB

ส่วนนี้อธิบายการรองรับวิทยุ DAB

รหัสระบุ

ประเภทตัวระบุหลักสำหรับวิทยุ DAB และ DMB ใน HAL วิทยุการออกอากาศ AIDL คือ DAB_SID_EXT DAB_SID_EXT ใช้ตัวระบุบริการ (SID) 32 บิตเพื่อให้แสดง SID ของทั้งวิทยุ DAB และ DMB ได้

นอกจากตัวระบุหลักแล้ว ระบบยังรองรับตัวระบุรอง เช่น DAB_ENSEMBLE และ DAB_FREQUENCY_KHZ ซึ่งสำคัญเนื่องจากสถานี DAB หลายแห่งสามารถใช้ DAB_SID_EXT เดียวกันได้โดยมีค่า DAB_ENSEMBLE หรือ DAB_FREQUENCY_KHZ ต่างกัน ระบบจะอัปเดตสถานีที่มี DAB_SID_EXT เดียวกันพร้อมกันโดยใช้ ITunerCallback#onProgramListUpdated เพื่อให้การอัปเดตรายการโปรแกรมถูกต้อง จากนั้นระบบจะส่งต่อข้อมูลอัปเดตนี้ไปยังบริการวิทยุกระจายเสียงและเครื่องมือจัดการวิทยุ และสุดท้ายจะส่งต่อไปยังแอปวิทยุผ่าน android.hardware.radio.ProgramList

ข้อมูลเมตา

ตารางต่อไปนี้แสดงข้อมูลเมตาที่รองรับสำหรับ DAB ใน AIDL Broadcast Radio HAL

ฟิลด์ข้อมูลเมตา คำอธิบาย
dabEnsembleName (รูปแบบย่อ: dabEnsembleNameShort) ชื่อกลุ่มของสถานี DAB
dabServiceName (ย่อมาจาก dabServiceNameShort) ชื่อบริการของสถานี DAB
dabComponentName (ย่อมาจาก dabComponentNameShort) ชื่อคอมโพเนนต์ของสถานี DAB

การรองรับวิทยุดิจิทัลไฮบริด

ส่วนนี้จะอธิบายการรองรับวิทยุ HD

รหัสระบุ

HD_STATION_ID_EXT ทำหน้าที่เป็นตัวระบุหลักสำหรับสถานีวิทยุ HD นอกจากนี้ เรายังมีตัวระบุรอง เช่น HD_STATION_NAME และ HD_STATION_LOCATION ไว้เพื่อเพิ่มประสิทธิภาพการระบุสถานี HD_STATION_LOCATION ซึ่งระบุข้อมูลตำแหน่งได้เปิดตัวใน Android 15

เปิดหรือปิดใช้วิทยุดิจิทัล

ตั้งแต่ Android 15 เป็นต้นไป คุณสามารถเปิดหรือปิดใช้วิทยุดิจิทัล (เช่น วิทยุ HD) ได้โดยการปรับ ConfigFlag หากต้องการควบคุมการตั้งค่านี้สำหรับวิทยุ FM ให้ใช้ Flag FORCE_ANALOG_FM สำหรับวิทยุ AM ให้ใช้ Flag FORCE_ANALOG_AM การตั้งค่า Flag เป็น false จะเปิดใช้วิทยุ HD ส่วนการตั้งค่าเป็น true จะบังคับให้ใช้วิทยุ AM/FM แบบอนาล็อก

ช่อง HD ที่พร้อมให้รับชม

ตั้งแต่ Android 15 เป็นต้นไป ช่อง HD ที่พร้อมใช้งานสำหรับสถานีวิทยุ HD ในปัจจุบันจะแสดงด้วยหน้ากากบิต 8 บิต Metadata#hdSubChannelsAvailable ใน ProgramInfo.metadata ตัวอย่างเช่น ค่าของบิตที่ 1 จากด้านซ้ายแสดงว่าสถานี HD นี้มีช่องย่อย HD2 หรือไม่

สถานะการจับสัญญาณ

ใน Android เวอร์ชัน 15 ขึ้นไป แอปวิทยุจะแสดงสถานะการรับสัญญาณของสถานีวิทยุ HD แก่ผู้ใช้ได้ ซึ่งมีประโยชน์เนื่องจากบางครั้งการรับสัญญาณ HD ที่แรงอาจใช้เวลาสักครู่

ระบบจะใช้ ProgramInfo.infoFlags เพื่อติดตามสถานะและอัปเดตแอปวิทยุผ่าน ITunerCallback#onCurrentProgramInfoChanged. เพื่อระบุข้อมูลนี้

สถานะจะแสดงภายใน ProgramInfo.infoFlags ดังนี้

  • บิต 6: ระบุว่ามีสัญญาณวิทยุ HD หรือไม่
  • บิตที่ 7: แสดงว่าข้อมูลบริการข้อมูลสถานี (SIS) พร้อมใช้งานหรือไม่ SIS ให้ข้อมูลเพิ่มเติมเกี่ยวกับสถานีและรายการที่กำลังเล่น
  • บิตที่ 8: ระบุว่ามีเสียงดิจิทัล HD หรือไม่

ข้อมูลเมตา

ตารางต่อไปนี้แสดงข้อมูลเมตาของวิทยุ HD ที่รองรับสำหรับ Android เวอร์ชัน 15 ขึ้นไป

ฟิลด์ข้อมูลเมตา คำอธิบาย
commentShortDescription คำอธิบายบริบทสั้นๆ ของความคิดเห็น
commentActualText ข้อความของความคิดเห็น
commercial โฆษณาทางวิทยุ
ufids ตัวระบุไฟล์ที่ไม่ซ้ำกัน (UFID) ที่เชื่อมโยงกับเนื้อหา
hdStationNameShort ชื่อย่อหรือชื่อย่อสากลของสถานีวิทยุ HD
hdStationNameLong ชื่อแบบยาว สโลแกน หรือข้อความจากสถานีวิทยุ HD