การเปิดตัว 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 ระบบอนุญาตให้มีแอปบันทึกที่ใช้งานอยู่มากกว่า 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
  
    แสดงตัวอย่างนโยบายเสียงสำหรับ 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 เป็นระดับเสียงในหน่วยเดซิเบล ไฟล์รวมแยกต่างหากมีเส้นโค้งเริ่มต้น แต่สามารถเขียนทับเส้นโค้งแต่ละเส้นสำหรับกรณีการใช้งานและหมวดหมู่อุปกรณ์ที่กำหนดได้
  
    แสดงตัวอย่างตารางระดับเสียง 
<?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 
 
ใช้ includes เพื่อหลีกเลี่ยงการคัดลอกข้อมูลการกำหนดค่าโมดูล HAL ของเสียงใน Android Open Source Project (AOSP) มาตรฐาน
ไปยังไฟล์การกำหนดค่านโยบายเสียงทั้งหมด (ซึ่งมีแนวโน้มที่จะเกิดข้อผิดพลาด) ไฟล์ XML การกำหนดค่านโยบายเสียงมาตรฐาน
มีไว้สำหรับ HAL เสียงต่อไปนี้
A2DP:  a2dp_audio_policy_configuration.xmlเปลี่ยนเส้นทางมิกซ์ย่อย:  rsubmix_audio_policy_configuration.xmlUSB:  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 หลังจากเชื่อมต่อ
  
    แสดงตัวอย่างการกำหนดค่าอุปกรณ์ 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 จะมิกซ์ดาวน์เนื้อหาเป็นสเตอริโอโดยอัตโนมัติเมื่อส่งไปยังอุปกรณ์เสียงที่ไม่รองรับเสียงหลายช่อง
ตัวแปลงรหัสสื่อ 
ตรวจสอบว่าตัวแปลงรหัสเสียงที่ฮาร์ดแวร์และไดรเวอร์รองรับได้รับการประกาศอย่างถูกต้อง
สำหรับผลิตภัณฑ์ โปรดดูรายละเอียดที่หัวข้อ
การเปิดเผยตัวแปลงรหัสต่อ
เฟรมเวิร์ก