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

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

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

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

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

audio_hal

รูปที่ 1: อินเตอร์เฟซเสียงฮาล

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

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

ในฐานะที่เป็นส่วนหนึ่งของการดำเนินการตามระบบ HAL เสียงคุณต้องสร้าง แฟ้มการกำหนดค่านโยบายเสียง ที่อธิบายโครงสร้างเสียง ความสามารถเสียง 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 ส่งหรือรับเสียงไปและกลับจากฮัลผ่าน 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

เริ่มต้นใช้งานหลัก HAL API ( /hardware/interfaces/audio/core/all-versions/default/ ) เป็นห่อหุ้มรอบก่อนเสียงแหลมดำเนินงาน 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

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

HAL . ทั่วไป

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

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

ความต้องการ

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

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

อัปเดตเป็น 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 สร้างการทำสำเนา เพื่อหลีกเลี่ยงนี้ใน V7 ที่ enum ประเภทจะถูกเปลี่ยนเป็น string และทุกค่าการแจงนับไปได้มีการระบุไว้ในสคี XSD แทน

ดู รูปที่ 1 สำหรับการเปรียบเทียบการเปลี่ยนแปลงบางส่วนเพื่อเป็น AudioFormat enum พิมพ์ V7:

audioformat-change

รูปที่ 1: เปรียบเทียบบางส่วนของการเปลี่ยนแปลงไปยัง AudioFormat enum

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

  • AudioChannelMask
  • AudioContentType
  • AudioDevice : ผู้ผลิตขยาย
  • AudioFormat : ผู้ผลิตขยาย
  • AudioGainMode
  • AudioSource
  • AudioStreamType
  • AudioUsage

ผ่าน String ค่า enum

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

audio-passing-values

รูปที่ 2: ผ่าน string enum ค่า

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

  1. enum ค่าของ AudioFormat ถูกแปลงเป็น string ค่าใน libaudiohal และถูกส่งไปยัง HAL
  2. ในด้าน HAL ที่ default wrapper แปลง string ไปยัง 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 เพื่อลดคำจำกัดความที่ซ้ำกัน 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

แท็กผู้ขาย

นอกจากประเภทและรูปแบบของอุปกรณ์แล้ว ผู้ขายยังสามารถเพิ่มแท็กที่กำหนดเองสำหรับข้อมูลเมตาของแทร็กเสียงได้อีกด้วย

สำหรับข้อมูลเมตาของแทร็กที่เล่นและบันทึก ผู้จำหน่ายสามารถส่งแท็กของตนเอง ซึ่งใช้เพื่อเพิ่มแอตทริบิวต์ให้กับสตรีม Audio I/O จากแอปไปยัง HAL

แท็กผู้ขายสำหรับข้อมูลเมตาของแทร็กที่เล่นจะถูกเพิ่มตามที่เห็นในตัวอย่างต่อไปนี้:

struct PlaybackTrackMetadata {
…
    /** Tags from AudioTrack audio attributes */
    vec<AudioTag> tags;
};

RecordTrackMetadata โครงสร้างจะดำเนินการในรูปแบบเหมือนกันโดยการเพิ่มแท็กที่เฉพาะเจาะจงสำหรับเมตาดาต้าติดตามการบันทึก

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

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

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

VX_ {ผู้ขาย} _ {ตัวอักษร / / _}

ต่อไปนี้คือตัวอย่างบางส่วนของส่วนขยายผู้ขาย 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