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

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

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

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

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

audio_hal

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

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

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

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

เสียง HAL API

HAL เสียงมี API ต่อไปนี้:

  • แกนกลาง
  • เอฟเฟกต์ HAL
  • HAL . ทั่วไป

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

แกนกลาง

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

เอฟเฟกต์ HAL

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

ตารางต่อไปนี้แสดงรายการตำแหน่งของส่วนประกอบ 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 API สำหรับการใช้งาน ไคลเอนต์ และการทดสอบ

ความต้องการ

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

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

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

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

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

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

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

การแจงนับ

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

ในเสียง 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 ทั้งเฟรมเวิร์กและ wrapper HAL ใช้ค่า integer enum สำหรับการนำตรรกะทางธุรกิจไปใช้และใช้วิธีการแปลงที่แสดงใน รูปที่ 3

audio-passing-values

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

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

  1. ค่า enum ของ AudioFormat จะถูกแปลงเป็นค่าสตริงใน libaudiohal และถูกส่งไปยัง HAL
  2. ทางฝั่ง HAL Wrapper เริ่มต้นจะแปลงสตริงเป็นค่า enum ซึ่งส่งผ่านไปยัง 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 เพื่อลดคำจำกัดความที่ซ้ำกัน tuples ที่ซ้ำกันของรายการข้อมูลจะถูกจัดกลุ่มเข้าด้วยกันเป็นโครงสร้างที่ใช้ซ้ำได้ โครงสร้างข้อมูลเหล่านี้ใช้คุณลักษณะ 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 รุ่น HAL
Android 12 7.0
Android 11 6.0
Android 10 5.0
Android 9 4.0
Android 8 2.0