Управление томами

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

Фиксированные объемы

Реализации 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="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 . Подробнее см. пример выше в разделе «Определение групп томов» .

Текущие уровни громкости для каждой зоны сохраняются для пользователя, связанного с этой зоной. Эти настройки привязаны к конкретной зоне. Это означает, что если пользователь входит в систему на дисплее, связанном с основной зоной, а затем входит в зону, связанную с дополнительной аудиозоной, уровни громкости, загруженные и сохраненные для первой зоны, будут отличаться от уровней громкости для дополнительной зоны.

Минимальный и максимальный объем активации

В Android 15 реализовано управление индексами групп громкости для повышения безопасности и комфорта пользователя автомобильных аудиосистем. Это достигается за счёт использования минимальной и максимальной громкости активации, настраиваемой в конфигурации автомобильной аудиосистемы (см. раздел Определение групп громкости ). Эту функцию можно включить, установив параметр audioUseMinMaxActivationVolume в true в параметрах RRO сервиса автомобиля.

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

  • Должно содержать уникальное name в файле конфигурации автомобильной аудиосистемы, чтобы на него можно было ссылаться в группе томов ( group ) позже.
  • Должен содержать только один activationVolumeConfigEntry .

Каждый activationVolumeConfig содержит следующие атрибуты:

  • minActivationVolumePercentage (целое число, 0-100, необязательное, по умолчанию: 0): указывает минимальный объем активации в процентах.
  • maxActivationVolumePercentage (целое число, 0-100, необязательное, по умолчанию: 100): указывает максимальный объем активации в процентах.
  • invocationType (строка, необязательный, по умолчанию: onPlaybackChanged ): определяет условия, при которых применяется минимальный и максимальный уровень активации:

    • onBoot : Применяется только к первому новому активному воспроизведению в группе томов после загрузки.
    • onSourceChanged : применяется только к новому активному воспроизведению с измененным источником приложения или UID в группе томов.
    • onPlaybackChanged : Применяется к каждому новому активному воспроизведению в группе томов.

CarAudioService управляет минимальной и максимальной активацией, отслеживая следующие активные в данный момент аудиокомпоненты:

  • Текущие активные воспроизводимые треки
  • Текущее состояние вызова
  • Текущий запрос фокуса звука от Audio Control HAL, где запрос фокуса звука от Audio Control HAL сигнализирует о том, что активное воспроизведение звука происходит за пределами Android.

На следующем рисунке показан общий обзор управления минимальным и максимальным объемом активации:

image

Рисунок 1. Минимальная и максимальная громкость активации управления активными путями аудиоданных.

Указав значения minActivationVolumePercentage и maxActivationVolumePercentage , а также минимальный и максимальный индексы усиления громкости, можно рассчитать минимальный и максимальный индекс усиления громкости активации для каждой группы громкости. CarAudioService отслеживает каждое новое активное воспроизведение и применяет минимальный и максимальный уровень громкости активации при следующих условиях:

  • Соответствие типов вызова: тип активации воспроизведения (полученный из диспетчера звука, HAL управления звуком или диспетчера телефонии) должен соответствовать invocationType указанному в activationVolumeConfigEntry , связанном с группой томов.
  • Индекс громкости вне диапазона: Текущий индекс прироста громкости группы томов должен выходить за пределы заданного диапазона индекса прироста громкости активации, в частности, должно выполняться одно из следующих условий:

    • Индекс ниже расчетного минимального индекса прироста объема активации.

      ИЛИ

    • Индекс выше расчетного максимального индекса прироста объема активации.

При совпадении активации индекс прироста громкости группы громкости будет скорректирован до одного из следующих значений:

  • Минимальный индекс прироста объема активации, если он ниже минимального индекса прироста объема активации

    ИЛИ

  • Максимальный индекс прироста объема активации, если он выше максимального индекса прироста объема активации

Кроме того, событие группы томов автомобиля с типом события EVENT_TYPE_VOLUME_GAIN_INDEX_CHANGED отправляется всем зарегистрированным обратным вызовам событий группы томов.

Обработка событий клавиш регулировки громкости

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 .

Затухание и баланс

Обе версии 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 является ошибкой.

