เสียง HAL แบบ HIDL

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

ฮาล์เสียง

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

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

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

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

API เสียง HIDL HAL

ส่วนนี้จะอธิบาย API หลัก, เอฟเฟกต์ และ HAL API ทั่วไปสำหรับ HIDL

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

HAL ของเอฟเฟกต์

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

คอมโพเนนต์ HAL ของเอฟเฟกต์ ตำแหน่ง
API เวอร์ชันล่าสุด /hardware/interfaces/audio/effect/6.0/
สคีมา XSD ของไฟล์การกำหนดค่าเอฟเฟกต์ /hardware/interfaces/audio/effect/6.0/xml/audio_effects_conf.xsd

สำหรับข้อมูลเพิ่มเติม โปรดดูตัวอย่างการใช้งาน เอฟเฟกต์ HAL API ที่ /hardware/interfaces/audio/effect/all-versions/default/ และส่วนเอฟเฟกต์เสียง

HAL ทั่วไป

HAL API ทั่วไปที่ใช้ HIDL ประกอบด้วยสิ่งต่อไปนี้

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

การอัปเดตเกี่ยวกับ HAL เสียง V7

HAL เสียงเวอร์ชัน 7 มีการเปลี่ยนแปลงที่สำคัญใน Android 12 ตามที่อธิบายไว้ในส่วนนี้ Audio HAL V7 จะทำงานดังต่อไปนี้

  • รวมโมเดลข้อมูลที่เฟรมเวิร์กและ HAL ใช้
  • ลดการทำซ้ำระหว่างประเภทข้อมูล HIDL (enum) และสคีมา XML ซึ่งใช้สำหรับการกำหนดค่านโยบายเสียง

โดยเฉพาะอย่างยิ่ง มีการเปลี่ยนแปลงในส่วนต่อไปนี้ใน Audio HAL V7

เราจะกล่าวถึงการเปลี่ยนแปลงเหล่านี้อย่างละเอียดยิ่งขึ้นในส่วนที่เกี่ยวข้อง

การแจงนับ

เริ่มต้นใน HAL V7 เสียง แจกแจงประเภทที่ใช้ในการกำหนดค่านโยบายเสียง มีการกำหนดไว้ในสคีมา XSD เท่านั้น ไม่ใช่ใน HIDL

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

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

การเปลี่ยนแปลงรูปแบบเสียง

รูปที่ 2 การเปรียบเทียบการเปลี่ยนแปลงบางรายการกับค่าแจกแจง AudioFormat

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

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

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

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

การส่งค่าเสียง

รูปที่ 3 กำลังส่งผ่านค่า enum ของสตริง

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

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

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

การมีรายการค่า enum ทั้งหมดไว้ในคำจำกัดความของสคีมา XML (XSD) เพื่อการตรวจสอบไฟล์ XML ของการกำหนดค่านโยบายเสียงที่ดียิ่งขึ้นโดย VTS เราทำ การเปลี่ยนแปลงในไฟล์การกำหนดค่านโยบายเสียงที่ใช้กับ HAL V7 เพื่อให้เป็นไปตาม XSD

ใน V7 จะใช้อักขระ (เว้นวรรค) มาตรฐานเพื่อคั่นรายการค่าใน (เช่น อัตราการสุ่มตัวอย่าง มาสก์ช่องทาง และการแจ้ง) แทนที่จะเป็น , สัญลักษณ์ (คอมมา) และ | (แท่งแนวตั้ง) ที่ใช้ใน 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

ประเภทข้อมูล

เราได้กำหนดโครงสร้างข้อมูลใหม่ในเวอร์ชัน 7 เพื่อลดการซ้ำซ้อน คำจำกัดความ รายการข้อมูลที่ซ้ำกันจะจัดกลุ่มเข้าด้วยกันเป็นรายการที่นำมาใช้ใหม่ได้ เหล่านี้ โครงสร้างข้อมูลเหล่านี้ใช้ฟีเจอร์ HIDL ล่าสุด เช่น การรวมอย่างปลอดภัย

ตัวอย่างเช่น ใน V6 และต่ำกว่า ค่า 3 ส่วนเท่ากับ <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 มีการใช้งานที่คล้ายกันโดย การเพิ่มแท็กเฉพาะสำหรับข้อมูลเมตาของแทร็กบันทึก

การกำหนดเนมสเปซของส่วนขยายผู้ให้บริการ

ตั้งแต่ 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