HIDL Audio HAL

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

audio_hal

รูปที่ 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 คือจุดแรกเข้าของ API
  • IDevice.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

audioformat-change

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

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

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

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

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

audio-passing-values

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

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

  1. ระบบจะแปลงค่า Enum ของ AudioFormat เป็นค่าสตริงใน libaudiohal และส่งไปยัง HAL
  2. ในฝั่ง 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