التوجيه الصوتي

في Android 10، سيتم استبدال car_audio_configuration.xml. car_volumes_groups.xml وIAudioControl.getBusForContext في ملف الإعداد الجديد، يتم تحديد قائمة بالمناطق. ولكل منطقة منطقة واحدة أو أكثر مع الأجهزة المرتبطة بها، ويكون لكل جهاز السياقات التي يجب أن يتم توجيههم ضمن تلك المنطقة. يجب أن يتم تمثيل جميع السياقات داخل كل منطقة.

إعداد توجيه الصوت

وتمثل ملفات سياسات الصوت، الموجودة عادةً في قسم المورد، تكوين أجهزة الصوت باللوحة. جميع الأجهزة المشار إليها في يجب تحديد car_audio_configuration.xml ضمن audio_policy_configuration.xml

تفعيل توجيه AAOS

لاستخدام التوجيه المستنِد إلى AAOS، يجب ضبط إبلاغ audioUseDynamicRouting إلى true:

<resources>
    <bool name="audioUseDynamicRouting">true</bool>
</resources>

عندما يكون false، سيتم إيقاف التوجيه والكثير من إعدادات CarAudioService سيعود نظام التشغيل إلى سلوك AudioService التلقائي.

المنطقة الأساسية

سيتم تلقائيًا توجيه كل الأصوات إلى المنطقة الأساسية. لا توجد سوى أن تكون منطقة أساسية واحدة، والتي يشار إليها في التهيئة من خلال السمة isPrimary="true"

نموذج الإعدادات

على سبيل المثال، يمكن أن تكون للمركبة منطقتان: منطقة أساسية والمقعد الخلفي. نظام الترفيه. وبالتالي، قد تكون هناك car_audio_configuration.xml. على النحو التالي:

<audioZoneConfiguration version="2.0">
       <zone name="primary zone" isPrimary="true">
           <volumeGroups>
               <group>
                   <device address="bus0_media_out">
                       <context context="music"/>
                       <context context="announcement"/>
                   </device>
                   <device address="bus3_call_ring_out">
                       <context context="call_ring"/>
                   </device>
                   <device address="bus6_notification_out">
                       <context context="notification"/>
                   </device>
                   <device address="bus7_system_sound_out">
                       <context context="system_sound"/>
                       <context context="emergency"/>
                       <context context="safety"/>
                       <context context="vehicle_status"/>
                   </device>
               </group>
               <group>
                   <device address="bus1_navigation_out">
                       <context context="navigation"/>
                   </device>
                   <device address="bus2_voice_command_out">
                       <context context="voice_command"/>
                   </device>
               </group>
               <group>
                   <device address="bus4_call_out">
                       <context context="call"/>
                   </device>
               </group>
               <group>
                   <device address="bus5_alarm_out">
                       <context context="alarm"/>
                   </device>
               </group>
           </volumeGroups>
       </zone>
        <zone name="rear seat zone" audioZoneId="1">
           <volumeGroups>
               <group>
                   <device address="bus100_rear_seat">
                       <context context="music"/>
                       <context context="navigation"/>
                       <context context="voice_command"/>
                       <context context="call_ring"/>
                       <context context="call"/>
                       <context context="alarm"/>
                       <context context="notification"/>
                       <context context="system_sound"/>
                       <context context="emergency"/>
                       <context context="safety"/>
                       <context context="vehicle_status"/>
                       <context context="announcement"/>
                   </device>
               </group>
           </volumeGroups>
    </zones>
</audioZoneConfiguration>

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

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

إعدادات الصوت في منطقة الإشغال

في Android 11، تم توسيع نطاق car_audio_configuration.xml ليشمل ويجب إضافة حقلَين جديدَين، هما audioZoneId وoccupantZoneId. الخيار الأول، هو audioZoneId، يمكن استخدامه للتحكّم في إدارة المنطقة بشكل أفضل. من ناحية أخرى، يمكن استخدام occupantZoneId لضبط إعدادات مستندة إلى رقم تعريف المستخدم. التوجيه.

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

<audioZoneConfiguration version="2.0">
       <zone name="primary zone" isPrimary="true" occupantZoneId="0">
         ...
       </zone>
       <zone name="rear seat zone" audioZoneId="1" occupantZoneId="1">
         ...
       </zone>
    </zones>
