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

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

เทมเพลตที่ frameworks/av/services/audiopolicy/config/audio_policy_configuration.xml แสดงฟีเจอร์เหล่านี้หลายอย่างที่ใช้งานอยู่

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

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

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

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

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

การรวมไฟล์

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

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

ใช้ includes เพื่อหลีกเลี่ยงการคัดลอกข้อมูลการกำหนดค่าโมดูล 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

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

มี 2 เวอร์ชัน ได้แก่ กำหนดค่าได้และค่าเริ่มต้น ดูข้อมูลเกี่ยวกับวิธีเลือกเวอร์ชันได้ที่ การกำหนดค่าโดยใช้เฟรมเวิร์กพารามิเตอร์

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

การกำหนดค่าโดยใช้เฟรมเวิร์กพารามิเตอร์

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

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

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

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

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

ดูรายละเอียดเกี่ยวกับ Enumeration and Selection API ได้ที่ Android configuration interfaces และ OpenSLES_AndroidConfiguration.h ดูรายละเอียดเกี่ยวกับการกำหนดเส้นทางเสียงได้ที่ AudioRouting

การสนับสนุนหลายช่องทาง

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

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

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

ตัวแปลงรหัสสื่อ

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