Автомобильное аудио

Android Automotive OS (AAOS) основана на базовом аудиостеке Android и поддерживает варианты использования в качестве информационно-развлекательной системы в автомобиле. AAOS отвечает за звуки информационно-развлекательной системы (то есть мультимедиа, навигации и связи), но не несет прямой ответственности за звуковые сигналы и предупреждения, к которым предъявляются строгие требования к доступности и времени. Хотя AAOS предоставляет сигналы и механизмы, помогающие транспортному средству управлять звуком, в конечном итоге именно транспортное средство должно сделать запрос о том, какие звуки следует воспроизводить для водителя и пассажиров, гарантируя, что критические для безопасности звуки и нормативные звуки будут должным образом слышны без прерывание.

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

Android 11 включает следующие изменения в поддержку автомобильного звука:

Звуки и потоки Android

Автомобильные аудиосистемы обрабатывают следующие звуки и потоки:

Схема потоково-ориентированной архитектуры

Рисунок 1. Схема потоково-ориентированной архитектуры

Android управляет звуками, поступающими из приложений Android, контролируя эти приложения и направляя их звуки на устройства вывода в HAL в зависимости от типа звука:

  • Логические потоки , известные как источники в базовой номенклатуре аудио, помечены атрибутами аудио .
  • Физические потоки , известные как устройства в базовой аудиономенклатуре, не имеют контекстной информации после микширования.

В целях надежности внешние звуки (поступающие из независимых источников, таких как звуковые сигналы непристегнутых ремней безопасности) управляются вне Android, ниже HAL или даже на отдельном оборудовании. Разработчики системы должны предоставить микшер, который принимает один или несколько потоков звукового сигнала от Android, а затем подходящим образом объединяет эти потоки с внешними источниками звука, необходимыми для транспортного средства.

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

Андроид звуки

Приложения могут иметь один или несколько проигрывателей, которые взаимодействуют через стандартные API-интерфейсы Android (например, AudioManager для управления фокусом или MediaPlayer для потоковой передачи) для создания одного или нескольких логических потоков аудиоданных. Эти данные могут быть одноканальными моно или объемными 7.1, но маршрутизируются и обрабатываются как один источник. Поток приложения связан с AudioAttributes , которые дают системе подсказки о том, как следует выражать звук.

Логические потоки передаются через AudioService и направляются в один (и только один) из доступных физических выходных потоков, каждый из которых является выходом микшера внутри AudioFlinger. После того как аудиоатрибуты были микшированы в физический поток, они больше не доступны.

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

Внешние потоки

Звуковые потоки, которые не следует маршрутизировать через Android (по причинам сертификации или синхронизации), можно отправлять непосредственно на внешний микшер. Начиная с Android 11, HAL теперь может запрашивать фокус для этих внешних звуков, чтобы информировать Android о том, что он может предпринять соответствующие действия, такие как приостановка мультимедиа или предотвращение фокусировки другими.

Если внешние потоки являются источниками мультимедиа, которые должны взаимодействовать со звуковой средой, создаваемой Android (например, останавливать воспроизведение MP3 при включении внешнего тюнера), эти внешние потоки должны быть представлены приложением Android. Такое приложение будет запрашивать фокусировку звука от имени источника мультимедиа вместо HAL и будет отвечать на уведомления о фокусировке, запуская/останавливая внешний источник по мере необходимости, чтобы соответствовать политике фокусировки Android. Приложение также отвечает за обработку ключевых событий мультимедиа, таких как воспроизведение/пауза. Одним из предлагаемых механизмов управления такими внешними устройствами является HwAudioSource .

Устройства вывода

На уровне Audio HAL тип устройства AUDIO_DEVICE_OUT_BUS предоставляет общее устройство вывода для использования в автомобильных аудиосистемах. Устройство шины поддерживает адресные порты (где каждый порт является конечной точкой физического потока) и, как ожидается, будет единственным поддерживаемым типом устройства вывода в автомобиле.

Реализация системы может использовать один порт шины для всех звуков Android, и в этом случае Android смешивает все вместе и доставляет в виде одного потока. Альтернативно, HAL может предоставить один порт шины для каждого CarAudioContext , чтобы обеспечить одновременную доставку звука любого типа. Это позволяет реализации HAL микшировать и приглушать различные звуки по желанию.

Назначение аудиоконтекстов устройствам вывода осуществляется через car_audio_configuration.xml .

Вход микрофона

При захвате звука Audio HAL получает вызов openInputStream , который включает аргумент AudioSource , указывающий, как следует обрабатывать входной сигнал микрофона.

Источник VOICE_RECOGNITION (в частности, Google Assistant) ожидает поток стереомикрофона с эффектом эхоподавления (если доступен), но к нему не применяется никакая другая обработка. Ожидается, что формирование луча будет выполняться помощником.

Многоканальный микрофонный вход

Чтобы захватить звук с устройства с более чем двумя каналами (стерео), используйте маску индекса канала вместо маски позиционного индекса (например, CHANNEL_IN_LEFT ). Пример:

