เวอร์ชัน 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
ไฟล์ XML ช่วยให้กำหนดจำนวนและประเภทของโปรไฟล์สตรีมเอาต์พุตและอินพุต อุปกรณ์ที่ใช้เล่นและบันทึก และแอตทริบิวต์เสียงได้เช่นเดียวกับไฟล์ CONF นอกจากนี้ รูปแบบ XML ยังมีการปรับปรุงดังต่อไปนี้:
- ใน Android 10 ระบบจะอนุญาตให้แอปบันทึกเสียงที่ใช้งานอยู่มากกว่า 1 แอปพร้อมกัน
- การเริ่มบันทึกจะไม่ถูกปฏิเสธเนื่องจากการเกิดขึ้นพร้อมกัน
- Callback ของ
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
แสดงตัวอย่างนโยบายเสียงสำหรับ 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:
usb_audio_policy_configuration.xml
การจัดระเบียบโค้ดนโยบายเสียง
AudioPolicyManager.cpp
แบ่งออกเป็นหลายโมดูลเพื่อการดูแลรักษาและกำหนดค่าได้ง่าย องค์กรของ frameworks/av/services/audiopolicy
ประกอบด้วยโมดูลต่อไปนี้
โมดูล | คำอธิบาย |
---|---|
/managerdefault |
รวมอินเทอร์เฟซและลักษณะการทำงานทั่วไปซึ่งเหมือนกันกับแอปทั้งหมด คล้ายกับ AudioPolicyManager.cpp ที่มีฟังก์ชันการทำงานและแนวคิดทั่วไปที่แยกออกมา |
/common |
กำหนดคลาสพื้นฐาน (เช่น โครงสร้างข้อมูลสำหรับโปรไฟล์สตรีมเสียงอินพุตเอาต์พุต ตัวบ่งชี้อุปกรณ์เสียง แพตช์เสียง และพอร์ตเสียง) ซึ่งก่อนหน้านี้ได้กำหนดไว้ภายใน AudioPolicyManager.cpp |
/engine |
ใช้กฎที่กำหนดอุปกรณ์และวอลุ่มที่จะใช้สำหรับกรณีการใช้งานหนึ่งๆ โดยจะใช้อินเทอร์เฟซมาตรฐานกับส่วนที่เป็นแบบทั่วไป เช่น เพื่อรับอุปกรณ์ที่เหมาะสมสำหรับกรณีการใช้งานการเล่นหรือบันทึก หรือเพื่อตั้งค่าอุปกรณ์ที่เชื่อมต่อหรือสถานะภายนอก (นั่นคือ สถานะการโทรของการใช้งานแบบบังคับ) ซึ่งสามารถเปลี่ยนแปลงการตัดสินใจในการกำหนดเส้นทางได้ มี 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 รองรับหลังจากเชื่อมต่อ
แสดงตัวอย่างการกำหนดค่าอุปกรณ์ 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 จะมิกซ์เนื้อหาให้เป็นเสียงสเตอริโอโดยอัตโนมัติเมื่อส่งไปยังอุปกรณ์เสียงที่ไม่รองรับเสียงแบบหลายช่องทาง
ตัวแปลงรหัสสื่อ
ตรวจสอบว่ามีการประกาศตัวแปลงรหัสเสียงที่ฮาร์ดแวร์และไดรเวอร์รองรับไว้อย่างถูกต้องสำหรับผลิตภัณฑ์ โปรดดูรายละเอียดที่หัวข้อการเปิดเผยตัวแปลงรหัสให้กับเฟรมเวิร์ก