การกำหนดค่านโยบายเสียง

การเปิดตัว Android 10 ประกอบด้วยการปรับโครงสร้างที่สำคัญของตัวจัดการนโยบายด้านเสียงเพื่อให้มีความยืดหยุ่นมากขึ้นเพื่อรองรับกรณีการใช้งานยานยนต์ที่ซับซ้อน:

  • กลยุทธ์การกำหนดเส้นทางเฉพาะ OEM
  • กลุ่มวอลุ่มที่ปรับแต่งได้สำหรับกลุ่มของประเภทสตรีมดั้งเดิมโดยใช้เส้นโวลุ่มเดียวกัน
  • กลยุทธ์การกำหนดเส้นทางที่ประกาศโดยเอ็นจิ้นนโยบายเสียง แทนที่จะฮาร์ดโค้ด
  • เส้นโค้งปริมาณและกลุ่มที่จัดการโดยเอ็นจิ้นนโยบายเสียง
  • การปรับโครงสร้างภายในเพื่อเตรียมการแยกระหว่างรหัสทั่วไปและรหัสที่กำหนดค่าได้ในอนาคต และนำเสนอการจัดการอุปกรณ์เสียงที่สมบูรณ์ยิ่งขึ้น ตัวอย่างเช่น การใช้คุณสมบัติของอุปกรณ์ทั้งหมด ไม่ใช่แค่ประเภทในกฎนโยบาย

Android 7.0 เปิดตัวรูปแบบไฟล์การกำหนดค่านโยบายเสียง (XML) สำหรับการอธิบายโทโพโลยีเสียงของคุณ

จำเป็นต้องใช้ Android รุ่นก่อนหน้าโดยใช้ device/<company>/<device>/audio/audio_policy.conf เพื่อประกาศอุปกรณ์เสียงที่มีอยู่ในผลิตภัณฑ์ของคุณ (คุณสามารถดูตัวอย่างไฟล์นี้สำหรับฮาร์ดแวร์เสียง Galaxy Nexus ใน device/samsung/tuna/audio/audio_policy.conf ) อย่างไรก็ตาม CONF เป็นรูปแบบที่เรียบง่ายและเป็นกรรมสิทธิ์ซึ่งจำกัดเกินกว่าจะอธิบายโทโพโลยีที่ซับซ้อนสำหรับแนวดิ่ง เช่น โทรทัศน์และรถยนต์

Android 7.0 เลิกใช้ audio_policy.conf และเพิ่มการรองรับสำหรับการกำหนดโทโพโลยีเสียงโดยใช้รูปแบบไฟล์ XML ที่มนุษย์อ่านได้ง่ายขึ้น มีเครื่องมือแก้ไขและแยกวิเคราะห์ที่หลากหลาย และมีความยืดหยุ่นเพียงพอที่จะอธิบายโทโพโลยีเสียงที่ซับซ้อน Android 7.0 ใช้ USE_XML_AUDIO_POLICY_CONF สำหรับการเลือกรูปแบบ XML ของไฟล์ปรับแต่ง

