Android Automotive OS (AAOS) построена на основе основного аудиостека Android для поддержки вариантов использования для работы в качестве информационно-развлекательной системы в автомобиле. AAOS отвечает за звуки информационно-развлекательной системы (то есть мультимедиа, навигацию и связь), но не отвечает напрямую за звуковые сигналы и предупреждения, которые имеют строгие требования к доступности и времени. Хотя AAOS предоставляет сигналы и механизмы, помогающие автомобилю управлять звуком, в конечном итоге именно транспортное средство принимает решение о том, какие звуки следует воспроизводить для водителя и пассажиров, гарантируя, что критически важные для безопасности звуки и нормативные звуки будут слышны должным образом и без помех.
Поскольку Android управляет мультимедийным интерфейсом автомобиля, внешние источники мультимедиа, такие как радиотюнер, должны быть представлены приложениями, которые могут обрабатывать аудиофокус и ключевые события мультимедиа для источника.
Android 11 включает в себя следующие изменения в поддержке автомобильного аудио:
- Автоматический выбор аудиозоны на основе связанного идентификатора пользователя
- Новые возможности использования системы для поддержки звуков, характерных для автомобилей
- Поддержка аудиофокуса HAL
- Отложенный аудиофокус для непереходных потоков
- Пользовательские настройки для управления взаимодействием между навигацией и вызовами
Звуки и потоки 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) ожидает поток стереомикрофона с эффектом эхоподавления (если доступно), но без какой-либо другой обработки. Ожидается, что формирование луча будет выполнено 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:
CarAudioContext | Ассоциированные атрибутыИспользования |
---|---|
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 направлять аудиопотоки на основе связанной с ними зоны. Каждая зона по-прежнему определяет правила маршрутизации на основе контекстов и uid приложений. Когда создается проигрыватель, CarAudioService
определяет, с какой зоной связан проигрыватель, а затем на основе использования — на какое устройство AudioFlinger должен направлять аудио.
Фокус также поддерживается независимо для каждой аудиозоны. Это позволяет приложениям в разных зонах независимо воспроизводить звук, не мешая друг другу, при этом приложения по-прежнему учитывают изменения фокуса в своей зоне. CarZonesAudioFocus
в CarAudioService
отвечает за управление фокусом для каждой зоны.
Рисунок 2. Настройка многозонного звука
Аудио HAL
Реализации автомобильного аудио основаны на стандартном 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
, который включает в себя следующие компоненты:
- Имя модуля. Поддерживает "primary" (используется для автомобильных случаев использования), "A2DP", "remote_submix" и "USB". Имя модуля и соответствующий аудиодрайвер должны быть скомпилированы в
audio.primary.$(variant).so
. - devicePorts. Содержит список дескрипторов устройств для всех устройств ввода и вывода (включая постоянно подключенные устройства и съемные устройства), к которым можно получить доступ из этого модуля.
- Для каждого выходного устройства можно определить регулировку усиления, состоящую из значений мин./макс./по умолчанию/шага в миллибелах (1 миллибел = 1/100 дБ = 1/1000 бел).
- Атрибут адреса в экземпляре devicePort можно использовать для поиска устройства, даже если имеется несколько устройств с тем же типом устройства, что и
AUDIO_DEVICE_OUT_BUS
. - mixPorts. Содержит список всех выходных и входных потоков, предоставляемых аудио 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>