إدارة مستوى الصوت

لدى نظام التشغيل Android Automotive (AAOS) ميزة إدارة مستوى الصوت الخاصة به ضمن CarAudioService. فهو يستخدم إصلاحات مع توقع أن يتم تطبيق الأحجام أسفل طبقة HAL بواسطة جهاز مكبّر الصوت بدلاً من البرامج. تنظِّم أيضًا أجهزة إخراج الصوت في مجموعات حسب مستوى الصوت. لتطبيق النتيجة نفسها على جميع الأجهزة المرتبطة بمجموعة الصوت.

يتم استخدام أحجام ثابتة

يجب أن تتحكم عمليات تنفيذ نظام التشغيل Android Automotive في مستوى الصوت باستخدام مكبّر صوت للأجهزة بدلاً من برنامج مزج البرامج. لتجنّب الآثار الجانبية، يجب ضبط علامة config_useFixedVolume. إلى true (التراكب حسب الضرورة):

<resources>
    <!-- Car uses hardware amplifier for volume. -->
    <bool name="config_useFixedVolume">true</bool>
</resources>

في حال عدم ضبط العلامة config_useFixedVolume (أو ضبطها على "خطأ")، التطبيقات يمكنها استدعاء 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>

مثال على عملية تنفيذ السمة car_audio_configuration.xml

يجب أن تحتوي كل مجموعة مستويات صوت على جهاز إخراج واحد أو أكثر بالعناوين المرتبطة. يجب أن تتوافق هذه العناوين مع أجهزة الإخراج المحددة في 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 تمرر القيم وصولاً إلى HAL للتحكم في الصوت. تتطلب واجهات برمجة التطبيقات هذه android.car.permission.CAR_CONTROL_AUDIO_VOLUME

واجهات برمجة التطبيقات AudioControl API هي:

  • 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 أيضًا إمكانية تطبيق التأثيرات الصوتية على أجهزة إخراج الصوت. باستخدام هذا، يمكن إدارة التلاشي والتوازن عبر التأثيرات الصوتية بدلاً من ذلك. على أجهزة الإخراج المناسبة وليس من خلال واجهات برمجة التطبيقات هذه.

تجنّب التداخل مع أصوات أخرى

يحدث تجنب التداخل مع أصوات أخرى عندما تقلّل المركبة من تحسّن الصوت في بث واحد. لتتمكّن من سماع بث آخر يتم تشغيله في الوقت نفسه بشكل أوضح. في نظام التشغيل Android Automotive (AAOS) يتم تطبيق تجنُّب التداخل مع أصوات أخرى بسبب احتمال وجود الكثير من الأصوات خارج Android التي لا يمكن لنظام التشغيل التحكم فيها. في نظام Android 11، كانت المعلومات الرئيسية لخوارزمية HAL لاتخاذ قرارات التجنب هو ما إذا كان هناك جهازان للمخرجات ساحات المشاركات النشطة

متى تحب البط

مع أنّ المصنّع الأصلي للجهاز هو من يقرّر كيفية التعامل مع الهبوط من أصول البيانات، هناك بعض الإرشادات العامة التي ننصح بها ستظهر مجموعات البث المتعددة التي يتم تشغيلها ضمن Android تحدث هذه المشكلة الأكثر شيوعًا عندما يحتفظ تطبيقان/خدمتان بالتركيز الصوتي بشكل متزامن. مع وضع ذلك في الاعتبار، راجِع مصفوفة التفاعل. لمعرفة متى قد يمنح Android التركيز المتزامن، وبالتالي عندما يكون ذلك ممكنًا مجموعات بث مختلفة لتشغيلها في الوقت نفسه.

يُرجى تذكُّر أنّ أي عمليات بث بواسطة Android سيتم إجراؤها قبل تحقيق أي أرباح قيد التطبيق. وبالتالي، فإنّ أي بث يجب التوقف عن استخدامه عند تشغيله بالتزامن مع فينبغي توجيه آخر إلى أجهزة إخراج منفصلة حتى تتمكن HAL من تطبيق تجنب الزحف قبل بمزجها معًا.

السلوك المقترَح للتحايل

في ما يلي تفاعلات متزامنة محتملة يُنصح بتجنبها التي سيتم تطبيقها:

  • EMERGENCY تجاهل أو كتم صوت كل شيء باستثناء SAFETY ضمان سماع السائق للصوت
  • SAFETY تجاهل كل شيء باستثناء EMERGENCY يسمع السائق الصوت
  • NAVIGATION بط كل شيء باستثناء SAFETY EMERGENCY
  • CALL Duck كل شيء باستثناء SAFETY EMERGENCY وNAVIGATION
  • VOICE بطة CALL_RING
  • يعتمد المصنّعون الأصليون للأجهزة على تحديد أهمية VEHICLE_SOUNDS النشِط وما إذا كان يجب خفض الأصوات الأخرى للتأكد من أن السائق يسمعها أم لا.
  • يجب أن يتم تجنُّب MUSIC وANNOUNCEMENT بأي شكل من الأشكال. والاستثناء الرئيسي لهذا هو نغمات التفاعل باللمس التي يتم تشغيلها حاليًا SYSTEM_SOUND

نقاط أخرى يجب أخذها في الاعتبار عند التحايل

قد تستخدم بعض التطبيقات/الخدمات، مثل التنقّل أو "مساعد Google"، مشغّلات متعدّدة لإكمال أفعالهم. على المصنّعين الأصليين للأجهزة تجنُّب الإفراط في استخدامها بشدة عند توقُّف بث البيانات. من خلال أجهزة الإخراج هذه لضمان عدم إتاحة عرض الوسائط لدى المستخدم بعد قليل إلى الصوت الكامل قبل خفضه كعملية تشغيل تالية من شريط التنقل بدء تشغيل تطبيق المساعد.

وبالنسبة إلى المركبات ذات مراحل الصوت المتعددة مع عزل جيد بما فيه الكفاية، يتوفر أيضًا خيار لتوجيه الصوت إلى أجزاء مختلفة من السيارة بدلاً من الهرب. على سبيل المثال، التنقل يمكن توجيه التعليمات إلى مكبّرات صوت مسند الرأس في السيارة أثناء تشغيل الموسيقى ويلعب في جميع أنحاء المقصورة بمستوى الصوت العادي.

الأصوات الحرجة للحفاظ على الأمان

بينما تم تقديم نظام التشغيل Android 11 واجهات برمجة تطبيقات التركيز الصوتي HAL، ما زال تطبيق HAL خاضعًا لـ 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 إعدادات مستوى الصوت واجهة مستخدم تستخدم واجهات برمجة تطبيقات CarAudioManager التالية المستندة إلى VolumeGroup:

  • getVolumeGroupCount() لمعرفة عدد عناصر التحكّم التي يجب رسمها
  • getGroupMinVolume() وgetGroupMaxVolume() للحصول على الحدين الأدنى والعلوي.
  • getGroupVolume() للحصول على مستوى الصوت الحالي.
  • registerVolumeChangeObserver() لتلقّي إشعارات بشأن التغييرات في مستوى الصوت