เสียง 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

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