</audioZoneConfiguration>

تحدد الإعدادات أعلاه تعيين المنطقة الأساسية إلى منطقة الإشغال 0، audioZoneId 1 إلى occupantZoneId 1. بشكل عام، أي عملية ربط يمكن تهيئة بين منطقة الإشغال ومنطقة الصوت ولكن يجب أن يكون التعيين واحدًا لواحد. في ما يلي القواعد التي حدَّدت الحقلَين الجديدَين:

  • تكون قيمة audioZoneId للمنطقة الأساسية صفرًا دائمًا
  • لا يمكن تكرار رقمين (audioZoneId) وoccupantZoneId.
  • يمكن لكل من audioZoneId وoccupantZoneId إجراء عملية ربط واحدة فقط

التوجيه من خلال المعرّف الفريد للتطبيق

تم تقديم سلسلة من واجهات برمجة التطبيقات المخفية إلى CarAudioManager من أصل 10 للسماح للتطبيقات لطلب البحث وضبط مناطق الصوت والتركيز.

int[] getAudioZoneIds();
int getZoneIdForUid(int uid);
boolean setZoneIdForUid(int zoneId, int uid);
boolean clearZoneIdForUid(int uid);

تسمح واجهات برمجة التطبيقات المذكورة أعلاه لتطبيق الطرف الأول بإدارة التوجيه الصوتي استنادًا إلى في المُعرّف الفريد للتطبيق. وبناءً على ذلك، يكون كل من معرّف منطقة الصوت والمعرِّف الفريد للتطبيق مطلوبة أيضًا. من خلال هذه المعلومات، يمكن ضبط التوجيه الصوتي باستخدام واجهة برمجة تطبيقات CarAudioManager#setZoneIdForUid.

تغيير مناطق التطبيق

يتم تلقائيًا توجيه جميع مسارات الصوت إلى المنطقة الأساسية. لتحديث تطبيق من أجل التوجيه إلى منطقة مختلفة، يُرجى استخدام CarAudioManager#setZoneIdForUid:

// Find zone to play
int zoneId = ...

// Find application's uid
Int uid = mContext.getPackageManager()
        .getApplicationInfo(mContext.getPackageName(), 0)
        .uid;

if (mCarAudioManager.setZoneIdForUid(zoneId, info.uid)) {
    Log.d(TAG, "Zone successfully updated");
} else {
    Log.d(TAG, "Failed to change zone");
}

شمالاً ملاحظة: لا يمكن تبديل مناطق البث والتركيز ديناميكيًا. ولذلك، يجب إيقاف التشغيل وإعادة طلب التركيز وتغيير المناطق.

التوجيه باستخدام رقم تعريف المستخدم

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

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

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

التوجيه باستخدام setPreferredDevice

إلى جانب التغييرات المذكورة أعلاه، يتضمّن Android 11 أيضًا واجهة برمجة تطبيقات جديدة لطلب البحث عن أجهزة إخراج الصوت. المرتبطة بكل منطقة، CarAudioManager#getOutputDeviceForUsage(intzoneId, int use).

يمكن استخدام واجهة برمجة التطبيقات للاستعلام عن جهاز إخراج لمنطقة معيّنة وسمة صوت معيّنة. الاستخدام. وبهذه الطريقة يمكن لتطبيقات الطرف الأول توجيه الصوت إلى مناطق مختلفة عن طريق يستخدم واجهة برمجة تطبيقات setPreferredDevice الخاصة بالمشغّل تشير رسالة الأشكال البيانية واجهة برمجة التطبيقات getOutputDeviceForUsage المطلوبة PERMISSION_CAR_CONTROL_AUDIO_SETTINGS وهي واجهة برمجة تطبيقات للنظام. في ما يلي مثال لإيجاد جهاز وسائط لمنطقة معينة والتوجيه إلى ذلك الجهاز باستخدام واجهة برمجة تطبيقات setPreferredDevice.

audioZoneId = ... ;
mediaDeviceInfo = mCarAudioManager
            .getOutputDeviceForUsage(audioZoneId, AudioAttributes.USAGE_MEDIA);
…
mPlayer.setPreferredDevice(mediaDeviceInfo);