إدارة الحجم

يتم تضمين إدارة الحجم في 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 واجهات برمجة التطبيقات (APIs) لضبط التلاشي والتوازن في السيارة. تقوم واجهات برمجة تطبيقات النظام المقابلة لـ 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 لاتخاذ قرارات تجنب هي ما إذا كان جهازي الإخراج لديهما تدفقات نشطة أم لا.

متى البط

على الرغم من أن الأمر متروك لمصنعي المعدات الأصلية (OEM) الفرديين لتحديد كيفية التعامل مع 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 .

اعتبارات عند التملص

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

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

الأصوات الحرجة للسلامة

قدم 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

CarVolumeGroupInfo

يتمتع متلقي رد الاتصال بالحدث بإمكانية الوصول بسهولة إلى قائمة معلومات مجموعة حجم السيارة المتأثرة. وهذا يعني أن التطبيق لا يحتاج إلى إجراء أي مكالمات إضافية إلى إطار عمل صوت السيارة للحصول على أحدث حالة. يمكنه ببساطة استخدام CarVolumeGroupInfos المستلم to update the UI or internal states. To make it easier for apps, the aspects that changed in a car volume group are also provided as part of EventTypes`، كما هو موضح أدناه.

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

يحدد أي جانب من جوانب CarVolumeGroupInfo قد تغير. يمكن للتطبيقات استخدام هذا لتحديد التغييرات واتخاذ الإجراءات المطلوبة. على سبيل المثال، يشير EVENT_TYPE_VOLUME_MAX_INDEX_CHANGED إلى أن CarVolumeGroups' maximum volume gain index has changed and can be queried by CarVolumeGroupInfo.getMaxVolumeGainIndex()`.

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

نوع الحدث 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()

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

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

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

يعتمد الإطار الصوتي للسيارة على AudioControl HAL IAudioGainCallback لتوفير ExtraInfos مقترحة. لمعرفة المزيد، راجع رد الاتصال بالحصول على الصوت .

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

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

يوفر Android 14 رد اتصال جديد للتطبيقات المميزة وتطبيقات النظام الأساسي للتسجيل وإخطارك بـ CarVolumeGroupEvents .

  • للتسجيل في رد الاتصال، استخدم CarAudioManager#registerCarVolumeGroupEventCallback()

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

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

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

رد اتصال كسب الصوت

منذ Android 13، يمكن لـ AudioControl HAL تشغيل رد اتصال غير متزامن لإدارة تحديثات مستوى الصوت بسبب التغييرات في النظام الصوتي للسيارة.

هال API

التحكم في الصوت @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 أو الأحداث الرئيسية.

  • هال صامت. تم التبديل بناءً على قيود كتم الصوت التي تم تلقيها من خلال رد اتصال AudioGain .

بالنسبة للمستمعين مثل تطبيق الإعدادات، ستعتمد حالة كتم الصوت العامة لمجموعة الحجم ( CarVolumeGroupInfo.isMuted() ) على ما إذا تم تمكين أي من عمليات كتم الصوت المذكورة أعلاه.

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

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

عند تمكين كتم صوت HAL وتعطيل كتم صوت المستخدم:

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

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

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

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

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

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

حالة التفاعل: تم تمكين وتعطيل صوت HAL Mute بينما لا يوجد أي تغييرات على كتم صوت المستخدم

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

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

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

    • السبب: يمكن لتطبيقات وحدة التخزين التسجيل لعمليات رد الاتصال وتشغيل إلغاء كتم الصوت (CarAudioManager.setVolumeGroupMute(...,/* mute=*/ true,..)) تلقائيًا دون تدخل المستخدم، إذا كان هذا هو السلوك المتوقع من قبل OEM.

عند تعطيل كتم صوت 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

  • يستخدم المستخدم تطبيق 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 تعليقًا (على سبيل المثال، استئناف):

    • يطبق Vendor Audio HAL/AudioControl HAL فهرسًا آمنًا قدره 30 على نظام الصوت محليًا.

    • يقوم Vendor AudioControl HAL أيضًا بتشغيل رد الاتصال للفهرس الآمن:

    IAudioGainCallback.onAudioDeviceGainsChanged(SUSPEND_EXIT_VOL_LIMITATION, {...,  30 /* safe index */})
    
  • تستهلك خدمة الصوت في السيارة الفهرس الجديد من رد الاتصال المستخدم للاستمرارية وعمليات رد الاتصال الخاصة بها إلى تطبيق الصوت الذي يقوم بمزامنة الفهرس. فهرس مستوى الصوت قبل التوقف المرحلي هو 95. ومع ذلك، بعد الاستئناف، يتم تعيين هذا الفهرس إلى مستوى صوت آمن قدره 30 بواسطة مُنفذ AudioControl HAL .

تكوين حجم ديناميكي

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

  1. تكوين نهاية الخط (EOL) للمركبة.

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

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

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

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

تصميم

يتم تحقيق تكوين الحجم الديناميكي على ثلاث مراحل:

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

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

  • تحديث. يقوم مكدس صوت السيارة بتحديث حالات مجموعة الصوت بنطاقات الصوت الجديدة.

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

  • أتصل مرة أخرى.

    • بعد تحديثات نطاق مجموعة الصوت، يقوم مكدس صوت السيارة بتشغيل رد اتصال للتطبيقات المسجلة من خلال CarVolumeGroupEventCallback .

    • يحمل CarVolumeGroupEvent تحديث CarVolumeGroupInfo ونوع الحدث (ما تغير) والمعلومات الإضافية (لماذا تغير).

صورة

الشكل 1. تكوين الحجم الديناميكي.

هال API

التحكم الصوتي @ 3.0 AIDL

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

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

تسلسل

يتم عرض الرسم التخطيطي التسلسلي لتكوين الحجم الديناميكي أدناه.

صورة

الشكل 2. مخطط تسلسلي لتكوين الحجم الديناميكي.

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

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

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

    • منفذ الجهاز. IN_DEVICE ، OUT_DEVICE
    • اتصال. BUS
    • عنوان. تم تعريفه في تعريف Audio HAL
    • وضع الربح. JOINT
  • يجب على البائعين تحديد مجموعة شاملة من تعريفات نطاق الصوت في سياسة Audio HAL واستخدام رد الاتصال لتخصيصها لمتغيرات السيارة. راجع تعريف IModuleChangeCallbac AIDL لمزيد من المعلومات.

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