ข้อดีของรูปแบบ XML

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

  • ใน Android 10 อนุญาตให้ใช้แอปบันทึกที่ใช้งานพร้อมกันได้มากกว่าหนึ่งแอป
    • การบันทึกจะไม่ถูกปฏิเสธเนื่องจากสถานการณ์พร้อมกัน
    • registerAudioRecordingCallback(AudioManager.AudioRecordingCallback cb) การเรียกกลับจะแจ้งให้ลูกค้าทราบถึงการเปลี่ยนแปลงเส้นทางการดักจับ
  • ในสถานการณ์ต่อไปนี้ ไคลเอ็นต์จะได้รับตัวอย่างเสียงเงียบ:
    • กรณีการใช้งานที่คำนึงถึงความเป็นส่วนตัว (เช่น VOICE_COMMUNICATION ) เปิดใช้งานอยู่
    • ลูกค้าไม่มีบริการเบื้องหน้าหรือ UI เบื้องหน้า
    • บทบาทพิเศษได้รับการยอมรับจากนโยบาย:
      • บริการการเข้าถึง: บันทึกได้แม้ว่ากรณีการใช้งานที่คำนึงถึงความเป็นส่วนตัวจะเปิดใช้งานอยู่
      • ผู้ช่วย: ถือว่าความเป็นส่วนตัวมีความละเอียดอ่อนหาก UI อยู่ด้านบน
  • โปรไฟล์เสียงมีโครงสร้างคล้ายกับตัวอธิบายเสียงแบบง่ายของ HDMI ทำให้สามารถตั้งค่าอัตราการสุ่มตัวอย่าง/มาสก์ช่องสัญญาณที่แตกต่างกันสำหรับรูปแบบเสียงแต่ละรูปแบบ
  • มีคำจำกัดความที่ชัดเจนสำหรับการเชื่อมต่อที่เป็นไปได้ทั้งหมดระหว่างอุปกรณ์และสตรีม ก่อนหน้านี้ กฎโดยนัยทำให้สามารถเชื่อมต่ออุปกรณ์ทั้งหมดที่เชื่อมต่อกับโมดูล HAL เดียวกัน ป้องกันไม่ให้นโยบายด้านเสียงควบคุมการเชื่อมต่อที่ร้องขอด้วย API แพตช์เสียง ในรูปแบบ XML คำอธิบายทอพอโลยีกำหนดข้อจำกัดการเชื่อมต่อ
  • การสนับสนุน รวมถึง การหลีกเลี่ยงการทำซ้ำข้อกำหนด A2DP, USB มาตรฐานหรือกำหนดเส้นทางการส่งใหม่
  • เส้นโค้งปริมาณสามารถปรับแต่งได้ ก่อนหน้านี้ ตารางโวลุ่มถูกฮาร์ดโค้ด ในรูปแบบ XML ตารางโวลุ่มมีการอธิบายและสามารถปรับแต่งได้

เท็มเพลตที่ frameworks/av/services/audiopolicy/config/audio_policy_configuration.xml แสดงคุณลักษณะเหล่านี้จำนวนมากที่ใช้งานอยู่

รูปแบบไฟล์และตำแหน่ง

ไฟล์การกำหนดค่านโยบายเสียงใหม่คือ audio_policy_configuration.xml และอยู่ใน /system/etc ตัวอย่างต่อไปนี้แสดงการกำหนดค่านโยบายเสียงอย่างง่ายในรูปแบบไฟล์ XML สำหรับ Android 12 และสำหรับเวอร์ชันที่ต่ำกว่า Android 12

โครงสร้างระดับบนสุดประกอบด้วยโมดูลที่สอดคล้องกับแต่ละโมดูลฮาร์ดแวร์เสียง HAL โดยที่แต่ละโมดูลมีรายการพอร์ตผสม พอร์ตอุปกรณ์ และเส้นทาง:

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

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

การรวมไฟล์

สามารถใช้วิธีการ XML Inclusions (XInclude) เพื่อรวมข้อมูลการกำหนดค่านโยบายเสียงที่อยู่ในไฟล์ XML อื่นๆ ไฟล์ที่รวมทั้งหมดต้องเป็นไปตามโครงสร้างที่อธิบายไว้ข้างต้นโดยมีข้อจำกัดดังต่อไปนี้:

  • ไฟล์สามารถมีได้เฉพาะองค์ประกอบระดับบนสุดเท่านั้น
  • ไฟล์ต้องไม่มีองค์ประกอบ XInclude

ใช้รวมถึงเพื่อหลีกเลี่ยงการคัดลอกข้อมูลการกำหนดค่าโมดูลเสียง HAL ของ Android Open Source Project (AOSP) มาตรฐานไปยังไฟล์การกำหนดค่านโยบายเสียงทั้งหมด (ซึ่งมีแนวโน้มที่จะเกิดข้อผิดพลาด) ไฟล์ XML การกำหนดค่านโยบายเสียงมาตรฐานมีให้สำหรับ HAL เสียงต่อไปนี้:

  • A2DP: a2dp_audio_policy_configuration.xml
  • เปลี่ยนเส้นทางซับมิกซ์: rsubmix_audio_policy_configuration.xml
  • USB: usb_audio_policy_configuration.xml

องค์กรรหัสนโยบายเสียง

AudioPolicyManager.cpp แบ่งออกเป็นหลายโมดูลเพื่อให้ง่ายต่อการบำรุงรักษาและกำหนดค่า องค์กรของ frameworks/av/services/audiopolicy รวมถึงโมดูลต่อไปนี้

