เสียง 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 API ทั่วไปสำหรับ HIDL

Core HAL

อินเทอร์เฟซที่สําคัญบางส่วนใน Core HAL ที่ใช้ HIDL มีดังนี้

  • IDeviceFactory.hal คือจุดแรกเข้าของ API
  • IDevice.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 ก่อน 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) ที่แชร์โดย API หลักและ 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

ใน 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

การมีรายการค่าแบบแจกแจงทั้งหมดในคําจํากัดความสคีมา 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

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

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

สำหรับการเล่นและการบันทึกข้อมูลเมตาของแทร็ก ผู้ให้บริการสามารถส่งแท็กของตนเอง ซึ่งใช้ในการเพิ่มแอตทริบิวต์ไปยังสตรีม 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