مدیریت حجم

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

حجم‌های ثابت

پیاده‌سازی‌های AAOS به جای میکسر نرم‌افزاری، از یک تقویت‌کننده سخت‌افزاری برای کنترل صدا استفاده می‌کنند. برای جلوگیری از عوارض جانبی، پرچم config_useFixedVolume را روی true تنظیم کنید (در صورت لزوم، overlay کنید):

<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="4">
    </deviceConfigurations>
    <activationVolumeConfigs>
        <activationVolumeConfig name="activation_volume_on_boot_config">
            <activationVolumeConfigEntry minActivationVolumePercentage="10" maxActivationVolumePercentage="90"
            invocationType="onBoot" />
        </activationVolumeConfig>
        ...
    </activationVolumeConfigs>
    <zones>
        <zone name="primary zone" isPrimary="true">
          <zoneConfigs>
              <zoneConfig name="primary zone config 0" isDefault="true">
                <volumeGroups>
                    <group activationConfig="activation_volume_on_boot_config">
                        <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>
              </zoneConfig>
              ...
            </zoneConfigs>
        </zone>
     </zones>
</audioZoneConfiguration>

هر گروه حجمی باید شامل یک یا چند دستگاه خروجی با آدرس‌های مرتبط باشد. آدرس‌ها باید با دستگاه‌های خروجی تعریف شده در 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 تعریف شده است. برای کسب اطلاعات بیشتر، به مثال بالا در Define volume groups مراجعه کنید.

سطوح صدای فعلی برای هر منطقه برای کاربر مرتبط با آن منطقه ثابت است. این تنظیمات مختص به منطقه هستند، به این معنی که اگر کاربری در صفحه نمایش مرتبط با منطقه اصلی وارد سیستم شود و سپس بعداً وارد منطقه‌ای مرتبط با منطقه صوتی ثانویه شود، سطوح صدای بارگذاری شده و ثابت برای منطقه اول با سطوح صدای منطقه ثانویه متفاوت است.

حداقل و حداکثر حجم فعال‌سازی

اندروید ۱۵ کنترل بر شاخص‌های گروه صدا را برای بهبود ایمنی و راحتی کاربر در سیستم‌های صوتی خودرو معرفی می‌کند. این امر از طریق استفاده از حداقل و حداکثر حجم فعال‌سازی، که در پیکربندی صوتی خودرو پیکربندی شده‌اند (به بخش تعریف گروه‌های صدا مراجعه کنید) حاصل می‌شود. می‌توانید این ویژگی را با تنظیم audioUseMinMaxActivationVolume روی true در Car Service RROها فعال کنید.

شما می‌توانید چندین ورودی activationVolumeConfig در activationVolumeConfigs تعریف کنید که هر کدام نشان‌دهنده حداقل و حداکثر پیکربندی فعال‌سازی متفاوتی هستند. هر activationVolumeConfig :

  • باید حاوی یک name منحصر به فرد در سراسر فایل پیکربندی سیستم صوتی خودرو باشد، تا بتوان بعداً در گروه صدا ( group ) به آن اشاره کرد.
  • باید فقط شامل یک activationVolumeConfigEntry باشد.

هر activationVolumeConfig شامل ویژگی‌های زیر است:

  • minActivationVolumePercentage (عدد صحیح، ۰-۱۰۰، اختیاری، پیش‌فرض: ۰): حداقل حجم فعال‌سازی را به صورت درصد مشخص می‌کند.
  • maxActivationVolumePercentage (عدد صحیح، ۰-۱۰۰، اختیاری، پیش‌فرض: ۱۰۰): حداکثر حجم فعال‌سازی را به صورت درصد مشخص می‌کند.
  • invocationType (رشته، اختیاری، پیش‌فرض: onPlaybackChanged ): شرایطی را تعریف می‌کند که تحت آنها حداقل و حداکثر حجم فعال‌سازی اعمال می‌شود:

    • onBoot : فقط برای اولین پخش فعال جدید در یک گروه صدا پس از بوت اعمال می‌شود.
    • onSourceChanged : فقط برای یک پخش فعال جدید با یک برنامه یا منبع UID تغییر یافته در یک گروه حجم اعمال می‌شود.
    • onPlaybackChanged : برای هر پخش فعال جدید در یک گروه حجم اعمال می‌شود.

CarAudioService با نظارت بر زیربخش‌های صوتی فعال فعلی زیر، حداقل و حداکثر فعال‌سازی را مدیریت می‌کند:

  • آهنگ‌های پخش فعال فعلی
  • وضعیت فعلی تماس
  • درخواست فوکوس صوتی فعلی از Audio Control HAL که در آن درخواست فوکوس صوتی از Audio Control HAL نشان می‌دهد که پخش صوتی فعالی در خارج از اندروید در حال انجام است.

