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

تمتلك AAOS إدارة مجلدات خاصة بها ضمن CarAudioService. ويستخدم مستويات صوت ثابتة مع توقّع أن يتم تطبيق مستويات الصوت تحت HAL بواسطة مكبّر صوت في الأجهزة بدلاً من البرامج. وتعمل هذه الميزة أيضًا على تنظيم أجهزة الإخراج في مجموعات صوت لتطبيق المكاسب نفسها على جميع الأجهزة المرتبطة بمجموعة الصوت.

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

يجب أن تتحكّم عمليات تنفيذ AAOS في مستوى الصوت باستخدام مكبّر صوت للأجهزة بدلاً من محوِّل صوت للبرامج. لتجنُّب الآثار الجانبية، اضبط علامة 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 تُرسِل القيم إلى 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 التركيز المتزامن، وبالتالي الحالات التي يمكن فيها تشغيل مجرّدَين مختلفَين من البث المتزامن.

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

السلوك المقترَح للخفض

في ما يلي التفاعلات المتزامنة المحتملة التي ننصح بتطبيق ميزة "خفض الصوت" عليها:

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

اعتبارات أخرى عند إخفاء الفيديو

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

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

الأصوات المهمة للسلامة

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

ضبط واجهة مستخدم إعدادات مستوى الصوت

يفصل نظام التشغيل AAOS واجهة مستخدم إعدادات الصوت عن إعدادات مجموعة الصوت (التي يمكن تداخلها كما هو موضّح في مقالة "ضبط مجموعات الصوت"). يضمن هذا الفصل عدم الحاجة إلى إجراء تغييرات في حال تغيّر إعدادات مجموعات الوحدات في المستقبل.

في واجهة مستخدم "إعدادات السيارة"، يحتوي ملف packages/apps/Car/Settings/res/xml/car_volume_items.xml على عناصر واجهة المستخدم (موارد العنوان والرمز) المرتبطة بكل AudioAttributes.USAGE محدّد. يقدّم هذا الملف عرضًا معقولاً لملف VolumeGroups المحدّد باستخدام الموارد المرتبطة بالاستخدام المُعترَف به أولاً والمضمّن في كل مجموعة مجلدات.

على سبيل المثال، يحدِّد المثال التالي مجموعة 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. تستخدم واجهة برمجة التطبيقات الخاصة بإعدادات مستوى الصوت UI واجهات برمجة التطبيقات التالية لنظام CarAudioManager المستندة إلى VolumeGroup:

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