تنظیمات صوتی ماشین

در اندروید ۱۰، car_audio_configuration.xml جایگزین car_volumes_groups.xml و IAudioControl.getBusForContext شد. فایل‌های سیاست صوتی که معمولاً در پارتیشن vendor قرار دارند، پیکربندی سخت‌افزار صوتی برد را نشان می‌دهند. تمام دستگاه‌هایی که در car_audio_configuration.xml به آنها اشاره شده است، باید در audio_policy_configuration.xml تعریف شوند.

شکل ۱ نمای کلی از معماری سرویس صوتی خودرو را نشان می‌دهد که در آن سرویس صوتی خودرو، فایل پیکربندی صوتی خودرو را می‌خواند تا صدا را برای دستگاه تنظیم کند.

مروری بر معماری سیستم صوتی خودرو

شکل ۱. نمای کلی معماری سیستم صوتی خودرو.

فایل پیکربندی سیستم صوتی خودرو را در مسیر vendor/etc/ یا system/etc/ روی دستگاه قرار دهید، به طوری که vendor/etc/ اولین جایی باشد که سرویس سیستم صوتی خودرو برای یافتن این فایل جستجو می‌کند. سرویس‌های سیستم صوتی خودرو car_audio_configuration.xml را برای تعیین پیکربندی سیستم صوتی می‌خواند.

مناطق صوتی خودرو:

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

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

    • تمام دستگاه‌های صوتی که شامل یک گروه صدا هستند، با تغییرات بهره یکسانی کنترل می‌شوند. پیکربندی بهره صدا برای همه دستگاه‌های یک گروه باید یکسان باشد.

    • نگاشت زمینه صوتی به دستگاه‌های صوتی. از این برای ساخت یک میکس صوتی استفاده کنید که کاربردهای صوتی را به یک دستگاه خروجی نگاشت می‌کند.

    • تمام زمینه‌های صوتی باید در یک منطقه نمایش داده شوند. این امر امکان تنظیم دقیق مسیریابی صوتی را برای تمام کاربردهای ویژگی‌های صوتی فراهم می‌کند.

زمینه‌های صوتی

برای ساده‌سازی پیکربندی صدای AAOS، کاربردهای مشابه در CarAudioContexts گروه‌بندی شده‌اند. این contextهای صوتی در سراسر CarAudioService برای تعریف مسیریابی، گروه‌های صدا، تمرکز صدا و مدیریت ducking استفاده می‌شوند. contextهای صوتی استاتیک در AAOS در این جدول فهرست شده‌اند.

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

CarAudioContext کاربردهای ویژگی‌های مرتبط
MUSIC UNKNOWN
GAME
MEDIA
NAVIGATION ASSISTANCE_NAVIGATION_GUIDANCE
VOICE_COMMAND ASSISTANT
ASSISTANCE_ACCESSIBILITY
CALL_RING NOTIFICATION_RINGTONE
CALL VOICE_COMMUNICATION
VOICE_COMMUNICATION_SIGNALING
ALARM ALARM
NOTIFICATION NOTIFICATION
NOTIFICATION_*
SYSTEM_SOUND ASSISTANCE_SONIFICATION
EMERGENCY EMERGENCY
SAFETY SAFETY
VEHICLE_STATUS VEHICLE_STATUS
ANNOUNCEMENT ANNOUNCEMENT

فعال کردن مسیریابی AAOS

برای استفاده از مسیریابی مبتنی بر AAOS، باید پرچم audioUseDynamicRouting را روی true تنظیم کنید:

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

وقتی false ، مسیریابی و بخش زیادی از CarAudioService غیرفعال می‌شود و AAOS به رفتار پیش‌فرض AudioService برمی‌گردد.

موتور سیاست صوتی قابل تنظیم

برای گسترش بیشتر مدیریت صدای خودرو در اندروید ۱۴، AAOS استفاده از مدیریت صدا را از طریق موتور سیاست صوتی قابل تنظیم (CAP) معرفی کرد. انجام این کار انعطاف‌پذیری بیشتری را برای کنترل مسیریابی صدا و مدیریت صدا فراهم می‌کند و تعریف متنوعی از موارد زیر را ارائه می‌دهد:

شما می‌توانید موتور سیاست صوتی قابل پیکربندی (CAP) را از طریق استفاده از useCoreAudioVolume و useCoreAudioRouting فعال کنید. برای جزئیات بیشتر به Configurable audio policy engine مراجعه کنید.

منطقه اولیه

به طور پیش‌فرض، تمام صداها به منطقه اصلی (primary zone) هدایت می‌شوند. فقط یک منطقه اصلی وجود دارد که در پیکربندی با ویژگی isPrimary="true" نشان داده شده است. منطقه اصلی به طور خودکار Audiomanager.PRIMARY_AUDIO_ZONE را به خود اختصاص می‌دهد.

