Audio Hardware Abstraction Layer (HAL) ของ Android เชื่อมต่อ API เฟรมเวิร์กเฉพาะเสียงในระดับที่สูงกว่าใน android.media
กับไดรเวอร์เสียงและฮาร์ดแวร์พื้นฐาน Audio HAL กำหนดอินเทอร์เฟซมาตรฐานที่บริการเสียงเรียกเข้ามา ต้องนำไปใช้เพื่อให้ฮาร์ดแวร์เสียงทำงานได้อย่างถูกต้อง
หน้านี้จะแสดงภาพรวมของ HAL เสียงและให้รายละเอียดของ API และข้อกำหนดในการนำไปใช้งาน
อินเทอร์เฟซเสียง HAL
อินเทอร์เฟซ Audio HAL ถูกกำหนดโดยใช้ HIDL ในไฟล์ . .hal
และ XSD schema สำหรับไฟล์การกำหนดค่า ดังแสดงดังต่อไปนี้
รูปที่ 1 อินเทอร์เฟซ Audio HAL
ไฟล์การกำหนดค่า
ไฟล์คอนฟิกูเรชัน XML ของนโยบายเสียงและเอฟเฟ็กต์เสียงถือเป็นส่วนหนึ่งของอินเทอร์เฟซ Audio HAL ไฟล์เหล่านี้ต้องเป็นไปตามสคีมา และความสอดคล้องจะได้รับการตรวจสอบโดยการทดสอบ VTS
ในการปรับใช้ HAL เสียง คุณต้องสร้าง ไฟล์คอนฟิกูเรชันนโยบายเสียง ที่อธิบายโทโพโลยีเสียง ต้องประกาศความสามารถของ Audio HAL ในไฟล์ audio_policy_configuration.xml
เพื่อให้เฟรมเวิร์กใช้งานได้
เสียง HAL API
HAL เสียงประกอบด้วย API ต่อไปนี้:
- แกน HAL
- ผลกระทบ HAL
- HAL ทั่วไป
API เหล่านี้แต่ละรายการได้อธิบายไว้ในหัวข้อต่อไปนี้
แกน HAL
Core HAL เป็น API หลักที่ AudioFlinger ใช้เพื่อเล่นเสียงและควบคุมการกำหนดเส้นทางเสียง อินเทอร์เฟซหลักบางส่วนมีดังนี้:
-
IDeviceFactory.hal
เป็นจุดเริ่มต้นของ API -
IDevice.hal
และIPrimaryDevice.hal
มีเมธอด เช่นsetMasterVolume
หรือopenInputStream
- สตรีมเป็นแบบทิศทางเดียวและใช้งานโดย AudioFlinger เพื่อส่งหรือรับเสียงเข้าและออกจาก HAL ผ่าน
IStream.hal
,IStreamOut.hal
และIStreamIn.hal
ตารางต่อไปนี้แสดงตำแหน่งของส่วนประกอบ Core HAL ที่เป็นประโยชน์
ส่วนประกอบหลักของ HAL | ที่ตั้ง |
---|---|
API เวอร์ชันล่าสุด | /hardware/interfaces/audio/6.0 |
ประเภทเฉพาะสำหรับ Core HAL API ล่าสุด | /hardware/interfaces/audio/6.0/types.hal |
ไฟล์การกำหนดค่านโยบายเสียง XSD schema | /hardware/interfaces/audio/6.0/config/audio_policy_configuration.xsd |
การใช้งานเริ่มต้นของ Core HAL API ( /hardware/interfaces/audio/core/all-versions/default/
) เป็นตัวห่อหุ้มการใช้งาน pre-Treble HAL โดย ใช้ไลบรารีที่ใช้ร่วมกันแบบดั้งเดิม การใช้งานเริ่มต้นยังสามารถถือเป็นข้อมูลอ้างอิงเมื่อใช้งาน Audio HAL เวอร์ชันใหม่ที่โต้ตอบกับไดรเวอร์เคอร์เนลโดยตรง
ผลกระทบ HAL
Effects HAL API ถูกใช้โดยเฟรมเวิร์กเอฟเฟกต์เพื่อควบคุมเอฟเฟกต์เสียง คุณยังสามารถกำหนดค่าเอฟเฟ็กต์การ ประมวลผลล่วงหน้า เช่น การควบคุมอัตราขยายอัตโนมัติและการลดสัญญาณรบกวนผ่าน Effects HAL API
ตารางต่อไปนี้แสดงตำแหน่งของส่วนประกอบ Effects HAL ที่เป็นประโยชน์
ผลกระทบส่วนประกอบ HAL | ที่ตั้ง |
---|---|
API เวอร์ชันล่าสุด | /hardware/interfaces/audio/effect/6.0/ |
ไฟล์คอนฟิกูเรชันเอฟเฟ็กต์ XSD schema | /hardware/interfaces/audio/effect/6.0/xml/audio_effects_conf.xsd |
สำหรับข้อมูลเพิ่มเติม โปรดดูตัวอย่างการใช้งาน Effects HAL API ( /hardware/interfaces/audio/effect/all-versions/default/
) และส่วน Audio Effects
HAL ทั่วไป
Common HAL เป็นไลบรารีของประเภทข้อมูลทั่วไปที่ใช้โดย Core และ Effects HAL API ไม่มีอินเทอร์เฟซและไม่มีการทดสอบ VTS ที่เกี่ยวข้องเนื่องจากกำหนดโครงสร้างข้อมูลเท่านั้น Common HAL API ประกอบด้วยสิ่งต่อไปนี้:
- คำจำกัดความ (
/hardware/interfaces/audio/common/6.0/types.hal
) ที่ใช้ร่วมกันโดย Core และ Effect API - ยูทิลิตี้ (
/hardware/interfaces/audio/common/all-versions
) ใช้เพื่อช่วยเขียนโค้ดกับ HIDL APIs สำหรับการใช้งาน ไคลเอ็นต์ และการทดสอบ
ความต้องการ
นอกเหนือจากการนำ HAL เสียงไปใช้และสร้างไฟล์คอนฟิกูเรชันนโยบายเสียงแล้ว จะต้องปฏิบัติตามข้อกำหนด HAL ต่อไปนี้:
- หากการบันทึกสำหรับ Sound Trigger (การบันทึกจากฮอตเวิร์ด DSP บัฟเฟอร์) ได้รับการสนับสนุนโดยโปรไฟล์อินพุตหนึ่งโปรไฟล์ การนำไปใช้งานจะต้องรองรับจำนวนสตรีมที่ใช้งานบนโปรไฟล์นี้ซึ่งสอดคล้องกับจำนวนเซสชันที่เกิดขึ้นพร้อมกันที่ Sound Trigger HAL รองรับ
- การทำงานพร้อมกันของการโทรด้วยเสียง TX และการจับภาพจากตัวประมวลผลแอปพลิเคชันตามรายละเอียดในหน้า การจับภาพพร้อมกัน
อัปเดตเป็น Audio HAL V7
เพื่อแก้ไขปัญหาความเข้ากันได้แบบย้อนหลัง AIDL ที่เสถียรเป็นสิ่งจำเป็นสำหรับการเปลี่ยนแปลง HAL ทั้งหมดที่เริ่มต้นจาก Android 13 เพื่อสนับสนุนและปรับปรุงการนำ AIDL มาใช้ใน Android 13 และสูงกว่า Audio HAL V7 จะทำสิ่งต่อไปนี้:
- รวมโมเดลข้อมูลที่ใช้โดยเฟรมเวิร์กและ HAL
- ย่อความซ้ำซ้อนระหว่างประเภทข้อมูล HIDL (enum) และ XML schema ที่ใช้สำหรับการกำหนดค่านโยบายเสียง
โดยเฉพาะอย่างยิ่ง มีการเปลี่ยนแปลงในส่วนต่อไปนี้ในเสียง HAL V7:
การเปลี่ยนแปลงเหล่านี้จะกล่าวถึงในรายละเอียดเพิ่มเติมในส่วนที่เกี่ยวข้อง
การแจงนับ
เริ่มตั้งแต่ Audio HAL V7 ประเภทที่ระบุที่ใช้ในไฟล์การกำหนดค่านโยบายเสียงจะกำหนดไว้ใน XSD schema เท่านั้น ไม่ใช่ใน HIDL
ใน audio HAL V6 ค่าของประเภท enum (เช่น AudioFormat
) ใน types.hal
ยังถูกกำหนดในไฟล์การกำหนดค่านโยบายเสียง XSD schema ซึ่งสร้างการทำซ้ำ เพื่อหลีกเลี่ยงปัญหานี้ใน V7 ชนิด enum จะถูกเปลี่ยนเป็น string
และค่าการแจงนับที่เป็นไปได้ทั้งหมดจะแสดงรายการใน XSD schema แทน
ดูรูปที่ 2 สำหรับการเปรียบเทียบการเปลี่ยนแปลงบางอย่างกับประเภท AudioFormat
enum ใน V7
รูปที่ 2 การเปรียบเทียบการเปลี่ยนแปลงบางอย่างกับ AudioFormat enum
อ้างถึงรายการต่อไปนี้สำหรับประเภท enum ที่แปลงเป็น String
:
-
AudioChannelMask
-
AudioContentType
-
AudioDevice
: ผู้ขายขยายได้ -
AudioFormat
: ผู้ขายขยายได้ -
AudioGainMode
-
AudioSource
-
AudioStreamType
-
AudioUsage
ส่งผ่านค่า enum ของสตริง
ค่าสตริงใช้สำหรับถ่ายโอนข้อมูลเป็นค่าการแจงนับข้ามขอบเขตอินเทอร์เฟซ HAL ทั้งเฟรมเวิร์กและ HAL wrapper ใช้ค่า enum จำนวนเต็มสำหรับการนำตรรกะทางธุรกิจไปใช้ และใช้วิธีการแปลงที่แสดงใน รูปที่ 3
รูปที่ 3 การส่งค่า enum ของสตริง
ตัวอย่างเช่น หากต้องการส่งค่าประเภทรูปแบบเสียงจากเฟรมเวิร์กไปยังผู้จำหน่าย:
- ค่า enum ของ
AudioFormat
จะถูกแปลงเป็นค่าสตริงในlibaudiohal
และส่งผ่านไปยัง HAL - ในด้าน HAL ตัวตัดคำเริ่มต้นจะแปลงสตริงเป็นค่า enum ซึ่งส่งผ่านไปยัง HAL เดิม
การเปลี่ยนแปลง XML schema
การมีรายการค่า enum ที่สมบูรณ์ในข้อกำหนด XML schema (XSD) ช่วยให้สามารถตรวจสอบไฟล์ XML การกำหนดค่านโยบายเสียงได้ดีขึ้นโดย VTS มีการเปลี่ยนแปลงในไฟล์กำหนดค่านโยบายเสียงที่ใช้กับ 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
ถูกนำมาใช้ในลักษณะเดียวกันโดยการเพิ่มแท็กเฉพาะสำหรับข้อมูลเมตาของแทร็กการบันทึก
เนมสเปซส่วนขยายของผู้ขาย
เริ่มตั้งแต่ HAL V7 ส่วนขยายของผู้ขายจำเป็นต้องมีคำนำหน้า {vendor}
เพิ่มเติมซึ่งไม่จำเป็นใน V6 เพื่อให้คำนำหน้า {vendor}
ถูกต้อง จะต้องเป็นอักขระที่เป็นตัวอักษรและตัวเลขคละกันตั้งแต่สามตัวขึ้นไป
ใช้รูปแบบต่อไปนี้ใน V7:
VX_{ vendor }_{ letters/numbers }
ต่อไปนี้คือตัวอย่างบางส่วนของส่วนขยายผู้ให้บริการ V7 ที่ถูกต้อง:
- VX_ GOOGLE _VR
- VX_ QCI _AMBIENT_MIC
ข้อมูลรุ่น
ตารางต่อไปนี้แสดงหมายเลขเวอร์ชัน HAL สำหรับ Android แต่ละรุ่น
เวอร์ชันแอนดรอยด์ | รุ่น HAL |
---|---|
แอนดรอยด์ 13 | 7.1 |
แอนดรอยด์ 12 | 7.0 |
แอนดรอยด์ 11 | 6.0 |
แอนดรอยด์ 10 | 5.0 |
แอนดรอยด์ 9 | 4.0 |
แอนดรอยด์ 8 | 2.0 |