HIDL Audio HAL

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

audio_hal

รูปที่ 1 อินเทอร์เฟซ Audio HAL

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

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

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

Audio HIDL HAL API

ส่วนนี้อธิบาย API ของ Core, Effects และ Common HAL สำหรับ HIDL

Core HAL

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

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

ตารางต่อไปนี้แสดงตำแหน่งของคอมโพเนนต์ HIDL ของ Core HAL ที่มีประโยชน์

คอมโพเนนต์ Core 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 โดยใช้ ไลบรารีที่แชร์แบบเดิม นอกจากนี้ การใช้งานเริ่มต้นยังถือเป็นข้อมูลอ้างอิงเมื่อใช้ Audio HAL เวอร์ชันใหม่ที่โต้ตอบกับไดรเวอร์เคอร์เนลโดยตรง

Effects HAL

ตารางต่อไปนี้แสดงตำแหน่งของคอมโพเนนต์ Effects HAL ที่มีประโยชน์โดยใช้ HIDL

คอมโพเนนต์ Effects 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/ และส่วนเอฟเฟกต์เสียง

Common HAL

Common HAL API ที่ใช้ HIDL มีองค์ประกอบต่อไปนี้

  • คำจำกัดความ (/hardware/interfaces/audio/common/6.0/types.hal) ที่ API ของ Core และ Effect ใช้ร่วมกัน
  • ยูทิลิตี (/hardware/interfaces/audio/common/all-versions) ที่ใช้เพื่อช่วยในการเขียนโค้ดกับ HIDL API สำหรับการใช้งาน ไคลเอ็นต์ และการทดสอบ

การอัปเดต Audio HAL V7

Audio 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 เปรียบเทียบการเปลี่ยนแปลงบางอย่างของประเภท Enum AudioFormat ใน V7

audioformat-change

รูปที่ 2 การเปรียบเทียบการเปลี่ยนแปลงบางอย่างของ Enum 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 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 เพื่อลดคำจำกัดความที่ซ้ำกัน ระบบจะจัดกลุ่ม Tuple ของรายการข้อมูลที่ซ้ำกันไว้ในโครงสร้างที่นำกลับมาใช้ใหม่ได้ โครงสร้างข้อมูลเหล่านี้ใช้ฟีเจอร์ HIDL ล่าสุด เช่น Safe Union

ตัวอย่างเช่น ใน V6 และเวอร์ชันก่อนหน้า ระบบมักใช้ Tuple <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

    แทนที่ Union ใน 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