پیکربندی نمونه (نسخه ۲)

برای مثال، یک وسیله نقلیه ممکن است دو منطقه داشته باشد، یک منطقه اصلی و یک سیستم سرگرمی صندلی عقب. در این سناریو، می‌توانید یک 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>
               </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>
               <group>
                   <device address="bus7_system_sound_out">
                       <context context="system_sound"/>
                       <context context="emergency"/>
                       <context context="safety"/>
                       <context context="vehicle_status"/>
                   </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 پیکربندی شده باشد، سطوح صدا برای هر گروه به HAL منتقل می‌شود تا روی خروجی این دستگاه‌ها اعمال شود.

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

در مثال منطقه ثانویه، تمام زمینه‌های صوتی به یک دستگاه واحد و یک گروه صدا هدایت می‌شوند.

تعریف گروه حجمی برای موتور CAP

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


<group name="media">
  <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>
</group>
<group name="navigation">
  <device address="bus1_navigation_out">
    <context context="navigation"/>
  </device>
  <device address="bus2_voice_command_out">
    <context context="voice_command"/>
  </device>
</group>

نام این گروه حجم باید با نام حجم تعریف شده در موتور CAP مطابقت داشته باشد. علاوه بر این، useFixedVolume نیز باید روی false تنظیم شود. برای جزئیات بیشتر به تنظیمات صوتی پرچم‌های AAOS مراجعه کنید.

پیکربندی صوتی منطقه اشغال‌شده

در اندروید ۱۱، car_audio_configuration.xml دو فیلد جدید به نام‌های audioZoneId و occupantZoneId معرفی کرد. می‌توانید audioZoneId برای کنترل مدیریت منطقه صوتی استفاده کنید. می‌توانید occupantZoneId برای پیکربندی مسیریابی بر اساس شناسه کاربر استفاده کنید.

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

<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>

این پیکربندی، نگاشتی را برای منطقه اصلی به منطقه ساکن ۰ و audioZoneId 1 به occupantZoneId 1 تعریف می‌کند. هرگونه نگاشتی بین منطقه ساکن و منطقه صوتی قابل پیکربندی است. با این حال، این نگاشت باید یک به یک باشد. قوانینی که دو فیلد جدید را تعریف کرده‌اند عبارتند از:

  • audioZoneId برای منطقه اصلی همیشه PRIMARY_AUDIO_ZONE ID است. اگر isPrimary="true" تعریف شده باشد، نیازی به audioZoneId نیست.

  • شماره‌های audioZoneId و occupantZoneId قابل تکرار نیستند.

  • audioZoneId و occupantZoneId فقط می‌توانند نگاشت یک به یک داشته باشند.

پیکربندی سیستم صوتی ماشین اندروید ۱۴

در اندروید ۱۴، AAOS سرویس افزونه OEM را معرفی کرد که به شما امکان می‌دهد رفتار صوتی تحت نظارت سرویس صوتی خودرو را مدیریت کنید. همراه با سرویس‌های افزونه جدید، تغییرات زیر به فایل پیکربندی صوتی خودرو اضافه شده است:

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

زمینه صوتی خودرو تعریف شده توسط OEM

برای فعال کردن پیکربندی صوتی انعطاف‌پذیر، در اندروید ۱۴، سرویس car audio امکان گروه‌بندی کاربردهای صوتی را به گونه‌ای متفاوت از زمینه‌های صوتی استاتیک تعریف‌شده فراهم می‌کند. این زمینه تعریف‌شده توسط OEM را می‌توان در فایل car_audio_configuration.xml نسخه ۳ تعریف کرد.

در عوض، از زمینه‌های صوتی استاتیک از پیش تعریف‌شده استفاده می‌شود. قالب کلی زمینه صوتی خودرو تعریف‌شده توسط OEM بعداً نشان داده شده است.

هر یک از زمینه‌های OEM به یک name به همراه لیستی از ویژگی‌های صوتی مورد استفاده که به آن زمینه اختصاص داده شده‌اند، نیاز دارند. در مثال قبلی، دو زمینه تعریف شده‌اند:

<carAudioConfiguration version="3">
    <oemContexts>
        <oemContext name="media">
            <audioAttributes>
                <usage value="AUDIO_USAGE_MEDIA" />
    <usage value="AUDIO_USAGE_UNKNOWN"/>
            </audioAttributes>
        </oemContext>
        <oemContext name="game">
            <audioAttributes>
                <usage value="AUDIO_USAGE_GAME" />
            </audioAttributes>
        </oemContext>
...
  • متن media شامل AUDIO_USAGE_MEDIA و AUDIO_USAGE_UNKNOWN است
  • متن game فقط شامل AUDIO_USAGE_GAME است