تصویر زیر نمای کلی سطح بالایی از مدیریت حداقل و حداکثر حجم فعال‌سازی را نشان می‌دهد:

image

شکل ۱. حداقل و حداکثر مدیریت حجم فعال‌سازی مسیرهای داده صوتی فعال.

با استفاده از مقادیر مشخص شده minActivationVolumePercentage ، maxActivationVolumePercentage ، حداقل و حداکثر شاخص افزایش حجم صدا، می‌توانید حداقل و حداکثر شاخص افزایش حجم صدا را برای هر گروه صدا محاسبه کنید. CarAudioService هر پخش جدید فعال را رصد می‌کند و حداقل و حداکثر حجم صدا را تحت شرایط زیر اعمال می‌کند:

  • تطابق نوع فراخوانی: نوع فعال‌سازی پخش (که از Audio Manager، Audio Control HAL یا Telephony Manager گرفته شده است) باید با invocationType مشخص شده در activationVolumeConfigEntry مرتبط با گروه صدا مطابقت داشته باشد.
  • شاخص حجم خارج از محدوده: شاخص افزایش حجم فعلی گروه حجم باید خارج از محدوده شاخص افزایش حجم فعال‌سازی تعریف‌شده باشد، به طور خاص، یکی از موارد زیر صحیح است:

    • این شاخص کمتر از حداقل شاخص افزایش حجم فعال‌سازی محاسبه‌شده است.

      یا

    • این شاخص بالاتر از شاخص افزایش حجم فعال‌سازی حداکثر محاسبه‌شده است.

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

  • حداقل شاخص افزایش حجم فعال‌سازی اگر کمتر از حداقل شاخص افزایش حجم فعال‌سازی باشد

    یا

  • حداکثر شاخص افزایش حجم فعال‌سازی اگر بیشتر از حداکثر شاخص افزایش حجم فعال‌سازی باشد

علاوه بر این، یک رویداد گروه حجم خودرو با نوع رویداد EVENT_TYPE_VOLUME_GAIN_INDEX_CHANGED به تمام فراخوانی‌های رویداد گروه حجم ثبت‌شده ارسال می‌شود.

مدیریت رویدادهای کلید صدا

اندروید چندین کد کلیدی برای کنترل صدا تعریف می‌کند، از جمله:

  • KEYCODE_VOLUME_UP
  • KEYCODE_VOLUME_DOWN
  • KEYCODE_VOLUME_MUTE

به طور پیش‌فرض، اندروید رویدادهای کلید صدا را به برنامه‌ها هدایت می‌کند. پیاده‌سازی‌های خودرو باید این رویدادهای کلیدی را مجبور به پردازش توسط CarAudioService کنند، که سپس setGroupVolume یا setMasterMute را به صورت مناسب فراخوانی می‌کند. برای اعمال این رفتار، پرچم config_handleVolumeKeysInWindowManager را روی true تنظیم کنید:

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

رویدادهای کلید صدا در حال حاضر هیچ راهی برای تشخیص اینکه برای کدام منطقه در نظر گرفته شده‌اند ندارند و فرض می‌شود که همه آنها با منطقه صوتی اصلی مرتبط هستند. هنگامی که یک رویداد کلید صدا دریافت می‌شود، CarAudioService با واکشی زمینه‌های صوتی برای پخش‌کننده‌های فعال و سپس تنظیم گروه صدا که شامل دستگاه خروجی مرتبط با زمینه صوتی با بالاترین اولویت است، تعیین می‌کند که کدام گروه صدا را تنظیم کند. اولویت‌بندی بر اساس یک ترتیب ثابت تعریف شده در CarVolume.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 کاملاً درست است
    • ‎-۱.۰ کاملاً چپ است
    • مقداری خارج از محدوده‌ی ۱- تا ۱، خطا محسوب می‌شود.
  • setFadeTowardFront(float value) صدای بلندگو را به سمت جلو (+) یا عقب (-) ماشین تغییر می‌دهد.

    • 0.0 در مرکز قرار دارد
    • +۱.۰ کاملاً رو به جلو است
    • -۱.۰ کاملاً به عقب است
    • مقداری خارج از محدوده‌ی ۱- تا ۱، خطا محسوب می‌شود.

شما تصمیم می‌گیرید که این مقادیر چگونه اعمال شوند و چگونه به کاربران نمایش داده شوند. آن‌ها می‌توانند صرفاً برای رسانه‌ها یا به طور کلی برای همه صداهای اندروید اعمال شوند. اندروید ۱۱ همچنین پشتیبانی از اعمال جلوه‌های صوتی به دستگاه‌های خروجی را معرفی کرد. با این کار، می‌توان به جای استفاده از این APIها، محو شدن و تعادل را از طریق جلوه‌های صوتی روی دستگاه‌های خروجی مناسب مدیریت کرد.