final AudioFormat audioFormat = new AudioFormat.Builder()
    .setEncoding(AudioFormat.ENCODING_PCM_16BIT)
    .setSampleRate(44100)
    .setChannelIndexMask(0xf /* 4 channels, 0..3 */)
    .build();
final AudioRecord audioRecord = new AudioRecord.Builder()
    .setAudioFormat(audioFormat)
    .build();
audioRecord.setPreferredDevice(someAudioDeviceInfo);

Когда установлены оба setChannelMask и setChannelIndexMask , AudioRecord использует только значение, установленное setChannelMask (максимум два канала).

Одновременный захват

Начиная с Android 10, платформа Android поддерживает одновременный захват входных данных, но с ограничениями для защиты конфиденциальности пользователя. В рамках этих ограничений виртуальные источники, такие как AUDIO_SOURCE_FM_TUNER , игнорируются, и поэтому их разрешено захватывать одновременно с обычным входом (например, микрофоном). HwAudioSources также не рассматривается как часть ограничений одновременного захвата.

Приложения, предназначенные для работы с устройствами AUDIO_DEVICE_IN_BUS или со вторичными устройствами AUDIO_DEVICE_IN_FM_TUNER , должны полагаться на явную идентификацию этих устройств и использование AudioRecord.setPreferredDevice() для обхода логики выбора источника Android по умолчанию.

Использование аудио

AAOS в основном использует AudioAttributes.AttributeUsages для маршрутизации, регулировки громкости и управления фокусом. Использование — это представление того, «почему» воспроизводится поток. Таким образом, все потоки и запросы фокуса звука должны указывать использование для их воспроизведения звука. Если он не задан специально при создании объекта AudioAttributes, по умолчанию будет использоваться USAGE_UNKNOWN . Хотя в настоящее время это рассматривается так же, как USAGE_MEDIA , на это поведение не следует полагаться при воспроизведении мультимедиа.

Использование системы

В Android 11 были представлены методы использования системы. Эти способы использования ведут себя аналогично ранее установленным вариантам использования, за исключением того, что они требуют использования системных API, а также android.permission.MODIFY_AUDIO_ROUTING . Новые способы использования системы:

  • USAGE_EMERGENCY
  • USAGE_SAFETY
  • USAGE_VEHICLE_STATUS
  • USAGE_ANNOUNCEMENT

Чтобы создать AudioAttributes с использованием системы, используйте AudioAttributes.Builder#setSystemUsage вместо setUsage . Вызов этого метода при несистемном использовании приведет к созданию исключения IllegalArgumentException . Кроме того, если в сборщике были установлены и использование системы, и использование, при сборке будет выдано исключение IllegalArgumentException .

Чтобы проверить, какое использование связано с экземпляром AudioAttributes , вызовите AudioAttributes#getSystemUsage . Это возвращает связанное использование или использование системы.

Аудио контексты

Чтобы упростить настройку звука AAOS, аналогичные варианты использования были сгруппированы в CarAudioContext . Эти аудиоконтексты используются в CarAudioService для определения маршрутизации, групп громкости и управления фокусом звука.

Аудиоконтексты в Android 11:

АвтомобильАудиоКонтекст Использование связанного атрибута
MUSIC UNKNOWN, GAME, MEDIA
NAVIGATION ASSISTANCE_NAVIGATION_GUIDANCE
VOICE_COMMAND ASSISTANT, ASSISTANCE_ACCESSIBILITY
CALL_RING NOTIFICATION_RINGTONE
CALL VOICE_COMMUNICATION, VOICE_COMMUNICATION_SIGNALING
ALARM ALARM
NOTIFICATION NOTIFICATION, NOTIFICATION_*
SYSTEM_SOUND ASSISTANCE_SONIFICATION
EMERGENCY EMERGENCY
SAFETY SAFETY
VEHICLE_STATUS VEHICLE_STATUS
ANNOUNCEMENT ANNOUNCEMENT

Сопоставление между аудиоконтекстами и обычаями. Выделенные строки относятся к новым вариантам использования системы .

Многозонное аудио

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

Многозонный звук, начиная с Android 10, позволяет OEM-производителям настраивать звук в отдельные зоны. Каждая зона представляет собой набор устройств внутри автомобиля со своими собственными группами томов, конфигурацией маршрутизации для контекстов и управлением фокусом. Таким образом, основная кабина может быть настроена как одна аудиозона, а разъемы для наушников на заднем дисплее — как вторая зона.

Зоны определяются как часть файла car_audio_configuration.xml . Затем CarAudioService считывает конфигурацию и помогает AudioService маршрутизировать аудиопотоки на основе связанной с ними зоны. Каждая зона по-прежнему определяет правила маршрутизации на основе контекста и идентификатора приложения. При создании проигрывателя CarAudioService определяет, с какой зоной связан проигрыватель, а затем, в зависимости от использования, к какому устройству AudioFlinger следует направить звук.

