ส่วนต่อไปนี้อธิบายวิธีใช้เลเยอร์การแยกแยะฮาร์ดแวร์ (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 2.0 | openSession(ITunerCallback callback) สร้างขึ้น
(Result result, ITunerSession session) |
|
AIDL | void setTunerCallback(in ITunerCallback callback) |
|
คำอธิบาย:
|
||
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 MBonProgramListUpdate
กําหนดให้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 intTUNER_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 มาใช้อีกต่อไป ยูเนียน AIDLMetadata
จะกำหนดไว้ใน 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 |