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

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

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

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

متى تحب البط

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

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

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

فيما يلي يوصى بتجنب التفاعلات المتزامنة المحتملة.

التفاعل الإجراء
EMERGENCY يتجاهل أو يكتم صوت كل شيء باستثناء SAFETY
SAFETY كل شيء على "البط" باستثناء EMERGENCY
NAVIGATION بط كل شيء ما عدا SAFETY وEMERGENCY
CALL بط كل شيء باستثناء SAFETY وEMERGENCY وNAVIGATION
VOICE بط CALL_RING
VEHICLE_SOUNDS وعليك تحديد أهمية الصوت النشط وما إذا كان يخفّف من أصوات أخرى.
MUSIC وANNOUNCEMENT اهرب من كل شيء. الاستثناءات هي نغمات التفاعل باللمس التي يتم تشغيلها كـ SYSTEM_SOUND.

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

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

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

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

قدّم نظام 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.

على سبيل المثال، يحدّد المثال التالي السمة 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() سيتم إرسال إشعار إليك بتغييرات مستوى الصوت.

حدث مجموعة حجم السيارة

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

  • قائمة CarVolumeGroupInfo
  • EventTypes (تم ربط البيانات بشكل بت)
  • قائمة ExtraInfos

معلومات عن CarVolumeGroup

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

أنواع الأحداث

تحدِّد هذه السياسة جانب CarVolumeGroupInfo الذي تم تغييره. يمكن للتطبيقات استخدام ذلك لتحديد التغييرات واتخاذ الإجراءات المطلوبة. على سبيل المثال، تشير السمة EVENT_TYPE_VOLUME_MAX_INDEX_CHANGED إلى أنّ فهرس الحدّ الأقصى لقيمة الحجم CarVolumeGroups ذي الصلة قد تغيّر ويمكن الاستعلام عنه من خلال CarVolumeGroupInfo.getMaxVolumeGainIndex().

يوضّح الجدول التالي العلاقة بين EventType وCarVolumeGroupInfo.

نوع الحدث معلومات عن CarVolumeGroup
EVENT_TYPE_VOLUME_GAIN_INDEX_changeD CarVolumeGroupInfo.getVolumeGrowIndex()
EVENT_TYPE_VOLUME_MIN_INDEX_changeD CarVolumeGroupInfo.getMinVolumeOnIndex()
EVENT_TYPE_VOLUME_MAX_INDEX_changeD CarVolumeGroupInfo.getMaxVolumeGrowIndex()
EVENT_TYPE_MUTE_changeD CarSizeGroupInfo.is الآتيd()
EVENT_TYPE_VOLUME_BLOCKED_CHANGED CarVolumeGroupInfo.isBlock()
EVENT_TYPE_ATTENUATION_تغيير CarVolumeGroupInfo.isAttenuated()
EVENT_TYPE_ZONE_CONFIGURATION_changeD CarVolumeGroupInfo.getAudioAttributes()

معلومات إضافية

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

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

يعتمد إطار عمل الصوت في السيارة على HAL IAudioGainCallback للتحكّم في الصوت لتوفير ExtraInfos المقترَحة. لمزيد من المعلومات، يُرجى الاطّلاع على معاودة الاتصال بميزة "اكتساب الصوت".

يتم تغيير أداة "CarVolumeGroupEvent" لتلبية الاحتياجات المستقبلية لإطار عمل الصوت في السيارة. ونعتزم إتاحة الميزات الجديدة من خلال CarVolumeGroupEvent فقط. ننصح بشدة أنّ مطوّري التطبيقات يستخدمون CarVolumeGroupEvent للتعامل مع مستوى صوت المجموعات وكتم صوت التغييرات.

معاودة الاتصال بحدث مجموعة مستوى صوت السيارة

يوفّر Android 14 ميزة جديدة لإعادة الاتصال للتطبيقات الحاصلة على الامتيازات والنظام الأساسي للتسجيل وتلقّي إشعارات بشأن CarVolumeGroupEvents.

  • للتسجيل من أجل معاودة الاتصال، استخدِم CarAudioManager#registerCarVolumeGroupEventCallback()

  • لإلغاء تسجيل معاودة الاتصال، استخدِم CarAudioManager#unregisterCarVolumeGroupEventCallback()

في حال تسجيل تطبيق في CarVolumeGroupEventCallback الجديد وCarVolumeCallback القديم، ستكون الأولوية للحدث CarVolumeGroupEventCallbacks. لم تعُد حزمة الصوت في السيارة تعمل على تشغيل "CarVolumeCallback". يؤدي هذا إلى منع المشغلات المكررة لنفس التطبيق للحدث نفسه.

ننصحك بشدة باستخدام CarVolumeGroupEventCallback لإدارة مستوى صوت المجموعة وكتم صوت التغييرات.

معاودة الاتصال لاستخدام الصوت

بدءًا من الإصدار Android 13، يمكن أن يشغّل AudioControl HAL استدعاء غير متزامن لإدارة التعديلات على مستوى الصوت بسبب التغييرات في نظام الصوت في السيارة.

واجهة برمجة تطبيقات HAL

AudioControl @2.0 AIDL

