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

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

Использование фиксированных объемов

Реализации 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>

Пример реализации car_audio_configuration.xml .

Каждая группа томов должна содержать одно или несколько устройств вывода со связанными адресами. Эти адреса должны соответствовать устройствам вывода, определенным в 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 для настройки затухания и баланса в автомобиле. Для CarAudioManager существуют соответствующие системные API, которые передают значения в HAL AudioControl. Для этих 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 является ошибкой.

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

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

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

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

Когда уклоняться

Хотя индивидуальный OEM-производитель должен определять, как приглушение будет обрабатываться его HAL, мы рекомендуем несколько общих рекомендаций. Несколько потоков, воспроизводимых в Android, чаще всего возникают, когда два приложения/службы одновременно удерживают фокус звука. Имея это в виду, см. раздел «Матрица взаимодействия» , чтобы узнать, когда Android может предоставлять одновременный фокус и, следовательно, когда два разных потока могут воспроизводиться одновременно.

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

Рекомендуемое поведение при уклонении

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

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

Другие соображения при уклонении

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

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

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

Хотя в 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() , чтобы получать уведомления об изменениях объема.