รุ่น 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 ของไฟล์กำหนดค่า
หมายเหตุ: การสนับสนุนสำหรับแฟล็กบิลด์ USE_XML_AUDIO_POLICY_CONF
และความสามารถในการใช้รูปแบบ CONF ที่เลิกใช้แล้วจึงถูกลบออกใน Android 10 ข้อดีของรูปแบบ 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
แสดงตัวอย่างนโยบายเสียงสำหรับ Android 12
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<audioPolicyConfiguration version="7.0" xmlns:xi="http://www.w3.org/2001/XInclude">
<globalConfiguration speaker_drc_enabled="true"/>
<modules>
<module name="primary" halVersion="3.0">
<attachedDevices>
<item>Speaker</item>
<item>Earpiece</item>
<item>Built-In Mic</item>
</attachedDevices>
<defaultOutputDevice>Speaker</defaultOutputDevice>
<mixPorts>
<mixPort name="primary output" role="source" flags="AUDIO_OUTPUT_FLAG_PRIMARY">
<profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
samplingRates="48000" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/>
</mixPort>
<mixPort name="primary input" role="sink">
<profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
samplingRates="8000 16000 48000"
channelMasks="AUDIO_CHANNEL_IN_MONO"/>
</mixPort>
</mixPorts>
<devicePorts>
<devicePort tagName="Earpiece" type="AUDIO_DEVICE_OUT_EARPIECE" role="sink">
<profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
samplingRates="48000" channelMasks="AUDIO_CHANNEL_IN_MONO"/>
</devicePort>
<devicePort tagName="Speaker" role="sink" type="AUDIO_DEVICE_OUT_SPEAKER" address="">
<profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
samplingRates="48000" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/>
</devicePort>
<devicePort tagName="Wired Headset" type="AUDIO_DEVICE_OUT_WIRED_HEADSET" role="sink">
<profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
samplingRates="48000" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/>
</devicePort>
<devicePort tagName="Built-In Mic" type="AUDIO_DEVICE_IN_BUILTIN_MIC" role="source">
<profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
samplingRates="8000 16000 48000"
channelMasks="AUDIO_CHANNEL_IN_MONO"/>
</devicePort>
<devicePort tagName="Wired Headset Mic" type="AUDIO_DEVICE_IN_WIRED_HEADSET" role="source">
<profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
samplingRates="8000 16000 48000"
channelMasks="AUDIO_CHANNEL_IN_MONO"/>
</devicePort>
</devicePorts>
<routes>
<route type="mix" sink="Earpiece" sources="primary output"/>
<route type="mix" sink="Speaker" sources="primary output"/>
<route type="mix" sink="Wired Headset" sources="primary output"/>
<route type="mix" sink="primary input" sources="Built-In Mic,Wired Headset Mic"/>
</routes>
</module>
<xi:include href="a2dp_audio_policy_configuration.xml"/>
</modules>
<xi:include href="audio_policy_volumes.xml"/>
<xi:include href="default_volume_tables.xml"/>
</audioPolicyConfiguration>
แสดงตัวอย่างนโยบายเสียงสำหรับเวอร์ชันที่ต่ำกว่า Android 12
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<audioPolicyConfiguration version="1.0" xmlns:xi="http://www.w3.org/2001/XInclude">
<globalConfiguration speaker_drc_enabled="true"/>
<modules>
<module name="primary" halVersion="3.0">
<attachedDevices>
<item>Speaker</item>
<item>Earpiece</item>
<item>Built-In Mic</item>
</attachedDevices>
<defaultOutputDevice>Speaker</defaultOutputDevice>
<mixPorts>
<mixPort name="primary output" role="source" flags="AUDIO_OUTPUT_FLAG_PRIMARY">
<profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
samplingRates="48000" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/>
</mixPort>
<mixPort name="primary input" role="sink">
<profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
samplingRates="8000,16000,48000"
channelMasks="AUDIO_CHANNEL_IN_MONO"/>
</mixPort>
</mixPorts>
<devicePorts>
<devicePort tagName="Earpiece" type="AUDIO_DEVICE_OUT_EARPIECE" role="sink">
<profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
samplingRates="48000" channelMasks="AUDIO_CHANNEL_IN_MONO"/>
</devicePort>
<devicePort tagName="Speaker" role="sink" type="AUDIO_DEVICE_OUT_SPEAKER" address="">
<profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
samplingRates="48000" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/>
</devicePort>
<devicePort tagName="Wired Headset" type="AUDIO_DEVICE_OUT_WIRED_HEADSET" role="sink">
<profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
samplingRates="48000" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/>
</devicePort>
<devicePort tagName="Built-In Mic" type="AUDIO_DEVICE_IN_BUILTIN_MIC" role="source">
<profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
samplingRates="8000,16000,48000"
channelMasks="AUDIO_CHANNEL_IN_MONO"/>
</devicePort>
<devicePort tagName="Wired Headset Mic" type="AUDIO_DEVICE_IN_WIRED_HEADSET" role="source">
<profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
samplingRates="8000,16000,48000"
channelMasks="AUDIO_CHANNEL_IN_MONO"/>
</devicePort>
</devicePorts>
<routes>
<route type="mix" sink="Earpiece" sources="primary output"/>
<route type="mix" sink="Speaker" sources="primary output"/>
<route type="mix" sink="Wired Headset" sources="primary output"/>
<route type="mix" sink="primary input" sources="Built-In Mic,Wired Headset Mic"/>
</routes>
</module>
<xi:include href="a2dp_audio_policy_configuration.xml"/>
</modules>
<xi:include href="audio_policy_volumes.xml"/>
<xi:include href="default_volume_tables.xml"/>
</audioPolicyConfiguration>
โครงสร้างระดับบนสุดประกอบด้วยโมดูลที่สอดคล้องกับโมดูลฮาร์ดแวร์เสียง HAL แต่ละโมดูล โดยแต่ละโมดูลมีรายการพอร์ตมิกซ์ พอร์ตอุปกรณ์ และเส้นทาง:
พอร์ตมิกซ์ อธิบายโปรไฟล์การกำหนดค่าที่เป็นไปได้สำหรับสตรีมที่สามารถเปิดได้ที่ HAL เสียงสำหรับการเล่นและบันทึก พอร์ตอุปกรณ์ จะอธิบายอุปกรณ์ที่สามารถต่อเข้ากับประเภทได้ (และอาจระบุที่อยู่และคุณสมบัติเสียง หากเกี่ยวข้อง) เส้นทาง ถูกแยกออกจากตัวอธิบายพอร์ตผสม ทำให้สามารถอธิบายเส้นทางจากอุปกรณ์หนึ่งไปยังอีกอุปกรณ์หนึ่งหรือสตรีมไปยังอุปกรณ์ได้ ตารางปริมาตรคือรายการจุดง่ายๆ ที่กำหนดเส้นโค้งที่ใช้ในการแปลจากดัชนี UI ไปเป็นปริมาตรในหน่วย dB ไฟล์รวมที่แยกต่างหากจะมีเส้นโค้งเริ่มต้น แต่แต่ละเส้นโค้งสำหรับกรณีการใช้งานและหมวดหมู่อุปกรณ์ที่กำหนดสามารถเขียนทับได้
แสดงตัวอย่างตารางปริมาณ
<?xml version="1.0" encoding="UTF-8"?>
<volumes>
<reference name="FULL_SCALE_VOLUME_CURVE">
<point>0,0</point>
<point>100,0</point>
</reference>
<reference name="SILENT_VOLUME_CURVE">
<point>0,-9600</point>
<point>100,-9600</point>
</reference>
<reference name="DEFAULT_VOLUME_CURVE">
<point>1,-4950</point>
<point>33,-3350</point>
<point>66,-1700</point>
<point>100,0</point>
</reference>
</volumes>
แสดงตัวอย่างปริมาณ
<?xml version="1.0" encoding="UTF-8"?>
<volumes>
<volume stream="AUDIO_STREAM_VOICE_CALL" deviceCategory="DEVICE_CATEGORY_HEADSET" ref="DEFAULT_VOLUME_CURVE"/>
<volume stream="AUDIO_STREAM_VOICE_CALL" deviceCategory="DEVICE_CATEGORY_SPEAKER" ref="DEFAULT_VOLUME_CURVE"/>
<volume stream="AUDIO_STREAM_VOICE_CALL" deviceCategory="DEVICE_CATEGORY_EARPIECE" ref="DEFAULT_VOLUME_CURVE"/>
<volume stream="AUDIO_STREAM_VOICE_CALL" deviceCategory="DEVICE_CATEGORY_EXT_MEDIA" ref="DEFAULT_VOLUME_CURVE"/>
<volume stream="AUDIO_STREAM_SYSTEM" deviceCategory="DEVICE_CATEGORY_HEADSET" ref="DEFAULT_VOLUME_CURVE"/>
<volume stream="AUDIO_STREAM_SYSTEM" deviceCategory="DEVICE_CATEGORY_SPEAKER" ref="DEFAULT_VOLUME_CURVE"/>
<volume stream="AUDIO_STREAM_SYSTEM" deviceCategory="DEVICE_CATEGORY_EARPIECE" ref="DEFAULT_VOLUME_CURVE"/>
<volume stream="AUDIO_STREAM_SYSTEM" deviceCategory="DEVICE_CATEGORY_EXT_MEDIA" ref="DEFAULT_VOLUME_CURVE"/>
<volume stream="AUDIO_STREAM_RING" deviceCategory="DEVICE_CATEGORY_HEADSET" ref="DEFAULT_VOLUME_CURVE"/>
<volume stream="AUDIO_STREAM_RING" deviceCategory="DEVICE_CATEGORY_SPEAKER" ref="DEFAULT_VOLUME_CURVE"/>
<volume stream="AUDIO_STREAM_RING" deviceCategory="DEVICE_CATEGORY_EARPIECE" ref="DEFAULT_VOLUME_CURVE"/>
<volume stream="AUDIO_STREAM_RING" deviceCategory="DEVICE_CATEGORY_EXT_MEDIA"ref="DEFAULT_VOLUME_CURVE"/>
<volume stream="AUDIO_STREAM_MUSIC" deviceCategory="DEVICE_CATEGORY_HEADSET" ref="DEFAULT_VOLUME_CURVE"/>
<volume stream="AUDIO_STREAM_MUSIC" deviceCategory="DEVICE_CATEGORY_SPEAKER">
<point>1,-5500</point>
<point>20,-4300</point>
<point>86,-1200</point>
<point>100,0</point>
</volume>
<volume stream="AUDIO_STREAM_MUSIC" deviceCategory="DEVICE_CATEGORY_EARPIECE" ref="DEFAULT_VOLUME_CURVE"/>
<volume stream="AUDIO_STREAM_MUSIC" deviceCategory="DEVICE_CATEGORY_EXT_MEDIA" ref="DEFAULT_VOLUME_CURVE"/>
<volume stream="AUDIO_STREAM_ALARM" deviceCategory="DEVICE_CATEGORY_HEADSET" ref="DEFAULT_VOLUME_CURVE"/>
<volume stream="AUDIO_STREAM_ALARM" deviceCategory="DEVICE_CATEGORY_SPEAKER" ref="DEFAULT_VOLUME_CURVE"/>
<volume stream="AUDIO_STREAM_ALARM" deviceCategory="DEVICE_CATEGORY_EARPIECE" ref="DEFAULT_VOLUME_CURVE"/>
<volume stream="AUDIO_STREAM_ALARM" deviceCategory="DEVICE_CATEGORY_EXT_MEDIA" ref="DEFAULT_VOLUME_CURVE"/>
<volume stream="AUDIO_STREAM_NOTIFICATION" deviceCategory="DEVICE_CATEGORY_HEADSET" ref="DEFAULT_VOLUME_CURVE"/>
<volume stream="AUDIO_STREAM_NOTIFICATION" deviceCategory="DEVICE_CATEGORY_SPEAKER" ref="DEFAULT_VOLUME_CURVE"/>
<volume stream="AUDIO_STREAM_NOTIFICATION" deviceCategory="DEVICE_CATEGORY_EARPIECE" ref="DEFAULT_VOLUME_CURVE"/>
<volume stream="AUDIO_STREAM_NOTIFICATION" deviceCategory="DEVICE_CATEGORY_EXT_MEDIA" ref="DEFAULT_VOLUME_CURVE"/>
<volume stream="AUDIO_STREAM_BLUETOOTH_SCO" deviceCategory="DEVICE_CATEGORY_HEADSET" ref="DEFAULT_VOLUME_CURVE"/>
<volume stream="AUDIO_STREAM_BLUETOOTH_SCO" deviceCategory="DEVICE_CATEGORY_SPEAKER" ref="DEFAULT_VOLUME_CURVE"/>
<volume stream="AUDIO_STREAM_BLUETOOTH_SCO" deviceCategory="DEVICE_CATEGORY_EARPIECE" ref="DEFAULT_VOLUME_CURVE"/>
<volume stream="AUDIO_STREAM_BLUETOOTH_SCO" deviceCategory="DEVICE_CATEGORY_EXT_MEDIA" ref="DEFAULT_VOLUME_CURVE"/>
<volume stream="AUDIO_STREAM_ENFORCED_AUDIBLE" deviceCategory="DEVICE_CATEGORY_HEADSET" ref="DEFAULT_VOLUME_CURVE"/>
<volume stream="AUDIO_STREAM_ENFORCED_AUDIBLE" deviceCategory="DEVICE_CATEGORY_SPEAKER" ref="DEFAULT_VOLUME_CURVE"/>
<volume stream="AUDIO_STREAM_ENFORCED_AUDIBLE" deviceCategory="DEVICE_CATEGORY_EARPIECE" ref="DEFAULT_VOLUME_CURVE"/>
<volume stream="AUDIO_STREAM_ENFORCED_AUDIBLE" deviceCategory="DEVICE_CATEGORY_EXT_MEDIA" ref="DEFAULT_VOLUME_CURVE"/>
<volume stream="AUDIO_STREAM_DTMF" deviceCategory="DEVICE_CATEGORY_SPEAKER" ref="DEFAULT_VOLUME_CURVE"/>
<volume stream="AUDIO_STREAM_DTMF" deviceCategory="DEVICE_CATEGORY_SPEAKER" ref="DEFAULT_VOLUME_CURVE"/>
<volume stream="AUDIO_STREAM_DTMF" deviceCategory="DEVICE_CATEGORY_EARPIECE" ref="DEFAULT_VOLUME_CURVE"/>
<volume stream="AUDIO_STREAM_DTMF" deviceCategory="DEVICE_CATEGORY_EXT_MEDIA" ref="DEFAULT_VOLUME_CURVE"/>
<volume stream="AUDIO_STREAM_TTS" deviceCategory="DEVICE_CATEGORY_HEADSET" ref="SILENT_VOLUME_CURVE"/>
<volume stream="AUDIO_STREAM_TTS" deviceCategory="DEVICE_CATEGORY_SPEAKER" ref="FULL_SCALE_VOLUME_CURVE"/>
<volume stream="AUDIO_STREAM_TTS" deviceCategory="DEVICE_CATEGORY_EARPIECE" ref="SILENT_VOLUME_CURVE"/>
<volume stream="AUDIO_STREAM_TTS" deviceCategory="DEVICE_CATEGORY_EXT_MEDIA" ref="SILENT_VOLUME_CURVE"/>
<volume stream="AUDIO_STREAM_ACCESSIBILITY" deviceCategory="DEVICE_CATEGORY_HEADSET" ref="DEFAULT_VOLUME_CURVE"/>
<volume stream="AUDIO_STREAM_ACCESSIBILITY" deviceCategory="DEVICE_CATEGORY_SPEAKER" ref="DEFAULT_VOLUME_CURVE"/>
<volume stream="AUDIO_STREAM_ACCESSIBILITY" deviceCategory="DEVICE_CATEGORY_EARPIECE" ref="DEFAULT_VOLUME_CURVE"/>
<volume stream="AUDIO_STREAM_ACCESSIBILITY" deviceCategory="DEVICE_CATEGORY_EXT_MEDIA" ref="DEFAULT_VOLUME_CURVE"/>
<volume stream="AUDIO_STREAM_REROUTING" deviceCategory="DEVICE_CATEGORY_HEADSET" ref="FULL_SCALE_VOLUME_CURVE"/>
<volume stream="AUDIO_STREAM_REROUTING" deviceCategory="DEVICE_CATEGORY_SPEAKER" ref="FULL_SCALE_VOLUME_CURVE"/>
<volume stream="AUDIO_STREAM_REROUTING" deviceCategory="DEVICE_CATEGORY_EARPIECE" ref="FULL_SCALE_VOLUME_CURVE"/>
<volume stream="AUDIO_STREAM_REROUTING" deviceCategory="DEVICE_CATEGORY_EXT_MEDIA" ref="FULL_SCALE_VOLUME_CURVE"/>
<volume stream="AUDIO_STREAM_PATCH" deviceCategory="DEVICE_CATEGORY_HEADSET" ref="FULL_SCALE_VOLUME_CURVE"/>
<volume stream="AUDIO_STREAM_PATCH" deviceCategory="DEVICE_CATEGORY_SPEAKER" ref="FULL_SCALE_VOLUME_CURVE"/>
<volume stream="AUDIO_STREAM_PATCH" deviceCategory="DEVICE_CATEGORY_EARPIECE" ref="FULL_SCALE_VOLUME_CURVE"/>
<volume stream="AUDIO_STREAM_PATCH" deviceCategory="DEVICE_CATEGORY_EXT_MEDIA" ref="FULL_SCALE_VOLUME_CURVE"/>
</volumes>
การรวมไฟล์ วิธีการรวม XML (XInclude) สามารถใช้เพื่อรวมข้อมูลการกำหนดค่านโยบายเสียงที่อยู่ในไฟล์ XML อื่น ๆ ไฟล์ที่รวมไว้ทั้งหมดจะต้องเป็นไปตามโครงสร้างที่อธิบายไว้ข้างต้น โดยมีข้อจำกัดดังต่อไปนี้:
ไฟล์สามารถมีได้เฉพาะองค์ประกอบระดับบนสุดเท่านั้น ไฟล์ต้องไม่มีองค์ประกอบ XInclude ใช้การรวมเพื่อหลีกเลี่ยงการคัดลอกข้อมูลการกำหนดค่าโมดูลเสียง HAL ของ Android Open Source Project (AOSP) มาตรฐานไปยังไฟล์การกำหนดค่านโยบายเสียงทั้งหมด (ซึ่งมีแนวโน้มที่จะเกิดข้อผิดพลาด) ไฟล์ XML การกำหนดค่านโยบายเสียงมาตรฐานมีให้สำหรับ HAL เสียงต่อไปนี้:
A2DP: a2dp_audio_policy_configuration.xml
เปลี่ยนเส้นทางซับมิกซ์: rsubmix_audio_policy_configuration.xml
ยูเอสบี: usb_audio_policy_configuration.xml
องค์กรรหัสนโยบายเสียง AudioPolicyManager.cpp
แบ่งออกเป็นหลายโมดูลเพื่อให้ง่ายต่อการบำรุงรักษาและกำหนดค่า การจัดระเบียบของ frameworks/av/services/audiopolicy
ประกอบด้วยโมดูลต่อไปนี้
โมดูล คำอธิบาย /managerdefault
รวมอินเทอร์เฟซทั่วไปและการใช้งานลักษณะการทำงานทั่วไปสำหรับแอปทั้งหมด คล้ายกับ AudioPolicyManager.cpp
ที่มีฟังก์ชันการทำงานของเอ็นจิ้นและแนวคิดทั่วไปที่ถูกแยกออกไป /common
กำหนดคลาสพื้นฐาน (เช่น โครงสร้างข้อมูลสำหรับโปรไฟล์สตรีมเสียงอินพุตเอาต์พุต ตัวอธิบายอุปกรณ์เสียง แพตช์เสียง และพอร์ตเสียง) สิ่งนี้ถูกกำหนดไว้ก่อนหน้านี้ภายใน AudioPolicyManager.cpp
/engine
ใช้กฎที่กำหนดว่าควรใช้อุปกรณ์และวอลุ่มใดสำหรับกรณีการใช้งานที่กำหนด ใช้อินเทอร์เฟซมาตรฐานกับส่วนทั่วไป เช่น เพื่อรับอุปกรณ์ที่เหมาะสมสำหรับการเล่นหรือจับภาพการใช้งานที่กำหนด หรือเพื่อตั้งค่าอุปกรณ์ที่เชื่อมต่อหรือสถานะภายนอก (นั่นคือ สถานะการโทรของการใช้งานที่บังคับ) ที่สามารถเปลี่ยนเส้นทางได้ การตัดสินใจ.
มีให้เลือกสองเวอร์ชัน: กำหนดค่าได้ และ ค่าเริ่มต้น สำหรับข้อมูลเกี่ยวกับวิธีการเลือกเวอร์ชัน โปรดดูที่ การกำหนดค่าโดยใช้ Framework พารามิเตอร์
/engineconfigurable
การใช้งานกลไกนโยบายที่อาศัยพารามิเตอร์กรอบงาน (ดูด้านล่าง) การกำหนดค่าจะขึ้นอยู่กับพารามิเตอร์ Framework และตำแหน่งที่นโยบายถูกกำหนดโดยไฟล์ XML /enginedefault
การใช้งานกลไกนโยบายตามการใช้งาน Android Audio Policy Manager ก่อนหน้านี้ นี่เป็นค่าเริ่มต้นและรวมกฎแบบฮาร์ดโค้ดที่สอดคล้องกับการใช้งาน Nexus และ AOSP /service
รวมอินเทอร์เฟซของตัวประสาน เธรด และการล็อกการใช้งานด้วยอินเทอร์เฟซกับส่วนที่เหลือของเฟรมเวิร์ก
การกำหนดค่าโดยใช้กรอบพารามิเตอร์ รหัสนโยบายเสียงได้รับการจัดระเบียบเพื่อให้ง่ายต่อการเข้าใจและบำรุงรักษา ในขณะเดียวกันก็สนับสนุนนโยบายด้านเสียงที่กำหนดโดยไฟล์การกำหนดค่าทั้งหมด การออกแบบนโยบายองค์กรและเสียงอิงตามกรอบงานพารามิเตอร์ของ Intel ซึ่งเป็นกรอบงานแบบใช้ปลั๊กอินและแบบกฎสำหรับการจัดการพารามิเตอร์
การใช้นโยบายเสียงที่กำหนดค่าได้ช่วยให้ผู้ขาย OEM สามารถ:
อธิบายโครงสร้างของระบบและพารามิเตอร์ในรูปแบบ XML เขียน (ในภาษา C++) หรือใช้แบ็กเอนด์ (ปลั๊กอิน) ซ้ำเพื่อเข้าถึงพารามิเตอร์ที่อธิบายไว้ กำหนด (ใน XML หรือในภาษาเฉพาะโดเมน)/กฎที่พารามิเตอร์ที่กำหนดต้องใช้ค่าที่กำหนด AOSP มีตัวอย่างของไฟล์การกำหนดค่านโยบายเสียงที่ใช้พารามิเตอร์ Framework ที่ Frameworks/av/services/audiopolicy/engineconfigurable/parameter-framework/example/Settings/PolicyConfigurableDomains.xml
สำหรับรายละเอียด โปรดดูเอกสารประกอบของ Intel เกี่ยวกับ 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
แสดงมาสก์ช่องสัญญาณ แบบไดนามิก ซึ่งหมายความว่าตัวจัดการนโยบายเสียงจะสอบถามมาสก์ช่องสัญญาณที่รองรับโดย HDMI sink หลังจากการเชื่อมต่อ
แสดงตัวอย่างการกำหนดค่าอุปกรณ์ HDMI
<module name="primary" halVersion="2.0">
<attachedDevices>
<item>Speaker</item>
</attachedDevices>
<defaultOutputDevice>Speaker</defaultOutputDevice>
<mixPorts>
<mixPort name="primary output" role="source" flags="AUDIO_OUTPUT_FLAG_PRIMARY">
<profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
samplingRates="48000" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/>
</mixPort>
<mixPort name="direct" role="source" flags="AUDIO_OUTPUT_FLAG_DIRECT" />
<mixPort name="tunnel" role="source"
flags="AUDIO_OUTPUT_FLAG_DIRECT|AUDIO_OUTPUT_FLAG_HW_AV_SYNC" />
</mixPorts>
<devicePorts>
<devicePort tagName="Speaker" type="AUDIO_DEVICE_OUT_SPEAKER" role="sink" />
<devicePort tagName="Out Aux Digital" type="AUDIO_DEVICE_OUT_AUX_DIGITAL" role="sink"
encodedFormats="AUDIO_FORMAT_AC3 AUDIO_FORMAT_IEC61937" />
</devicePorts>
<routes>
<route type="mix" sink="Speaker" sources="primary output"/>
<route type="mix" sink="Out Aux Digital" sources="primary output,direct,tunnel"/>
</routes>
</module>
คุณยังสามารถระบุมาสก์ช่องแบบคงที่ เช่น AUDIO_CHANNEL_OUT_5POINT1
มิกเซอร์ของ AudioFlinger จะดาวน์มิกซ์เนื้อหาให้เป็นสเตอริโอโดยอัตโนมัติเมื่อส่งไปยังอุปกรณ์เสียงที่ไม่รองรับเสียงหลายช่องสัญญาณ
ตัวแปลงสัญญาณสื่อ ตรวจสอบให้แน่ใจว่าตัวแปลงสัญญาณเสียงที่ฮาร์ดแวร์และไดรเวอร์ของคุณรองรับนั้นได้รับการประกาศอย่างถูกต้องสำหรับผลิตภัณฑ์ของคุณ สำหรับรายละเอียด โปรดดูที่ การเปิดเผย Codecs ไปยัง Framework