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

รุ่น 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 Flag สำหรับการเลือก XML ของไฟล์การกำหนดค่า

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

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

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

การรวมไฟล์

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

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

การใช้รวมถึงเพื่อหลีกเลี่ยงการคัดลอกโครงการโอเพนซอร์ส Android (AOSP) มาตรฐาน ข้อมูลการกำหนดค่าโมดูล HAL เสียงสำหรับการกำหนดค่านโยบายเสียงทั้งหมด (ซึ่งมีแนวโน้มว่าจะเกิดข้อผิดพลาด) ไฟล์ 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 เวอร์ชัน ได้แก่ configurable และ default สำหรับข้อมูลเกี่ยวกับวิธีเลือกเวอร์ชัน โปรดดูที่ การกำหนดค่าโดยใช้เฟรมเวิร์กพารามิเตอร์

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

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

โค้ดนโยบายเสียงได้รับการจัดระเบียบเพื่อให้เข้าใจง่ายและ รักษาไว้ไปพร้อมกับรองรับนโยบายเสียงที่กำหนดโดยการกำหนดค่าทั้งหมด การออกแบบนโยบายองค์กรและนโยบายเสียงอิงตามพารามิเตอร์ของ 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 เปิดตัว Enumeration and Selection API แบบสาธารณะใน ด้านบนของโครงสร้างพื้นฐานของแพตช์/พอร์ตเสียง และช่วยให้แอป นักพัฒนาซอฟต์แวร์เพื่อระบุค่ากำหนดสำหรับเอาต์พุตหรืออินพุตของอุปกรณ์ที่เฉพาะเจาะจงสำหรับ กับบันทึกหรือแทร็กเสียงที่เชื่อมต่อกัน

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

สำหรับรายละเอียดเกี่ยวกับ Enumeration and Selection API โปรดดู Android อินเทอร์เฟซการกำหนดค่าและ OpenSLES_AndroidConfiguration.h ได้ สำหรับรายละเอียดเกี่ยวกับการกำหนดเส้นทางเสียง โปรดดูที่ การกำหนดเส้นทางเสียง

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

หากฮาร์ดแวร์และไดรเวอร์ของคุณรองรับเสียงแบบหลายช่องผ่าน 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 รองรับหลังจากการเชื่อมต่อ

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

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

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