حذف نویز صوتی

کاهش نویز صوتی زمانی اتفاق می‌افتد که وسیله نقلیه، تقویت یک جریان را کاهش می‌دهد تا جریان دیگری که همزمان پخش می‌شود، واضح‌تر شنیده شود. در AAOS، کاهش نویز صوتی توسط HAL پیاده‌سازی می‌شود. اندروید هیچ کنترلی بر صداهای فراتر از سیستم عامل ندارد. در اندروید ۱۱، اطلاعات اصلی موجود برای HAL برای تصمیم‌گیری در مورد کاهش نویز، این است که آیا دو دستگاه خروجی هر دو جریان فعال دارند یا خیر.

چه زمانی باید اردک زد؟

اگرچه تعیین نحوه‌ی مدیریت فرآیند جوجه‌کشی توسط HAL به تولیدکننده‌ی اصلی تجهیزات (OEM) بستگی دارد، ما دستورالعمل‌های زیر را توصیه می‌کنیم.

  • پخش همزمان چندین استریم در اندروید معمولاً زمانی اتفاق می‌افتد که دو برنامه یا سرویس به طور همزمان فوکوس صوتی را در اختیار داشته باشند. برای اطلاع از اینکه چه زمانی اندروید ممکن است فوکوس همزمان را اعطا کند، به ماتریس تعامل در انواع محدودیت مراجعه کنید. با معرفی افزونه صوتی خودرو، این امر به مدیریت AudioFocus شما نیز بستگی دارد.

  • هر جریانی که توسط اندروید با هم مخلوط می‌شود، قبل از اعمال هرگونه بهره‌ای، این کار انجام می‌شود. به این ترتیب، هر جریانی که هنگام پخش همزمان با جریان دیگر باید از حالت فشرده خارج شود، باید به دستگاه‌های خروجی جداگانه هدایت شود تا HAL بتواند قبل از مخلوط کردن آنها، از حالت فشرده خارج شود.

موارد زیر تداخلات همزمان بالقوه‌ای هستند که توصیه می‌شود از آنها اجتناب کنید.

تعامل اکشن
EMERGENCY همه چیز را به جز SAFETY خفه می‌کند یا بی‌صدا می‌کند
SAFETY از همه چیز به جز EMERGENCY صرف نظر می‌کند
NAVIGATION همه چیز را نادیده می‌گیرد به جز SAFETY و EMERGENCY
CALL همه چیز را نادیده می‌گیرد به جز SAFETY ، EMERGENCY و NAVIGATION
VOICE اردک‌ها CALL_RING
VEHICLE_SOUNDS شما اهمیت صدای فعال و اینکه آیا صداهای دیگر را نادیده می‌گیرد یا خیر را تعیین می‌کنید.
MUSIC و ANNOUNCEMENT از همه چیز جاخالی می‌دهد. صداهای تعامل لمسی که به صورت SYSTEM_SOUND پخش می‌شوند، استثنا هستند.

ملاحظات هنگام جوجه کشی

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

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

صداهای بحرانی ایمنی

اندروید ۱۱ رابط‌های برنامه‌نویسی کاربردی (API) فوکوس صوتی HAL را معرفی کرد. HAL تضمین می‌کند که صداهای حیاتی از نظر ایمنی نسبت به سایر صداها در اولویت قرار دارند. اگر HAL فوکوس صوتی را برای USAGE_EMERGENCY نگه دارد، تضمینی وجود ندارد که برنامه‌ها و سرویس‌های اندروید صداها را پخش نکنند. HAL تعیین می‌کند که کدام جریان‌ها از اندروید باید برای پخش صداهای حیاتی از نظر ایمنی میکس یا بی‌صدا شوند.

رابط کاربری تنظیمات صدا را پیکربندی کنید

AAOS رابط کاربری تنظیمات ولوم را از پیکربندی گروه ولوم جدا می‌کند. این تنظیمات می‌توانند همانطور که در پیکربندی دستاوردهای گروه ولوم توضیح داده شده است، روی هم قرار گیرند. این جداسازی تضمین می‌کند که در صورت تغییر پیکربندی گروه‌های ولوم، نیازی به تغییر نیست.

در رابط کاربری تنظیمات خودرو، packages/apps/Car/Settings/res/xml/car_volume_items.xml شامل عناصر رابط کاربری (منابع عنوان و آیکون) مرتبط با هر AudioAttributes.USAGE تعریف شده است. این فایل با استفاده از منابع مرتبط با اولین کاربرد شناخته شده موجود در هر VolumeGroup ، امکان رندر معقولی از VolumeGroups تعریف شده را فراهم می‌کند.

