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