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

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

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

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

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

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

Диаграмма ориентированной на потоки архитектуры

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

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

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

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

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

Звуки 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_UNKOWN . Хотя в настоящее время это обрабатывается так же, как 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>