برای مثال، مثال زیر یک VolumeGroup را به گونه‌ای تعریف می‌کند که شامل voice_communication و voice_communication_signalling باشد. پیاده‌سازی پیش‌فرض رابط کاربری تنظیمات خودرو، VolumeGroup با استفاده از منابع مرتبط با voice_communication رندر می‌کند، زیرا این اولین matc در فایل است.

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

رویداد گروهی حجم خودرو

موارد استفاده از به‌روزرسانی صدا و تغییر وضعیت بی‌صدا در خودرو، دارای زیرساخت‌های زمینه‌ای هستند که ممکن است اقدامات برخی برنامه‌ها، مانند تنظیمات صدا، را تعریف کنند. فراخوانی فعلی صدا و بی‌صدا از پشته سیستم صوتی خودرو، اطلاعات زمینه‌ای محدودی را ارائه می‌دهد. برای ارائه خدمات بهتر به موارد استفاده خودرو و مقیاس‌پذیری آینده، CarVolumeGroupEvent به اندروید ۱۴ اضافه شده است. هر رویداد سه نوع اطلاعات حیاتی را در خود جای داده است:

  • فهرست اطلاعات CarVolumeGroupInfo
  • EventTypes (با نگاشت بیتی)
  • فهرست ExtraInfos

اطلاعات گروه حجم خودرو

گیرنده‌ی رویداد فراخوانی‌شده، به لیست اطلاعات گروه حجم خودرو که تحت تأثیر قرار گرفته‌اند، دسترسی دارد. این بدان معناست که برنامه برای دریافت آخرین وضعیت، نیازی به برقراری تماس‌های اضافی با چارچوب Car audio ندارد. می‌تواند به سادگی از CarVolumeGroupInfos دریافتی برای به‌روزرسانی رابط کاربری یا وضعیت‌های داخلی استفاده کند. برای سهولت کار برنامه‌ها، جنبه‌هایی که در یک گروه حجم خودرو تغییر کرده‌اند نیز به عنوان بخشی از EventTypes ارائه می‌شوند، همانطور که در زیر توضیح داده شده است.

انواع رویداد

مشخص می‌کند که کدام جنبه از CarVolumeGroupInfo تغییر کرده است. برنامه‌ها می‌توانند از این برای شناسایی تغییرات و انجام اقدامات لازم استفاده کنند. برای مثال، EVENT_TYPE_VOLUME_MAX_INDEX_CHANGED نشان می‌دهد که شاخص حداکثر افزایش حجم CarVolumeGroups مربوطه تغییر کرده است و می‌تواند توسط CarVolumeGroupInfo.getMaxVolumeGainIndex() مورد جستجو قرار گیرد.

جدول زیر رابطه بین EventType و CarVolumeGroupInfo را نشان می‌دهد.

نوع رویداد اطلاعات گروه حجم خودرو
EVENT_TYPE_VOLUME_GAIN_INDEX_CHANGED CarVolumeGroupInfo.getVolumeGainIndex()
EVENT_TYPE_VOLUME_MIN_INDEX_CHANGED CarVolumeGroupInfo.getMinVolumeGainIndex()
EVENT_TYPE_VOLUME_MAX_INDEX_CHANGED CarVolumeGroupInfo.getMaxVolumeGainIndex()
EVENT_TYPE_MUTE_CHANGED CarVolumeGroupInfo.isMuted()
EVENT_TYPE_VOLUME_BLOCKED_CHANGED CarVolumeGroupInfo.isBlocked()
EVENT_TYPE_ATTENUATION_CHANGED CarVolumeGroupInfo.isAttenuated()
EVENT_TYPE_ZONE_CONFIGURATION_CHANGED CarVolumeGroupInfo.getAudioAttributes()

اطلاعات اضافی

اطلاعات بیشتری در مورد دلیل تغییر CarVolumeGroup ارائه می‌دهد. برنامه‌ها می‌توانند از این اطلاعات برای ارائه زمینه اضافی برای هشدار به کاربر برای اقدام یا اطلاع‌رسانی استفاده کنند. به عنوان مثال، EXTRA_INFO_TRANSIENT_ATTENUATION_THERMAL نشان‌دهنده یک تضعیف گذرای فعال به دلیل اضافه بار حرارتی است. برنامه می‌تواند در صورت تلاش کاربر برای افزایش صدا، به او اطلاع دهد.

