مسیریابی صدا

در 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 از FixedVolume پیکربندی شده باشد، سطوح صدا برای هر گروه به HAL منتقل می‌شود تا در خروجی این دستگاه‌ها اعمال شود.

برای منطقه ثانویه، خروجی مورد انتظار از طریق یک دستگاه خروجی واحد است. در این مثال، همه موارد استفاده به واحد دستگاه و گروه حجم هدایت می‌شوند تا همه چیز ساده باشد.

پیکربندی صوتی منطقه ساکن

در Android 11 car_audio_configuration.xml برای معرفی دو فیلد جدید، audioZoneId و occupantZoneId بیشتر گسترش یافت. اولی، audioZoneId می تواند برای کنترل بهتر مدیریت منطقه استفاده شود. از طرف دیگر، occupantZoneId می تواند برای پیکربندی مسیریابی مبتنی بر شناسه کاربر استفاده شود.

برای استفاده از این فیلدهای جدید، V2 از 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 فقط می توانند نقشه برداری یک به یک داشته باشند

مسیریابی از طریق UID برنامه

مجموعه‌ای از APIهای مخفی در 10 مورد به CarAudioManager معرفی شدند تا به برنامه‌ها اجازه جستجو و تنظیم مناطق صوتی و تمرکز را بدهد.

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

APIهای بالا به یک برنامه شخص اول اجازه می دادند تا مسیریابی صدا را بر اساس UID یک برنامه مدیریت کند. به این ترتیب، هر دو ID منطقه صوتی و UID برنامه نیز مورد نیاز است. با در دست داشتن این اطلاعات، مسیریابی صدا را می توان با استفاده از CarAudioManager#setZoneIdForUid API تنظیم کرد.

تغییر مناطق برای یک برنامه

به طور پیش فرض، تمام مسیرهای صوتی به منطقه اصلی. برای به‌روزرسانی برنامه‌ای که باید به منطقه دیگری هدایت شود، از 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");
}

N نکته: استریم ها و فوکوس نمی توانند به صورت پویا مناطق را تغییر دهند. بنابراین، پخش باید متوقف شود و فوکوس مجدد برای تغییر منطقه درخواست شود.

مسیریابی با شناسه کاربری

در حالی که مسیریابی مبتنی بر UID یک برنامه امکان کنترل دقیق مسیریابی صوتی هر برنامه را فراهم می کند، همچنین مستلزم آن است که مسیریابی صوتی برای هر برنامه قبل از اینکه برنامه واقعاً فوکوس صوتی و پخش صدا را درخواست کند، تعریف شود. برای کاهش این مشکل و تسهیل بیشتر برنامه های شخص ثالث برای پخش صدا بدون تغییر، CarAudioService از منطقه سرنشین خودرو و نقشه منطقه صوتی برای تعریف مسیریابی مبتنی بر شناسه کاربر استفاده می کند. به این ترتیب، هنگامی که کاربر وارد منطقه سرنشینان می شود، به سرویس صوتی خودرو اطلاع داده می شود. با این سیگنال، مدیریت فوکوس صوتی و مسیریابی به طور خودکار برای تمام مناطق صوتی پیکربندی می شود.

مسیریابی مبتنی بر UID هنوز هم قابل استفاده است، اما باید مستقل از مسیریابی شناسه کاربر انجام شود. این بدان معنی است که اگر نگاشت منطقه صوتی سرنشین به خودرو تعریف شده باشد، مسیریابی مبتنی بر UID غیرفعال می شود و تلاش برای فراخوانی CarAudioManager#setZoneidForUid با خطا مواجه می شود.

در حالی که مدیریت مسیریابی و فوکوس صوتی با مدیریت منطقه ساکن ساده شده است، کاربر همچنان باید به یک منطقه ساکن اختصاص داده شود. این را می توان با استفاده از CarOccupantZoneManager#assignProfileUserToOccupantZone انجام داد. این API برای مدیریت کاربران به مجوز نیاز دارد. انتظار فعلی این است که OEMها از طریق نوعی رابط کاربری سیستم، تخصیص منطقه کاربر به ساکن را مدیریت کنند. پس از انجام راه‌اندازی برنامه، مسیریابی صدا، مدیریت تمرکز به طور خودکار برای کاربر پیکربندی می‌شود.

مسیریابی با setPreferredDevice

همراه با تغییرات بالا، اندروید 11 همچنین دارای یک API جدید برای پرس و جو از دستگاه های خروجی مرتبط با هر منطقه است، CarAudioManager#getOutputDeviceForUsage(int zoneId، int usage).

API را می توان برای پرس و جو از یک دستگاه خروجی برای یک منطقه خاص و استفاده از ویژگی صوتی استفاده کرد. به این ترتیب برنامه های شخص اول می توانند صدا را با استفاده از setPreferredDevice API پخش کننده به مناطق مختلف هدایت کنند. API getOutputDeviceForUsage به PERMISSION_CAR_CONTROL_AUDIO_SETTINGS نیاز دارد و یک API سیستم است. در زیر نمونه ای از یافتن دستگاه رسانه برای یک منطقه خاص و مسیریابی به آن دستگاه با استفاده از setPreferredDevice API آورده شده است.

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