يضيف الإصدار 2.0 من AudioControl AIDL HAL واجهة برمجة التطبيقات التالية:

واجهة برمجة التطبيقات الغرض
IAudioControl#registerGainCallback تسجيل نسخة افتراضية من IAudioGainCallback باستخدام طبقة تجريد الأجهزة (HAL) للتحكّم الصوتي
IAudioGainCallback#onAudioDeviceGainsChanged استدعاء غير متزامن للإعلام بالتغييرات التي تطرأ على إعدادات زيادة الصوت.

يتضمن استدعاء HAL للتحكّم في الصوت قوائم بالأسباب وسمة AudioGainConfigInfo ذات الصلة، والتي تتكوّن مما يلي:

  • رقم تعريف المنطقة
  • عنوان منفذ الجهاز
  • يمكن أن يكون فهرس الحجم > الفهرس إما فهرسًا مقيدًا أو فهرسًا تحديثًا.

يمكن تصنيف الأسباب على نطاق واسع على النحو التالي:

  • أسباب القيود: تغيير مؤقت في سلوك كتم الصوت وكتم الصوت
  • تعديل الأسباب: تغيير دائم في سلوك مستوى الصوت

أنواع القيود

اعتبارًا من AudioControl HAL AIDL V3، إليك أنواع القيود المتاحة:

  • تجاهل
  • تؤدي إلى الحظر
  • القيود
  • خفيف
القيود النشطة تغيير مستوى الصوت الذي يشغّله المستخدم تبديل كتم الصوت الذي يشغّله المستخدم
تجاهل ❌ (إعادة الصوت)

✔ (كتم الصوت)
تؤدي إلى الحظر
القيود ❌ (تجاوز الحدّ الأقصى)

✔ (أقل من الحدّ الأقصى)
خفيف

الأولوية بين القيود هي كتم الصوت > الحظر > التقييد > الحدّ.

القيود المفروضة على كتم الصوت

قيود كتم الصوت هي:

  • Reasons.TCU_MUTE
  • Reasons.REMOTE_MUTE

يحافظ إطار عمل الصوت في السيارة داخليًا على حالتَي كتم الصوت هاتَين:

  • كتم صوت المستخدم: يتم التبديل بناءً على طلب المستخدم، إما من خلال "CarAudioManager" أو الأحداث الرئيسية.

  • كتم صوت HAL: تم التبديل بناءً على قيود كتم الصوت التي يتم تلقّيها من خلال معاودة الاتصال "AudioGain".

بالنسبة إلى المستمعين الذين يستخدمون تطبيق "الإعدادات"، ستستند حالة كتم الصوت بشكل عام لمجموعة مستوى الصوت (CarVolumeGroupInfo.isMuted()) إلى ما إذا كان قد تم تفعيل أيّ من هذه الميزة.

وعند تفعيل كتم صوت HAL، يتم تجاهل كل التغييرات في مستوى الصوت الوارد وطلبات إعادة صوت المجموعة طوال مدة التقييد.

حالة التفاعل: كتم صوت HAL نشط وطلبات المستخدم لتبديل كتم الصوت

عند تفعيل كتم صوت HAL وإيقاف ميزة كتم صوت المستخدم:

  • تم تغيير حالة كتم الصوت العامة لمجموعة مستوى الصوت إلى true.
  • ستتمّ معالجة طلبات المستخدم لتفعيل كتم الصوت.
    • السبب: يجب الالتزام بطلبات تجاهل المستخدم في جميع الأوقات للحفاظ على خصوصية المستخدمين.

عند تفعيل كتم صوت HAL وتفعيل ميزة كتم صوت المستخدم:

  • تم تغيير حالة كتم الصوت العامة لمجموعة مستوى الصوت إلى true.

  • ستتم معالجة طلبات المستخدم لإيقاف كتم الصوت في NOT. تظل حالة كتم صوت المستخدم المخزن مؤقتًا مفعّلة.

    • السبب: لن يتم الالتزام بطلبات إلغاء تجاهل المستخدم إلا في حال عدم وجود قيود نشطة.

    • السبب: قد تؤدي إعادة كتم صوت "كتم صوت المستخدم" المخزّن مؤقتًا إلى إصدار صوت بدون قصد وعرّض أمان المستخدمين للخطر. وينطبق ذلك بالأخص إذا تم تفعيل حالة كتم الصوت عبر دورات الإشعال، ما يقلّل من وعي المستخدمين بإدراك مستوى الصوت.

