Управление громкостью содержится в 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 RROs.
Вы можете определить несколько записей activationVolumeConfig
в activationVolumeConfigs
, каждая из которых представляет собой отдельную минимальную и максимальную конфигурацию активации. Каждая activationVolumeConfig
:
- Должно содержать уникальное
name
в файле конфигурации автомобильной аудиосистемы, чтобы впоследствии на него можно было ссылаться в группе томов (group
). - Должен содержать только один
activationVolumeConfigEntry
.
Каждый activationVolumeConfig
содержит следующие атрибуты:
-
minActivationVolumePercentage
(целое число, 0-100, необязательный параметр, по умолчанию: 0): указывает минимальный объем активации в процентах. -
maxActivationVolumePercentage
(целое число, 0-100, необязательно, по умолчанию: 100): указывает максимальный объем активации в процентах. invocationType
(string, необязательно, по умолчанию:onPlaybackChanged
): определяет условия, при которых применяется минимальный и максимальный объем активации:-
onBoot
: применяется только к первому новому активному воспроизведению в группе томов после загрузки. -
onSourceChanged
: применяется только к новому активному воспроизведению с измененным источником приложения или UID в группе томов. -
onPlaybackChanged
: Применяется к каждому новому активному воспроизведению в группе томов.
-
CarAudioService
управляет минимальной и максимальной активацией, отслеживая следующие активные в данный момент аудиокомпоненты:
- Текущие активные воспроизводимые треки
- Текущее состояние вызова
- Текущий запрос фокуса звука от Audio Control HAL, где запрос фокуса звука от Audio Control HAL сигнализирует о том, что активное воспроизведение звука происходит за пределами Android.
На следующем рисунке показан общий обзор управления минимальным и максимальным объемом активации:
Рисунок 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.
Звуковое приглушение
Audio ducking происходит, когда транспортное средство уменьшает усиление для одного потока, чтобы другой поток, воспроизводимый одновременно, можно было услышать более четко. В AAOS audio ducking реализуется HAL. Android не имеет контроля над звуками за пределами ОС. В Android 11 основная информация, доступная HAL для принятия решений о ducking, заключается в том, имеют ли оба выходных устройства активные потоки.
Когда пригибаться
Хотя каждый производитель оригинального оборудования самостоятельно определяет, как 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
поскольку это первый matc в файле.
<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
Получатель обратного вызова события имеет готовый доступ к списку затронутой информации о группе громкости автомобиля. Это означает, что приложению не нужно делать никаких дополнительных вызовов в фреймворк Car audio, чтобы получить последнее состояние. Он может просто использовать полученные 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 может запускать асинхронный обратный вызов для управления обновлениями уровня громкости из-за изменений в аудиосистеме автомобиля.
HAL-API
AudioControl @2.0 AIDL
Версия 2.0 AudioControl AIDL HAL добавляет следующий API:
API | Цель |
---|---|
IAudioControl#registerGainCallback | Регистрирует экземпляр IAudioGainCallback с помощью AudioControl HAL. |
IAudioGainCallback#onAudioDeviceGainsChanged | Асинхронный обратный вызов для уведомления об изменениях в конфигурации усиления звука. |
Обратный вызов AudioControl HAL включает в себя списки причин и соответствующую AudioGainConfigInfo
, которая состоит из:
- Зона ID
- Адрес порта устройства
- Индекс объема > индекс может быть либо ограниченным индексом, либо обновленным индексом.
Причины можно условно разделить на следующие категории:
- Причины ограничения. Временное изменение громкости и отключение звука.
- Причины обновления. Постоянное изменение поведения громкости.
Типы ограничений
Начиная с AudioControl
HAL AIDL
V3
, поддерживаются следующие типы ограничений:
- Немой
- Блокировка
- Ограничение
- Затухание
Активное ограничение | Изменение громкости, инициированное пользователем | Отключение звука пользователем |
---|---|---|
Немой | ❌ | ❌ (включить звук) ✔ (без звука) |
Блокировка | ❌ | ✔ |
Ограничение | ❌ (сверх лимита) ✔ (ниже лимита) | ✔ |
Затухание | ✔ | ✔ |
Приоритет между ограничениями: Отключение звука > Блокировка > Ограничение > Ослабление.
Ограничения на отключение звука
Ограничения на отключение звука:
-
Reasons.TCU_MUTE
-
Reasons.REMOTE_MUTE
Внутри системы автомобильной аудиосистемы поддерживаются следующие два состояния отключения звука:
Отключение звука пользователем. Переключается по запросу пользователя, либо через
CarAudioManager
, либо через ключевые события.HAL mute. Переключается на основе ограничений отключения звука, полученных через обратный вызов
AudioGain
.
Для таких слушателей, как приложение «Настройки», состояние общего отключения звука группы громкости ( CarVolumeGroupInfo.isMuted()
) будет зависеть от того, включено ли какое-либо из вышеперечисленных отключений звука.
Если отключение звука HAL включено, все входящие запросы на изменение громкости и групповое включение звука игнорируются в течение всего срока действия ограничения.
Случай взаимодействия: отключение звука HAL активно, и пользователь запрашивает включение отключения звука
Когда отключение звука HAL включено, а отключение звука пользователя отключено:
- Общее состояние отключения звука группы томов изменено на
true
. - Запросы от пользователя на включение отключения звука будут обработаны.
- Причина: Запросы пользователей на отключение звука должны выполняться всегда, чтобы сохранить конфиденциальность пользователей.
Когда включено отключение звука HAL и отключение звука пользователем:
Общее состояние отключения звука группы томов изменено на
true
.Запросы от пользователя на отключение звука
NOT
будут обработаны. Кэшированное состояние отключения звука пользователя остается включенным.Причина: Запросы пользователей на включение звука будут выполнены только при отсутствии активных ограничений.
Причина: Отключение кэшированного пользовательского звука может вызвать непреднамеренный звуковой взрыв и поставить под угрозу безопасность пользователя. Это особенно актуально, если состояние отключения звука включено в циклах зажигания, что снижает осведомленность пользователей о восприятии уровня звука.
Случай взаимодействия: HAL Mute включен и выключен, в то время как User Mute не имеет изменений
Переключение отключения звука HAL изменит общее состояние отключения звука группы громкости. Однако оно не обновляет состояние отключения звука пользователя напрямую. Когда отключено отключение звука пользователя и получен обратный вызов отключения звука HAL для включения:
- Общее состояние отключения звука группы томов изменено на
true
. Запросы пользователя на изменение громкости
NOT
будут обрабатываться, пока включен режим отключения звука HAL.Причина: Пользователь не может воспринимать звук, пока включено отключение звука. Разрешение на изменение громкости может привести к звуковому взрыву и поставить под угрозу безопасность пользователя.
Причина: Приложения для управления громкостью могут регистрироваться для обратных вызовов и автоматически включать звук (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 может обновить текущий индекс группы томов до указанного индекса. Это в первую очередь используется в качестве обратной связи от аудиосистемы для запроса изменения громкости от фреймворка Car audio. Обновление индекса также передается в 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
.
Динамическая конфигурация громкости
Для этой функции мы рассматриваем следующие основные варианты использования:
Конфигурация конца линии транспортного средства (EOL).
Автопроизводители предпочитают обновлять конфигурации громкости в EOL на основе настройки аудиосистемы автомобиля. Обычно это сторонняя загрузка без обновления образа Android SW.
Автопроизводителям может потребоваться обновить конфигурацию объема во время графика технического обслуживания.
Конфигурация времени выполнения. Автомобильные аудиосистемы поддерживают конфигурации внешних усилителей, и эти ЭБУ могут содержать конфигурации диапазона громкости, которые запрашиваются во время загрузки.
Конфигурация по требованию. Предлагается для поддержки растущей потребности в аудиофункциях по требованию, в которых пользователи подписываются на улучшенную обработку сигнала на определенный период времени. Новые конфигурации диапазона громкости действительны в течение срока действия подписки.
Дизайн
Динамическая конфигурация объема достигается в три этапа:
Обнаружение. Реализация 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. Диаграмма последовательности для динамической конфигурации тома.
Ключевые аспекты
Чтобы оптимизировать эту функцию, примите во внимание следующее.
Аудиопорты, предоставляемые как часть обратного вызова, должны соответствовать определению автомобильной шины:
- Порт устройства.
IN_DEVICE
,OUT_DEVICE
- Подключение.
BUS
- Адрес. Определено в определении Audio HAL
- Режим усиления.
JOINT
- Порт устройства.
Поставщики должны определить надмножество определений диапазона громкости в политике Audio HAL и использовать обратный вызов для его настройки для вариантов транспортных средств. Для получения дополнительной информации см. определение
IModuleChangeCallbac
AIDL.Если более одной аудиошины принадлежат к одной и той же группе громкости, каждая из них должна иметь идентичные определения диапазона громкости. Невыполнение этого требования приводит к тому, что фреймворк автомобильной аудиосистемы отклоняет новое определение диапазона громкости.