مدیریت حجم

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() تا از تغییرات حجم مطلع شوید.