تتوفّر إدارة مستوى الصوت في 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
في سجلات RRO الخاصة بخدمة السيارة.
يمكنك تحديد إدخالات activationVolumeConfig
متعددة في activationVolumeConfigs
، يمثّل كل منها إعدادًا مختلفًا للحد الأدنى والأقصى للتفعيل. كل activationVolumeConfig
:
- يجب أن يحتوي على
name
فريد في ملف إعدادات صوت السيارة، حتى يمكن الرجوع إليه في مجموعة مستوى الصوت (group
) لاحقًا. - يجب أن يحتوي على
activationVolumeConfigEntry
واحد فقط.
يحتوي كل activationVolumeConfig
على السمات التالية:
-
minActivationVolumePercentage
(عدد صحيح، من 0 إلى 100، اختياري، القيمة التلقائية: 0): تحدّد هذه السمة الحد الأدنى لمستوى التفعيل كنسبة مئوية. -
maxActivationVolumePercentage
(عدد صحيح، من 0 إلى 100، اختياري، القيمة التلقائية: 100): تحدّد الحد الأقصى لحجم التفعيل كنسبة مئوية.
invocationType
(سلسلة، اختياري، القيمة التلقائية:onPlaybackChanged
): تحدّد الشروط التي يتم بموجبها تطبيق الحد الأدنى والأقصى لحجم التفعيل:-
onBoot
: يتم تطبيقه فقط على أول عملية تشغيل جديدة نشطة في مجموعة مستوى الصوت بعد إعادة التشغيل. -
onSourceChanged
: يتم تطبيقه فقط على تشغيل نشط حديثًا مع تغيير التطبيق أو مصدر المعرّف الفريد (UID) في مجموعة مستوى الصوت. onPlaybackChanged
: يتم تطبيقها على كل عملية تشغيل جديدة نشطة في مجموعة وحدات تخزين.
-
يدير CarAudioService
الحدّ الأدنى والأقصى للتنشيط من خلال مراقبة المكوّنات الفرعية الصوتية النشطة حاليًا التالية:
- مقاطع التشغيل النشطة الحالية
- حالة المكالمة الحالية
- طلب التركيز الصوتي الحالي من طبقة تجريد الأجهزة (HAL) الخاصة بالتحكّم في الصوت، حيث يشير طلب التركيز الصوتي من طبقة تجريد الأجهزة (HAL) الخاصة بالتحكّم في الصوت إلى أنّه يتم تشغيل الصوت بشكل نشط خارج نظام التشغيل Android
تعرض الصورة التالية نظرة عامة شاملة على الحد الأدنى والحد الأقصى لإدارة حجم التنشيط:
الشكل 1. الحدّ الأدنى والأقصى لمسارات بيانات الصوت النشطة لإدارة مستوى التفعيل
باستخدام minActivationVolumePercentage
وmaxActivationVolumePercentage
، الحد الأدنى والأقصى لمؤشر زيادة مستوى الصوت، يمكنك احتساب الحد الأدنى والأقصى لمؤشر زيادة مستوى الصوت لكل مجموعة من مجموعات مستوى الصوت. CarAudioService
يراقب كل عملية تشغيل نشطة حديثًا ويطبّق الحدّ الأدنى والأقصى لمستوى الصوت
عند التنشيط في الحالات التالية:
- أنواع التنشيط المتطابقة: يجب أن يتطابق نوع تنشيط التشغيل (المستمد من "مدير الصوت" أو Audio Control HAL أو Telephony Manager) مع
invocationType
المحدّد فيactivationVolumeConfigEntry
المرتبط بمجموعة مستوى الصوت. فهرس مستوى الصوت خارج النطاق: يجب أن يقع فهرس مستوى الصوت الحالي لمجموعة مستوى الصوت خارج نطاق فهرس مستوى الصوت المحدّد للتفعيل، وتحديدًا، يجب أن يكون أحد ما يلي صحيحًا:
الفهرس أقل من الحد الأدنى المحسوب لمعدل اكتساب التفعيل.
أو
الفهرس أعلى من الحد الأقصى المحسوب لمؤشر زيادة حجم التنشيط.
في حال توفّر تطابق بين عمليات التفعيل، سيتم تعديل مؤشر زيادة مستوى الصوت لمجموعة الصوت إلى إحدى القيم التالية:
الحدّ الأدنى لمؤشر مستوى الصوت عند التفعيل إذا كان أقل من الحدّ الأدنى لمؤشر مستوى الصوت عند التفعيل
أو
الحد الأقصى لمؤشر مستوى الصوت النشط إذا كان أعلى من الحد الأقصى لمؤشر مستوى الصوت النشط
بالإضافة إلى ذلك، يتم إرسال حدث مجموعة مستوى الصوت في السيارة الذي يتضمّن نوع الحدث
EVENT_TYPE_VOLUME_GAIN_INDEX_CHANGED
إلى جميع عمليات معاودة الاتصال المسجّلة الخاصة بأحداث مجموعة مستوى الصوت.
التعامل مع أحداث مفتاح التحكّم بمستوى الصوت
يحدّد نظام التشغيل Android عدة رموز مفاتيح للتحكّم في مستوى الصوت، بما في ذلك:
KEYCODE_VOLUME_UP
KEYCODE_VOLUME_DOWN
KEYCODE_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 HAL. تتطلّب واجهات برمجة التطبيقات هذه توفّر
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. أتاح الإصدار 11 من نظام التشغيل Android أيضًا إمكانية تطبيق المؤثرات الصوتية على أجهزة الإخراج. وبذلك، يمكن إدارة التلاشي والتوازن بشكل بديل من خلال المؤثرات الصوتية على أجهزة الإخراج المناسبة بدلاً من استخدام واجهات برمجة التطبيقات هذه.
تجنب التداخل مع أصوات أخرى
يحدث خفض مستوى الصوت عندما تخفض المركبة مستوى الصوت في بث واحد ليتم سماع بث آخر يتم تشغيله في الوقت نفسه بشكل أوضح. في 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
يمكن للمستلِم لوظيفة معاودة الاتصال الخاصة بالحدث الوصول بسهولة إلى قائمة معلومات مجموعة مستوى الصوت المتأثرة في السيارة. وهذا يعني أنّ التطبيق لا يحتاج إلى إجراء أي طلبات إضافية إلى إطار عمل "صوت السيارة" للحصول على الحالة الأخيرة. ويمكنه ببساطة استخدام 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_MUTE
Reasons.REMOTE_MUTE
يحتفظ إطار عمل الصوت في السيارة داخليًا بحالتَي كتم الصوت التاليتَين:
كتم صوت المستخدم يتم التبديل استنادًا إلى طلب من المستخدِم، إما من خلال
CarAudioManager
أو الأحداث الرئيسية.كتم صوت HAL: يتم التبديل استنادًا إلى القيود المفروضة على كتم الصوت التي تم تلقّيها من خلال
AudioGain
callback.
بالنسبة إلى التطبيقات التي تستمع إلى الصوت، مثل تطبيق "الإعدادات"، ستستند حالة كتم الصوت العام لمجموعة الصوت
(CarVolumeGroupInfo.isMuted()
) إلى ما إذا كان أي من عمليات كتم الصوت المذكورة أعلاه مفعّلاً.
عند تفعيل ميزة كتم الصوت في HAL، يتم تجاهل جميع طلبات تغيير مستوى الصوت الواردة وطلبات إلغاء كتم الصوت في المجموعة طوال مدة القيود.
حالة التفاعل: تفعيل كتم الصوت في طبقة تجريد الأجهزة (HAL) وطلب المستخدم تبديل حالة كتم الصوت
عند تفعيل ميزة كتم الصوت في HAL وإيقاف ميزة كتم الصوت للمستخدم:
- تم تغيير حالة كتم الصوت العام لمجموعة الصوت إلى
true
. - ستتم معالجة الطلبات المقدَّمة من المستخدم لتفعيل كتم الصوت.
- السبب: يجب الاستجابة لطلبات المستخدمين بكتم الصوت في جميع الأوقات للحفاظ على خصوصيتهم.
عند تفعيل خيار كتم الصوت في طبقة تجريد الأجهزة (HAL) وخيار كتم الصوت من قِبل المستخدم:
تم تغيير حالة كتم الصوت العام لمجموعة الصوت إلى
true
.ستتم معالجة طلبات المستخدمين لإيقاف ميزة كتم الصوت
NOT
. تظل حالة كتم صوت المستخدم المخزّنة مؤقتًا مفعّلة.السبب: لن يتم قبول طلبات إلغاء كتم الصوت إلا في حال عدم وجود قيود نشطة.
السبب: قد تؤدي إزالة كتم صوت المستخدم المخزّن مؤقتًا إلى حدوث انفجار صوتي غير مقصود وتعريض سلامة المستخدم للخطر. ويزداد احتمال حدوث ذلك بشكل خاص إذا تم تفعيل حالة كتم الصوت خلال دورات تشغيل متعددة، ما يقلّل من إدراك المستخدمين لمستوى الصوت.
حالة التفاعل: تم تفعيل كتم الصوت في طبقة تجريد الأجهزة (HAL) وإيقافه بدون أي تغييرات في كتم صوت المستخدم
سيؤدي تبديل كتم صوت HAL إلى تغيير حالة كتم الصوت الإجمالية لمجموعة الصوت. ومع ذلك، لا يتم تعديل حالة كتم صوت المستخدم مباشرةً. عندما تكون ميزة "كتم صوت المستخدم" غير مفعّلة ويتم تلقّي ردّ الاتصال HAL mute لتفعيلها:
- تم تغيير حالة كتم الصوت العام لمجموعة الصوت إلى
true
. ستتم معالجة طلبات المستخدم بتغيير مستوى الصوت
NOT
أثناء تفعيل ميزة كتم الصوت في HAL.السبب: لا يمكن للمستخدم سماع الصوت عندما يكون كتم الصوت مفعّلاً. قد يؤدي السماح بتغيير مستوى الصوت إلى حدوث انفجار صوتي وتعريض سلامة المستخدم للخطر.
السبب: يمكن لتطبيقات مستوى الصوت تسجيل عمليات رد الاتصال وتفعيل إلغاء كتم الصوت تلقائيًا (CarAudioManager.setVolumeGroupMute(...,/* mute=*/ true,..)) بدون تدخّل المستخدم، إذا كان هذا السلوك متوقعًا من الشركة المصنّعة للمعدات الأصلية.
عندما يكون كتم الصوت في HAL غير مفعّل بينما يكون كتم الصوت في تطبيق المستخدم غير مفعّل:
تم تغيير حالة كتم صوت مجموعة الصوت إلى
false
.السبب: قد يؤدي تثبيت حالة كتم الصوت وطلب إلغاء كتم الصوت من المستخدم إلى مقاطعة المستخدم بلا داعٍ عند التبديل بين حالات كتم الصوت بشكل متكرر.
ستتم معالجة طلبات المستخدمين لتغيير مستوى الصوت بشكل طبيعي.
تؤدي إلى الحظر
قيود الحظر هي:
Reasons.FORCED_MASTER_MUTE
Reasons.REMOTE_MUTE
Reasons.TCU_MUTE
.
عندما تكون قيود الحظر مفعَّلة، سيتم رفض طلبات المستخدمين التالية:
- لن تتم معالجة تغيير مستوى الصوت.
- تتم معالجة طلبات إيقاف أو تفعيل كتم الصوت.
القيود
قيود الحد الأقصى هي:
Reasons.THERMAL_LIMITATION
Reasons.SUSPEND_EXIT_VOL_LIMITATION
عندما تكون قيود "الوصول المحدود" مفعَّلة، سيتم حظر الطلبات التالية من المستخدمين:
تغيير مستوى الصوت:
- تتم معالجة البيانات ضمن القيود
- لا تتم معالجة البيانات التي تتجاوز الحدّ الأقصى المذكور أعلاه.
تتم معالجة طلبات إيقاف أو تفعيل كتم الصوت.
التوهين
قيود التوهين هي:
Reasons.ADAS_DUCKING
Reasons.NAV_DUCKING
Reasons.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. ومع ذلك، بعد الاستئناف، يضبط
AudioControl HAL
هذا الفهرس على مستوى صوت آمن يبلغ 30.
إعدادات مستوى الصوت الديناميكية
بالنسبة إلى هذه الميزة، نأخذ في الاعتبار حالات الاستخدام الأساسية التالية:
ضبط المركبة في نهاية خط الإنتاج
يفضّل مصنّعو السيارات تعديل إعدادات مستوى الصوت عند إيقاف السيارة نهائيًا استنادًا إلى إعداد نظام الصوت في السيارة. ويكون ذلك عادةً عبارة عن تحميل جانبي بدون تعديل صورة برنامج Android.
قد تحتاج شركات صناعة السيارات إلى تعديل إعدادات مستوى الصوت خلال جدول الصيانة.
إعدادات وقت التشغيل: تتيح أنظمة الصوت في السيارات إعدادات مكبّر الصوت الخارجي، وقد تستضيف وحدات التحكّم الإلكترونية هذه إعدادات نطاق مستوى الصوت التي يتم طلبها أثناء وقت التشغيل.
الإعداد عند الطلب: يتم تقديم هذه الميزة لتلبية الحاجة المتزايدة إلى ميزات صوتية مستندة إلى الطلب، حيث يشترك المستخدمون في معالجة محسّنة للإشارات لفترة زمنية معيّنة. تكون إعدادات نطاق الصوت الجديدة صالحة طوال مدة الاشتراك.
التصميم
يتم ضبط مستوى الصوت الديناميكي على ثلاث مراحل:
استكشاف المحتوى: تكتشف عملية تنفيذ AudioControl HAL الخاصة بالمورّد آخر التعديلات على نطاق مستوى الصوت من خلال آلية مخصّصة للاتصال بين العمليات (IPC) يملكها المورّد.
بعد اكتشافها، يتم إنشاء دالة رد الاتصال من خلال
AudioControl::IModuleChangeCallback
.تعديل تعدّل حزمة الصوت في السيارة حالات مجموعة مستوى الصوت باستخدام نطاقات مستوى الصوت الجديدة.
يتم بذل جهود للحفاظ على مستوى الصوت نفسه بعد تعديل نطاق مستوى الصوت. ومع ذلك، إذا كان الفهرس خارج النطاق، يتم ضبط فهرس مستوى الصوت الحالي على قيمة آمنة. على سبيل المثال، المستوى التلقائي الذي يوفّره المورّد أثناء عملية رد الاتصال.
معاودة الاتصال:
بعد تعديل نطاقات مجموعات مستوى الصوت، سيؤدي حزمة برامج الصوت في السيارة إلى تشغيل دالة رد الاتصال للتطبيقات المسجّلة من خلال
CarVolumeGroupEventCallback
.تحمل السمة
CarVolumeGroupEvent
السمتَينCarVolumeGroupInfo
وEvent-type (نوع التغيير) المعدَّلتَين، بالإضافة إلى Extra-info (سبب التغيير).
الشكل 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
لمزيد من المعلومات.عندما ينتمي أكثر من مسار صوتي واحد إلى مجموعة مستوى الصوت نفسها، يجب أن تتطابق تعريفات نطاق مستوى الصوت. ويؤدي عدم الالتزام بذلك إلى رفض إطار عمل الصوت في السيارة لتعريف نطاق مستوى الصوت الجديد.