در 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);