ما هیچ فرآیندی را برای ExtraInfos اعمال نمی‌کنیم. تعیین فرآیند بر اساس ExtraInfos به صلاحدید شما واگذار شده است. برای مثال، اگر تضعیف صدا به دلیل EXTRA_INFO_TRANSIENT_ATTENUATION_DUCKED فعال باشد، می‌توانید در ابتدا رابط کاربری نوار صدا را محو کنید تا از تغییر صدا توسط کاربر جلوگیری شود. برخی دیگر ممکن است ترجیح دهند که یک پیام هشدار مبنی بر فعال بودن کاهش صدا نشان دهند و به کاربر اجازه دهند صدا را تغییر دهد.

چارچوب سیستم صوتی خودرو برای ارائه ExtraInfos پیشنهادی به AudioControl HAL IAudioGainCallback وابسته است. برای کسب اطلاعات بیشتر، به Audio Gain Callback مراجعه کنید.

CarVolumeGroupEvent برای برآوردن نیازهای آینده چارچوب صوتی خودرو، مقیاس‌پذیر است. ما قصد داریم ویژگی‌های جدید را فقط از طریق CarVolumeGroupEvent پشتیبانی کنیم . اکیداً توصیه می‌کنیم که توسعه‌دهندگان برنامه از CarVolumeGroupEvent برای مدیریت حجم صدای گروه و تغییرات بی‌صدا کردن استفاده کنند.

فراخوانی رویداد گروه حجم خودرو

اندروید ۱۴، یک فراخوانی جدید برای برنامه‌های ممتاز و پلتفرمی ارائه می‌دهد تا ثبت شوند و از CarVolumeGroupEvents مطلع شوند.

  • برای ثبت نام در callback، CarAudioManager#registerCarVolumeGroupEventCallback() استفاده کنید.

  • برای لغو ثبت فراخوانی، از CarAudioManager#unregisterCarVolumeGroupEventCallback() استفاده کنید.

اگر یک برنامه با CarVolumeGroupEventCallback جدید و CarVolumeCallback قدیمی ثبت شود، رویداد CarVolumeGroupEventCallbacks اولویت‌بندی می‌شوند. پشته صوتی خودرو دیگر CarVolumeCallback را فعال نمی‌کند. این امر از فعال شدن تکراری در همان برنامه برای همان رویداد جلوگیری می‌کند.

اکیداً توصیه می‌کنیم برای مدیریت حجم صدای گروه و بی‌صدا کردن تغییرات، CarVolumeGroupEventCallback استفاده کنید.

فراخوانی مجدد بهره صوتی

از اندروید ۱۳، AudioControl HAL می‌تواند یک فراخوانی غیرهمزمان را برای مدیریت به‌روزرسانی‌های سطح صدا به دلیل تغییرات در سیستم صوتی خودرو آغاز کند.

رابط برنامه‌نویسی کاربردی هال

کنترل صوتی @2.0 AIDL

نسخه ۲.۰ نرم‌افزار AudioControl AIDL HAL رابط برنامه‌نویسی کاربردی (API) زیر را اضافه می‌کند:

رابط برنامه‌نویسی کاربردی هدف
IAudioControl#registerGainCallback یک نمونه از IAudioGainCallback را با AudioControl HAL ثبت می‌کند.
IAudioGainCallback#onAudioDeviceGainsChanged فراخوانی غیرهمزمان برای اطلاع‌رسانی تغییرات در پیکربندی بهره صدا.

فراخوانی AudioControl HAL شامل لیستی از دلایل و AudioGainConfigInfo مربوطه است که شامل موارد زیر است:

  • شناسه منطقه
  • آدرس پورت دستگاه
  • شاخص حجم > شاخص می‌تواند یا یک شاخص محدود یا یک شاخص به‌روزرسانی باشد.

دلایل را می‌توان به طور کلی به صورت زیر دسته‌بندی کرد:

  • دلایل محدودیت. تغییر گذرا در میزان صدا و بی‌صدا کردن.
  • دلایل به‌روزرسانی. تغییر دائمی در رفتار صدا.

انواع محدودیت

از AudioControl HAL AIDL V3 ، انواع محدودیت‌های پشتیبانی‌شده به شرح زیر است:

  • بی‌صدا کردن
  • مسدود کردن
  • محدودیت
  • میرایی
محدودیت فعال تغییر حجم صدا توسط کاربر فعال/غیرفعال کردن حالت بی‌صدا توسط کاربر
بی‌صدا کردن ❌ (بی‌صدا)

✔ (بی‌صدا)
مسدود کردن
محدودیت ❌ (بیش از حد مجاز)

✔ (کمتر از حد مجاز)
میرایی

اولویت بین محدودیت‌ها به صورت بی‌صدا > مسدود کردن > محدودیت > تضعیف است.

محدودیت‌های بی‌صدا کردن

محدودیت‌های بی‌صدا کردن عبارتند از:

  • Reasons.TCU_MUTE
  • Reasons.REMOTE_MUTE

