เสียง HAL แบบ HIDL

ใน Android 13 และต่ำกว่า อินเทอร์เฟซ HAL ของเสียงจะกำหนดโดยใช้ HIDL ในไฟล์ HIDL HAL (ที่มีนามสกุล .hal) และรูปแบบ XSD สำหรับไฟล์การกำหนดค่า ดังที่แสดงต่อไปนี้

audio_hal

รูปที่ 1 อินเทอร์เฟซ HAL ของเสียง

ไฟล์การกําหนดค่า

ระบบจะถือว่าไฟล์การกำหนดค่า XML ของนโยบายเสียงและเอฟเฟกต์เสียงเป็นส่วนหนึ่งของอินเทอร์เฟซ HAL ของ Audio HIDL ไฟล์เหล่านี้ต้องเป็นไปตามสคีมา และผ่านการทดสอบ VTS เพื่อยืนยันการปฏิบัติตามข้อกำหนด

ในการนํา HIDL HAL เสียงไปใช้ คุณต้องสร้างไฟล์การกําหนดค่านโยบายเสียงที่อธิบายโทโปโลยีเสียง คุณต้องประกาศความสามารถของ HAL เสียงในไฟล์ audio_policy_configuration.xml เพื่อให้เฟรมเวิร์กใช้ความสามารถดังกล่าวได้

Audio HIDL HAL API

ส่วนนี้อธิบาย API ของ HAL หลัก ผลลัพธ์ และทั่วไปสำหรับ HIDL

Core HAL

อินเทอร์เฟซหลักบางส่วนของ Core HAL ที่ใช้ HIDL มีดังนี้

  • IDeviceFactory.hal คือจุดแรกเข้าของ API
  • IDevice.hal และ IPrimaryDevice.hal มีเมธอด เช่น setMasterVolume หรือ openInputStream
  • สตรีมเป็นแบบทิศทางเดียวและ AudioFlinger จะใช้เพื่อส่งหรือรับเสียงจาก HAL ผ่าน IStream.hal, IStreamOut.hal และ IStreamIn.hal

ตารางต่อไปนี้แสดงตำแหน่งของคอมโพเนนต์ 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) ที่ Core และ 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

ใน Audio HAL V6 ค่าของประเภท enum (เช่น AudioFormat) ใน types.hal จะมีการกําหนดไว้ในสคีมา XSD ของไฟล์การกําหนดค่านโยบายเสียงด้วย ซึ่งจะทําให้เกิดข้อมูลที่ซ้ำกัน เพื่อหลีกเลี่ยงปัญหานี้ใน V7 ระบบจึงเปลี่ยนประเภท enum เป็น string และแสดงค่าการแจกแจงทั้งหมดที่เป็นไปได้ในสคีมา XSD แทน

รูปที่ 2 เปรียบเทียบการเปลี่ยนแปลงบางอย่างของประเภท AudioFormat enum ใน V7

audioformat-change

รูปที่ 2 การเปรียบเทียบการเปลี่ยนแปลงบางอย่างใน AudioFormat

โปรดดูรายการต่อไปนี้สำหรับประเภท Enum ที่แปลงเป็น string

  • AudioChannelMask
  • AudioContentType
  • AudioDevice: ขยายได้สำหรับผู้ให้บริการ
  • AudioFormat: ขยายได้สำหรับผู้ให้บริการ
  • AudioGainMode
  • AudioSource
  • AudioStreamType
  • AudioUsage

ส่งค่า enum สตริง

ค่าสตริงใช้สำหรับการโอนข้อมูลเป็นค่าการแจกแจงทั่วทั้งขอบเขตอินเทอร์เฟซ HAL ทั้งเฟรมเวิร์กและ Wrapper HAL ใช้ค่า Enum แบบจำนวนเต็มเพื่อใช้ตรรกะทางธุรกิจและใช้แนวทางการเปลี่ยนรูปแบบที่แสดงในรูปที่ 3

audio-passing-values

รูปที่ 3 การส่งค่า enum สตริง

ตัวอย่างเช่น หากต้องการส่งค่าประเภทรูปแบบเสียงจากเฟรมเวิร์กไปยังผู้ให้บริการ ให้ทำดังนี้

  1. ระบบจะแปลงค่า Enum ของ AudioFormat เป็นค่าสตริงใน libaudiohal และส่งไปยัง HAL
  2. ในฝั่ง HAL ตัวแฝงเริ่มต้นจะแปลงสตริงเป็นค่า enum ซึ่งส่งไปยัง HAL รุ่นเดิม

การเปลี่ยนแปลงสคีมา XML

การมีรายการค่าแบบ Enum ที่สมบูรณ์ในคำจำกัดความสคีมา 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

แท็กผู้ให้บริการ

นอกจากประเภทและรูปแบบอุปกรณ์แล้ว ผู้ให้บริการยังเพิ่มแท็กที่กำหนดเองสำหรับข้อมูลเมตาของแทร็กเสียงได้ด้วย

สำหรับข้อมูลเมตาของแทร็กการเล่นและการบันทึก ผู้ให้บริการสามารถส่งแท็กของตนเองจากแอปไปยัง HAL ซึ่งจะใช้เพื่อเพิ่มแอตทริบิวต์ในสตรีม I/O เสียง

ระบบจะเพิ่มแท็กผู้ให้บริการสำหรับข้อมูลเมตาของแทร็กการเล่นดังที่แสดงในตัวอย่างต่อไปนี้

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