Фокус также поддерживается независимо для каждой аудиозоны. Это позволяет приложениям в разных зонах независимо воспроизводить звук, не мешая друг другу, при этом приложения по-прежнему учитывают изменения фокуса внутри своей зоны. CarZonesAudioFocus в CarAudioService отвечает за управление фокусом для каждой зоны.

Настройка многозонного звука

Рисунок 2. Настройка многозонного звука

Аудио ХАЛ

Реализации автомобильного аудио основаны на стандарте Android Audio HAL, который включает в себя следующее:

  • IDevice.hal . Создает входные и выходные потоки, управляет основной громкостью и отключением звука и использует:
    • createAudioPatch . Для создания внешних-внешних патчей между устройствами.
    • IDevice.setAudioPortConfig() для обеспечения громкости для каждого физического потока.
  • IStream.hal . Наряду с вариантами ввода и вывода управляет потоковой передачей аудиосэмплов на оборудование и обратно.

Типы автомобильных устройств

Следующие типы устройств актуальны для автомобильных платформ.

Тип устройства Описание
AUDIO_DEVICE_OUT_BUS Первичный вывод с Android (именно так весь звук с Android доставляется в автомобиль). Используется как адрес для устранения неоднозначности потоков для каждого контекста.
AUDIO_DEVICE_OUT_TELEPHONY_TX Используется для аудио, направляемого на сотовую радиосвязь для передачи.
AUDIO_DEVICE_IN_BUS Используется для входов, не классифицированных иначе.
AUDIO_DEVICE_IN_FM_TUNER Используется только для радиовещания.
AUDIO_DEVICE_IN_TV_TUNER Используется для телевизионного устройства, если оно имеется.
AUDIO_DEVICE_IN_LINE Используется для входного разъема AUX.
AUDIO_DEVICE_IN_BLUETOOTH_A2DP Музыка принимается через Bluetooth.
AUDIO_DEVICE_IN_TELEPHONY_RX Используется для звука, полученного от сотовой радиосвязи, связанного с телефонным звонком.

Настройка аудиоустройств

Аудиоустройства, видимые для Android, должны быть определены в /audio_policy_configuration.xml , который включает следующие компоненты:

  • имя модуля. Поддерживает «основной» (используется для использования в автомобилях), «A2DP», «remote_submix» и «USB». Имя модуля и соответствующий аудиодрайвер должны быть скомпилированы в audio.primary.$(variant).so .
  • Порты устройства. Содержит список дескрипторов устройств для всех устройств ввода и вывода (включая постоянно подключенные и съемные устройства), к которым можно получить доступ из этого модуля.
    • Для каждого устройства вывода вы можете определить регулировку усиления, состоящую из значений мин/макс/по умолчанию/шаг в миллибелах (1 миллибел = 1/100 дБ = 1/1000 бел).
    • Атрибут адреса в экземпляре devicePort можно использовать для поиска устройства, даже если существует несколько устройств с тем же типом устройства, что и AUDIO_DEVICE_OUT_BUS .
  • миксПорты. Содержит список всех выходных и входных потоков, предоставляемых аудио HAL. Каждый экземпляр mixPort можно рассматривать как физический поток в Android AudioService.
  • маршруты. Определяет список возможных соединений между устройствами ввода и вывода или между потоком и устройством.

В следующем примере определяется устройство вывода bus0_phone_out, в котором все аудиопотоки Android микшируются с помощью Mixer_bus0_phone_out. Маршрут передает выходной поток mixer_bus0_phone_out на устройство bus0_phone_out .

<audioPolicyConfiguration version="1.0" xmlns:xi="http://www.w3.org/2001/XInclude">
    <modules>
        <module name="primary" halVersion="3.0">
            <attachedDevices>
                <item>bus0_phone_out</item>
<defaultOutputDevice>bus0_phone_out</defaultOutputDevice>
            <mixPorts>
                <mixPort name="mixport_bus0_phone_out"
                         role="source"
                         flags="AUDIO_OUTPUT_FLAG_PRIMARY">
                    <profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
                            samplingRates="48000"
                            channelMasks="AUDIO_CHANNEL_OUT_STEREO"/>
                </mixPort>
            </mixPorts>
            <devicePorts>
                <devicePort tagName="bus0_phone_out"
                            role="sink"
                            type="AUDIO_DEVICE_OUT_BUS"
                            address="BUS00_PHONE">
                    <profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
                            samplingRates="48000"
                            channelMasks="AUDIO_CHANNEL_OUT_STEREO"/>
                    <gains>
                        <gain name="" mode="AUDIO_GAIN_MODE_JOINT"
                                minValueMB="-8400"
                                maxValueMB="4000"
                                defaultValueMB="0"
                                stepValueMB="100"/>
                    </gains>
                </devicePort>
            </devicePorts>
            <routes>
                <route type="mix" sink="bus0_phone_out"
                       sources="mixport_bus0_phone_out"/>
            </routes>
        </module>
    </modules>
</audioPolicyConfiguration>