حالة التفاعل: تفعيل كتم صوت HAL وإيقافه أثناء عدم إجراء أي تغييرات لكتم صوت المستخدم

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

  • تم تغيير حالة كتم الصوت العامة لمجموعة مستوى الصوت إلى true.
  • ستتم معالجة طلبات "المستخدم" لتغيير مستوى الصوت NOT أثناء تفعيل كتم صوت HAL.

    • السبب: لا يمكن للمستخدم إدراك الصوت أثناء تفعيل كتم الصوت. يمكن أن يؤدي السماح بتغيير مستوى الصوت إلى حدوث انفجار صوتي وتعريض سلامة المستخدم للخطر.

    • السبب: يمكن للتطبيقات المرتبطة بمستوى الصوت التسجيل لتلقّي طلبات معاودة الاتصال وتشغيل إعادة الصوت (CarAudioManager.setVolumeGroupOpt(...,/* scroll=*/ 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.

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

أمثلة

حالة الاستخدام: يعدِّل المستخدم مؤشر الحجم إلى 30.

  • يستخدم المستخدم تطبيق مستوى الصوت لتغيير مؤشر مستوى الصوت إلى 30.

  • يتم تحويل هذا الفهرس إلى زيادة مستوى الصوت وإرساله إلى 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.

إعدادات مستوى الصوت الديناميكي

بالنسبة إلى هذه الميزة، نأخذ في الاعتبار حالات الاستخدام الأساسية التالية:

  1. إعداد نهاية الخط (EOL) للمركبة:

    • تفضل شركات تصنيع السيارات تحديث إعدادات مستوى الصوت في EOL بناءً على إعداد نظام الصوت في السيارة. ويكون ذلك عادةً من مصدر غير معروف بدون تحديث صورة Android SW.

    • قد تحتاج شركات تصنيع السيارات إلى تحديث ضبط مستوى الصوت أثناء جدول زمني للخدمة.

  2. ضبط بيئة التشغيل: تتوافق أنظمة الصوت في السيارات مع إعدادات مضخّمات صوت خارجية وقد تستضيف وحدات ECU هذه تكوينات نطاق الصوت التي يتم الاستعلام عنها خلال وقت التشغيل.

  3. الضبط عند الطلب: تم توفير هذه الميزة لتلبية الحاجة المتزايدة إلى ميزات الصوت التي تستند إلى الطلب والتي يشترك فيها المستخدمون في المعالجة المحسّنة للإشارات لفترة زمنية معيّنة. تكون تكوينات نطاق الصوت الجديدة صالحة لمدة الاشتراك.

التصميم

يتم ضبط مستوى الصوت الديناميكي على ثلاث مراحل:

  • الاستكشاف: يكتشف تنفيذ HAL للتحكم في الصوت لدى البائع تحديثات نطاق مستوى الصوت الجديدة من خلال آلية IPC مخصصة يملكها المورد.

    وبعد اكتشافه، يتم إنشاء معاودة الاتصال من خلال AudioControl::IModuleChangeCallback.

  • تعديل: تُحدِّث حزمة الصوت في السيارة حالات مجموعة مستويات الصوت باستخدام نطاقات الصوت الجديدة.

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

  • معاودة الاتصال:

    • بعد إجراء تعديلات على نطاق مجموعة مستوى الصوت، تتّصل حزمة الصوت في السيارة بالتطبيقات المسجّلة من خلال "CarVolumeGroupEventCallback".

    • يتضمّن CarVolumeGroupEvent التنسيق المُعدَّل CarVolumeGroupInfo ونوع الحدث (ما تم تغييره) والمعلومات الإضافية (سبب التغيير).

الصورة

الشكل 1. إعداد مستوى الصوت الديناميكي.

واجهة برمجة تطبيقات HAL

AudioControl 3.0 AIDL

يقدّم الإصدار 3.0 من AudioControl AIDL HAL واجهات برمجة التطبيقات التالية:

واجهة برمجة التطبيقات
IAudioControl#setModuleChangeCallback لضبط مثيل من IModuleChangeCallback مع AudioControl HAL.
IAudioControl#clearModuleChangeCallback يؤدي هذا الإجراء إلى محو مثيل IModuleChangeCallback الذي تم ضبطه سابقًا باستخدام AudioControl HAL.
IModuleChangeCallback#onAudioPortsChanged معاودة الاتصال للإبلاغ عن تغييرات منافذ الصوت

التسلسل

في ما يلي الرسم البياني للتسلسل لإعدادات مستوى الصوت الديناميكي.

الصورة

الشكل 2. رسم بياني تسلسلي لضبط مستوى الصوت الديناميكي

الجوانب الرئيسية

لتحسين هذه الميزة، يجب مراعاة ما يلي.

  • يجب أن تتطابق منافذ الصوت المقدّمة كجزء من طلب معاودة الاتصال مع تعريف حافلة Automotive في السيارات:

    • منفذ الجهاز: "IN_DEVICE" و"OUT_DEVICE"
    • التواصل. BUS
    • العنوان. معرَّف في تعريف HAL الصوتي
    • وضع اكتساب الألوان. JOINT
  • على المورّدين تحديد مجموعة رئيسية من تعريفات نطاق مستوى الصوت في سياسة HAL الخاصة بالصوت واستخدام طلب معاودة الاتصال لتخصيصه لخيارات المركبة. اطّلِع على تعريف IModuleChangeCallbac AIDL للحصول على مزيد من المعلومات.

  • عند انتماء أكثر من حافلة صوتية واحدة إلى مجموعة مستوى الصوت نفسها، يجب أن يكون لكل منها تعريفات متطابقة لنطاق مستوى الصوت. يؤدي عدم تنفيذ ذلك إلى رفض إطار الصوت في السيارة تعريف نطاق مستوى الصوت الجديد.