ใน Android 13 และเวอร์ชันที่ต่ำกว่า อินเทอร์เฟซ Audio HAL จะ
กำหนดโดยใช้ HIDL ในไฟล์ HIDL HAL (มี
ส่วนขยาย .hal
) และ
สคีมา XSD สำหรับ
ไฟล์การกำหนดค่า ดังที่แสดงด้านล่าง
รูปที่ 1 อินเทอร์เฟซ HAL ของเสียง
ไฟล์การกำหนดค่า
ไฟล์การกำหนดค่า XML ของนโยบายเสียงและเอฟเฟกต์เสียงถือเป็นส่วนหนึ่ง ของอินเทอร์เฟซ HAL ของ HIDL เสียง ไฟล์เหล่านี้ต้องเป็นไปตามสคีมาของไฟล์ และ การปฏิบัติตามข้อกำหนดจะได้รับการยืนยันโดยการทดสอบ VTS
คุณต้องสร้างไฟล์กำหนดค่านโยบายเสียง
ที่อธิบายโทโพโลยีเสียง ซึ่งเป็นส่วนหนึ่งของการใช้ HAL ของ HIDL เสียง ต้องประกาศความสามารถของ HAL เสียงในไฟล์ audio_policy_configuration.xml
เพื่อให้เฟรมเวิร์กใช้ความสามารถเหล่านั้นได้
Audio HIDL HAL API
ส่วนนี้อธิบาย API ของ HAL หลัก, เอฟเฟกต์ และ API ของ HAL ทั่วไปสำหรับ HIDL
HAL หลัก
อินเทอร์เฟซหลักบางส่วนของ HAL หลักที่ใช้ HIDL มีดังนี้
IDeviceFactory.hal
คือจุดแรกเข้าของ APIIDevice.hal
และIPrimaryDevice.hal
มีเมธอดต่างๆ เช่นsetMasterVolume
หรือopenInputStream
- สตรีมเป็นแบบทิศทางเดียวและ AudioFlinger ใช้เพื่อส่งหรือรับ
เสียงไปยังและจาก HAL ผ่าน
IStream.hal
,IStreamOut.hal
และIStreamIn.hal
ตารางต่อไปนี้แสดงตำแหน่งของคอมโพเนนต์ HIDL ของ HAL หลักที่มีประโยชน์
คอมโพเนนต์ 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 ทั่วไป
API ของ HAL ทั่วไปที่ใช้ HIDL มีองค์ประกอบต่อไปนี้
- คำจำกัดความ (
/hardware/interfaces/audio/common/6.0/types.hal
) ที่แชร์โดย Core API และ Effect API - ยูทิลิตี (
/hardware/interfaces/audio/common/all-versions
) ที่ใช้เพื่อช่วย การเขียนโค้ดกับ HIDL API สำหรับการใช้งาน ไคลเอ็นต์ และการทดสอบ
การอัปเดต HAL เสียง V7
เวอร์ชัน 7 ของ Audio HAL ใน Android 12 มีการเปลี่ยนแปลงที่สำคัญตามที่ระบุไว้ในส่วนนี้ HAL เสียง V7 จะทำสิ่งต่อไปนี้
- รวมโมเดลข้อมูลที่เฟรมเวิร์กและ HAL ใช้
- ลดการทำซ้ำระหว่างประเภทข้อมูล HIDL (การแจงนับ) กับสคีมา XML ที่ใช้สำหรับการกำหนดค่านโยบายเสียง
โดยเฉพาะอย่างยิ่ง เราได้ทำการเปลี่ยนแปลงในส่วนต่อไปนี้ใน Audio HAL V7
การเปลี่ยนแปลงเหล่านี้จะอธิบายโดยละเอียดในส่วนที่เกี่ยวข้อง
การแจงนับ
ตั้งแต่ Audio HAL V7 เป็นต้นไป ประเภทที่แจงนับซึ่งใช้ในการกำหนดค่านโยบายเสียง จะกำหนดไว้ในสคีมา XSD เท่านั้น ไม่ได้กำหนดไว้ใน HIDL
ใน Audio HAL V6 ค่าของประเภท enum (เช่น AudioFormat
) ใน types.hal
จะ
กำหนดไว้ในสคีมา XSD ของไฟล์การกำหนดค่านโยบายเสียงด้วย ซึ่งทำให้เกิด
การทำซ้ำ ใน V7 เราได้เปลี่ยนประเภท Enum เป็น string
เพื่อหลีกเลี่ยงปัญหานี้
และแสดงค่าการแจงนับที่เป็นไปได้ทั้งหมดในสคีมา XSD แทน
รูปที่ 2 เปรียบเทียบการเปลี่ยนแปลงบางอย่างกับประเภทการแจงนับ AudioFormat
ในเวอร์ชัน 7
รูปที่ 2 การเปรียบเทียบการเปลี่ยนแปลงบางอย่างใน Enum AudioFormat
ดูรายการต่อไปนี้สำหรับประเภทการแจงนับที่แปลงเป็น
string
AudioChannelMask
AudioContentType
AudioDevice
: ขยายได้โดยผู้ให้บริการAudioFormat
: ขยายได้โดยผู้ให้บริการAudioGainMode
AudioSource
AudioStreamType
AudioUsage
ส่งค่า enum สตริง
ค่าสตริงใช้สำหรับการโอนข้อมูลเป็นค่าการแจงนับข้ามขอบเขตอินเทอร์เฟซ HAL ทั้งเฟรมเวิร์กและ HAL Wrapper ใช้ค่า 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 เพื่อลดคำจำกัดความที่ซ้ำกัน ระบบจะจัดกลุ่มทูเพิลของรายการข้อมูลที่ซ้ำกันไว้ด้วยกันเป็นโครงสร้างที่นำกลับมาใช้ใหม่ได้ โครงสร้างข้อมูลเหล่านี้ใช้ฟีเจอร์ HIDL ล่าสุด เช่น สหภาพที่ปลอดภัย
เช่น ใน V6 และต่ำกว่านั้น มักจะใช้ <format, sampling rate, channel mask>
ในอินเทอร์เฟซและประเภท 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
มีการใช้โครงสร้างในลักษณะที่คล้ายกันโดยการเพิ่มแท็กเฉพาะสำหรับข้อมูลเมตาของแทร็กการบันทึก
การกำหนด Namespace ของส่วนขยายของผู้ให้บริการ
ตั้งแต่ 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 |