تتضمّن CarAudioService إدارة مستوى الصوت، وهي تستخدم مستويات صوت ثابتة مع توقّع أن يتم تطبيق مستويات الصوت تحت طبقة HAL بواسطة مضخّم صوت للأجهزة بدلاً من البرامج. تعمل CarAudioService على تنظيم أجهزة الإخراج في مجموعات مستوى الصوت لتطبيق مستوى الصوت نفسه على جميع الأجهزة المرتبطة بمجموعة مستوى الصوت.
الأحجام الثابتة
تستخدم عمليات تنفيذ AAOS مضخّمًا للأجهزة للتحكّم في مستوى الصوت بدلاً من برنامج دمج. لتجنُّب الآثار الجانبية، اضبط العلامة config_useFixedVolume على
true (تراكب حسب الحاجة):
<resources>
<!-- Car uses hardware amplifier for volume. -->
<bool name="config_useFixedVolume">true</bool>
</resources>
عندما لا يتم ضبط العلامة config_useFixedVolume (أو يتم ضبطها على false)، يمكن للتطبيقات استدعاء AudioManager.setStreamVolume() لتغيير مستوى الصوت حسب نوع البث في برنامج دمج الصوت. قد لا يكون ذلك مرغوبًا دائمًا بسبب التأثيرات المحتملة في التطبيقات الأخرى، ولأنّ خفض مستوى الصوت في برنامج الخلط قد يؤدي إلى توفّر عدد أقل من البتات المهمة في الإشارة عند تلقّيها من خلال مضخّم الأجهزة.
مجموعات مستوى الصوت
تتولّى مجموعات الصوت إدارة مستويات الصوت لمجموعة من الأجهزة ضمن منطقة صوتية. ويمكن التحكّم في مستوى الصوت بشكل مستقل لكل مجموعة من مجموعات الصوت. يتم ضبط المكاسب الناتجة على الأجهزة المرتبطة ليتم تطبيقها من خلال مضخّم صوت المركبة. يتم الاحتفاظ بإعدادات مستوى الصوت للمستخدم ويتم تحميلها عند تسجيل الدخول.
تحديد مجموعات وحدات التخزين
تستخدِم CarAudioService مجموعات مستوى الصوت المحدّدة في car_audio_configuration.xml:
<audioZoneConfiguration version="4">
</deviceConfigurations>
<activationVolumeConfigs>
<activationVolumeConfig name="activation_volume_on_boot_config">
<activationVolumeConfigEntry minActivationVolumePercentage="10" maxActivationVolumePercentage="90"
invocationType="onBoot" />
</activationVolumeConfig>
...
</activationVolumeConfigs>
<zones>
<zone name="primary zone" isPrimary="true">
<zoneConfigs>
<zoneConfig name="primary zone config 0" isDefault="true">
<volumeGroups>
<group activationConfig="activation_volume_on_boot_config">
<device address="bus0_media_out">
<context context="music"/>
</device>
</group>
<group>
<device address="bus1_navigation_out">
<context context="navigation"/>
</device>
<device address="bus2_voice_command_out">
<context context="voice_command"/>
</device>
</group>
...
</volumeGroups>
</zoneConfig>
...
</zoneConfigs>
</zone>
</zones>
</audioZoneConfiguration>
يجب أن تحتوي كل مجموعة مستوى صوت على جهاز إخراج واحد أو أكثر مع عناوين مرتبطة. يجب أن تتوافق العناوين مع أجهزة الإخراج المحدّدة في audio_policy_configuration.xml.
ضبط مستويات الصوت في مجموعة الصوت
تحتوي كل مجموعة مستوى صوت على قيم الحد الأدنى والأقصى والمستوى التلقائي، بالإضافة إلى حجم الخطوة استنادًا إلى القيم التي تم ضبطها في audio_policy_configuration.xml للأجهزة المرتبطة بمجموعة مستوى الصوت.
<devicePort tagName="bus0_media_out" role="sink" type="AUDIO_DEVICE_OUT_BUS" address="bus0_media_out">
<profile name="" format="AUDIO_FORMAT_PCM_16_BIT" samplingRates="48000" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/>
<gains>
<gain name="" mode="AUDIO_GAIN_MODE_JOINT"
minValueMB="-3200" maxValueMB="600" defaultValueMB="0" stepValueMB="100"/>
</gains>
</devicePort>
أثناء عملية التهيئة، تتحقّق مجموعة الصوت من قيم مستوى الصوت للأجهزة المرتبطة بها وتضبط المجموعة على النحو التالي:
- حجم الخطوة: يجب أن يكون هو نفسه لجميع الأجهزة التي تتحكّم فيها مجموعة الصوت.
- الحدّ الأدنى للزيادة: أصغر حدّ أدنى للمكسب بين الأجهزة في المجموعة
- الحدّ الأقصى للزيادة: أعلى حد أقصى للكسب بين الأجهزة في المجموعة
- مستوى الصوت التلقائي: أعلى مستوى صوت تلقائي بين الأجهزة في المجموعة
نظرًا لطريقة ضبط هذه القيم، من الممكن ضبط مستوى الصوت لمجموعة صوتية خارج النطاق المسموح به لجهاز مرتبط بالمجموعة الصوتية. في هذه الحالة، يتم ضبط مستوى الصوت على الحد الأدنى أو الأقصى لقيمة مستوى الصوت في الجهاز استنادًا إلى ما إذا كانت قيمة مجموعة مستوى الصوت أقل من النطاق أو أعلى منه.
معرّفات مجموعة وحدات التخزين
يتم تحديد مجموعات مستوى الصوت في وقت التشغيل بالترتيب المحدّد في ملف XML.
تتراوح المعرّفات من 0 إلى N-1 ضمن منطقة صوتية، حيث يمثّل N عدد مجموعات مستوى الصوت في تلك المنطقة. وبهذه الطريقة، لا تكون معرّفات مجموعات وحدات التخزين فريدة على مستوى المناطق. تُستخدَم هذه المعرّفات لواجهات برمجة التطبيقات CarAudioManager المرتبطة بمجموعات الصوت. أي واجهة برمجة تطبيقات تتلقّى groupId بدون zoneId
تستخدم تلقائيًا منطقة الصوت الأساسية.
إدارة مستوى الصوت في مناطق متعدّدة
من المتوقّع أن تحتوي كل منطقة صوتية على مجموعة واحدة أو أكثر من مجموعات مستوى الصوت، ولا ترتبط كل مجموعة مستوى صوت إلا بمنطقة صوتية واحدة. يتم تحديد هذه العلاقة كجزء من car_audio_configuration.xml. لمزيد من المعلومات، اطّلِع على المثال أعلاه
في تحديد مجموعات مستوى الصوت.
يتم الاحتفاظ بمستويات الصوت الحالية لكل منطقة للمستخدم المرتبط بهذه المنطقة. هذه الإعدادات خاصة بكل منطقة، ما يعني أنّه إذا سجّل المستخدم الدخول على شاشة مرتبطة بالمنطقة الأساسية، ثم سجّل الدخول لاحقًا إلى منطقة مرتبطة بمنطقة صوتية ثانوية، ستختلف مستويات الصوت التي تم تحميلها والاحتفاظ بها للمنطقة الأولى عن تلك الخاصة بالمنطقة الثانوية.
الحدّ الأدنى والأقصى لمستوى الصوت عند التفعيل
يوفّر Android 15 إمكانية التحكّم في فهارس مجموعات مستوى الصوت لتحسين السلامة وراحة المستخدم في أنظمة الصوت داخل السيارة. ويتم ذلك من خلال استخدام الحد الأدنى والحد الأقصى لمستويات صوت التفعيل، ويتم ضبطها ضمن إعدادات صوت السيارة (راجِع تحديد مجموعات مستوى الصوت). يمكنك تفعيل هذه الميزة من خلال ضبط audioUseMinMaxActivationVolume على true في RROs الخاصة بخدمة السيارة.
يمكنك تحديد إدخالات activationVolumeConfig متعددة في activationVolumeConfigs، يمثّل كل منها إعدادًا مختلفًا للحد الأدنى والأقصى للتفعيل. كل activationVolumeConfig:
- يجب أن يحتوي على
nameفريد في ملف إعدادات صوت السيارة، حتى يمكن الرجوع إليه في مجموعة مستوى الصوت (group) لاحقًا. - يجب أن يحتوي على
activationVolumeConfigEntryواحد فقط.
يحتوي كل activationVolumeConfig على السمات التالية:
-
minActivationVolumePercentage(عدد صحيح، من 0 إلى 100، اختياري، القيمة التلقائية: 0): تحدّد هذه السمة الحد الأدنى لمستوى التفعيل كنسبة مئوية. -
maxActivationVolumePercentage(عدد صحيح، من 0 إلى 100، اختياري، القيمة التلقائية: 100): تحدّد الحد الأقصى لمستوى التفعيل كنسبة مئوية.
invocationType(سلسلة، اختياري، القيمة التلقائية:onPlaybackChanged): تحدّد الشروط التي يتم بموجبها تطبيق الحد الأدنى والأقصى لحجم التفعيل:-
onBoot: يتم تطبيقه فقط على التشغيل الأول الجديد النشط على مجموعة مستوى الصوت بعد إعادة التشغيل. -
onSourceChanged: يتم تطبيق هذا الإجراء فقط على عملية تشغيل نشطة حديثًا مع تغيير التطبيق أو مصدر المعرّف الفريد (UID) في مجموعة مستوى الصوت. onPlaybackChanged: يتم تطبيقها على كل عملية تشغيل جديدة نشطة في مجموعة وحدات تخزين.
-
يدير CarAudioService الحدّ الأدنى والأقصى للتنشيط من خلال مراقبة المكوّنات الفرعية الصوتية النشطة حاليًا التالية:
- مقاطع التشغيل النشطة الحالية
- حالة المكالمة الحالية
- طلب أولويّة الصوت الحالي من Audio Control HAL حيث يشير طلب أولويّة الصوت من Audio Control HAL إلى أنّه يتم تشغيل الصوت بشكل نشط خارج Android
تعرض الصورة التالية نظرة عامة عالية المستوى على إدارة الحد الأدنى والحد الأقصى لحجم التنشيط:
الشكل 1: مسارات بيانات الصوت النشطة للحدّ الأدنى والأقصى من مستوى التفعيل
باستخدام minActivationVolumePercentage وmaxActivationVolumePercentage، الحد الأدنى والأقصى لمؤشر زيادة مستوى الصوت، يمكنك احتساب الحد الأدنى والأقصى لمؤشر زيادة مستوى الصوت لكل مجموعة من مجموعات مستوى الصوت. CarAudioService
يراقب كل عملية تشغيل جديدة نشطة ويطبّق الحد الأدنى والأقصى لمستوى الصوت
عند التنشيط في الحالات التالية:
- أنواع التنشيط المتطابقة: يجب أن يتطابق نوع تفعيل التشغيل (المستمد من "مدير الصوت" أو Audio Control HAL أو Telephony Manager) مع
invocationTypeالمحدّد فيactivationVolumeConfigEntryالمرتبط بمجموعة مستوى الصوت. فهرس مستوى الصوت خارج النطاق: يجب أن يقع فهرس مستوى الصوت الحالي لمجموعة مستوى الصوت خارج نطاق فهرس مستوى الصوت المحدّد للتفعيل، وتحديدًا، يجب أن يكون أحد ما يلي صحيحًا:
الفهرس أقل من الحد الأدنى المحسوب لمستوى صوت التنشيط.
أو
الفهرس أعلى من الحد الأقصى المحسوب لمعدّل اكتساب التنشيط.
عند توفّر تطابق بين بيانات التفعيل، سيتم تعديل مؤشر زيادة مستوى الصوت لمجموعة الصوت إلى إحدى القيم التالية:
الحدّ الأدنى لمؤشر مستوى الصوت عند التفعيل إذا كان أقل من الحدّ الأدنى لمؤشر مستوى الصوت عند التفعيل
أو
الحد الأقصى لمؤشر مستوى الصوت عند التفعيل إذا كان أعلى من الحد الأقصى لمؤشر مستوى الصوت عند التفعيل
بالإضافة إلى ذلك، يتم إرسال حدث مجموعة مستوى الصوت في السيارة الذي يتضمّن نوع الحدث
EVENT_TYPE_VOLUME_GAIN_INDEX_CHANGED إلى جميع عمليات معاودة الاتصال المسجّلة الخاصة بأحداث مجموعة مستوى الصوت.
التعامل مع أحداث مفتاح التحكّم بمستوى الصوت
يحدّد نظام التشغيل Android عدة رموز مفاتيح للتحكّم في مستوى الصوت، بما في ذلك:
KEYCODE_VOLUME_UPKEYCODE_VOLUME_DOWNKEYCODE_VOLUME_MUTE
توجّه Android تلقائيًا أحداث مفتاح مستوى الصوت إلى التطبيقات. يجب أن تفرض عمليات التنفيذ الخاصة بالسيارات معالجة هذه الأحداث الرئيسية من خلال CarAudioService، التي بدورها تستدعي setGroupVolume أو setMasterMute، حسب الاقتضاء. لفرض هذا السلوك، اضبط العلامة
config_handleVolumeKeysInWindowManager على true:
<resources>
<bool name="config_handleVolumeKeysInWindowManager">true</bool>
</resources>
لا تتوفّر حاليًا طريقة للتمييز بين الأحداث الرئيسية المتعلقة بمفتاح الصوت، ويُفترض أنّها مرتبطة جميعًا بمنطقة الصوت الأساسية. عند تلقّي حدث مفتاح مستوى الصوت، يحدّد CarAudioService مجموعة مستوى الصوت التي سيتم تعديلها من خلال جلب سياقات الصوت للمشغّلات النشطة، ثم تعديل مجموعة مستوى الصوت التي تحتوي على جهاز الإخراج المرتبط بسياق الصوت ذي الأولوية القصوى. يتم تحديد الأولوية استنادًا إلى ترتيب ثابت محدّد في CarVolume.AUDIO_CONTEXT_VOLUME_PRIORITY.
التلاشي والتوازن
يتضمّن كلا الإصدارَين من AudioControl HAL واجهات برمجة تطبيقات لضبط مستوى الصوت المتلاشي ومستوى الصوت المتوازن في المركبة. تعمل واجهات برمجة التطبيقات المقابلة لنظام CarAudioManager على تمرير القيم إلى طبقة تجريد الأجهزة AudioControl. تتطلّب واجهات برمجة التطبيقات هذه توفّر
android.car.permission.CAR_CONTROL_AUDIO_VOLUME. واجهات برمجة التطبيقات AudioControl هي:
يؤدي الضغط على
setBalanceTowardRight(float value)إلى نقل مستوى صوت مكبّر الصوت إلى الجانب الأيمن (+) أو الأيسر (-) من السيارة.- يتم توسيط القيمة 0.0
- +1.0 هي الإجابة الصحيحة تمامًا
- -1.0 هو أقصى قيمة لليسار
- إذا كانت القيمة خارج النطاق من -1 إلى 1، سيحدث خطأ
يؤدي الضغط على
setFadeTowardFront(float value)إلى تغيير مستوى صوت مكبّر الصوت في اتجاه الجزء الأمامي (+) أو الخلفي (-) من السيارة.- يتم توسيط القيمة 0.0
- +1.0 هو أحدث إصدار
- -1.0 يعني أنّ العنصر في الخلف تمامًا
- إذا كانت القيمة خارج النطاق من -1 إلى 1، سيحدث خطأ
يمكنك تحديد كيفية تطبيق هذه القيم وكيفية عرضها للمستخدمين. ويمكن تطبيقها بشكل صارم على الوسائط أو على جميع أصوات Android. يتيح Android 11 أيضًا تطبيق تأثيرات صوتية على أجهزة الإخراج. وبذلك، يمكن إدارة التلاشي والتوازن من خلال المؤثرات الصوتية على أجهزة الإخراج المناسبة بدلاً من استخدام واجهات برمجة التطبيقات هذه.
تجنب التداخل مع أصوات أخرى
يحدث تجنب التداخل مع أصوات أخرى عندما تخفض المركبة مستوى الصوت في أحد مصادر البث ليتم سماع مصدر آخر يتم تشغيله في الوقت نفسه بوضوح أكبر. في AAOS، يتم تنفيذ ميزة تجنُّب التداخل مع أصوات أخرى من خلال طبقة تجريد الأجهزة (HAL). لا يتحكّم نظام التشغيل Android في الأصوات خارج نطاق نظام التشغيل. في نظام التشغيل Android 11، المعلومات الرئيسية المتاحة لطبقة HAL لاتخاذ قرارات بشأن التخفيف هي ما إذا كان جهازا إخراج يتضمّنان بثًا نشطًا أم لا.
متى يجب الانحناء؟
على الرغم من أنّ الأمر يعود إلى الشركة المصنّعة للمعدات الأصلية في تحديد كيفية تعامل طبقة HAL مع ميزة "تخفيف الصوت"، ننصح باتّباع الإرشادات التالية.
يحدث تشغيل عدة عمليات بث في Android عادةً عندما يحصل تطبيقان أو خدمتان على تركيز الصوت في الوقت نفسه. لمعرفة الحالات التي قد يمنح فيها نظام التشغيل Android التركيز المتزامن، راجِع مصفوفة التفاعل في أنواع القيود. مع طرح إضافة الصوت في السيارة، يعتمد ذلك أيضًا على إدارة AudioFocus.
يتم دمج أي بث معًا بواسطة Android قبل تطبيق أي مكاسب. وبالتالي، يجب توجيه أي بث يجب خفض مستوى صوته عند تشغيله بشكل متزامن مع بث آخر إلى أجهزة إخراج منفصلة حتى يتمكّن HAL من خفض مستوى الصوت قبل مزجهما.
السلوك المقترَح لتخفيف الصوت
في ما يلي التفاعلات المتزامنة المحتملة التي يُنصح بتخفيف صوتها.
| التفاعل | الإجراء |
|---|---|
EMERGENCY
| يخفض مستوى صوت كل الأصوات أو يكتمها باستثناء SAFETY
|
SAFETY |
كتم كل الأصوات باستثناء EMERGENCY |
NAVIGATION |
يتم خفض مستوى صوت كل الأصوات باستثناء SAFETY وEMERGENCY |
CALL |
يتم تجاهل كل شيء باستثناء SAFETY وEMERGENCY وNAVIGATION |
VOICE |
البط CALL_RING |
VEHICLE_SOUNDS |
يمكنك تحديد أهمية الصوت النشط وما إذا كان سيخفض مستوى صوت الأصوات الأخرى أم لا. |
MUSIC وANNOUNCEMENT |
تم تجاهل كل شيء. الاستثناءات هي نغمات التفاعل باللمس التي يتم تشغيلها كـ
SYSTEM_SOUND.
|
اعتبارات عند التهرّب
قد تستخدم بعض التطبيقات والخدمات، مثل تطبيقات التنقّل أو المساعدين الرقميين، مشغّلات متعددة لتنفيذ الإجراءات. تجنَّب خفض مستوى الصوت بشكل كبير عندما يتوقف تدفق البيانات عبر أجهزة الإخراج لضمان عدم عودة مستوى صوت الوسائط إلى الحد الأقصى قبل خفضه قبل بدء التشغيل التالي من شريط التنقل أو تطبيق مساعد.
في المركبات التي تتضمّن مراحل صوتية متعددة مع عزل جيد بما يكفي، يمكنك توجيه الصوت إلى مناطق مختلفة من السيارة بدلاً من خفض مستوى الصوت. على سبيل المثال، يمكن توجيه تعليمات التنقّل إلى مكبّرات الصوت في مسند رأس السائق مع مواصلة تشغيل الموسيقى في جميع أنحاء المقصورة بمستوى صوت عادي.
الأصوات المهمة للسلامة
قدّم الإصدار 11 من نظام التشغيل Android
واجهات برمجة تطبيقات HAL لأولويّة الصوت. تضمن طبقة HAL إعطاء الأولوية للأصوات المهمة المتعلقة بالسلامة على الأصوات الأخرى. إذا كان HAL يحتفظ بتركيز الصوت لمدة USAGE_EMERGENCY، ليس من المضمون ألا تشغّل التطبيقات والخدمات من Android أصواتًا. تحدّد طبقة تجريد الأجهزة (HAL) مصادر الصوت التي يجب مزجها أو كتمها لتشغيل الأصوات المهمة للسلامة.
ضبط واجهة مستخدم إعدادات مستوى الصوت
يفصل نظام التشغيل Android Automotive واجهة مستخدم إعدادات مستوى الصوت عن إعدادات مجموعة مستوى الصوت. يمكن تراكب هذه الإعدادات كما هو موضّح في ضبط مكاسب مجموعة مستوى الصوت. ويضمن هذا الفصل عدم الحاجة إلى إجراء أي تغييرات في حال تغيّر إعداد مجموعات وحدات التخزين.
في واجهة مستخدم إعدادات السيارة، يحتوي packages/apps/Car/Settings/res/xml/car_volume_items.xml
على عناصر واجهة المستخدم (موارد العنوان والرمز) المرتبطة بكل AudioAttributes.USAGE محدّد. يوفّر هذا الملف عرضًا معقولاً VolumeGroups المحدّد من خلال استخدام الموارد المرتبطة بأول استخدام تم التعرّف عليه والمضمّن في كل VolumeGroup.
على سبيل المثال، يحدّد المثال التالي VolumeGroup على أنّه يتضمّن voice_communication وvoice_communication_signalling. يعرض التنفيذ التلقائي لواجهة مستخدم إعدادات السيارة VolumeGroup باستخدام الموارد المرتبطة بـ voice_communication لأنّها أول تطابق في الملف.
<carVolumeItems xmlns:car="http://schemas.android.com/apk/res-auto">
<item car:usage="voice_communication"
car:title="@*android:string/volume_call"
car:icon="@*android:drawable/ic_audio_ring_notif"/>
<item car:usage="voice_communication_signalling"
car:title="@*android:string/volume_call"
car:icon="@*android:drawable/ic_audio_ring_notif"/>
<item car:usage="media"
car:title="@*android:string/volume_music"
car:icon="@*android:drawable/ic_audio_media"/>
<item car:usage="game"
car:title="@*android:string/volume_music"
car:icon="@*android:drawable/ic_audio_media"/>
<item car:usage="alarm"
car:title="@*android:string/volume_alarm"
car:icon="@*android:drawable/ic_audio_alarm"/>
<item car:usage="assistance_navigation_guidance"
car:title="@string/navi_volume_title"
car:icon="@drawable/ic_audio_navi"/>
<item car:usage="notification_ringtone"
car:title="@*android:string/volume_ringtone"
car:icon="@*android:drawable/ic_audio_ring_notif"/>
<item car:usage="assistant"
car:title="@*android:string/volume_unknown"
car:icon="@*android:drawable/ic_audio_vol"/>
<item car:usage="notification"
car:title="@*android:string/volume_notification"
car:icon="@*android:drawable/ic_audio_ring_notif"/>
<item car:usage="notification_communication_request"
car:title="@*android:string/volume_notification"
car:icon="@*android:drawable/ic_audio_ring_notif"/>
<item car:usage="notification_communication_instant"
car:title="@*android:string/volume_notification"
car:icon="@*android:drawable/ic_audio_ring_notif"/>
<item car:usage="notification_communication_delayed"
car:title="@*android:string/volume_notification"
car:icon="@*android:drawable/ic_audio_ring_notif"/>
<item car:usage="notification_event"
car:title="@*android:string/volume_notification"
car:icon="@*android:drawable/ic_audio_ring_notif"/>
<item car:usage="assistance_accessibility"
car:title="@*android:string/volume_notification"
car:icon="@*android:drawable/ic_audio_ring_notif"/>
<item car:usage="assistance_sonification"
car:title="@*android:string/volume_unknown"
car:icon="@*android:drawable/ic_audio_vol"/>
<item car:usage="unknown"
car:title="@*android:string/volume_unknown"
car:icon="@*android:drawable/ic_audio_vol"/>
</carVolumeItems>
يتم تحديد السمات والقيم المستخدَمة في الإعداد أعلاه في
packages/apps/Car/Settings/res/values/attrs.xml. تستخدم واجهة مستخدم إعدادات مستوى الصوت واجهات برمجة التطبيقات المستندة إلى VolumeGroup التالية في CarAudioManager:
getVolumeGroupCount()لمعرفة عدد عناصر التحكّم التي يجب رسمها.getGroupMinVolume()وgetGroupMaxVolume()للحصول على الحدّين الأدنى والأعلى.getGroupVolume()للحصول على مستوى الصوت الحاليregisterVolumeChangeObserver()لتلقّي إشعارات بشأن تغييرات مستوى الصوت
حدث مجموعة مستوى صوت السيارة
تتضمّن حالات استخدام ميزة تعديل مستوى الصوت ومفتاح كتم الصوت في السيارات أسسًا سياقية قد تحدّد إجراءات بعض التطبيقات، مثل إعدادات مستوى الصوت. تقدّم دالة معاودة الاتصال الحالية الخاصة بمستوى الصوت وكتم الصوت من حزمة الصوت في السيارة معلومات سياقية محدودة. لتحسين حالات استخدام السيارات وقابلية التوسّع المستقبلية، تمت إضافة CarVolumeGroupEvent إلى Android 14. يحمل كل حدث ثلاثة أنواع مهمة من المعلومات:
- عدد العناصر في القائمة:
CarVolumeGroupInfo EventTypes(مخطّط بت)- عدد العناصر في القائمة:
ExtraInfos
CarVolumeGroupInfo
يمكن لمستلِم معاودة الاتصال بالحدث الوصول بسهولة إلى قائمة معلومات مجموعة مستوى صوت السيارة المتأثرة. وهذا يعني أنّ التطبيق لا يحتاج إلى إجراء أي طلبات إضافية إلى إطار عمل Car audio للحصول على الحالة الأخيرة. ويمكنه ببساطة استخدام CarVolumeGroupInfos المستلَمة لتعديل واجهة المستخدم أو الحالات الداخلية. لتسهيل الأمر على التطبيقات، يتم أيضًا توفير الجوانب التي تغيّرت في مجموعة من السيارات ضمن EventTypes، كما هو موضّح أدناه.
EventTypes
تحدّد هذه السمة الجانب الذي تم تغييره في CarVolumeGroupInfo. ويمكن للتطبيقات استخدام ذلك
لتحديد التغييرات واتّخاذ الإجراءات المطلوبة. على سبيل المثال، يشير EVENT_TYPE_VOLUME_MAX_INDEX_CHANGED إلى أنّ مؤشر CarVolumeGroups الخاص بالحد الأقصى لمستوى الصوت قد تغيّر ويمكن الاستعلام عنه باستخدام CarVolumeGroupInfo.getMaxVolumeGainIndex().
يوضّح الجدول التالي العلاقة بين EventType وCarVolumeGroupInfo.
| EventType | CarVolumeGroupInfo |
|---|---|
EVENT_TYPE_VOLUME_GAIN_INDEX_CHANGED |
CarVolumeGroupInfo.getVolumeGainIndex() |
EVENT_TYPE_VOLUME_MIN_INDEX_CHANGED |
CarVolumeGroupInfo.getMinVolumeGainIndex() |
EVENT_TYPE_VOLUME_MAX_INDEX_CHANGED |
CarVolumeGroupInfo.getMaxVolumeGainIndex() |
EVENT_TYPE_MUTE_CHANGED |
CarVolumeGroupInfo.isMuted() |
EVENT_TYPE_VOLUME_BLOCKED_CHANGED |
CarVolumeGroupInfo.isBlocked() |
EVENT_TYPE_ATTENUATION_CHANGED |
CarVolumeGroupInfo.isAttenuated() |
EVENT_TYPE_ZONE_CONFIGURATION_CHANGED |
CarVolumeGroupInfo.getAudioAttributes() |
ExtraInfos
تقدّم هذه السمة معلومات إضافية حول سبب تغيُّر CarVolumeGroup. يمكن للتطبيقات استخدام هذه المعلومات لتوفير سياق إضافي إما لتنبيه المستخدم
لاتّخاذ إجراء أو لإرسال إشعار. على سبيل المثال، يشير EXTRA_INFO_TRANSIENT_ATTENUATION_THERMAL
إلى تخفيف مؤقت نشط بسبب الحمل الحراري الزائد. ويمكن للتطبيق إعلام المستخدم إذا حاول رفع مستوى الصوت.
لا نفرض أي عملية على ExtraInfos. ويعود إليك تقدير تحديد العملية استنادًا إلى ExtraInfos. على سبيل المثال، إذا كان التخفيف
مفعّلاً بسبب EXTRA_INFO_TRANSIENT_ATTENUATION_DUCKED، يمكنك أيضًا اختيار
تعتيم واجهة مستخدم شريط مستوى الصوت في البداية لمنع المستخدم من تغيير مستوى الصوت.
يمكن للمستخدمين الآخرين اختيار عرض إشعار بأنّ ميزة "خفض مستوى الصوت" نشطة والسماح للمستخدم بتغيير مستوى الصوت.
يعتمد إطار عمل الصوت في السيارة على AudioControl HAL IAudioGainCallback لتوفير ExtraInfos المقترَحة. لمزيد من المعلومات، يُرجى الاطّلاع على
Audio Gain Callback.
CarVolumeGroupEvent يتوسّع لتلبية الاحتياجات المستقبلية لإطار عمل صوت السيارة. ونحن نخطّط لإتاحة الميزات الجديدة من خلال CarVolumeGroupEvent فقط. ننصح بشدة مطوّري التطبيقات باستخدام CarVolumeGroupEvent للتعامل مع تغييرات مستوى الصوت وكتم الصوت في المجموعات.
دالة معاودة الاتصال بحدث مجموعة مستوى صوت السيارة
يوفّر نظام التشغيل Android 14 دالة رد نداء جديدة للتطبيقات ذات الأذونات المميزة وتطبيقات النظام الأساسي لتسجيل CarVolumeGroupEvents وتلقّي إشعارات بشأنها.
للتسجيل في خدمة معاودة الاتصال، استخدِم
CarAudioManager#registerCarVolumeGroupEventCallback()لإلغاء تسجيل معاودة الاتصال، استخدِم
CarAudioManager#unregisterCarVolumeGroupEventCallback()
إذا سجّل تطبيق باستخدام CarVolumeGroupEventCallback الجديد وCarVolumeCallback القديم، ستكون الأولوية للحدث CarVolumeGroupEventCallbacks.
لم يعُد حزمة الصوت في السيارة تؤدي إلى تشغيل CarVolumeCallback. ويمنع ذلك
عوامل التشغيل المكرّرة للتطبيق نفسه للحدث نفسه.
ننصحك بشدة باستخدام CarVolumeGroupEventCallback لإدارة مستوى الصوت في المجموعة وتغييرات كتم الصوت.
دالة معاودة الاتصال الخاصة بمستوى الصوت
منذ الإصدار 13 من نظام التشغيل Android، يمكن أن يؤدي AudioControl HAL إلى تشغيل ردّ اتصال غير متزامن لإدارة تعديلات مستوى الصوت بسبب التغييرات في نظام الصوت في السيارة.
HAL API
AudioControl @2.0 AIDL
يضيف الإصدار 2.0 من AudioControl AIDL HAL واجهة برمجة التطبيقات التالية:
| واجهة برمجة التطبيقات | الغرض |
|---|---|
IAudioControl#registerGainCallback |
تسجيل مثيل IAudioGainCallback باستخدام AudioControl HAL |
IAudioGainCallback#onAudioDeviceGainsChanged |
دالة ردّ غير متزامنة لإرسال إشعار بالتغييرات التي تم إجراؤها على إعدادات مستوى الصوت. |
يتضمّن ردّ الاتصال في AudioControl HAL قوائم بالأسباب وAudioGainConfigInfo الخاص بكل سبب، ويتألف من:
- رقم تعريف المنطقة
- عنوان منفذ الجهاز
- يمكن أن يكون فهرس الحجم > الفهرس إما فهرسًا محظورًا أو فهرسًا معدَّلاً.
يمكن تصنيف الأسباب بشكل عام على النحو التالي:
- أسباب الحظر تغيير مؤقت في مستوى الصوت وسلوك الكتم
- أسباب التعديل تغيير دائم في سلوك مستوى الصوت
أنواع القيود
اعتبارًا من AudioControl HAL AIDL V3، إليك أنواع القيود المتاحة:
- كتم الصوت
- تؤدي إلى الحظر
- القيد
- التوهين
| القيود النشطة | تغيير مستوى الصوت من قِبل المستخدم | زر تفعيل أو إيقاف كتم الصوت الذي يتحكّم فيه المستخدم |
|---|---|---|
| كتم الصوت | ❌ | ❌ (إعادة الصوت) ✔ (كتم الصوت) |
| تؤدي إلى الحظر | ❌ | ✔ |
| القيد | ❌ (تجاوز الحدّ الأقصى) ✔ (ضمن الحدّ الأقصى) |
✔ |
| التوهين | ✔ | ✔ |
ترتيب الأولوية بين القيود هو كتم الصوت > الحظر > الحدّ > التخفيف.
قيود كتم الصوت
في ما يلي القيود المفروضة على كتم الصوت:
Reasons.TCU_MUTEReasons.REMOTE_MUTE
يحتفظ إطار عمل الصوت في السيارة داخليًا بحالتَي كتم الصوت التاليتَين:
كتم صوت المستخدم يتم التبديل استنادًا إلى طلب من المستخدِم، إما من خلال
CarAudioManagerأو الأحداث الرئيسية.كتم صوت HAL يتم التبديل استنادًا إلى القيود المفروضة على كتم الصوت التي تم تلقّيها من خلال
AudioGaincallback.
بالنسبة إلى المستمعين، مثل تطبيق "الإعدادات"، ستستند حالة كتم الصوت العام لمجموعة الصوت
(CarVolumeGroupInfo.isMuted()) إلى ما إذا كان أي من عمليات كتم الصوت
المذكورة أعلاه مفعّلاً.
عند تفعيل ميزة كتم الصوت في HAL، يتم تجاهل جميع طلبات تغيير مستوى الصوت الواردة وطلبات إلغاء كتم الصوت في المجموعة طوال مدة القيود.
حالة التفاعل: يكون كتم الصوت في طبقة تجريد الأجهزة (HAL) مفعّلاً ويطلب المستخدم تبديل حالة كتم الصوت
عند تفعيل ميزة "كتم صوت مساعد Google" وإيقاف ميزة "كتم صوت المستخدم":
- تم تغيير حالة كتم الصوت الإجمالية لمجموعة الصوت إلى
true. - ستتم معالجة الطلبات المقدَّمة من المستخدم لتفعيل ميزة كتم الصوت.
- السبب: يجب الاستجابة لطلبات المستخدمين بكتم الصوت في جميع الأوقات للحفاظ على خصوصيتهم.
عند تفعيل خيار كتم الصوت في طبقة تجريد الأجهزة (HAL) وخيار كتم الصوت من قِبل المستخدم:
تم تغيير حالة كتم الصوت الإجمالية لمجموعة الصوت إلى
true.سيتم
NOTمعالجة الطلبات التي يرسلها المستخدم لإيقاف ميزة كتم الصوت. ستبقى حالة كتم صوت المستخدم المخزّنة مؤقتًا مفعّلة.السبب: لن يتم قبول طلبات إلغاء كتم الصوت إلا في حال عدم وجود قيود نشطة.
السبب: قد تؤدي إعادة الصوت إلى تشغيل صوت غير مقصود وتعريض سلامة المستخدم للخطر. ويكون ذلك صحيحًا بشكل خاص إذا تم تفعيل حالة كتم الصوت في جميع دورات تشغيل السيارة، ما يقلّل من إدراك المستخدمين لمستوى الصوت.
حالة التفاعل: تم تفعيل وإيقاف كتم صوت HAL بدون أي تغييرات في كتم صوت المستخدم
سيؤدي تبديل كتم صوت HAL إلى تغيير حالة كتم الصوت الإجمالية لمجموعة الصوت. ومع ذلك، لا تعدّل هذه الطريقة حالة كتم صوت المستخدم مباشرةً. عندما تكون ميزة "كتم صوت المستخدم" غير مفعّلة ويتم تلقّي ردّ الاتصال HAL mute لتفعيلها:
- تم تغيير حالة كتم الصوت الإجمالية لمجموعة الصوت إلى
true. ستتم معالجة طلبات المستخدم بتغيير مستوى الصوت
NOTأثناء تفعيل كتم الصوت في HAL.السبب: لا يمكن للمستخدم سماع الصوت عندما يكون كتم الصوت مفعّلاً. قد يؤدي السماح بتغيير مستوى الصوت إلى حدوث انفجار صوتي وتعريض سلامة المستخدم للخطر.
السبب: يمكن لتطبيقات مستوى الصوت تسجيل عمليات رد الاتصال وتفعيل كتم الصوت تلقائيًا (CarAudioManager.setVolumeGroupMute(...,/* mute=*/ true,..)) بدون تدخّل المستخدم، إذا كان هذا السلوك متوقعًا من قِبل الشركة المصنّعة للجهاز الأصلي.
عند إيقاف ميزة كتم الصوت في HAL مع إيقاف ميزة كتم الصوت في التطبيق:
تم تغيير حالة كتم صوت مجموعة الصوت إلى
false.السبب: قد يؤدي جعل حالة كتم الصوت ثابتة وطلب إلغاء كتم الصوت من المستخدم إلى مقاطعة المستخدم بلا داعٍ عندما يتم التبديل بين حالات كتم الصوت بشكل متكرر.
ستتم معالجة طلبات المستخدمين بتغيير مستوى الصوت بشكل طبيعي.
تؤدي إلى الحظر
قيود الحظر هي:
Reasons.FORCED_MASTER_MUTEReasons.REMOTE_MUTEReasons.TCU_MUTE.
عندما تكون قيود الحظر مفعَّلة، سيتم حظر الطلبات من المستخدمين لإجراء ما يلي:
- لن تتم معالجة تغيير مستوى الصوت.
- تتم معالجة عمليات إيقاف أو تفعيل كتم الصوت.
القيد
في ما يلي القيود المفروضة على استخدام هذه الميزة:
Reasons.THERMAL_LIMITATIONReasons.SUSPEND_EXIT_VOL_LIMITATION
عندما تكون قيود "الوصول المحدود" مفعَّلة، ستظهر للمستخدمين الطلبات التالية:
تغيير مستوى الصوت:
- تتم معالجة البيانات ضمن القيود
- لا تتم معالجة البيانات التي تتجاوز الحدّ الأقصى المذكور أعلاه.
تتم معالجة عمليات إيقاف أو تفعيل كتم الصوت.
التوهين
قيود التوهين هي:
Reasons.ADAS_DUCKINGReasons.NAV_DUCKINGReasons.PROJECTION_DUCKING
عندما تكون قيود التخفيف نشطة، سيتم منع المستخدمين من إجراء ما يلي:
تتم معالجة تغييرات مستوى الصوت. يتم ضبط مستوى الصوت الحالي الجديد على مستوى الصوت المخفَّض (بدلاً من مستوى الصوت السابق). يتم إجراء تغييرات مستوى الصوت المستقبلية من هذا المستوى.
تمت معالجة زر إيقاف أو تفعيل كتم الصوت.
تعديل الفهرس
يُعدّ ما يلي تعديلاً غير متزامن لفهرس مستوى الصوت:
Reasons.EXTERNAL_AMP_VOL_FEEDBACK.
وباستخدام هذا السبب، يمكن أن تعدّل طبقة تجريد الأجهزة (HAL) الخاصة بـ AudioControl الفهرس الحالي لمجموعة مستوى الصوت إلى الفهرس المحدّد. يُستخدَم هذا الإجراء بشكل أساسي لتقديم ملاحظات من نظام الصوت
بشأن طلب تغيير مستوى الصوت الوارد من إطار عمل صوت السيارة. يتم أيضًا إبلاغ التطبيقات بتحديث الفهرس من خلال ردّ الاتصال CarVolumeGroupEvent لمزامنة الفهرس.
أمثلة
حالة الاستخدام: يعدّل المستخدم مؤشر مستوى الصوت إلى 30
يستخدم المستخدم تطبيق "مستوى الصوت" لتغيير مؤشر مستوى الصوت إلى 30.
يتم تحويل هذا الفهرس إلى مستوى الصوت المُكتسَب وإرساله إلى Audio HAL.
تتلقّى عمليات تنفيذ المورّدين
Audio HALمستوى الصوت الجديد ويتم تعديل نظام الصوت (مثل مضخّم الصوت الخارجي).يستجيب نظام الصوت بأنّه تم تعديل مستوى الصوت إلى الفهرس 15 فقط (لأسباب غير معروفة لنظام التشغيل Android).
عمليات تنفيذ عوامل تشغيل
AudioControl HALمن قِبل المورّدين:IAudioGainCallback.onAudioDeviceGainsChanged(EXTERNAL_AMP_VOL_FEEDBACK, {..., 15 /* New index */})تستهلك خدمة الصوت في السيارة الفهرس الجديد من دالة الرجوع التي يتم استخدامها للحفاظ على البيانات ودوال الرجوع إلى تطبيق الصوت. الفهرس الذي يطلبه المستخدم هو 30. ومع ذلك، فإنّ تحديثات الملاحظات غير المتزامنة لنظام الصوت تعدّل الفهرس إلى 15.
حالة الاستخدام: تشغيل الصوت لأول مرة بعد الخروج من وضع التعليق
تم ضبط مؤشر مستوى الصوت قبل التعليق على مستوى عالٍ يبلغ 95 (النطاق: [0-99]).
يدخل Android في وضع التعليق.
بعد أن يتم إيقاف Android مؤقتًا (على سبيل المثال، استئنافه):
تطبِّق الجهة الخارجية
Audio HAL/AudioControl HALمؤشر أمان يبلغ 30 على نظام الصوت محليًا.يُفعّل المورّد
AudioControl HALأيضًا دالة معاودة الاتصال للفهرس الآمن:
IAudioGainCallback.onAudioDeviceGainsChanged(SUSPEND_EXIT_VOL_LIMITATION, {..., 30 /* safe index */})تستهلك خدمة الصوت في السيارة الفهرس الجديد من دالة الرجوع التي يتم استخدامها للحفاظ على البيانات ودوال الرجوع الخاصة بها لمزامنة الفهرس مع تطبيق مستوى الصوت. يبلغ مؤشر مستوى الصوت قبل التعليق 95. ومع ذلك، بعد الاستئناف، يتم ضبط هذا الفهرس على مستوى صوت آمن يبلغ 30 من خلال
AudioControl HAL.
إعدادات مستوى الصوت الديناميكية
بالنسبة إلى هذه الميزة، نأخذ في الاعتبار حالات الاستخدام الأساسية التالية:
ضبط إعدادات المركبة في نهاية خط الإنتاج
يفضّل مصنّعو السيارات تعديل إعدادات مستوى الصوت عند إيقاف السيارة نهائيًا استنادًا إلى إعداد نظام الصوت في السيارة. ويكون ذلك عادةً عبارة عن تحميل جانبي بدون تعديل صورة برنامج Android.
قد تحتاج شركات صناعة السيارات إلى تعديل إعدادات مستوى الصوت خلال جدول الصيانة.
إعدادات وقت التشغيل: تتيح أنظمة الصوت في السيارات إعدادات مكبّرات الصوت الخارجية، وقد تستضيف وحدات التحكّم الإلكترونية هذه إعدادات نطاق مستوى الصوت التي يتم طلبها أثناء وقت التشغيل.
الإعداد عند الطلب: يتم تقديم هذه الميزة لتلبية الحاجة المتزايدة إلى ميزات الصوت المستندة إلى الطلب، والتي يشترك فيها المستخدمون في معالجة محسّنة للإشارات لفترة زمنية معيّنة. تكون إعدادات نطاق الصوت الجديدة صالحة طوال مدة الاشتراك.
تصميم
يتم ضبط مستوى الصوت الديناميكي على ثلاث مراحل:
استكشاف المحتوى: تكتشف عملية تنفيذ AudioControl HAL الخاصة بالمورّد آخر التعديلات على نطاق مستوى الصوت من خلال آلية مخصّصة للاتصال بين العمليات (IPC) يملكها المورّد.
بعد اكتشافها، يتم إنشاء دالة رد الاتصال من خلال
AudioControl::IModuleChangeCallback.تعديل تعدّل حزمة الصوت في السيارة حالات مجموعة الصوت باستخدام نطاقات الصوت الجديدة.
يتم بذل جهود للحفاظ على مستوى الصوت نفسه بعد تعديل نطاق الصوت. ومع ذلك، إذا كان الفهرس خارج النطاق، يتم ضبط فهرس مستوى الصوت الحالي على قيمة آمنة. على سبيل المثال، المستوى التلقائي الذي يوفّره المورّد أثناء عملية معاودة الاتصال.
معاودة الاتصال:
بعد تعديل نطاقات مجموعة مستوى الصوت، سيؤدي حزمة برامج تشغيل الصوت في السيارة إلى تفعيل دالة ردّ لطلبات التطبيقات المسجّلة من خلال
CarVolumeGroupEventCallback.تحمل السمة
CarVolumeGroupEventالسمةCarVolumeGroupInfoالمعدَّلة ونوع الحدث (التغيير الذي تم إجراؤه) والمعلومات الإضافية (سبب التغيير).
الشكل 2: إعدادات مستوى الصوت الديناميكية
HAL API
AudioControl @ 3.0 AIDL
يقدّم الإصدار 3.0 من واجهة AudioControl AIDL HAL واجهات برمجة التطبيقات التالية:
| واجهة برمجة التطبيقات | |
|---|---|
| IAudioControl#setModuleChangeCallback | تضبط هذه الدالة مثيلاً من IModuleChangeCallback باستخدام AudioControl HAL. |
| IAudioControl#clearModuleChangeCallback | يمحو مثيل IModuleChangeCallback الذي تم ضبطه سابقًا باستخدام واجهة HAL الخاصة بـ AudioControl. |
| IModuleChangeCallback#onAudioPortsChanged | دالة رد الاتصال لإرسال إشعارات بالتغييرات التي تطرأ على AudioPorts |
التسلسل
يظهر أدناه مخطط التسلسل لإعدادات مستوى الصوت الديناميكية.
الشكل 3: مخطط تسلسلي لإعدادات مستوى الصوت الديناميكي
الجوانب الرئيسية
لتحسين هذه الميزة، يُرجى مراعاة ما يلي:
يجب أن تتطابق منافذ الصوت المقدَّمة كجزء من معاودة الاتصال مع تعريف Automotive BUS:
- منفذ الجهاز:
IN_DEVICE،OUT_DEVICE - الاتصال:
BUS - العنوان: محدّد في تعريف Audio HAL
- وضع "الكسب":
JOINT
- منفذ الجهاز:
يجب أن يحدّد المورّدون مجموعة فرعية من تعريفات نطاق مستوى الصوت في سياسة Audio HAL واستخدام وظيفة معاودة الاتصال لتخصيصها حسب فئات المركبات. يمكنك الاطّلاع على تعريف AIDL الخاص بـ
IModuleChangeCallbacلمزيد من المعلومات.عندما ينتمي أكثر من ناقل صوت واحد إلى مجموعة مستوى الصوت نفسها، يجب أن تتطابق تعريفات نطاق مستوى الصوت. ويؤدي عدم الالتزام بذلك إلى رفض إطار عمل الصوت في السيارة لتعريف نطاق مستوى الصوت الجديد.