تتضمّن إدارة الصوت 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="2.0">
<zones>
<zone name="primary zone" isPrimary="true">
<volumeGroups>
<group>
<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>
</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 عدة رموز مفاتيح للتحكّم في مستوى الصوت، بما في ذلك:
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. وفّر نظام التشغيل 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 audio focus APIs. يضمن HAL منح الأولوية للأصوات المهمة للسلامة على الأصوات الأخرى. إذا كان HAL يحافظ على تركيز الصوت
لنظام التشغيل USAGE_EMERGENCY
، لا يمكن ضمان أن التطبيقات والخدمات من
Android لن تشغّل الأصوات. يحدِّد HAL مصادر البث من Android التي يجب
مزجها أو كتم صوتها لتشغيل الأصوات المهمة للسلامة.
ضبط واجهة مستخدم إعدادات مستوى الصوت
يفصل نظام التشغيل AAOS واجهة مستخدم إعدادات الصوت عن إعدادات مجموعة الصوت. ويمكن تداخل هذه العناصر كما هو موضّح في ضبط مكاسب مجموعة الحجم. يضمن هذا الفصل عدم الحاجة إلى إجراء أي تغييرات في حال تغيّر إعدادات مجموعات مجلدات التخزين.
في واجهة مستخدم إعدادات السيارة، يحتوي 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
واجهة برمجة التطبيقات 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 callback لتفعيله:
- تم تغيير حالة كتم الصوت العامة لمجموعة مستوى الصوت إلى
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 الخاصة بإدارة الصوت تعديل الفهرس الحالي لمجموعة مستوى الصوت
إلى الفهرس المحدَّد. يُستخدَم هذا الإجراء بشكل أساسي كتعليقات من نظام الصوت
لطلب تغيير مستوى الصوت من إطار عمل Car audio. يتم أيضًا إرسال تعديل الفهرس
إلى التطبيقات كطلب استدعاء CarVolumeGroupEvent
لمزامنة
الفهرس.
أمثلة
حالة الاستخدام: يُعدِّل المستخدم مؤشر مستوى الصوت إلى 30
يستخدم المستخدم تطبيق Volume لتغيير مؤشر مستوى الصوت إلى 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
.
ضبط مستوى الصوت الديناميكي
بالنسبة إلى هذه الميزة، نأخذ في الاعتبار حالات الاستخدام الأساسية التالية:
إعدادات نهاية عمر المركبة (EOL)
يفضّل صانعو السيارات تعديل إعدادات مستوى الصوت عند نهاية عمر المنتج استنادًا إلى إعدادات نظام الوسائط في المركبة. وعادةً ما يكون هذا الإجراء عبارة عن تحميل من مصدر غير معروف بدون تعديل صورة برنامج Android.
قد يحتاج صانعو السيارات إلى تعديل إعدادات مستوى الصوت أثناء جدول الصيانة.
إعدادات وقت التشغيل: تتيح أنظمة الصوت في السيارات ضبط ملفّات برمجية خارجية لوحدة التحكّم في الإشعال (ECU)، وقد تستضيف هذه الوحدات ملفّات برمجية لضبط نطاق مستوى الصوت يتم الاستعلام عنها أثناء عملية التشغيل.
الضبط عند الطلب: يتم توفيرها لتلبية الحاجة المتزايدة إلى ميزات الصوت المستندة إلى الطلب التي يشترك فيها المستخدمون في معالجة إشارة محسّنة لفترة زمنية. تكون إعدادات نطاق مستوى الصوت الجديدة صالحة طوال مدة الاشتراك.
التصميم
يتم ضبط مستوى الصوت الديناميكي في ثلاث مراحل:
الاقتراحات: يكتشف تنفيذ HAL للتحكم في الصوت لدى البائع تحديثات نطاق مستوى الصوت الجديدة من خلال آلية IPC مخصصة يملكها المورد.
بعد رصدها، يتم إنشاء مكالمة تلقائية من خلال
AudioControl::IModuleChangeCallback
.تعديل تعدِّل حِزمة الصوت في السيارة حالات مجموعة الصوت باستخدام نطاقات الصوت الجديدة.
يتم بذل الجهود للحفاظ على مستوى الصوت نفسه بعد تعديل نطاق الصوت. ومع ذلك، إذا خرج المؤشر عن الحدود المسموح بها، يتم ضبط مؤشر مستوى الصوت الحالي على قيمة آمنة. على سبيل المثال، المستوى التلقائي الذي يوفّره المورّد أثناء إعادة الاتصال.
معاودة الاتصال:
بعد تعديل نطاق مجموعة مستوى الصوت، يبدأ تجميع الصوت في السيارة عملية استدعاء ل التطبيقات المسجّلة من خلال
CarVolumeGroupEventCallback
.تحتوي السمة
CarVolumeGroupEvent
على السمةCarVolumeGroupInfo
المعدّلة وEvent-type (ما الذي تغيّر) وExtra-info (سبب التغيّر).
الشكل 1: ضبط مستوى الصوت الديناميكي
واجهة برمجة التطبيقات HAL
AudioControl @ 3.0 AIDL
يقدّم الإصدار 3.0 من AudioControl AIDL HAL واجهات برمجة التطبيقات التالية:
واجهة برمجة التطبيقات | |
---|---|
IAudioControl#setModuleChangeCallback | تُعدّ مثيلًا من IModuleChangeCallback باستخدام AudioControl HAL. |
IAudioControl#clearModuleChangeCallback | تُزيل هذه الوظيفة مثيل IModuleChangeCallback الذي تم ضبطه سابقًا باستخدام واجهة برمجة التطبيقات AudioControl HAL. |
IModuleChangeCallback#onAudioPortsChanged | تلقّي مكالمة للردّ على إشعارات التغييرات في AudioPorts |
التسلسل
يظهر أدناه مخطّط تسلسل إعداد وحدة التخزين الديناميكية.
الشكل 2: مخطّط تسلسل لإعداد مستوى الصوت الديناميكي
الجوانب الرئيسية
لتحسين هذه الميزة، اتّبِع الخطوات التالية:
يجب أن تتطابق AudioPorts المقدَّمة كجزء من طلب إعادة الاتصال مع تعريف Automotive BUS:
- منفذ الجهاز:
IN_DEVICE
،OUT_DEVICE
- الاتصال:
BUS
- العنوان: محدّد في تعريف Audio HAL
- وضع الكسب:
JOINT
- منفذ الجهاز:
يجب أن يحدِّد المورّدون مجموعة فائقة من تعريفات نطاق مستوى الصوت في سياسة Audio HAL وأن يستخدموا دالة الاستدعاء لتخصيصها لأنواع المركبات. يمكنك الاطّلاع على
IModuleChangeCallbac
تعريف AIDL للحصول على مزيد من المعلومات.عندما ينتمي أكثر من ناقل بيانات صوتي واحد إلى مجموعة مستوى الصوت نفسها، يجب أن يكون لكل منها تعريفات متطابقة لنطاق مستوى الصوت. يؤدي عدم إجراء ذلك إلى رفض إطار العمل للصوت في السيارة لتعريف نطاق الصوت الجديد.