AAOS مدیریت حجم مخصوص به خود را در CarAudioService
دارد. از ولوم های ثابت با این انتظار استفاده می کند که ولوم ها باید کمتر از HAL توسط تقویت کننده سخت افزاری به جای نرم افزار اعمال شوند. همچنین دستگاههای خروجی را در گروههای حجمی سازماندهی میکند تا دستاوردهای یکسانی را برای همه دستگاههای مرتبط با گروه حجم اعمال کند.
استفاده از حجم های ثابت
پیاده سازی های 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>
اجرای نمونه car_audio_configuration.xml
.
هر گروه حجم باید شامل یک یا چند دستگاه خروجی با آدرس های مرتبط باشد. این آدرس ها باید با دستگاه های خروجی تعریف شده در 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 تعداد گروه های صدا در آن منطقه است. به این ترتیب، شناسه های گروه حجمی در بین مناطق منحصر به فرد نیستند. این شناسهها برای APIهای CarAudioManager
مرتبط با گروههای حجمی استفاده میشوند. هر API که یک 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
تعیین می شود.AUDIO_CONTEXT_VOLUME_PRIORITY.
محو شدن و تعادل
هر دو نسخه AudioControl HAL دارای APIهایی برای تنظیم محو شدن و تعادل در خودرو هستند. APIهای سیستم مربوطه برای CarAudioManager وجود دارد که مقادیر را به AudioControl HAL منتقل می کند. این APIها به android.car.permission.CAR_CONTROL_AUDIO_VOLUME
نیاز دارند.
API های AudioControl عبارتند از:
-
setBalanceTowardRight(float value)
. صدای بلندگو را به سمت راست (+) یا چپ (-) ماشین تغییر می دهد. 0.0 در مرکز قرار دارد، +1.0 کاملاً راست، -1.0 کاملاً سمت چپ است، و مقدار خارج از محدوده -1 تا 1 یک خطا است. -
setFadeTowardFront(float value)
- صدای بلندگو را به سمت جلو (+) یا عقب (-) ماشین تغییر می دهد. 0.0 در مرکز قرار می گیرد، +1.0 کاملاً جلو، -1.0 کاملاً عقب است و مقدار خارج از محدوده -1 تا 1 یک خطا است.
این به OEM ها بستگی دارد که تصمیم بگیرند این مقادیر چگونه اعمال شوند و چگونه برای کاربران ظاهر شوند. آنها را می توان به شدت در رسانه ها یا در سراسر هیئت مدیره برای همه صداهای Android اعمال کرد.
اندروید 11 همچنین پشتیبانی از اعمال جلوه های صوتی بر روی دستگاه های خروجی را معرفی کرد. با این کار، میتوانید بهجای این APIها، محو شدن و تعادل را از طریق جلوههای صوتی روی دستگاههای خروجی مناسب مدیریت کنید.
اردک صوتی
داک شدن صدا زمانی اتفاق میافتد که وسیله نقلیه بهره یک جریان را کاهش میدهد تا جریان دیگری که همزمان پخش میشود با وضوح بیشتری شنیده شود. در AAOS، اجرای صدا به HAL واگذار میشود، زیرا به طور بالقوه صداهای زیادی خارج از اندروید وجود دارد که سیستمعامل کنترلی بر آنها ندارد. در Android 11، اطلاعات اصلی در دسترس HAL برای تصمیم گیری در مورد ducking این است که آیا دو دستگاه خروجی هر دو دارای جریان فعال هستند یا خیر.
چه زمانی به اردک زدن
در حالی که تعیین نحوه استفاده از ducking توسط HAL به عهده خود OEM است، برخی از دستورالعمل های کلی وجود دارد که ما توصیه می کنیم. پخشهای چندگانه در Android معمولاً زمانی اتفاق میافتد که دو برنامه/سرویس فوکوس صوتی را همزمان نگه دارند. با در نظر گرفتن این موضوع، ماتریس تعامل را ببینید تا بدانید چه زمانی ممکن است اندروید فوکوس همزمان را ارائه دهد و بنابراین، چه زمانی امکان پخش همزمان دو جریان مختلف وجود دارد.
به خاطر داشته باشید که هر جریانی که توسط Android با هم ترکیب شده باشد، قبل از اعمال هرگونه سود انجام می شود. به این ترتیب، هر جریانی که باید هنگام پخش همزمان با دیگری پخش شود، باید به دستگاههای خروجی مجزا هدایت شود تا HAL بتواند قبل از مخلوط کردن آنها با یکدیگر، داکینگ را اعمال کند.
رفتار جوجه کشی توصیه شده
موارد زیر تعاملات همزمان بالقوه ای هستند که در آنها توصیه می کنیم ducking اعمال شود:
-
EMERGENCY
. برای اطمینان از اینکه راننده صدا را می شنود، همه چیز را به جزSAFETY
خاموش یا بی صدا کنید -
SAFETY
. برای اطمینان از اینکه راننده صدا را می شنود همه چیز را به جزEMERGENCY
اردک بزنید -
NAVIGATION
. اردک همه چیز به جزSAFETY
وEMERGENCY
-
CALL
. همه چیز را به جزSAFETY
،EMERGENCY
وNAVIGATION
کنار بگذارید -
VOICE
. اردکCALL_RING
- تعیین اهمیت
VEHICLE_SOUNDS
فعال و اینکه آیا آنها باید صداهای دیگر را برای اطمینان از شنیدن راننده از صداهای دیگر پخش کنند، به عهده OEM ها است. -
MUSIC
وANNOUNCEMENT
باید از همه چیز رد شود. استثنا اصلی در این مورد، زنگ های تعامل لمسی است که در حال حاضر به عنوانSYSTEM_SOUND
پخش می شود
ملاحظات دیگر هنگام اردک زدن
برخی از برنامهها/سرویسها مانند ناوبری یا دستیار ممکن است از چند بازیکن برای تکمیل اقدامات خود استفاده کنند. OEM ها باید بر اساس زمانی که داده های جریانی از طریق این دستگاه های خروجی نمی آیند، از بازکردن بیش از حد تهاجمی خودداری کنند تا اطمینان حاصل شود که کاربر به طور لحظه ای حجم رسانه را به حالت کامل برنمی گرداند، قبل از اینکه پخش بعدی از برنامه ناوبری یا دستیار شروع شود.
برای وسایل نقلیه با چندین مرحله صوتی با ایزوله کافی خوب، همچنین گزینه ای برای هدایت صدا به مناطق مختلف خودرو به جای اردک وجود دارد. برای مثال، دستورالعملهای ناوبری را میتوان به بلندگوهای پشتی سر راننده هدایت کرد، در حالی که موسیقی در کل کابین با صدای عادی پخش میشود.
صداهای حیاتی ایمنی
در حالی که Android 11 API های فوکوس صوتی HAL را معرفی کرد، هنوز هم این موضوع در اختیار HAL است تا اطمینان حاصل شود که صداهای مهم ایمنی نسبت به سایر صداها اولویت دارند. حتی اگر HAL فوکوس صوتی را برای USAGE_EMERGENCY
نگه دارد، این تضمین نمیکند که برنامهها و سرویسهای داخل Android صداها را پخش نکنند. این به HAL بستگی دارد که تعیین کند کدام جریانها از Android باید مخلوط یا بیصدا شوند زیرا صداهای مهم ایمنی پخش میشوند.
پیکربندی رابط کاربری تنظیمات صدا
AAOS رابط تنظیمات صدا را از پیکربندی گروه صدا جدا میکند (که میتواند همانطور که در پیکربندی گروههای صدا توضیح داده شده است روی هم قرار گیرد). این جداسازی تضمین میکند که اگر پیکربندی گروههای حجمی در آینده تغییر کند، نیازی به تغییر نیست.
در رابط کاربری تنظیمات خودرو، فایل packages/apps/Car/Settings/res/xml/car_volume_items.xml
حاوی عناصر رابط کاربری (منابع عنوان و نماد) مرتبط با هر AudioAttributes.USAGE
تعریفشده است. USAGE. این فایل با استفاده از منابع مرتبط با اولین استفاده شناخته شده موجود در هر VolumeGroup، یک رندر معقول از VolumeGroups
تعریف شده ارائه می دهد.
به عنوان مثال، مثال زیر یک 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
اعلام شدهاند. رابط تنظیمات صدا از API های CarAudioManager مبتنی بر VolumeGroup زیر استفاده می کند:
-
getVolumeGroupCount()
برای اینکه بدانید چند کنترل باید ترسیم شود. -
getGroupMinVolume()
وgetGroupMaxVolume()
برای دریافت کران های پایین و بالایی. -
getGroupVolume()
برای دریافت حجم فعلی. -
registerVolumeChangeObserver()
تا از تغییرات حجم مطلع شوید.