چارچوب صوتی خودرو به صورت داخلی این دو حالت بی‌صدا را حفظ می‌کند:

  • بی‌صدا کردن کاربر. بر اساس درخواست کاربر، یا از طریق CarAudioManager یا رویدادهای کلیدی، فعال یا غیرفعال می‌شود.

  • بی‌صدا کردن HAL. بر اساس محدودیت‌های بی‌صدا کردن دریافتی از طریق فراخوانی AudioGain فعال یا غیرفعال می‌شود.

برای شنونده‌هایی مانند برنامه تنظیمات، وضعیت کلی بی‌صدا کردن گروه صدا ( CarVolumeGroupInfo.isMuted() ) بر اساس فعال بودن هر یک از بی‌صداهای فوق خواهد بود.

وقتی بی‌صدا کردن HAL فعال باشد، تمام درخواست‌های تغییر حجم صدا و بی‌صدا کردن گروهی برای مدت زمان محدودیت نادیده گرفته می‌شوند.

مورد تعامل: بی‌صدا کردن HAL فعال است و کاربر درخواست تغییر وضعیت بی‌صدا کردن را دارد

وقتی بی‌صدا کردن HAL فعال و بی‌صدا کردن کاربر غیرفعال است:

  • وضعیت بی‌صدای کلی گروه صدا به true تغییر یافته است.
  • درخواست‌های کاربر برای فعال کردن بی‌صدا پردازش خواهد شد.
    • دلیل: درخواست‌های بی‌صدا کردن کاربر باید همیشه مورد توجه قرار گیرد تا حریم خصوصی کاربران حفظ شود.

وقتی بی‌صدا کردن HAL و بی‌صدا کردن کاربر فعال باشد:

  • وضعیت بی‌صدای کلی گروه صدا به true تغییر یافته است.

  • درخواست‌های کاربر برای غیرفعال کردن بی‌صدا کردن پردازش NOT شد. وضعیت بی‌صدا کردن کاربر ذخیره‌شده در حافظه پنهان، همچنان فعال باقی می‌ماند.

    • دلیل: درخواست‌های بی‌صدا کردن کاربر فقط در صورتی پذیرفته می‌شوند که هیچ محدودیت فعالی وجود نداشته باشد.

    • دلیل: غیرفعال کردن بی‌صدا کردن حافظه پنهان (cache) بی‌صدا کردن کاربر ممکن است باعث انفجار ناخواسته صدا شود و ایمنی کاربر را به خطر بیندازد. این امر به ویژه در صورتی صادق است که حالت بی‌صدا در طول چرخه‌های احتراق فعال باشد که آگاهی کاربران از درک سطح صدا را کاهش می‌دهد.

مورد تعامل: HAL Mute فعال و غیرفعال است در حالی که User mute هیچ تغییری ندارد

فعال کردن HAL mute وضعیت کلی mute گروه صدا را تغییر می‌دهد. با این حال، وضعیت mute کاربر را مستقیماً به‌روزرسانی نمی‌کند. وقتی که user mute غیرفعال است و فراخوانی HAL mute برای فعال کردن دریافت می‌شود:

  • وضعیت بی‌صدای کلی گروه صدا به true تغییر یافته است.
  • درخواست‌های کاربر برای تغییر صدا در حالی که HAL mute فعال است، پردازش NOT شد.

    • دلیل: کاربر نمی‌تواند صدا را در حالی که بی‌صدا فعال است، بشنود. اجازه تغییر صدا می‌تواند منجر به انفجار صدا شود و ایمنی کاربر را به خطر بیندازد.

    • دلیل: برنامه‌های تنظیم صدا می‌توانند برای فراخوانی‌های مجدد ثبت‌نام کنند و بدون دخالت کاربر، در صورتی که این رفتار مورد انتظار سازنده اصلی (OEM) باشد، به طور خودکار و بدون دخالت کاربر، یک حالت بی‌صدا (CarAudioManager.setVolumeGroupMute(...,/* mute=*/ true,..)) را فعال کنند.

وقتی بی‌صدا کردن HAL غیرفعال است در حالی که بی‌صدا کردن کاربر غیرفعال است:

  • وضعیت بی‌صدا کردن گروه صدا به false تغییر یافته است.

    دلیل: قرار دادن حالت بی‌صدا به صورت چسبنده و درخواست از کاربر برای لغو بی‌صدا کردن، ممکن است وقتی حالت‌های بی‌صدا مرتباً تغییر می‌کنند، بی‌جهت کار کاربر را مختل کند.

  • درخواست‌های کاربران برای تغییر حجم به طور عادی پردازش خواهد شد.

مسدود کردن

محدودیت‌های مسدودسازی عبارتند از:

  • Reasons.FORCED_MASTER_MUTE
  • Reasons.REMOTE_MUTE
  • Reasons.TCU_MUTE .