این context باید در بالای فایل car_audio_configuration.xml تعریف شود. وقتی context های OEM تعریف شدند، بقیه پیکربندی سیستم صوتی خودرو می‌تواند مانند قبل ادامه یابد. قوانین زیر در مورد context سیستم صوتی خودرو اعمال می‌شود:

  • تعریف زمینه OEM اختیاری است. به جای آن از زمینه صوتی استاتیک استفاده می‌شود.

  • نام‌های زمینه‌ها را تکرار نکنید.

  • استفاده از ویژگی صوتی را به چندین زمینه اختصاص ندهید.

  • تمام کاربردهای صوتی تعریف‌شده در AudioAttributes باید برای ساخت زمینه استفاده شوند.

به طور دقیق، رشته android.audio.policy.configuration.V7_0.AudioUsage که نشان‌دهنده‌ی کاربرد صدا است، باید برای تعریف زمینه‌ی صوتی OEM استفاده شود. در آینده، کاربردهای جدیدتر ویژگی‌های صوتی به مناسب‌ترین زمینه اختصاص داده می‌شوند تا هنگام مهاجرت از یک نسخه اندروید به نسخه دیگر، خطا کاهش یابد.

اگرچه زمینه تعریف‌شده توسط OEM برای گسترش بیشتر سرویس صوتی افزونه OEM معرفی شد، اما همچنان می‌توان از آن بدون سرویس افزونه OEM استفاده کرد. رفتار صوتی شبیه به سرویس صوتی استاتیک است:

  • تعاملات فوکوس صوتی. ویژگی صوتی برای تعیین بهترین رفتار تطبیقی ​​​​که توسط ماتریس تعامل فوکوس صوتی تنظیم شده است، استفاده می‌شود. برای جزئیات بیشتر، به فوکوس صوتی مراجعه کنید.

  • از ویژگی audio برای تعیین بهترین تطابق استفاده می‌شود:

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

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

    • از ویژگی audio برای نگاشت زمینه استاتیک مربوطه به duck، بر اساس ماتریس ducking صوتی استاتیک، استفاده می‌شود.

استراتژی‌های محصول موتور CAP

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

برای کسب اطلاعات بیشتر، به استراتژی محصول موتور CAP در AAOS مراجعه کنید.

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

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

<carAudioConfiguration version="3">
    <!-- optional OEM context -->
    <oemContexts>
      <oemContext name="media">
        <audioAttributes>
          <usage value="AUDIO_USAGE_MEDIA" />
          <usage value="AUDIO_USAGE_UNKNOWN"/>
        </audioAttributes>
      </oemContext>
      <oemContext name="game">
        <audioAttributes>
          <usage value="AUDIO_USAGE_GAME" />
        </audioAttributes>
      </oemContext>
...
    </oemContexts>
  <zones>
    <zone name="primary zone" isPrimary="true" occupantZoneId="0">
      <zoneConfigs>
        <zoneConfig name="primary zone config 0" isDefault="true">
          <volumeGroups>
            <group>
              <device address="bus0_media_out">
                <context context="media"/>
            <context context="game"/>
                <context context="announcement"/>
              </device>
              <device address="bus6_notification_out">
                <context context="notification"/>
              </device>
            </group>
  ...
      </zoneConfigs>
    </zone
  </zones>

برای کسب اطلاعات بیشتر، به فایل نسخه 3 که در device/generic/car/emulator/audio/car_audio_configuration.xml تعریف شده است، مراجعه کنید. از اندروید 14 به بعد، منطقه اصلی می‌تواند فقط یک (1) پیکربندی داشته باشد. مناطق غیر اصلی می‌توانند چندین پیکربندی داشته باشند. قوانین زیر در مورد پیکربندی‌های صوتی خودرو اعمال می‌شود:

  • منطقه صوتی اصلی فقط می‌تواند یک پیکربندی داشته باشد.

  • مناطق صوتی غیر اصلی می‌توانند پیکربندی‌های متعددی داشته باشند.

  • نام باید برای هر منطقه صوتی و پیکربندی منطقه صوتی منحصر به فرد باشد.

  • در یک منطقه صوتی، پیکربندی‌های صوتی ممکن است متفاوت باشند:

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

  • دستگاه‌های صوتی متعلق به یک گروه صوتی باید پیکربندی‌های بهره صوتی یکسانی داشته باشند.

  • تمام زمینه‌های صوتی (OEM یا استاتیک) باید برای هر پیکربندی صوتی اختصاص داده شوند.

سازگاری رو به جلو

اگرچه نسخه‌های جدید car_audio_configuration.xml در هر به‌روزرسانی ویژگی‌های جدیدی را معرفی می‌کنند، اما همچنان می‌توانید از فایل‌های قدیمی‌تر در نسخه‌های جدیدتر AAOS استفاده کنید. تولیدکنندگان اصلی تجهیزات (OEM) که به نسخه‌های جدید اندروید به‌روزرسانی می‌کنند، می‌توانند دوباره از فایل car_audio_configuration.xml استفاده کنند.

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