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

เวอร์ชัน 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 build สำหรับเลือกรูปแบบ XML ของไฟล์กำหนดค่า

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

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

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

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

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

การรวมไฟล์

คุณสามารถใช้วิธีการรวม XML (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

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

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

/engineconfigurable การใช้งานเครื่องมือนโยบายที่อาศัยเฟรมเวิร์กพารามิเตอร์ (ดูด้านล่าง) การกําหนดค่าจะอิงตามเฟรมเวิร์กพารามิเตอร์และตําแหน่งที่ไฟล์ XML กําหนดนโยบาย
/enginedefault การติดตั้งใช้งานเครื่องมือนโยบายตามการติดตั้งใช้งานเครื่องมือจัดการนโยบายเสียงของ Android ก่อนหน้านี้ ตัวเลือกนี้เป็นค่าเริ่มต้นและมีกฎแบบฮาร์ดโค้ดที่สอดคล้องกับการใช้งาน 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 โปรดดูรายละเอียดเกี่ยวกับการกำหนดเส้นทางเสียงที่หัวข้อ 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 รองรับหลังจากเชื่อมต่อ

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

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

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