وقتی محدودیت‌های مسدودسازی فعال هستند، درخواست‌هایی از کاربران برای:

  • تغییر حجم پردازش نمی‌شود .
  • خاموش/بی‌صدا کردنِ ضامن‌دار پردازش می‌شوند.

محدودیت

محدودیت‌های اعمال شده عبارتند از:

  • Reasons.THERMAL_LIMITATION
  • Reasons.SUSPEND_EXIT_VOL_LIMITATION

وقتی محدودیت‌های دسترسی فعال هستند، درخواست‌هایی از کاربران برای:

  • تغییر حجم صدا:

    • در محدوده مجاز پردازش می‌شوند
    • موارد فوق پردازش نمی‌شوند
  • خاموش/بی‌صدا کردنِ ضامن‌دار پردازش می‌شوند.

میرایی

محدودیت‌های میرایی عبارتند از:

  • Reasons.ADAS_DUCKING
  • Reasons.NAV_DUCKING
  • Reasons.PROJECTION_DUCKING

وقتی محدودیت‌های میرایی فعال هستند، درخواست‌های کاربران برای:

  • تغییرات صدا پردازش می‌شوند. سطح صدای فعلی جدید روی صدای ضعیف‌شده تنظیم می‌شود (به جای صدای قبلی). تغییرات بعدی صدا از این سطح انجام می‌شود.

  • قطع صدا پردازش می‌شود.

به‌روزرسانی به فهرست

موارد زیر به عنوان به‌روزرسانی ناهمزمان شاخص حجم در نظر گرفته می‌شود: Reasons.EXTERNAL_AMP_VOL_FEEDBACK .

به همین دلیل، AudioControl HAL می‌تواند شاخص فعلی گروه صدا را به شاخص مشخص شده به‌روزرسانی کند. این در درجه اول به عنوان بازخوردی از سیستم صوتی برای درخواست تغییر صدا از چارچوب Car audio استفاده می‌شود. به‌روزرسانی شاخص همچنین به عنوان یک فراخوانی CarVolumeGroupEvent با Apps برای همگام‌سازی شاخص ارتباط برقرار می‌کند.

مثال‌ها

مورد استفاده: کاربر شاخص حجم را به 30 به‌روزرسانی می‌کند

  • کاربر از برنامه‌ی Volume برای تغییر شاخص صدا به ۳۰ استفاده می‌کند.

  • این شاخص به افزایش صدا تبدیل شده و به Audio HAL ارسال می‌شود.

  • پیاده‌سازی‌های فروشنده‌ی Audio HAL ، افزایش حجم جدید را دریافت کرده و سیستم صوتی را به‌روزرسانی می‌کنند (مانند آمپلی‌فایر خارجی).

  • سیستم صوتی پاسخ می‌دهد که سطح صدا فقط تا شاخص ۱۵ به‌روزرسانی می‌شود (به دلایلی که برای اندروید ناشناخته است).

  • پیاده‌سازی‌های فروشنده از تریگرهای AudioControl HAL :

    IAudioGainCallback.onAudioDeviceGainsChanged(EXTERNAL_AMP_VOL_FEEDBACK, {...,  15 /* New index */})
    
  • سرویس صوتی خودرو، اندیس جدید از callback را که برای تداوم و فراخوانی‌های مجدد به برنامه‌ی صدا استفاده می‌شود، مصرف می‌کند. اندیس درخواستی کاربر 30 است. با این حال، بازخورد ناهمزمان سیستم صوتی، اندیس را به 15 به‌روزرسانی می‌کند.

مورد استفاده: اولین پخش صدا پس از خروج از حالت تعلیق

  • شاخص حجم قبل از تعلیق روی سطح بالای ۹۵ تنظیم شده است (محدوده: [۰-۹۹]).

  • اندروید وارد حالت تعلیق می‌شود.

  • وقتی اندروید وجود داشته باشد، به حالت تعلیق در می‌آید (برای مثال، از سر گرفته می‌شود):

    • فروشنده‌ی Audio HAL/AudioControl HAL یک شاخص امن ۳۰ را به صورت محلی برای سیستم صوتی اعمال می‌کند.

    • فروشنده AudioControl HAL همچنین فراخوانی برای شاخص ایمن را آغاز می‌کند:

    IAudioGainCallback.onAudioDeviceGainsChanged(SUSPEND_EXIT_VOL_LIMITATION, {...,  30 /* safe index */})
    
  • سرویس صوتی خودرو، اندیس جدید حاصل از فراخوانی مجدد را که برای تداوم و فراخوانی‌های مجدد خود به برنامه‌ی تنظیم صدا که این اندیس را همگام‌سازی می‌کند، مصرف می‌کند. اندیس صدا قبل از تعلیق ۹۵ است. با این حال، پس از از سرگیری، این اندیس توسط پیاده‌سازی AudioControl HAL روی سطح صدای ایمن ۳۰ تنظیم می‌شود.