Вы сами решаете, как применять эти значения и как отображать их пользователям. Их можно применять только к медиафайлам или ко всем звукам Android. В Android 11 также появилась поддержка применения аудиоэффектов к устройствам вывода. Благодаря этому можно управлять затуханием и балансом звука с помощью аудиоэффектов на соответствующих устройствах вывода, а не через эти API.

Приглушение звука

Приглушение звука происходит, когда автомобиль снижает усиление одного потока, чтобы другой поток, воспроизводимый одновременно, звучал более чётко. В AAOS приглушение звука реализуется HAL. Android не контролирует звуки за пределами ОС. В Android 11 основная информация, доступная HAL для принятия решений о приглушении, — это наличие активных потоков у обоих выходных устройств.

Когда пригибаться

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

  • Воспроизведение нескольких потоков в Android обычно происходит, когда два приложения или службы одновременно удерживают аудиофокус. Чтобы узнать, когда Android может предоставлять одновременный фокус, см. матрицу взаимодействия в разделе «Типы ограничений» . С появлением плагина для автомобильной аудиосистемы это также зависит от настроек AudioFocus.

  • Все потоки, микшируемые Android, микшируются до применения каких-либо усилений. Таким образом, любой поток, который должен быть приглушен при одновременном воспроизведении с другим, должен быть направлен на отдельные выходные устройства, чтобы HAL мог применить приглушение перед их микшированием.

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

Взаимодействие Действие
EMERGENCY Отключает или приглушает все звуки, кроме SAFETY
SAFETY Уклоняется от всего, кроме EMERGENCY
NAVIGATION Уклоняется от всего, кроме SAFETY и EMERGENCY
CALL Уклоняется от всего, кроме SAFETY , EMERGENCY и NAVIGATION
VOICE Утки CALL_RING
VEHICLE_SOUNDS Вы определяете важность активного звука и то, заглушает ли он другие звуки.
MUSIC и ANNOUNCEMENT Всё игнорируется. Исключение составляют звуки сенсорного взаимодействия, воспроизводимые как SYSTEM_SOUND .

Что следует учитывать при приседании

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

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

Звуки, критически важные для безопасности

В Android 11 появились API аудиофокуса HAL . HAL обеспечивает приоритет звуков, критически важных для безопасности, над другими звуками. Если HAL удерживает аудиофокус в состоянии USAGE_EMERGENCY , это не гарантирует, что приложения и службы Android не будут воспроизводить звуки. HAL определяет, какие потоки Android следует микшировать или отключать для воспроизведения звуков, критически важных для безопасности.

Настройте пользовательский интерфейс параметров громкости

AAOS разделяет пользовательский интерфейс настроек громкости и конфигурацию группы томов. Их можно наложить друг на друга, как описано в разделе «Настройка усиления группы томов» . Такое разделение гарантирует отсутствие необходимости внесения изменений при изменении конфигурации групп томов.

В пользовательском интерфейсе настроек автомобиля packages/apps/Car/Settings/res/xml/car_volume_items.xml содержит элементы пользовательского интерфейса (ресурсы заголовка и значка), связанные с каждым определённым AudioAttributes.USAGE . Этот файл обеспечивает корректную визуализацию определённых VolumeGroups с использованием ресурсов, связанных с первым распознанным использованием, содержащимся в каждой VolumeGroup .

Например, в следующем примере определяется 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() для получения уведомлений об изменениях громкости.

Событие группы объема автомобиля

Сценарии использования обновления громкости и отключения звука в автомобилях имеют контекстную основу, которая может определять действия некоторых приложений, например, настройки громкости. Текущий обратный вызов громкости и отключения звука из стека автомобильной аудиосистемы предоставляет ограниченную контекстную информацию. Для лучшего соответствия сценариям использования в автомобилях и будущей масштабируемости в Android 14 добавлено событие CarVolumeGroupEvent. Каждое событие несёт три важных типа информации:

  • Список CarVolumeGroupInfo
  • EventTypes (битовое отображение)
  • Список ExtraInfos

CarVolumeGroupInfo

