ใน Android 13 และต่ำกว่า อินเทอร์เฟซ HAL ของเสียงจะกำหนดโดยใช้ HIDL ในไฟล์ HIDL HAL (ที่มีนามสกุล .hal
) และรูปแบบ XSD สำหรับไฟล์การกำหนดค่า ดังที่แสดงต่อไปนี้
รูปที่ 1 อินเทอร์เฟซ HAL ของเสียง
ไฟล์การกําหนดค่า
ระบบจะถือว่าไฟล์การกำหนดค่า XML ของนโยบายเสียงและเอฟเฟกต์เสียงเป็นส่วนหนึ่งของอินเทอร์เฟซ HAL ของ Audio HIDL ไฟล์เหล่านี้ต้องเป็นไปตามสคีมา และผ่านการทดสอบ VTS เพื่อยืนยันการปฏิบัติตามข้อกำหนด
ในการนํา HIDL HAL เสียงไปใช้ คุณต้องสร้างไฟล์การกําหนดค่านโยบายเสียงที่อธิบายโทโปโลยีเสียง คุณต้องประกาศความสามารถของ HAL เสียงในไฟล์ audio_policy_configuration.xml
เพื่อให้เฟรมเวิร์กใช้ความสามารถดังกล่าวได้
Audio HIDL HAL API
ส่วนนี้จะอธิบาย API หลัก, เอฟเฟกต์ และ HAL API ทั่วไปสำหรับ HIDL
Core HAL
อินเทอร์เฟซที่สําคัญบางส่วนใน Core HAL ที่ใช้ HIDL มีดังนี้
IDeviceFactory.hal
คือจุดแรกเข้าของ APIIDevice.hal
และIPrimaryDevice.hal
มีเมธอด เช่นsetMasterVolume
หรือopenInputStream
- สตรีมเป็นแบบทิศทางเดียวและ AudioFlinger จะใช้เพื่อส่งหรือรับเสียงจาก HAL ผ่าน
IStream.hal
,IStreamOut.hal
และIStreamIn.hal
ตารางต่อไปนี้แสดงตำแหน่งของคอมโพเนนต์ Core HAL HIDL ที่มีประโยชน์
คอมโพเนนต์ 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 ที่ใช้ไลบรารีที่ใช้ร่วมกันแบบเดิม
นอกจากนี้ การใช้งานเริ่มต้นยังใช้เป็นข้อมูลอ้างอิงเมื่อติดตั้งใช้งาน HAL เสียงเวอร์ชันใหม่ที่โต้ตอบกับไดรเวอร์เคอร์เนลโดยตรงได้ด้วย
HAL สำหรับเอฟเฟกต์
ตารางต่อไปนี้แสดงตําแหน่งของคอมโพเนนต์ HAL ของเอฟเฟกต์ที่มีประโยชน์โดยใช้ HIDL
คอมโพเนนต์ 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/
และส่วนเอฟเฟกต์เสียง
HAL ทั่วไป
Common HAL API ที่ใช้ HIDL มีดังนี้
- คำจำกัดความ (
/hardware/interfaces/audio/common/6.0/types.hal
) ที่แชร์โดย API หลักและ Effect API - ยูทิลิตี (
/hardware/interfaces/audio/common/all-versions
) ที่ใช้ช่วยเขียนโค้ดกับ HIDL API สำหรับการใช้งาน ไคลเอ็นต์ และการทดสอบ
การอัปเดต Audio HAL V7
HAL เสียงเวอร์ชัน 7 ใน Android 12 มีการเปลี่ยนแปลงที่สำคัญตามที่ระบุไว้ในส่วนนี้ Audio HAL V7 ทำงานดังนี้
- รวมโมเดลข้อมูลที่เฟรมเวิร์กและ HAL ใช้
- ลดการซ้ำกันระหว่างประเภทข้อมูล HIDL (Enum) กับสคีมา XML ที่ใช้สำหรับการกำหนดค่านโยบายเสียง
โดยเฉพาะอย่างยิ่ง การเปลี่ยนแปลงจะดำเนินการในส่วนต่อไปนี้ใน Audio HAL V7
เราจะกล่าวถึงการเปลี่ยนแปลงเหล่านี้อย่างละเอียดยิ่งขึ้นในส่วนที่เกี่ยวข้อง
การแจกแจง
ตั้งแต่ Audio HAL V7 เป็นต้นไป ประเภทที่ระบุรายการที่ใช้ในไฟล์การกำหนดค่านโยบายเสียงจะกำหนดไว้ในสคีมา XSD เท่านั้น และไม่ได้อยู่ใน HIDL
ใน HAL V6 เสียง ค่าของประเภท enum (เช่น AudioFormat
) ใน types.hal
จะมีการกำหนดในสคีมา XSD ของไฟล์การกำหนดค่านโยบายเสียงด้วย ซึ่งทำให้เป็นการทำซ้ำ เพื่อหลีกเลี่ยงปัญหานี้ใน V7 ระบบจึงเปลี่ยนประเภท enum เป็น string
และแสดงค่าการแจกแจงทั้งหมดที่เป็นไปได้ในสคีมา XSD แทน
รูปที่ 2 เปรียบเทียบการเปลี่ยนแปลงบางอย่างของประเภท AudioFormat
enum ใน V7
รูปที่ 2 การเปรียบเทียบการเปลี่ยนแปลงบางรายการกับค่าแจกแจง AudioFormat
โปรดดูรายการต่อไปนี้สำหรับประเภท Enum ที่แปลงเป็น string
AudioChannelMask
AudioContentType
AudioDevice
: ขยายได้สำหรับผู้ให้บริการAudioFormat
: ขยายได้สำหรับผู้ให้บริการAudioGainMode
AudioSource
AudioStreamType
AudioUsage
ส่งค่า enum สตริง
ค่าสตริงใช้สำหรับการโอนข้อมูลเป็นค่าการแจกแจงทั่วทั้งขอบเขตอินเทอร์เฟซ HAL ทั้งเฟรมเวิร์กและ Wrapper HAL ใช้ค่า Enum แบบจำนวนเต็มเพื่อใช้ตรรกะทางธุรกิจและใช้แนวทางการเปลี่ยนรูปแบบที่แสดงในรูปที่ 3
รูปที่ 3 การส่งค่า enum สตริง
ตัวอย่างเช่น หากต้องการส่งค่าประเภทรูปแบบเสียงจากเฟรมเวิร์กไปยังผู้ให้บริการ ให้ทำดังนี้
- ระบบจะแปลงค่า Enum ของ
AudioFormat
เป็นค่าสตริงในlibaudiohal
และส่งไปยัง HAL - ในฝั่ง HAL ตัวแฝงเริ่มต้นจะแปลงสตริงเป็นค่า enum ซึ่งส่งไปยัง HAL รุ่นเดิม
การเปลี่ยนแปลงสคีมา XML
การมีรายการค่าแบบแจกแจงทั้งหมดในคําจํากัดความสคีมา XML (XSD) จะช่วยให้ VTS ตรวจสอบไฟล์ XML การกำหนดค่านโยบายเสียงได้ดียิ่งขึ้น เราได้ทําการเปลี่ยนแปลงในไฟล์การกําหนดค่านโยบายเสียงที่ใช้กับ HAL V7 เพื่อให้เป็นไปตาม XSD
ใน V7 ระบบจะใช้อักขระ ␣
(เว้นวรรค) มาตรฐานเพื่อคั่นรายการค่าในแอตทริบิวต์ (เช่น อัตราตัวอย่าง มาสก์ช่อง และ Flag) แทนสัญลักษณ์ ,
(คอมมา) และ |
(เส้นตั้ง) ที่ใช้ใน V6 และต่ำกว่า ดังที่เห็นในตัวอย่างต่อไปนี้ ระบบจะใช้การเว้นวรรคเพื่อคั่นรายการค่าของ channelMasks
<profile channelMasks="AUDIO_CHANNEL_OUT_STEREO AUDIO_CHANNEL_OUT_MONO" … />
หากต้องการเปลี่ยนแปลงสัญลักษณ์ ให้ใช้สคริปต์ Conversion อัตโนมัติที่ชื่อ 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 เพื่อลดการกําหนดซ้ำ ระบบจะจัดกลุ่มชุดข้อมูลซ้ำๆ เข้าด้วยกันเป็นโครงสร้างที่นํากลับมาใช้ซ้ำได้ โครงสร้างข้อมูลเหล่านี้ใช้ฟีเจอร์ HIDL ล่าสุด เช่น ยูเนียนแบบปลอดภัย
เช่น ใน V6 และต่ำกว่า <format, sampling rate, channel mask>
3 ตัวมักใช้ในอินเทอร์เฟซและประเภท HIDL เพื่อลดความซ้ำซ้อนนี้ ใน V7 ระบบจะกำหนดAudioConfigBase
ประเภทข้อมูลและประเภทข้อมูลอื่นๆ ดังนี้
AudioConfigBase := <format, sampling rate, channel mask>
AudioConfigBaseOptional := <[fmt], [sampl. rate], [chan. mask]>
ใช้โดย
AudioConfig
,AudioOffloadInfo
,AudioPortConfig
AudioProfile := <format, {sampling rates}, {channel masks}>
แทนที่คอลเล็กชันแบบหลวมใน
AudioPort/PortConfig
AudioPortExtendedInfo := device | mix | session
แทนที่สหภาพใน
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_VR
VX_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 |