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

Управление громкостью содержится в 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="2.0">
    <zones>
        <zone name="primary zone" isPrimary="true">
            <volumeGroups>
                <group>
                    <device address="bus0_media_out">
                        <context context="music"/>
                    </device>
                </group>
                <group>
                    <device address="bus1_navigation_out">
                        <context context="navigation"/>
                    </device>
                    <device address="bus2_voice_command_out">
                        <context context="voice_command"/>
                    </device>
                </group>
                ...
            </volumeGroups>
        </zone>
     </zones>
</audioZoneConfiguration>

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

Настройка усиления группы томов

Каждая группа томов имеет минимальное, максимальное и значение усиления по умолчанию, а также размер шага, основанный на значениях, настроенных в файле audio_policy_configuration.xml для устройств, связанных с группой томов.

<devicePort tagName="bus0_media_out" role="sink" type="AUDIO_DEVICE_OUT_BUS" address="bus0_media_out">
  <profile name="" format="AUDIO_FORMAT_PCM_16_BIT" samplingRates="48000" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/>
  <gains>
    <gain name="" mode="AUDIO_GAIN_MODE_JOINT"
      minValueMB="-3200" maxValueMB="600" defaultValueMB="0" stepValueMB="100"/>
  </gains>
</devicePort>

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

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

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

Идентификаторы группы томов

Группы томов идентифицируются во время выполнения в порядке, определенном в XML-файле. Идентификаторы варьируются от 0 до N-1 в пределах аудиозоны, где N — количество групп громкости в этой зоне. Таким образом, идентификаторы групп томов не уникальны в разных зонах. Эти идентификаторы используются для API CarAudioManager связанных с группами томов. Любой API, который принимает идентификатор groupId без zoneId по умолчанию использует основную аудиозону.

Многозонное управление томами

Предполагается, что каждая аудиозона будет иметь одну или несколько групп громкости, и каждая группа громкости связана только с одной аудиозоной. Эта связь определяется как часть car_audio_configuration.xml . Чтобы узнать больше, см. пример выше в разделе «Определение групп томов» .

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

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

Android определяет несколько кодов клавиш для регулировки громкости, в том числе:

  • KEYCODE_VOLUME_UP
  • KEYCODE_VOLUME_DOWN
  • KEYCODE_VOLUME_MUTE

По умолчанию Android направляет события клавиш громкости в приложения. Автомобильные реализации должны принудительно обрабатывать эти ключевые события с помощью CarAudioService , который затем вызывает setGroupVolume или setMasterMute , в зависимости от ситуации. Чтобы добиться такого поведения, установите для флага config_handleVolumeKeysInWindowManager значение true :

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

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

Исчезновение и баланс

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

  • Несколько потоков, воспроизводимых в 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 .

Соображения при уклонении

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

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

Критические звуки безопасности

В 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

АвтомобильОбъемГруппаИнформация

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

Платформа автомобильной аудиосистемы зависит от AudioControl HAL IAudioGainCallback для предоставления предлагаемой ExtraInfos . Чтобы узнать больше, см. Обратный вызов усиления звука .

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

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

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

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

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

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

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

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

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

ХАЛ API

Аудиоконтроль @ 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 включено и отключено, в то время как отключение звука пользователя не имеет изменений.

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

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

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

    • Причина: приложения Volume могут регистрироваться для обратных вызовов и запускать включение звука (CarAudioManager.setVolumeGroupMute(...,/* mute=*/ true,..)) автоматически без вмешательства пользователя, если это ожидаемое поведение OEM.

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

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

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

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

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

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

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

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

Дизайн

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

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

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

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

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

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

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

    • CarVolumeGroupEvent содержит обновленную CarVolumeGroupInfo , Event-type (что изменилось) и Extra-info (почему это изменилось).

изображение

Рисунок 1. Конфигурация динамического тома.

ХАЛ API

Аудиоконтроль @ 3.0 AIDL

Версия 3.0 AudioControl AIDL HAL содержит следующие API:

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

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

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

изображение

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

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

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

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

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

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