รุ่น 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
ของไฟล์การกำหนดค่า
หมายเหตุ: การรองรับ
USE_XML_AUDIO_POLICY_CONF
สร้าง Flag ซึ่งทำให้ความสามารถในการ
ใช้รูปแบบ CONF ที่เลิกใช้งานแล้วได้ถูกนำออกใน Android 10
ข้อดีของรูปแบบ 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
แสดงตัวอย่างนโยบายเสียงสำหรับ 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
การใช้รวมถึงเพื่อหลีกเลี่ยงการคัดลอกโครงการโอเพนซอร์ส 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 รองรับหลังจากการเชื่อมต่อ
แสดงตัวอย่างการกำหนดค่าอุปกรณ์ 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 ผสมผสาน
ไปยังสเตอริโอโดยอัตโนมัติเมื่อส่งไปยังอุปกรณ์เสียงที่ไม่
รองรับเสียงแบบหลายช่องทาง
ตัวแปลงรหัสสื่อ
ตรวจสอบว่าตัวแปลงสัญญาณเสียงที่ฮาร์ดแวร์และไดรเวอร์รองรับถูกต้อง
ที่ประกาศไว้สำหรับผลิตภัณฑ์ของคุณ โปรดดูรายละเอียดที่หัวข้อ
การแสดงตัวแปลงรหัสต่อ
เฟรมเวิร์ก