Конфигурация автозвука

В Android 10 car_audio_configuration.xml заменил car_volumes_groups.xml и IAudioControl.getBusForContext . Файлы политики аудио, обычно содержащиеся в разделе поставщика, представляют собой конфигурацию аудиооборудования платы. Все устройства, указанные в car_audio_configuration.xml должны быть определены в audio_policy_configuration.xml .

На рисунке 1 ниже показан общий обзор архитектуры службы автомобильной аудиосистемы, в которой служба автомобильной аудиосистемы считывает файл конфигурации автомобильной аудиосистемы для настройки звука для устройства.

Обзор архитектуры автомобильной аудиосистемы

Рисунок 1. Обзор архитектуры автомобильной аудиосистемы.

Поместите файл конфигурации автомобильной аудиосистемы в vendor\etc\ или system\etc\ на устройстве, при этом vendor\etc\ будет первым местом поиска файла службой автомобильной аудиосистемы. Службы автомобильной аудиосистемы считывают car_audio_configuration.xml , чтобы определить конфигурацию аудио.

Зоны автозвука:

  • Каждая аудиозона содержит уникальный идентификатор аудиозоны.
  • Каждую аудиозону можно сопоставить с зоной агента.
  • Звуковые действия в каждой зоне независимы друг от друга:

    • Аудио фокус
    • Аудио маршрутизация
    • Приглушение звука
  • Группы объемов автомобиля:

    • Все аудиоустройства, содержащие группу громкости, управляются одновременно с одинаковым изменением усиления. Конфигурация усиления звука для всех устройств в группе должна быть одинаковой.

    • Сопоставление аудиоконтекста с аудиоустройствами. Используйте это для создания аудиомикса, который сопоставляет использование звука с устройством вывода.

    • Все аудиоконтексты должны быть представлены внутри зоны. Это позволяет точно настроить маршрутизацию звука для всех применений аудиоатрибутов.

Аудио контексты

Чтобы упростить настройку звука AAOS, аналогичные варианты использования были сгруппированы в CarAudioContexts . Эти аудиоконтексты используются в CarAudioService для определения маршрутизации, групп громкости, фокусировки звука и управления приглушением. Статические аудиоконтексты в AAOS перечислены ниже.

В этой таблице описывается сопоставление между аудиоконтекстами и их использованием. Выделенные строки предназначены для нового использования системы.

АвтомобильАудиоКонтекст Использование связанного атрибута
МУЗЫКА UNKNOWN
GAME
MEDIA
НАВИГАЦИЯ ASSISTANCE_NAVIGATION_GUIDANCE
VOICE_COMMAND ASSISTANT
ASSISTANCE_ACCESSIBILITY
CALL_RING NOTIFICATION_RINGTONE
ВЫЗОВ VOICE_COMMUNICATION
VOICE_COMMUNICATION_SIGNALING
ТРЕВОГА ALARM
УВЕДОМЛЕНИЕ NOTIFICATION
NOTIFICATION_*
СИСТЕМА_ЗВУК ASSISTANCE_SONIFICATION
ЧРЕЗВЫЧАЙНАЯ СИТУАЦИЯ EMERGENCY
БЕЗОПАСНОСТЬ SAFETY
VEHICLE_STATUS VEHICLE_STATUS
ОБЪЯВЛЕНИЕ ANNOUNCEMENT

Включить маршрутизацию AAOS

Чтобы использовать маршрутизацию на основе AAOS, необходимо установить для флага audioUseDynamicRouting значение true :

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

Если false , маршрутизация и большая часть CarAudioService отключаются, и AAOS возвращается к поведению AudioService по умолчанию.

Основная зона

По умолчанию весь звук направляется в основную зону. Существует только одна основная зона, которая указывается в конфигурации атрибутом isPrimary="true" . Основной зоне автоматически назначается Audiomanager.PRIMARY_AUDIO_ZONE .

Пример конфигурации (версия 2)

Например, автомобиль может иметь две зоны: основную зону и развлекательную систему на задних сиденьях. В этом сценарии вы можете спроектировать возможную версию car_audio_configuration.xml 2 следующим образом:

<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 для применения к выходным данным этих устройств.

Для основной зоны мы рекомендуем отделить системные звуки от других звуков. Это позволяет обрабатывать звуки транспортных средств с более высоким приоритетом. Служба автозвука уже делает эти различия для звуков автомобиля с точки зрения управления фокусировкой и приглушением звука. Например, запрос на фокусировку аварийного звука имеет более высокий приоритет, чем другой запрос на фокусировку.

Для простоты в примере дополнительной зоны все аудиоконтексты направляются на одно устройство и одну группу томов.

Конфигурация звука в зоне присутствия

В Android 11 в 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>

Приведенная выше конфигурация определяет сопоставление основной зоны с зоной агента 0 и audioZoneId 1 с occupantZoneId 1. В общем, можно настроить любое сопоставление между зоной агента и аудиозоной. Однако отображение должно быть взаимно однозначным. Правила, определяющие два новых поля, перечислены ниже.

  • audioZoneId для основной зоны всегда имеет идентификатор PRIMARY_AUDIO_ZONE . Если определено isPrimary="true" , то audioZoneId не требуется.

  • Номера audioZoneId и occupantZoneId не могут повторяться.

  • audioZoneId и occupantZoneId могут иметь только однозначное сопоставление.

