เครื่องเสียง HAL

Audio Hardware Abstraction Layer (HAL) ของ Android เชื่อมต่อ API เฟรมเวิร์กเฉพาะเสียงในระดับที่สูงกว่าใน android.media กับไดรเวอร์เสียงและฮาร์ดแวร์พื้นฐาน Audio HAL กำหนดอินเทอร์เฟซมาตรฐานที่บริการเสียงเรียกเข้ามา ต้องนำไปใช้เพื่อให้ฮาร์ดแวร์เสียงทำงานได้อย่างถูกต้อง

หน้านี้จะแสดงภาพรวมของ HAL เสียงและให้รายละเอียดของ API และข้อกำหนดในการนำไปใช้งาน

อินเทอร์เฟซเสียง HAL

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

audio_hal

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

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

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

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

เสียง HAL API

HAL เสียงประกอบด้วย API ต่อไปนี้:

  • แกน HAL
  • ผลกระทบ HAL
  • HAL ทั่วไป

API เหล่านี้แต่ละรายการได้อธิบายไว้ในหัวข้อต่อไปนี้

แกน HAL

Core HAL เป็น API หลักที่ AudioFlinger ใช้เพื่อเล่นเสียงและควบคุมการกำหนดเส้นทางเสียง อินเทอร์เฟซหลักบางส่วนมีดังนี้:

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

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

ส่วนประกอบหลักของ 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

Effects HAL API ถูกใช้โดยเฟรมเวิร์กเอฟเฟกต์เพื่อควบคุมเอฟเฟกต์เสียง คุณยังสามารถกำหนดค่าเอฟเฟ็กต์การ ประมวลผลล่วงหน้า เช่น การควบคุมอัตราขยายอัตโนมัติและการลดสัญญาณรบกวนผ่าน Effects HAL API

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

ผลกระทบส่วนประกอบ 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 ทั่วไป

Common HAL เป็นไลบรารีของประเภทข้อมูลทั่วไปที่ใช้โดย Core และ Effects HAL API ไม่มีอินเทอร์เฟซและไม่มีการทดสอบ VTS ที่เกี่ยวข้องเนื่องจากกำหนดโครงสร้างข้อมูลเท่านั้น Common HAL API ประกอบด้วยสิ่งต่อไปนี้:

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

ความต้องการ

นอกเหนือจากการนำ HAL เสียงไปใช้และสร้างไฟล์คอนฟิกูเรชันนโยบายเสียงแล้ว จะต้องปฏิบัติตามข้อกำหนด HAL ต่อไปนี้:

  • หากการบันทึกสำหรับ Sound Trigger (การบันทึกจากฮอตเวิร์ด DSP บัฟเฟอร์) ได้รับการสนับสนุนโดยโปรไฟล์อินพุตหนึ่งโปรไฟล์ การนำไปใช้งานจะต้องรองรับจำนวนสตรีมที่ใช้งานบนโปรไฟล์นี้ซึ่งสอดคล้องกับจำนวนเซสชันที่เกิดขึ้นพร้อมกันที่ Sound Trigger HAL รองรับ
  • การทำงานพร้อมกันของการโทรด้วยเสียง TX และการจับภาพจากตัวประมวลผลแอปพลิเคชันตามรายละเอียดในหน้า การจับภาพพร้อมกัน

อัปเดตเป็น Audio HAL V7

เพื่อแก้ไขปัญหาความเข้ากันได้แบบย้อนหลัง AIDL ที่เสถียรเป็นสิ่งจำเป็นสำหรับการเปลี่ยนแปลง HAL ทั้งหมดที่เริ่มต้นจาก Android 13 เพื่อสนับสนุนและปรับปรุงการนำ AIDL มาใช้ใน Android 13 และสูงกว่า Audio HAL V7 จะทำสิ่งต่อไปนี้:

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

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

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

การแจงนับ

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

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

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

audioformat-change

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

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

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

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

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

audio-passing-values

รูปที่ 3 การส่งค่า enum ของสตริง

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

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

การเปลี่ยนแปลง XML schema

การมีรายการค่า 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 แต่ละรุ่น

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