Получатель обратного вызова события имеет доступ к списку информации о затронутых группах громкости автомобиля. Это означает, что приложению не нужно выполнять дополнительные вызовы к фреймворку автомобильной аудиосистемы для получения актуальной информации о состоянии. Оно может просто использовать полученные данные CarVolumeGroupInfos для обновления пользовательского интерфейса или внутренних состояний. Для упрощения работы приложений информация об изменившихся в группе громкости автомобиля также предоставляется в составе EventTypes , как описано ниже.

Типы событий

Определяет, какой аспект CarVolumeGroupInfo изменился. Приложения могут использовать это для выявления изменений и выполнения необходимых действий. Например, EVENT_TYPE_VOLUME_MAX_INDEX_CHANGED указывает на то, что соответствующий индекс максимального усиления громкости CarVolumeGroups изменился и может быть запрошен с помощью CarVolumeGroupInfo.getMaxVolumeGainIndex() .

В следующей таблице показана связь между EventType и CarVolumeGroupInfo .

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

ExtraInfos

Предоставляет дополнительную информацию о причине изменения CarVolumeGroup . Приложения могут использовать эту информацию для предоставления дополнительного контекста, чтобы либо предупредить пользователя о необходимости каких-либо действий, либо отправить уведомление. Например, EXTRA_INFO_TRANSIENT_ATTENUATION_THERMAL указывает на активное кратковременное затухание звука из-за тепловой перегрузки. Приложение может уведомить пользователя, если он попытается увеличить громкость.

Мы не применяем никаких обязательных процессов для ExtraInfos . Вы можете самостоятельно определить процесс на основе ExtraInfos . Например, если затухание включено из-за EXTRA_INFO_TRANSIENT_ATTENUATION_DUCKED , вы также можете изначально приглушить пользовательский интерфейс панели громкости, чтобы пользователь не мог изменить громкость. Другие могут отображать уведомление об активации приглушения и разрешать пользователю изменять громкость.

Фреймворк автомобильной аудиосистемы использует функцию AudioControl HAL IAudioGainCallback для предоставления рекомендуемых ExtraInfos . Подробнее см. в разделе Audio Gain Callback .

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

Обратный вызов события группы громкости автомобиля

В Android 14 реализован новый обратный вызов для привилегированных и платформенных приложений, позволяющий им регистрироваться и получать уведомления о CarVolumeGroupEvents .

  • Чтобы зарегистрироваться для обратного вызова, используйте CarAudioManager#registerCarVolumeGroupEventCallback()

  • Чтобы отменить регистрацию обратного вызова, используйте CarAudioManager#unregisterCarVolumeGroupEventCallback()

Если приложение регистрируется с новым CarVolumeGroupEventCallback и устаревшим CarVolumeCallback , события CarVolumeGroupEventCallbacks имеют приоритет. Стек автомобильной аудиосистемы больше не активирует CarVolumeCallback . Это предотвращает дублирование триггеров одного и того же приложения для одного и того же события.

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

Обратный вызов усиления звука

Начиная с Android 13, AudioControl HAL может запускать асинхронный обратный вызов для управления обновлениями уровня громкости из-за изменений в аудиосистеме автомобиля.

HAL API

AudioControl @2.0 AIDL

Версия 2.0 AudioControl AIDL HAL добавляет следующий API:

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 ​​будут обработаны. Кэшированное состояние отключения звука пользователя останется включённым.

    • Причина: Запросы пользователей на включение звука будут удовлетворены только при отсутствии активных ограничений.

    • Причина: Отключение кэшированного пользовательского звука может привести к непреднамеренному взрыву звука и поставить под угрозу безопасность пользователя. Это особенно актуально, если режим отключения звука активен во время всех циклов зажигания, что снижает восприятие пользователем уровня звука.

Случай взаимодействия: HAL Mute включен и выключен, в то время как User Mute не имеет изменений

