HIDL เสียง HAL

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

audio_hal

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

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

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

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

เสียง HIDL HAL API

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

คอร์ ฮาล

อินเทอร์เฟซหลักบางส่วนของ 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 schema /hardware/interfaces/audio/6.0/config/audio_policy_configuration.xsd

การใช้งานเริ่มต้นของ Core HAL API ( /hardware/interfaces/audio/core/all-versions/default/ ) เป็นส่วนสรุปของการใช้งาน pre-Treble HAL โดยใช้ ไลบรารี่ที่ใช้ร่วมกันแบบเดิม การใช้งานเริ่มต้นยังถือเป็นข้อมูลอ้างอิงเมื่อใช้ Audio HAL เวอร์ชันใหม่ที่โต้ตอบกับไดรเวอร์เคอร์เนลโดยตรง

เอฟเฟ็กต์ HAL

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

ส่วนประกอบผลกระทบ HAL ที่ตั้ง
API เวอร์ชันล่าสุด /hardware/interfaces/audio/effect/6.0/
ไฟล์การกำหนดค่าเอฟเฟกต์ XSD schema /hardware/interfaces/audio/effect/6.0/xml/audio_effects_conf.xsd

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

ทั่วไป HAL

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

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

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

โดยเฉพาะการเปลี่ยนแปลงจะเกิดขึ้นในพื้นที่ต่อไปนี้ใน Audio HAL V7:

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

การแจงนับ

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

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

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

audioformat-change

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

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

  • AudioChannelMask
  • AudioContentType
  • AudioDevice : ผู้ขายสามารถขยายได้
  • AudioFormat : ผู้ขายสามารถขยายได้
  • AudioGainMode
  • AudioSource
  • AudioStreamType
  • AudioUsage

ส่งผ่านค่าแจงนับสตริง

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

audio-passing-values

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

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

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

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

การมีรายการค่า enum ที่สมบูรณ์ในข้อกำหนด XML schema (XSD) ช่วยให้ตรวจสอบไฟล์ XML การกำหนดค่านโยบายเสียงได้ดีขึ้นโดย VTS เราทำการเปลี่ยนแปลงในไฟล์การกำหนดค่านโยบายเสียงที่ใช้กับ 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 ได้รับการปรับใช้ในลักษณะเดียวกันโดยการเพิ่มแท็กเฉพาะสำหรับข้อมูลเมตาของแทร็กการบันทึก

เนมสเปซส่วนขยายของผู้ขาย

เริ่มตั้งแต่ HAL V7 ส่วนขยายผู้ขายจำเป็นต้องมีคำนำหน้า {vendor} เพิ่มเติมซึ่งไม่จำเป็นใน V6 เพื่อให้คำนำหน้า {vendor} ถูกต้อง ต้องเป็นอักขระตัวอักษรและตัวเลขสามตัวขึ้นไป

ใช้รูปแบบต่อไปนี้ใน V7:

VX_{ vendor }_{ letters/numbers }

ต่อไปนี้คือตัวอย่างบางส่วนของส่วนขยายผู้จำหน่าย V7 ที่ถูกต้อง:

  • VX_ GOOGLE _VR
  • VX_ QCI _AMBIENT_MIC

ข้อมูลเวอร์ชัน

ตารางต่อไปนี้แสดงหมายเลขเวอร์ชัน HAL สำหรับ Android แต่ละรุ่น:

เวอร์ชัน Android เวอร์ชัน HIDL HAL
แอนดรอยด์ 13 7.1
แอนดรอยด์ 12 7.0
แอนดรอยด์ 11 6.0
แอนดรอยด์ 10 5.0
แอนดรอยด์ 9 4.0
แอนดรอยด์ 8 2.0