پیکربندی پویای حجم

برای این ویژگی، موارد استفاده اصلی زیر را در نظر می‌گیریم:

  1. پیکربندی پایان خط (EOL) خودرو.

    • خودروسازان ترجیح می‌دهند تنظیمات صدا را در پایان عمر سیستم صوتی خودرو و بر اساس تنظیمات سیستم صوتی خودرو به‌روزرسانی کنند. معمولاً این یک به‌روزرسانی جانبی بدون به‌روزرسانی تصویر اندروید SW است.

    • ممکن است خودروسازان نیاز داشته باشند که پیکربندی حجم را در طول برنامه سرویس به‌روزرسانی کنند.

  2. پیکربندی زمان اجرا. سیستم‌های صوتی خودرو از پیکربندی‌های تقویت‌کننده خارجی پشتیبانی می‌کنند و این ECUها ممکن است میزبان پیکربندی‌های محدوده صدا باشند که در زمان بوت شدن مورد پرسش قرار می‌گیرند.

  3. پیکربندی بر اساس تقاضا. ارائه شده برای پشتیبانی از نیاز روزافزون به ویژگی‌های صوتی مبتنی بر تقاضا که در آن کاربران برای مدت زمانی از پردازش سیگنال پیشرفته استفاده می‌کنند. پیکربندی‌های جدید محدوده صدا برای مدت زمان اشتراک معتبر هستند.

طراحی

پیکربندی حجم پویا در سه مرحله انجام می‌شود:

  • کشف. پیاده‌سازی AudioControl HAL فروشنده، به‌روزرسانی‌های جدید محدوده صدا را از طریق یک مکانیسم IPC سفارشی متعلق به فروشنده کشف می‌کند.

    پس از کشف، یک فراخوانی برگشتی از طریق AudioControl::IModuleChangeCallback ایجاد می‌شود.

  • به‌روزرسانی. مجموعه تنظیمات سیستم صوتی خودرو، وضعیت گروه‌های صدا را با محدوده‌های صدای جدید به‌روزرسانی می‌کند.

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

  • تماس مجدد.

    • پس از به‌روزرسانی محدوده گروه صدا، مجموعه تنظیمات سیستم صوتی خودرو، فراخوانی مجددی را برای برنامه‌های ثبت‌شده از طریق CarVolumeGroupEventCallback آغاز می‌کند.

    • CarVolumeGroupEvent شامل CarVolumeGroupInfo ، Event-type (چه چیزی تغییر کرده) و Extra-info (چرا تغییر کرده) به‌روزرسانی‌شده است.

تصویر

شکل ۲. پیکربندی پویای حجم.

رابط برنامه‌نویسی کاربردی هال

کنترل صوتی @ 3.0 AIDL

نسخه ۳.۰ نرم‌افزار AudioControl AIDL HAL رابط‌های برنامه‌نویسی کاربردی (API) زیر را معرفی می‌کند:

رابط برنامه‌نویسی کاربردی
IAudioControl#setModuleChangeCallback یک نمونه از IModuleChangeCallback را با AudioControl HAL تنظیم می‌کند.
IAudioControl#clearModuleChangeCallback نمونه‌ی IModuleChangeCallback که قبلاً با AudioControl HAL تنظیم شده بود را پاک می‌کند.
تغییر فراخوانی ماژول در پورت‌های صوتی (IModuleChangeCallback#onAudioPortsChanged) فراخوانی مجدد برای اطلاع‌رسانی تغییرات در AudioPorts

توالی

نمودار توالی پیکربندی حجم پویا در زیر نمایش داده شده است.

تصویر

شکل ۳. نمودار توالی برای پیکربندی پویای حجم.

جنبه‌های کلیدی

برای بهینه سازی این ویژگی، موارد زیر را در نظر بگیرید.

  • پورت‌های صوتی ارائه شده به عنوان بخشی از فراخوانی مجدد باید با تعریف Automotive BUS مطابقت داشته باشند:

    • پورت دستگاه. IN_DEVICE ، OUT_DEVICE
    • اتصال. BUS
    • آدرس. در تعریف Audio HAL تعریف شده است
    • حالت گین. JOINT
  • فروشندگان باید مجموعه‌ای از تعاریف محدوده صدا را در سیاست Audio HAL تعریف کنند و از فراخوانی برای سفارشی‌سازی آن برای انواع خودرو استفاده کنند. برای اطلاعات بیشتر به تعریف IModuleChangeCallbac AIDL مراجعه کنید.

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