โมดูล คำอธิบาย
/managerdefault รวมอินเทอร์เฟซทั่วไปและการใช้งานลักษณะการทำงานทั่วไปสำหรับแอปทั้งหมด คล้ายกับ AudioPolicyManager.cpp ที่มีฟังก์ชันการทำงานของเอ็นจิ้นและแนวคิดทั่วไปที่แยกออกจากกัน
/common กำหนดคลาสพื้นฐาน (เช่น โครงสร้างข้อมูลสำหรับโปรไฟล์สตรีมเสียงเอาต์พุตอินพุต ตัวอธิบายอุปกรณ์เสียง แพตช์เสียง และพอร์ตเสียง) สิ่งนี้ถูกกำหนดไว้ก่อนหน้านี้ใน AudioPolicyManager.cpp
/engine

ใช้กฎที่กำหนดว่าควรใช้อุปกรณ์และโวลุ่มใดสำหรับกรณีการใช้งานที่กำหนด มันใช้อินเทอร์เฟซมาตรฐานกับส่วนทั่วไป เช่น เพื่อรับอุปกรณ์ที่เหมาะสมสำหรับการเล่นหรือกรณีการใช้งานการจับภาพที่กำหนด หรือการตั้งค่าอุปกรณ์ที่เชื่อมต่อหรือสถานะภายนอก (นั่นคือ สถานะการโทรของการบังคับใช้งาน) ที่สามารถเปลี่ยนแปลงเส้นทางได้ การตัดสินใจ.

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

/engineconfigurable การนำกลไกนโยบายไปใช้ที่อาศัย Parameter Framework (ดูด้านล่าง) การกำหนดค่าขึ้นอยู่กับ Parameter Framework และตำแหน่งที่กำหนดนโยบายโดยไฟล์ XML
/enginedefault การนำกลไกนโยบายไปใช้โดยอิงจากการใช้งาน Android Audio Policy Manager ก่อนหน้านี้ นี่เป็นค่าเริ่มต้นและรวมถึงกฎฮาร์ดโค้ดที่สอดคล้องกับการใช้งาน Nexus และ AOSP
/service รวมอินเทอร์เฟซของตัวประสาน เธรด และการล็อกการใช้งานด้วยอินเทอร์เฟซไปยังส่วนที่เหลือของเฟรมเวิร์ก

การกำหนดค่าโดยใช้ Parameter Framework

รหัสนโยบายเสียงได้รับการจัดระเบียบเพื่อให้ง่ายต่อการเข้าใจและบำรุงรักษา ในขณะเดียวกันก็สนับสนุนนโยบายเสียงที่กำหนดโดยไฟล์การกำหนดค่าทั้งหมด การออกแบบนโยบายองค์กรและเสียงเป็นไปตาม Parameter Framework ของ Intel ซึ่งเป็นกรอบงานแบบปลั๊กอินและแบบใช้กฎสำหรับการจัดการพารามิเตอร์

การใช้นโยบายเสียงที่กำหนดค่าได้ช่วยให้ผู้ผลิต OEM สามารถ:

  • อธิบายโครงสร้างและพารามิเตอร์ของระบบในรูปแบบ XML
  • เขียน (ใน C++) หรือใช้แบ็กเอนด์ (ปลั๊กอิน) ซ้ำเพื่อเข้าถึงพารามิเตอร์ที่อธิบายไว้
  • กำหนดเงื่อนไข/กฎเกณฑ์ (ในรูปแบบ XML หรือภาษาเฉพาะโดเมน) ซึ่งพารามิเตอร์ที่กำหนดจะต้องใช้ค่าที่กำหนด

AOSP มีตัวอย่างไฟล์คอนฟิกูเรชันนโยบายเสียงที่ใช้ Parameter Framework ที่ Frameworks/av/services/audiopolicy/engineconfigurable/parameter-framework/example/Settings/PolicyConfigurableDomains.xml สำหรับรายละเอียด โปรดดูเอกสารประกอบของ Intel เกี่ยวกับ Parameter Framework

ใน Android 10 หรือต่ำกว่า นโยบายเสียงที่กำหนดค่าได้จะถูกเลือกโดยใช้ตัวเลือก USE_CONFIGURABLE_AUDIO_POLICY ใน Android 11 หรือสูงกว่า เวอร์ชันของกลไกจัดการนโยบายเสียงจะถูกเลือกในไฟล์ audio_policy_configuration.xml ในการเลือกเอ็นจินนโยบายเสียงที่กำหนดค่าได้ ให้ตั้งค่าแอตทริบิวต์ engine_library ขององค์ประกอบ globalConfiguration ให้สามารถ configurable ได้ดังในตัวอย่างต่อไปนี้:

