ใน Android 13 และต่ำกว่า อินเทอร์เฟซ Audio HAL จะ
กำหนดโดยใช้ HIDL ในไฟล์ HIDL HAL (นามสกุล
.hal) และ
XSD สคีมาสำหรับ
ไฟล์การกำหนดค่า ดังที่แสดงด้านล่าง
รูปที่ 1 อินเทอร์เฟซ Audio HAL
ไฟล์การกำหนดค่า
ไฟล์การกำหนดค่า XML ของนโยบายเสียงและเอฟเฟกต์เสียงถือเป็นส่วนหนึ่งของอินเทอร์เฟซ Audio HIDL HAL ไฟล์เหล่านี้ต้องเป็นไปตามสคีมา และระบบจะตรวจสอบการปฏิบัติตามข้อกำหนดด้วยการทดสอบ VTS
เมื่อใช้ Audio HIDL HAL คุณต้องสร้างไฟล์การกำหนดค่านโยบายเสียงที่อธิบายโทโพโลยีเสียง ต้องประกาศความสามารถของ Audio HAL ในไฟล์ audio_policy_configuration.xml เพื่อให้เฟรมเวิร์กใช้งานได้
Audio HIDL HAL API
ส่วนนี้อธิบาย API ของ Core, Effects และ Common HAL สำหรับ HIDL
Core HAL
อินเทอร์เฟซหลักบางส่วนของ Core HAL ที่ใช้ HIDL มีดังนี้
IDeviceFactory.halเป็นจุดเริ่มต้นของ APIIDevice.halและIPrimaryDevice.halมีเมธอดต่างๆ เช่นsetMasterVolumeหรือopenInputStream- สตรีมเป็นแบบทิศทางเดียวและ AudioFlinger ใช้เพื่อส่งหรือรับเสียงไปยังและจาก HAL ผ่าน
IStream.hal,IStreamOut.halและIStreamIn.hal
ตารางต่อไปนี้แสดงตำแหน่งของคอมโพเนนต์ HIDL ของ Core HAL ที่มีประโยชน์
| คอมโพเนนต์ Core HAL | ตำแหน่ง |
|---|---|
| API เวอร์ชันล่าสุด | /hardware/interfaces/audio/6.0
|
| ประเภทที่เฉพาะเจาะจงกับ Core HAL API ล่าสุด | /hardware/interfaces/audio/6.0/types.hal
|
| สคีมา XSD ของไฟล์การกำหนดค่านโยบายเสียง | /hardware/interfaces/audio/6.0/config/audio_policy_configuration.xsd
|
การใช้งานเริ่มต้นของ Core HAL API (/hardware/interfaces/audio/core/all-versions/default/)
เป็น Wrapper รอบการใช้งาน HAL ก่อน Treble โดยใช้
ไลบรารีที่แชร์แบบเดิม
นอกจากนี้ การใช้งานเริ่มต้นยังถือเป็นข้อมูลอ้างอิงเมื่อใช้ Audio HAL เวอร์ชันใหม่ที่โต้ตอบกับไดรเวอร์เคอร์เนลโดยตรง
Effects HAL
ตารางต่อไปนี้แสดงตำแหน่งของคอมโพเนนต์ Effects HAL ที่มีประโยชน์โดยใช้ HIDL
| คอมโพเนนต์ Effects HAL | ตำแหน่ง |
|---|---|
| API เวอร์ชันล่าสุด | /hardware/interfaces/audio/effect/6.0/
|
| สคีมา XSD ของไฟล์การกำหนดค่าเอฟเฟกต์ | /hardware/interfaces/audio/effect/6.0/xml/audio_effects_conf.xsd
|
ดูข้อมูลเพิ่มเติมได้ที่ตัวอย่างการใช้งาน
Effects HAL API ที่ /hardware/interfaces/audio/effect/all-versions/default/ และส่วนเอฟเฟกต์เสียง
Common HAL
Common HAL API ที่ใช้ HIDL มีองค์ประกอบต่อไปนี้
- คำจำกัดความ (
/hardware/interfaces/audio/common/6.0/types.hal) ที่ API ของ Core และ Effect ใช้ร่วมกัน - ยูทิลิตี (
/hardware/interfaces/audio/common/all-versions) ที่ใช้เพื่อช่วยในการเขียนโค้ดกับ HIDL API สำหรับการใช้งาน ไคลเอ็นต์ และการทดสอบ
การอัปเดต Audio HAL V7
Audio HAL เวอร์ชัน 7 ใน Android 12 มีการเปลี่ยนแปลงที่สำคัญตามที่ระบุไว้ในส่วนนี้ Audio HAL V7 มีหน้าที่ดังนี้
- รวมโมเดลข้อมูลที่เฟรมเวิร์กและ HAL ใช้
- ลดการทำซ้ำระหว่างประเภทข้อมูล HIDL (Enum) กับสคีมา XML ที่ใช้สำหรับการกำหนดค่านโยบายเสียง
โดยเฉพาะอย่างยิ่ง มีการเปลี่ยนแปลงในส่วนต่อไปนี้ใน Audio HAL V7
เราจะอธิบายการเปลี่ยนแปลงเหล่านี้โดยละเอียดมากขึ้นในส่วนที่เกี่ยวข้อง
การแจกแจง
ตั้งแต่ Audio HAL V7 เป็นต้นไป ระบบจะกำหนดประเภทการแจกแจงที่ใช้ในไฟล์การกำหนดค่านโยบายเสียงในสคีมา XSD เท่านั้น ไม่ใช่ใน HIDL
ใน Audio HAL V6 ค่าของประเภท Enum (เช่น AudioFormat) ใน types.hal จะกำหนดไว้ในสคีมา XSD ของไฟล์การกำหนดค่านโยบายเสียงด้วย ซึ่งทำให้เกิดการทำซ้ำ เพื่อหลีกเลี่ยงปัญหานี้ใน V7 ระบบจะเปลี่ยนประเภท Enum เป็น string และแสดงค่าการแจกแจงที่เป็นไปได้ทั้งหมดในสคีมา XSD แทน
รูปที่ 2 เปรียบเทียบการเปลี่ยนแปลงบางอย่างของประเภท Enum AudioFormat ใน V7
รูปที่ 2 การเปรียบเทียบการเปลี่ยนแปลงบางอย่างของ Enum AudioFormat
ดูรายการประเภท Enum ที่แปลงเป็น string ได้ในรายการต่อไปนี้
AudioChannelMaskAudioContentTypeAudioDevice: ผู้ให้บริการขยายได้AudioFormat: ผู้ให้บริการขยายได้AudioGainModeAudioSourceAudioStreamTypeAudioUsage
ส่งค่า Enum สตริง
ระบบใช้ค่าสตริงเพื่อโอนข้อมูลเป็นค่าการแจกแจงข้ามขอบเขตอินเทอร์เฟซ HAL ทั้งเฟรมเวิร์กและ Wrapper HAL ใช้ค่า Enum จำนวนเต็มเพื่อใช้ตรรกะทางธุรกิจ และใช้ แนวทางการแปลงที่แสดงใน รูปที่ 3:
รูปที่ 3 การส่งค่า Enum สตริง
ตัวอย่างเช่น หากต้องการส่งค่าประเภทรูปแบบเสียงจากเฟรมเวิร์กไปยังผู้ให้บริการ ให้ทำดังนี้
- ระบบจะแปลงค่า Enum ของ
AudioFormatเป็นค่าสตริงในlibaudiohalและส่งไปยัง HAL - ในฝั่ง HAL Wrapper เริ่มต้นจะแปลงสตริงเป็นค่า Enum ซึ่งจะส่งไปยัง HAL แบบเดิม
การเปลี่ยนแปลงสคีมา XML
การมีรายการค่า enum ที่สมบูรณ์ในคำจำกัดความสคีมา XML (XSD) ช่วยให้ VTS ตรวจสอบความถูกต้องของไฟล์ XML การกำหนดค่านโยบายเสียงได้ดียิ่งขึ้น เราได้ทำการเปลี่ยนแปลงในไฟล์การกำหนดค่านโยบายเสียงที่ใช้กับ HAL V7 เพื่อให้เป็นไปตาม XSD
ใน V7 ระบบจะใช้ตัวคั่น ␣ (ช่องว่าง) มาตรฐานเพื่อคั่นรายการค่าในแอตทริบิวต์ (เช่น อัตราการสุ่มตัวอย่าง, มาสก์ช่อง และแฟล็ก) แทนสัญลักษณ์ , (คอมมา) และ | (ขีดแนวตั้ง) ที่ใช้ใน V6 และเวอร์ชันก่อนหน้า ดังที่เห็นในตัวอย่างต่อไปนี้ ระบบจะใช้ช่องว่างเพื่อคั่นรายการค่าสำหรับ channelMasks
<profile channelMasks="AUDIO_CHANNEL_OUT_STEREO AUDIO_CHANNEL_OUT_MONO" … />
หากต้องการทำการเปลี่ยนแปลงสัญลักษณ์ ให้ใช้สคริปต์การแปลงอัตโนมัติที่ชื่อว่า update_audio_policy_config.sh ดูคำสั่งต่อไปนี้เพื่อแปลงไฟล์การกำหนดค่านโยบายเสียง V6 เป็นเวอร์ชัน V7 สำหรับอุปกรณ์ Pixel 5 (Redfin)
hardware/interfaces/audio/7.0/config/update_audio_policy_config.sh \
device/google/redfin/audio/audio_policy_configuration.xml 6.0
ประเภทข้อมูล
เราได้กำหนดโครงสร้างข้อมูลบางอย่างใหม่ใน V7 เพื่อลดคำจำกัดความที่ซ้ำกัน ระบบจะจัดกลุ่ม Tuple ของรายการข้อมูลที่ซ้ำกันไว้ในโครงสร้างที่นำกลับมาใช้ใหม่ได้ โครงสร้างข้อมูลเหล่านี้ใช้ฟีเจอร์ HIDL ล่าสุด เช่น Safe Union
ตัวอย่างเช่น ใน V6 และเวอร์ชันก่อนหน้า ระบบมักใช้ Tuple <format, sampling rate, channel mask>
ในอินเทอร์เฟซและประเภท HIDL หากต้องการนำความซ้ำซ้อนนี้ออก ใน V7 ระบบจะกำหนดประเภทข้อมูล AudioConfigBase และประเภทข้อมูลอื่นๆ ดังนี้
AudioConfigBase := <format, sampling rate, channel mask>AudioConfigBaseOptional := <[fmt], [sampl. rate], [chan. mask]>ใช้โดย
AudioConfig,AudioOffloadInfo,AudioPortConfigAudioProfile := <format, {sampling rates}, {channel masks}>แทนที่คอลเล็กชันแบบหลวมๆ ใน
AudioPort/PortConfigAudioPortExtendedInfo := device | mix | sessionแทนที่ Union ใน
AudioPort/PortConfig
แท็กของผู้ให้บริการ
นอกจากประเภทและรูปแบบอุปกรณ์แล้ว ผู้ให้บริการยังเพิ่มแท็กที่กำหนดเองสำหรับข้อมูลเมตาของแทร็กเสียงได้ด้วย
สำหรับข้อมูลเมตาของแทร็กการเล่นและการบันทึก ผู้ให้บริการสามารถส่งแท็กของตนเอง ซึ่งใช้เพื่อเพิ่มแอตทริบิวต์ลงในสตรีม I/O ของเสียง จากแอปไปยัง HAL
ระบบจะเพิ่มแท็กของผู้ให้บริการสำหรับข้อมูลเมตาของแทร็กการเล่นดังที่เห็นในตัวอย่างต่อไปนี้
struct PlaybackTrackMetadata {
…
/** Tags from AudioTrack audio attributes */
vec<AudioTag> tags;
};
โครงสร้าง RecordTrackMetadata จะใช้ในลักษณะที่คล้ายกันโดยการเพิ่มแท็กที่เฉพาะเจาะจงสำหรับข้อมูลเมตาของแทร็กการบันทึก
การใช้เนมสเปซส่วนขยายของผู้ให้บริการ
ตั้งแต่ HAL V7 เป็นต้นไป ส่วนขยายของผู้ให้บริการต้องมีคำนำหน้า {vendor} เพิ่มเติม ซึ่งไม่จำเป็นใน V6 คำนำหน้า {vendor} ต้องเป็นอักขระตัวอักษรและตัวเลขอย่างน้อย 3 ตัวจึงจะถูกต้อง
ใช้รูปแบบต่อไปนี้ใน V7
VX_{vendor}_{letters/numbers}
ตัวอย่างส่วนขยายของผู้ให้บริการ V7 ที่ถูกต้องมีดังนี้
VX_GOOGLE_VRVX_QCI_AMBIENT_MIC
ข้อมูลเวอร์ชัน
ตารางต่อไปนี้แสดงหมายเลขเวอร์ชัน HAL สำหรับ Android แต่ละรุ่น
| เวอร์ชัน Android | เวอร์ชัน HIDL HAL |
|---|---|
| Android 13 | 7.1 |
| Android 12 | 7.0 |
| Android 11 | 6.0 |
| Android 10 | 5.0 |
| Android 9 | 4.0 |
| Android 8 | 2.0 |