Управление громкостью осуществляется в 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 в настройках Car Service RRO.
В activationVolumeConfigs можно определить несколько записей activationVolumeConfig , каждая из которых представляет собой различную минимальную и максимальную конфигурацию активации. Каждая activationVolumeConfig :
- Файл конфигурации автомобильной аудиосистемы должен иметь уникальное
name, чтобы на него можно было ссылаться в группе громкости (group) в дальнейшем. - Должен содержать только один
activationVolumeConfigEntry.
Каждый activationVolumeConfig содержит следующие атрибуты:
-
minActivationVolumePercentage(целое число, 0-100, необязательно, по умолчанию: 0): Задает минимальный объем активации в процентах. -
maxActivationVolumePercentage(целое число, 0-100, необязательно, по умолчанию: 100): Задает максимальный объем активации в процентах. invocationType(строка, необязательный параметр, по умолчанию:onPlaybackChanged): Определяет условия, при которых применяется минимальный и максимальный уровень громкости активации:-
onBoot: Применяется только к первому активному воспроизведению в группе томов после загрузки. -
onSourceChanged: Применяется только к новому активному воспроизведению с измененным источником приложения или UID в группе томов. -
onPlaybackChanged: Применяется ко всем новым активным воспроизведениям в группе томов.
-
CarAudioService управляет минимальным и максимальным уровнем активации, отслеживая следующие активные в данный момент аудиокомпоненты:
- Текущие активные треки воспроизведения
- Текущее состояние вызова
- Текущий запрос на фокусировку звука от Audio Control HAL указывает на то, что активное воспроизведение звука происходит вне Android.
На следующем изображении представлен общий обзор управления минимальным и максимальным объемом активации:

Рисунок 1. Пути передачи активных аудиоданных для управления минимальной и максимальной громкостью активации.
Задав значения minActivationVolumePercentage , maxActivationVolumePercentage , а также минимальное и максимальное значения индекса усиления громкости, вы можете рассчитать минимальное и максимальное значения индекса усиления громкости для каждой группы громкости. CarAudioService отслеживает каждое новое активное воспроизведение и применяет минимальное и максимальное значение усиления громкости при следующих условиях:
- Соответствие типа вызова: Тип активации воспроизведения (полученный из Audio Manager, Audio Control HAL или Telephony Manager) должен совпадать с
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 .
| Тип события | 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 . Для получения дополнительной информации см. раздел «Audio Gain Callback» .
CarVolumeGroupEvent масштабируется для удовлетворения будущих потребностей автомобильной аудиосистемы. Мы планируем поддерживать новые функции только через CarVolumeGroupEvent . Мы настоятельно рекомендуем разработчикам приложений использовать CarVolumeGroupEvent для обработки изменений громкости и отключения звука в группах устройств.
обратный звонок по групповому мероприятию, посвященному объему автомобилей
В Android 14 появилась новая функция обратного вызова для привилегированных и платформенных приложений, позволяющая регистрироваться и получать уведомления о CarVolumeGroupEvents .
Для регистрации обратного вызова используйте
CarAudioManager#registerCarVolumeGroupEventCallback()Чтобы отменить регистрацию функции обратного вызова, используйте
CarAudioManager#unregisterCarVolumeGroupEventCallback()
Если приложение регистрируется с новым CarVolumeGroupEventCallback и устаревшим CarVolumeCallback , то события CarVolumeGroupEventCallbacks получают приоритет. Автомобильная аудиосистема больше не запускает CarVolumeCallback . Это предотвращает дублирование запусков одного и того же события для одного и того же приложения.
Мы настоятельно рекомендуем использовать CarVolumeGroupEventCallback для управления изменениями громкости и отключения звука в группе.
Обратный вызов усиления звука
Начиная с Android 13, AudioControl HAL может запускать асинхронный обратный вызов для управления обновлениями уровня громкости, вызванными изменениями в автомобильной аудиосистеме.
API HAL
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 включена и выключена, в то время как функция отключения звука пользователем не изменилась.
Переключение режима отключения звука 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 может обновлять текущий индекс группы громкости до указанного значения. Это в основном используется в качестве обратной связи от аудиосистемы для запроса изменения громкости от системы управления автомобильной аудиосистемой. Обновление индекса также передается в приложения в виде обратного вызова 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.
Динамическая конфигурация объема
Для реализации этой функции мы рассматриваем следующие основные сценарии использования:
Конфигурация автомобиля на заключительном этапе производства (EOL).
Автопроизводители предпочитают обновлять настройки громкости при окончании срока поддержки в зависимости от конфигурации автомобильной аудиосистемы. Как правило, это делается путем установки дополнительных программ без обновления образа Android.
Автопроизводителям может потребоваться обновить конфигурацию объема памяти во время планового технического обслуживания.
Конфигурация во время выполнения. Автомобильные аудиосистемы поддерживают конфигурацию с внешним усилителем, и эти блоки управления могут хранить настройки диапазона громкости, запрашиваемые во время загрузки.
Конфигурация по запросу. Предлагается для удовлетворения растущей потребности в функциях обработки звука по запросу, когда пользователи подписываются на улучшенную обработку сигнала на определенный период времени. Новые конфигурации диапазона громкости действуют в течение всего срока действия подписки.
Дизайн
Динамическая настройка громкости осуществляется в три этапа:
Обнаружение. Реализация AudioControl HAL от производителя обнаруживает новые обновления диапазона громкости с помощью пользовательского механизма межпроцессного взаимодействия (IPC), принадлежащего производителю.
После обнаружения генерируется функция обратного вызова через
AudioControl::IModuleChangeCallback.Обновление. Автомобильная аудиосистема обновляет состояние групп громкости в соответствии с новыми диапазонами громкости.
Прилагаются усилия для поддержания одинакового уровня объема после обновления диапазона объемов. Однако, если индекс выходит за пределы допустимых значений, текущий индекс объема устанавливается на безопасное значение. Например, на уровень по умолчанию, предоставленный поставщиком во время обратного вызова.
Перезвонить.
После обновления диапазона групп громкости автомобильная аудиосистема инициирует обратный вызов приложениям, зарегистрированным через
CarVolumeGroupEventCallback.В
CarVolumeGroupEventсодержится обновленнаяCarVolumeGroupInfo, тип события (что изменилось) и дополнительная информация (почему это изменилось).

Рисунок 2. Динамическая конфигурация объема.
API HAL
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.Если к одной и той же группе громкости относится более одной аудиошины, каждая из них должна иметь идентичные определения диапазона громкости. В противном случае система автомобильной аудиосистемы отклонит новое определение диапазона громкости.