يتضمّن إصدار Android 10 إعادة هندسة كبيرة لخدمة إدارة سياسة الصوت لتوفير المزيد من المرونة لتلبية حالات الاستخدام المعقّدة في السيارات:
- استراتيجيات التوجيه الخاصة بالمصنّعين الأصليين للأجهزة
- مجموعات قابلة للتخصيص لمستوى الصوت لمجموعات أنواع البث القديمة باستخدام منحنيات مستوى الصوت نفسها
- استراتيجيات التوجيه التي يعلن عنها محرّك سياسة الصوت بدلاً من تضمينها في الرمز البرمجي
- منحنيات الصوت والمجموعات التي تديرها آلية سياسة الصوت
- إعادة صياغة داخلية استعدادًا لعملية تقسيم مستقبلية بين التعليمات البرمجية الشائعة والتعليمات البرمجية القابلة للضبط، وتوفير إدارة أفضل لأجهزة الصوت على سبيل المثال، استخدام جميع سمات الجهاز وليس نوعه فقط في قواعد السياسة
طرح نظام التشغيل 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 سهل القراءة ويحتوي على مجموعة كبيرة من أدوات التعديل والتحليل، وهو مرن بما يكفي لوصف طوبولوجيا الصوت المعقدة. يستخدم الإصدار 7.0 من نظام Android علامة الإنشاء
USE_XML_AUDIO_POLICY_CONF
لاختيار تنسيق XML
لملفات الإعدادات.
مزايا تنسيق XML
وكما هو الحال في ملف CONF، يتيح ملف XML تحديد عدد وأنواع الملفات الشخصية لإخراج البث والإدخال، والأجهزة القابلة للاستخدام للتشغيل والالتقاط، وسمات الصوت. بالإضافة إلى ذلك، يوفّر تنسيق XML التحسينات التالية:
- في نظام التشغيل Android 10، يُسمح باستخدام أكثر من تطبيق تسجيل نشط واحد
في الوقت نفسه.
- لا يتم رفض بدء التسجيل مطلقًا بسبب تعارض في المهام.
- يُرسِل الإجراء المُعاد للاتّصال
registerAudioRecordingCallback(AudioManager.AudioRecordingCallback cb)
إشعارًا إلى العملاء بتغييرات مسار الالتقاط.
- في الحالات التالية، يحصل العميل على عيّنات صوتية صامتة:
- حالة استخدام حسّاسة للخصوصية (مثل
VOICE_COMMUNICATION
) نشطة. - لا يتضمّن التطبيق خدمة تعمل في المقدّمة أو واجهة مستخدم تعمل في المقدّمة.
- تتعرّف السياسة على الأدوار الخاصة:
- خدمة تسهيل الاستخدام: يمكنها التسجيل حتى إذا كانت حالة استخدام حسّاسة للخصوصية نشطة.
- "مساعد Google": يُعتبَر هذا التطبيق حسّاسًا من حيث الخصوصية إذا كان واجهة المستخدم في أعلى الشاشة.
- حالة استخدام حسّاسة للخصوصية (مثل
- تتضمّن الملفات الصوتية بنية مشابهة لملفّات وصف الصوت البسيطة في HDMI، ما يتيح استخدام مجموعة مختلفة من معدّلات أخذ العينات/أقنعة القنوات لكل تنسيق صوتي.
- تتوفّر تعريفات واضحة لجميع عمليات الربط المحتملة بين الأجهزة ومصادر البيانات. في السابق، كانت هناك قاعدة ضمنية تتيح توصيل جميع الأجهزة المرتبطة بوحدة HAL المعينة، ما يمنع سياسة الصوت من التحكّم في عمليات الربط المطلوبة باستخدام واجهات برمجة التطبيقات لإصلاح الصوت. في تنسيق XML، يحدِّد وصف الشبكة الطوبولوجية قيود الاتصال.
- إنّ ميزة التضمين تتجنّب تكرار تعريفات A2DP أو USB أو إعادة توجيه الإرسال المعيارية.
- منحنيات الصوت قابلة للتخصيص. في السابق، كانت جداول الوحدات تخضع لرمز ثابت. في تنسيق XML، يتم وصف جداول الوحدات ويمكن تخصيصها.
يعرض النموذج في
frameworks/av/services/audiopolicy/config/audio_policy_configuration.xml
العديد من هذه الميزات قيد الاستخدام.
تنسيق الملف وموقعه
ملف الإعداد الجديد لسياسة الصوت هو
audio_policy_configuration.xml
ويمكن العثور عليه في
/system/etc
. تعرض الأمثلة التالية إعدادات بسيطة لسياسة الصوت بتنسيقملف XML لنظام التشغيل 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 الصوتي لتشغيل المحتوى وتسجيله.
- تصف منافذ الجهاز الأجهزة التي يمكن ربطها مع نوعها (وخصائص العنوان والصوت اختياريًا، إذا كان ذلك منطبقًا).
- يتم فصل المسارات عن وصف منفذ المزيج، ما يتيح وصف المسارات من جهاز إلى جهاز أو من مصدر بث إلى جهاز.
جداول مستوى الصوت هي قوائم بسيطة من النقاط التي تحدّد المنحنى المستخدَم للترجمة من مؤشر واجهة المستخدم إلى مستوى الصوت بوحدة ديسيبل. يقدّم ملف تضمين منفصل منحنيات تلقائية، ولكن يمكن استبدال كل منحنى لحالة استخدام وفئة جهاز معيّنة.
مثال على جدول مستوى الصوت
<?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 |
تنفيذ القواعد التي تحدِّد الأجهزة والأحجام التي يجب استخدامها في حالة استخدام معيّنة وتنفِّذ واجهة قياسية مع الجزء العام، مثل الحصول على الجهاز المناسب لحالة استخدام معيّنة لتشغيل المحتوى أو تسجيله، أو لتحديد الأجهزة المتصلة أو الحالة الخارجية (أي حالة الاتصال للاستخدام القسري) التي يمكنها تغيير قرار التوجيه. يتوفّر بإصدارَين: قابل للضبط وتلقائي. للحصول على معلومات عن كيفية اختيار الإصدار، يُرجى الاطّلاع على الإعداد باستخدام إطار عمل المَعلمات. |
/engineconfigurable |
تنفيذ محرّك السياسة الذي يعتمد على إطار عمل المَعلمات (راجِع المعلومات أدناه). يستند الإعداد إلى إطار عمل المَعلمات ومكان تحديد السياسة باستخدام ملفات XML. |
/enginedefault |
تنفيذ محرّك السياسة استنادًا إلى عمليات التنفيذ السابقة لخدمة "إدارة سياسة الصوت" في Android هذا هو الإعداد التلقائي ويتضمّن قواعد غير قابلة للتعديل تتوافق مع عمليات تنفيذ Nexus وAOSP. |
/service |
يتضمّن واجهات الربط وعمليات إنشاء المواضيع وتنفيذ عمليات القفل باستخدام الواجهة مع بقية الإطار. |
الضبط باستخدام إطار عمل المَعلمات
تم تنظيم رمز سياسة الصوت لتسهيل فهمه و صياغه، مع السماح أيضًا بسياسة صوت يتم تحديدها بالكامل من خلال ملفات الضبط. يستند تصميم السياسة الصوتية والتنظيمية إلى "إطار عمل المَعلمات" من Intel، وهو إطار عمل يستند إلى المكوّنات الإضافية والقواعد لمعالجة المَعلمات.
يتيح استخدام سياسة الصوت القابلة للضبط لمصنّعي المعدّات الأصلية ما يلي:
- وصف بنية النظام ومَعلماته بتنسيق XML
- يمكنك كتابة (باستخدام C++) أو إعادة استخدام الخلفية (المكوّن الإضافي) للوصول إلى المَعلمات описанة.
- حدِّد (بتنسيق XML أو بلغة خاصة بالمجال) الشروط أو القواعد التي يجب أن تستند إليها مَعلمة معيّنة لتحديد قيمة معيّنة.
يتضمّن AOSP مثالاً لملف إعدادات سياسة الصوت الذي يستخدم إطار عمل Parameter
في Frameworks/av/services/audiopolicy/engineconfigurable/parameter-framework/example/Settings/PolicyConfigurableDomains.xml
. للاطّلاع على
التفاصيل، يُرجى الرجوع إلى مستندات Intel حول
إطار عمل المَعلمات.
في الإصدار 10 من نظام التشغيل Android أو الإصدارات الأقدم، يتم اختيار سياسة الصوت القابلة للضبط
باستخدام خيار الإصدار USE_CONFIGURABLE_AUDIO_POLICY
.
في الإصدار 11 من نظام التشغيل Android أو الإصدارات الأحدث، يتم اختيار إصدار محرك
سياسة الصوت في ملف audio_policy_configuration.xml
.
لاختيار محرّك سياسة الصوت القابل للضبط، اضبط قيمة سمة engine_library
لعنصر globalConfiguration
على configurable
كما هو موضّح في المثال التالي:
<audioPolicyConfiguration> <globalConfiguration engine_library="configurable" /> ... </audioPolicyConfiguration>
واجهات برمجة التطبيقات لتوجيه سياسة الصوت
طرح الإصدار Android 6.0 واجهة برمجة تطبيقات عامة لتحديد واختيار الأجهزة تقع في قاعدة بنية الربط الصوتي/منفذ الصوت، وتسمح لمطوّري التطبيقات بتحديد جهاز معيّن لإخراج أو إدخال المحتوى الصوتي المرتبط.
في الإصدار 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 كي لا يتم تقليل مستوى الصوت إلى قناتين). يجب أن يعرِض واجهة 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 عملية تقليل كثافة
المحتوى إلى صوت استيريو تلقائيًا عند إرساله إلى جهاز صوتي لا يسمح
بتشغيل الصوت المتعدّد القنوات.
برامج ترميز الوسائط
تأكَّد من أنّ برامج ترميز الصوت التي تتيحها الأجهزة وبرامج التشغيل مُعلَن عنها بشكلٍ سليم لمنتجاتك. لمعرفة التفاصيل، يُرجى الاطّلاع على مقالة إتاحة برامج الترميز لإطار العمل.