Конфигурация автомобильной аудиосистемы Android 14

В Android 14 компания AAOS представила службу OEM-плагинов, которая позволяет более активно управлять поведением звука, контролируемым службой автомобильной аудиосистемы. Наряду с новыми сервисами плагина в файл конфигурации автозвука добавлены следующие изменения:

  • Контекст автомобильной аудиосистемы, определенный OEM
  • Динамические конфигурации неосновной зоны

Контекст автомобильной аудиосистемы, определенный OEM-производителем

Чтобы обеспечить гибкую конфигурацию звука, в Android 14 служба автомобильного аудио позволяет группировать использование звука иначе, чем статические контексты аудио, определенные выше. Этот контекст, определенный OEM-производителем, можно определить в файле car_audio_configuration.xml версии 3.

Вместо этого используются определенные в данный момент статические аудиоконтексты. Общий формат контекста автомобильной аудиосистемы, определенного 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

Контекст должен быть определен в верхней части файла car_audio_configuration.xml . Когда OEM-контексты определены, остальная часть настройки автомобильной аудиосистемы может продолжаться, как и раньше. К контексту автомобильной аудиосистемы применяются следующие правила:

  • Определения контекста OEM не являются обязательными. Вместо этого используется статический контекст Audio .

  • Не повторяйте названия контекстов.

  • Не назначайте использование атрибута audio нескольким контекстам.

  • Все способы использования аудио, определенные в AudioAttributes должны использоваться для создания контекста.

Строго говоря, строковое представление использования звука android.audio.policy.configuration.V7_0.AudioUsage должно использоваться для определения аудиоконтекста OEM. В будущем новые варианты использования атрибутов аудио будут присваиваться наиболее подходящему контексту, чтобы уменьшить количество ошибок при переходе с одной версии Android на другую.

Хотя контекст, определяемый OEM, был введен для дальнейшего расширения службы аудио плагинов OEM, его по-прежнему можно использовать без службы плагинов OEM. Поведение звука напоминает поведение статического аудиосервиса:

  • Взаимодействие с аудиофокусом. Атрибут аудио используется для определения наилучшего поведения соответствия, установленного матрицей взаимодействия фокуса звука. Подробную информацию см. в разделе Аудио фокус .

  • Атрибут звука управления громкостью звука используется для определения наилучшего соответствия:

    • Группа томов на основе контекста, определенного OEM.
    • Настроен приоритет из статического списка томов.
  • Поведение приглушения звука:

    • Использование атрибута аудио для текущего фокуса аудио используется для сопоставления с информацией о выходном аудиоустройстве, как определено в файле конфигурации автомобильной аудиосистемы.

    • Атрибут Audio используется для сопоставления соответствующего статического контекста с приглушением на основе статической матрицы приглушения звука.

Конфигурации динамических аудиозон

В Android 14, чтобы обеспечить настройку динамических аудиозон, схема конфигурации автомобильной аудиосистемы для определения аудиозон также обновлена ​​до версии 3. Новая схема требует настройки конфигурации для каждой зоны.

<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 . Начиная с Android 14, основная зона может иметь только одну (1) конфигурацию. Неосновные зоны могут иметь несколько конфигураций. К конфигурациям автомобильной аудиосистемы применяются следующие правила:

  • Основная аудиозона может иметь только одну конфигурацию.

  • Неосновные аудиозоны могут иметь несколько конфигураций.

  • Имя должно быть уникальным для каждой аудиозоны и конфигурации аудиозоны.

  • В пределах аудиозоны конфигурации звука могут различаться:

    • Настройка групп томов не обязательно должна быть одинаковой.
    • Назначение аудиоконтекста не обязательно должно быть одинаковым.
  • Имена устройств вывода звука должны быть уникальными в разных зонах и конфигурациях. Имя устройства должно появляться только один раз в аудиоконфигурации или зонах.

  • Аудиоустройства, принадлежащие к одной группе громкости, должны иметь одинаковые настройки усиления звука.

  • Все аудиоконтексты (OEM или статические) должны быть назначены для каждой аудиоконфигурации.

Прямая совместимость

Хотя в новых версиях файла car_audio_configuration.xml в каждом обновлении представлены новые функции, вы по-прежнему можете использовать старые файлы в новых версиях AAOS. OEM-производители, обновляющие новые версии Android, могут повторно использовать файл car_audio_configuration.xml .

Чтобы использовать новую функцию, для которой требуется новая информация, содержащаяся в car_audio_configuration.xml , необходимо обновить версию. Попытка использовать более старую версию файла с информацией, не поддерживаемой в этой версии файла, вызывает исключение IllegalStateException при запуске службы автомобиля. Сообщение об исключении содержит соответствующую информацию о том, какая информация используется и какая минимальная версия требуется.