Включение/выключение звука HAL изменяет общее состояние отключения звука группы громкости. Однако оно не приводит к непосредственному обновлению состояния отключения звука пользователя. Если отключение звука пользователя и получен обратный вызов отключения звука HAL для включения:

  • Общее состояние отключения звука группы томов изменено на true .
  • Запросы пользователя на изменение громкости NOT будут обрабатываться, пока включено отключение звука HAL.

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

    • Причина: Приложения для управления громкостью могут регистрироваться для обратных вызовов и автоматически включать включение звука (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 для синхронизации индекса.

Примеры

Пример использования: пользователь обновляет индекс объема до 30.

  • Пользователь использует приложение Volume, чтобы изменить индекс громкости на 30.

  • Этот индекс преобразуется в усиление громкости и отправляется в Audio HAL.

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

  • Аудиосистема отвечает, что уровень громкости обновлен только до индекса 15 (по неизвестным Android причинам).

  • Реализации триггеров AudioControl HAL от поставщиков:

    IAudioGainCallback.onAudioDeviceGainsChanged(EXTERNAL_AMP_VOL_FEEDBACK, {...,  15 /* New index */})
    
  • Сервис автомобильной аудиосистемы использует новый индекс из обратного вызова, который используется для сохранения данных и обратных вызовов в приложение громкости. Запрошенный пользователем индекс — 30. Однако асинхронная обратная связь аудиосистемы обновляет индекс до 15.

Пример использования: первое воспроизведение звука после выхода из режима ожидания.

  • Индекс объема перед приостановкой установлен на высоком уровне 95 (диапазон: [0-99]).

  • Android переходит в режим ожидания.

  • После того, как Android приостановится (например, возобновится):

    • Vendor Audio HAL/AudioControl HAL применяет безопасный индекс 30 к аудиосистеме локально.

    • Вендор AudioControl HAL также запускает обратный вызов для безопасного индекса:

    IAudioGainCallback.onAudioDeviceGainsChanged(SUSPEND_EXIT_VOL_LIMITATION, {...,  30 /* safe index */})
    
  • Служба автомобильной аудиосистемы использует новый индекс из обратного вызова, который используется для сохранения данных, и собственные обратные вызовы к приложению управления громкостью, синхронизируя индекс. Индекс громкости до приостановки равен 95. Однако после возобновления работы реализатор AudioControl HAL устанавливает для этого индекса безопасный уровень громкости 30.

Динамическая конфигурация громкости

Для этой функции мы рассматриваем следующие основные варианты использования:

  1. Конфигурация конца линии транспортного средства (EOL).

    • Автопроизводители предпочитают обновлять настройки громкости в конце срока службы автомобиля, исходя из настроек аудиосистемы. Как правило, это происходит путём загрузки отдельного ПО без обновления образа Android.

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

  2. Конфигурация во время работы. Автомобильные аудиосистемы поддерживают конфигурации внешнего усилителя, и эти ЭБУ могут хранить конфигурации диапазона громкости, запрашиваемые во время загрузки.

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

Дизайн

Динамическая конфигурация громкости достигается в три этапа:

  • Обнаружение. Реализация AudioControl HAL от поставщика обнаруживает новые обновления диапазона громкости с помощью специального механизма IPC, принадлежащего поставщику.

    После обнаружения генерируется обратный вызов через AudioControl::IModuleChangeCallback .

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

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

  • Перезвонить.

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

    • CarVolumeGroupEvent содержит обновленную CarVolumeGroupInfo , типе события (что изменилось) и дополнительную информацию (почему оно изменилось).

изображение

Рисунок 2. Конфигурация динамического объема.

HAL API

AudioControl @ 3.0 AIDL

Версия 3.0 AudioControl AIDL HAL представляет следующие API:

API
IAudioControl#setModuleChangeCallback Устанавливает экземпляр IModuleChangeCallback с AudioControl HAL.
IAudioControl#clearModuleChangeCallback Очищает экземпляр IModuleChangeCallback, ранее установленный с помощью AudioControl HAL.
IModuleChangeCallback#onAudioPortsChanged Обратный вызов для уведомления об изменениях в AudioPorts

Последовательность

Ниже представлена ​​диаграмма последовательности настройки динамического тома.

изображение

Рисунок 3. Диаграмма последовательности для динамической конфигурации тома.

Ключевые аспекты

Чтобы оптимизировать эту функцию, примите во внимание следующее.

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

    • Порт устройства. IN_DEVICE , OUT_DEVICE
    • Подключение. BUS
    • Адрес. Указан в определении Audio HAL.
    • Режим усиления. JOINT
  • Поставщики должны определить расширенный набор определений диапазонов громкости в политике Audio HAL и использовать обратный вызов для его настройки под различные варианты автомобилей. Подробнее см. в определении AIDL IModuleChangeCallbac .

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