<audioPolicyConfiguration>
    <globalConfiguration engine_library="configurable" />
...
</audioPolicyConfiguration>

API การกำหนดเส้นทางนโยบายเสียง

Android 6.0 เปิดตัว API การแจงนับและการเลือกสาธารณะซึ่งอยู่ด้านบนของโครงสร้างพื้นฐานของแพตช์เสียง/พอร์ตเสียง และช่วยให้นักพัฒนาแอประบุการตั้งค่าสำหรับเอาต์พุตหรืออินพุตของอุปกรณ์เฉพาะสำหรับบันทึกหรือแทร็กเสียงที่เชื่อมต่อ

ใน Android 7.0 API การแจงนับและการเลือกจะตรวจสอบโดยการทดสอบ CTS และขยายให้รวมการกำหนดเส้นทางสำหรับสตรีมเสียง C/C++ (OpenSL ES) ดั้งเดิม การกำหนดเส้นทางของสตรีมดั้งเดิมยังคงทำใน Java ด้วยการเพิ่มอินเทอร์เฟซ AudioRouting ที่แทนที่ รวม และเลิกใช้วิธีการกำหนดเส้นทางที่ชัดเจนซึ่งเฉพาะสำหรับคลาส AudioTrack และ AudioRecord

สำหรับรายละเอียดเกี่ยวกับการแจงนับและ API การเลือก โปรดดูที่ ส่วนต่อประสานการกำหนดค่า Android และ OpenSLES_AndroidConfiguration.h สำหรับรายละเอียดเกี่ยวกับการกำหนดเส้นทางเสียง โปรดดูที่ AudioRouting

รองรับหลายช่องทาง

หากฮาร์ดแวร์และไดรเวอร์ของคุณรองรับเสียงแบบหลายช่องสัญญาณผ่าน HDMI คุณสามารถส่งออกสตรีมเสียงไปยังฮาร์ดแวร์เสียงได้โดยตรง (ซึ่งจะข้ามมิกเซอร์ AudioFlinger เพื่อไม่ให้ดาวน์มิกซ์เป็นสองช่องสัญญาณ) เสียง HAL จะต้องเปิดเผยว่าโปรไฟล์สตรีมเอาต์พุต รองรับความสามารถด้านเสียงหลายช่องสัญญาณ หาก HAL เปิดเผยความสามารถ ตัวจัดการนโยบายเริ่มต้นจะอนุญาตให้เล่นหลายช่องสัญญาณผ่าน HDMI สำหรับรายละเอียดการใช้งาน โปรดดู device/samsung/tuna/audio/audio_hw.c

หากต้องการระบุว่าผลิตภัณฑ์ของคุณมีเอาต์พุตเสียงแบบหลายช่องสัญญาณ ให้แก้ไขไฟล์การกำหนดค่านโยบายเสียงเพื่ออธิบายเอาต์พุตแบบหลายช่องสัญญาณสำหรับผลิตภัณฑ์ของคุณ ตัวอย่างต่อไปนี้จาก frameworks/av/services/audiopolicy/config/primary_audio_policy_configuration_tv.xml จะแสดง Dynamic Channel Mask ซึ่งหมายความว่าตัวจัดการนโยบายด้านเสียงจะสอบถาม Channel Mask ที่รองรับโดยซิงก์ HDMI หลังจากการเชื่อมต่อ

คุณยังสามารถระบุรูปแบบช่องสัญญาณคงที่ เช่น AUDIO_CHANNEL_OUT_5POINT1 มิกเซอร์ของ AudioFlinger จะดาวน์มิกซ์เนื้อหาเป็นสเตอริโอโดยอัตโนมัติเมื่อส่งไปยังอุปกรณ์เสียงที่ไม่รองรับเสียงแบบหลายช่องสัญญาณ

ตัวแปลงสัญญาณสื่อ

ตรวจสอบให้แน่ใจว่าได้ประกาศตัวแปลงสัญญาณเสียงที่สนับสนุนฮาร์ดแวร์และไดรเวอร์ของคุณอย่างถูกต้องสำหรับผลิตภัณฑ์ของคุณ สำหรับรายละเอียด โปรดดู การเปิดเผยตัวแปลงสัญญาณไปยังกรอบงาน