Аудио фокус

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

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

Фокус взаимодействия

Для поддержки AAOS запросы аудиофокуса обрабатываются на основе предопределенных взаимодействий между CarAudioContext запроса и текущих держателей фокуса. Существует три типа взаимодействий:

  • Эксклюзивный
  • Отклонять
  • Параллельный

Эксклюзивное взаимодействие

Это модель взаимодействия, наиболее часто используемая в Android.

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

Отклонить взаимодействие

При отклоняемых взаимодействиях входящий запрос всегда отклоняется. Например, при попытке воспроизвести музыку во время разговора. В этом случае, если Dialer удерживает аудиофокус для звонка, а второе приложение запрашивает фокус для воспроизведения музыки, музыкальное приложение получает AUDIOFOCUS_REQUEST_FAILED в ответ на запрос. Поскольку запрос фокуса отклоняется, потеря фокуса текущему держателю фокуса не отправляется.

Параллельное взаимодействие

Уникальным для AAOS является одновременное взаимодействие. Это дает приложениям, запрашивающим аудиофокус в автомобиле, возможность удерживать фокус одновременно с другими приложениями. Для одновременного взаимодействия должны быть выполнены следующие условия.:

Если эти критерии соблюдены, то запрос фокуса возвращается с AUDIOFOCUS_REQUEST_GRANTED в то время как текущий держатель фокуса не имеет изменений в фокусе. Однако, если текущий держатель фокуса выбирает получать события утки или делать паузу при укачивании, текущий держатель фокуса теряет фокус, как это происходит при исключительном взаимодействии.

Обработка параллельных потоков

Хотя параллельное взаимодействие имеет множество применений, будьте осторожны при микшировании и приглушении на аппаратном уровне между выходными устройствами. Мы настоятельно рекомендуем, чтобы экземпляры CarAudioContext , которым разрешено воспроизводиться одновременно, направлялись на разные выходные устройства.

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

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

Матрица взаимодействия

В этой таблице показана матрица взаимодействия, определенная CarAudioService . Каждая строка представляет CarAudioContext текущего держателя фокуса, а каждый столбец представляет входящий запрос.

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

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

Матрица взаимодействия аудиофокуса

Рисунок 1. Матрица взаимодействия аудиофокуса.

В Android 11 был представлен новый пользовательский параметр, позволяющий пользователям изменять поведение взаимодействия между навигацией и телефонными звонками. При установке android.car.KEY_AUDIO_FOCUS_NAVIGATION_REJECTED_DURING_CALL изменяет взаимодействие между входящими запросами фокуса NAVIGATION и текущими держателями фокуса CALL с concurrent на rejects . Если пользователь предпочитает, чтобы инструкции по навигации не прерывали вызов, он может включить этот параметр. Он сохраняется для пользователя и может быть установлен динамически, чтобы последующие запросы фокуса учитывали новую настройку.

Отложенный аудиофокус

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

Правила для отложенных запросов аудиофокуса

  • Только нетранзиентные запросы. Отложенный запрос может быть сделан только для нетранзиентных источников, чтобы избежать воспроизведения транзитного звука долгое время после того, как он становится актуальным.

  • Только один запрос может быть задержан за раз. Если задержанный запрос сделан, когда уже есть задержанный запрос, исходный задержанный запрос получает событие изменения AUDIOFOCUS_LOSS , а новый запрос получает синхронный ответ AUDIOFOCUS_REQUEST_DELAYED .

  • Отложенные запросы должны иметь OnAudioFocusChangeListener . После задержки запроса прослушиватель используется для уведомления запрашивающей стороны о том, когда запрос в конечном итоге будет удовлетворен ( AUDIOFOCUS_GAIN ) или если он будет отклонен позже ( AUDIOFOCUS_LOSS ).

Запрос отложенного фокуса

Чтобы создать запрос, который можно отложить:

  1. Используйте AudioFocusRequest.Builder#setAcceptsDelayedFocusGain .

    mMediaWithDelayedFocusListener = new MediaWithDelayedFocusListener();
    
    mDelayedFocusRequest = new AudioFocusRequest
         .Builder(AudioManager.AUDIOFOCUS_GAIN)
         .setAudioAttributes(mMusicAudioAttrib)
         .setOnAudioFocusChangeListener(mMediaWithDelayedFocusListener)
         .setForceDucking(false)
         .setWillPauseWhenDucked(false)
         .setAcceptsDelayedFocusGain(true)
         .build();
    
  2. При выполнении запроса обработайте ответ AUDIOFOCUS_REQUEST_DELAYED :

    int delayedFocusRequestResults = mAudioManager.requestAudioFocus(mDelayedFocusRequest);
    if (delayedFocusRequestResults == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {
        // start audio playback
        return;
    }
    if (delayedFocusRequestResults == AudioManager.AUDIOFOCUS_REQUEST_DELAYED) {
         // audio playback delayed to audio focus listener
         return;
    }
    
  3. Если запрос задерживается, прослушиватель фокуса обрабатывает изменения фокуса:

    private final class MediaWithDelayedFocusListener implements
    OnAudioFocusChangeListener {
           @Override
           public void onAudioFocusChange(int focusChange) {
               synchronized (mLock) {
                   switch (focusChange) {
                       case AudioManager.AUDIOFOCUS_GAIN:
                            // Start focus playback
                       case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT:
                            // Pause media transiently
                       case AudioManager.AUDIOFOCUS_LOSS:
                            // Stop media
    

Система принудительного затухания

Android 15 представляет системное затухание звука в AAOS. В Android аудиофокус не принудительно устанавливается системой. Таким образом, хотя разработчикам приложений рекомендуется соблюдать рекомендации по аудиофокусу, если приложение продолжает громко воспроизводить звук даже после потери аудиофокуса, система не может этого предотвратить.

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

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

Высокоуровневый дизайн

На следующем рисунке показана высокоуровневая конструкция и поддержка функции потери фокуса в автомобилях:

Высокоуровневый дизайн для системно-управляемой функции затухания

Рисунок 2. Высокоуровневая конструкция для системно-управляемой функции затухания.

  • Целевое затухание: Системное принудительное затухание в Android 15 специально разработано для ситуаций, когда приложение теряет аудиофокус, но продолжает воспроизводить звук.
  • Механизм затухания: когда приложение теряет аудиофокус и переключается на новое запрашивающее приложение:
    • Аудиофреймворк автоматически приглушает звук проигрываемого приложения.
    • После затухания система отключает аудиопоток.
    • Затем приложение получает уведомление о потере аудиофокуса.
    • Некорректно работающие приложения отключаются до тех пор, пока не восстановится звуковой фокус.
    • Логика по умолчанию — постепенное появление приложений, которые постепенно исчезают через 2 секунды. Однако OEM-производители могут настроить это на любое значение тайм-аута.
    • Аудиофреймворк использует конфигурации OEM для операций постепенного затухания и нарастания громкости.
  • Файл конфигурации OEM: Android 15 включает новый файл конфигурации car_audio_fade_configuration.xml :

    • Этот файл позволяет OEM-производителям определять критерии, при которых принудительное применение аудиофокуса системы к проигрывающему приложению.
    • Аудиофреймворк применяет затухание и отключение звука только в том случае, если проигрывающее приложение соответствует правилам, определенным OEM в этом XML-файле.
    • Это дает OEM-производителям возможность настраивать поведение функции на основе характеристик приложения или типов использования звука.
  • Управление функциями с помощью RRO: введен новый флаг функции наложения ресурсов времени выполнения (RRO) audioUseFadeManagerConfiguration для включения или отключения этой функции:

    • По умолчанию эта функция отключена.
    • Чтобы активировать системную потерю фокуса звука, OEM-производители должны установить этот флаг в true .
    • Хотя фреймворк автомобильной аудиосистемы ожидает допустимых определений конфигурации затухания при включении флага, отсутствие таких определений не приводит автоматически к фатальному исключению.
    • Все приложения конфигураций затухания должны иметь соответствующие определения затухания. Это фатальная ошибка — вызывать конфигурацию затухания (по ее имени) как часть конфигурации автомобильного аудио без предоставления допустимого определения.
    • Если флаг отключен, все определения конфигурации затухания и любые ссылки на конфигурации игнорируются.

Конфигурация менеджера затухания

Аудиофреймворк Android 15 представляет унифицированный FadeManagerConfiguration , чтобы предоставить OEM-производителям детальный контроль над поведением затухания звука. Этот фреймворк проиллюстрирован на рисунке 3:

Конфигурация менеджера затухания

Рисунок 3. Конфигурация менеджера затухания.

В эту конфигурацию входят:

  • Свойства перехода с затуханием: настройки для затухания и появления.
    • Может быть определен с помощью конкретных аудиоприменений или атрибутов.
    • Позволяет настраивать пользовательскую длительность.
    • Эти настройки используются для построения VolumeShaper.Configuration .
  • Политики затухания: правила, регулирующие момент затухания.
    • Глобальный переключатель для включения или отключения затухания.
    • Настраиваемый список вариантов использования звука с возможностью постепенного затухания (с возможностью постепенного затухания при потере фокуса).
    • Списки исключений (незатухающие) предотвращают затухание критических или обозначенных источников звука. Эти списки могут быть основаны на:
      • Типы контента
      • Аудио атрибуты
      • UID приложений (можно задать только во время выполнения)

Конфигурации OEM

В этом разделе мы рассмотрим доступные OEM-кастомизации.

XML-файл конфигурации затухания звука в автомобиле

В Android 15 представлен новый файл конфигурации car_audio_fade_configuration.xml , который позволяет OEM-производителям выполнять расширенную настройку поведения затухания звука при потере фокуса.

  • Этот XML-файл позволяет определять несколько отдельных конфигураций затухания, каждая из которых требует уникального имени для перекрестных ссылок в car_audio_configuration.xml .
  • Эти конфигурации можно гибко применять в различных аудиозонах и конфигурациях зон.
  • Примечательно, что каждая конфигурация затухания принимает только значения длительности в миллисекундах, которые система затем использует для внутренней генерации соответствующего VolumeShaper.Configuration .

Для практического руководства по реализации ознакомьтесь с примерами конфигураций, предоставленными для эмулятора, расположенными в файле device/generic/car/emulator/audio/car_audio_fade_configuration.xml .

XML-файл конфигурации автомобильной аудиосистемы

Android 15 представляет обновленный файл car_audio_configuration.xml , теперь версии 4, который включает новые теги applyFadeConfigs и fadeConfig . Тег applyFadeConfigs может содержать несколько определений fadeConfig , что позволяет гибко настраивать конфигурацию затухания. Каждое определение:

  • Необходимо включить один fadeConfig по умолчанию, обозначенный как isDefault = true .
  • Может включать несколько определений переходных fadeConfig . Эти переходные конфигурации применяются специально во время взаимодействий с потерей аудиофокуса и только тогда, когда приложение , получающее аудиофокус, соответствует критериям, определенным в переходной конфигурации.

Для практического руководства по реализации ознакомьтесь с примерами конфигураций, предоставленными для эмулятора, расположенными по адресу device/generic/car/emulator/audio/car_audio_configuration.xml .

Расширение сервиса OEM audio focus

OEM-производители, реализующие пользовательский сервис фокусировки звука автомобиля, имеют возможность гибко настраивать параметры затухания звука, включая их в OemCarAudioFocusResult . Этого можно добиться с помощью метода конструктора setAudioAttributesToCarAudioFadeConfigurationMap() :

/** @see OemCarAudioFocusResult#getAudioAttributesToCarAudioFadeConfigurationMap() **/
@NonNull
public Builder setAudioAttributesToCarAudioFadeConfigurationMap(@NonNull
        Map<AudioAttributes, CarAudioFadeConfiguration> attrsToCarAudioFadeConfig) {
}

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

Диаграмма последовательности

Эта диаграмма последовательности иллюстрирует поведение после предоставления аудиофокуса App2 и последующей потери аудиофокуса App1 :

  • После того, как служба автомобильной аудиосистемы отправляет потерю аудиофокуса в App1 , воспроизведение с проигрывателя App1 подвергается затуханию, как определено активными FadeManagerConfiguration s. После завершения операции затухания App1 получает стандартный обратный вызов потери аудиофокуса.
  • При желании звук для App1 может быть постепенно возвращен после настраиваемой длительности. OEM-производители могут гибко устанавливать эту длительность через Builder#setFadeInDurationForUsage(int, long) в соответствии с конкретными требованиями к продукту.

Диаграмма последовательности для функции затухания звука в автомобиле

Рисунок 4. Диаграмма последовательности для функции затухания звука в автомобиле.

Многозонное управление фокусом

Для автомобилей с несколькими аудиозонами аудиофокус управляется независимо для каждой зоны. Таким образом, запрос в одну зону не учитывает, что удерживает фокус в других зонах, и не приводит к потере фокуса держателями фокуса в других зонах. Благодаря этому фокусом основного салона можно управлять отдельно от развлекательной системы для задних сидений, тем самым не прерывая воспроизведение звука в одной зоне изменениями фокуса в другой.

Для всех приложений CarAudioService автоматически управляет фокусом. Аудиозона запроса фокуса определяется связанным с ней UserId или UID (подробнее см. в разделе Многозонная маршрутизация звука ).

Запросить аудио из нескольких зон одновременно

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

//Create attribute with bundle and AUDIOFOCUS_EXTRA_REQUEST_ZONE_ID
Bundle bundle = new Bundle();
bundle.putInt(CarAudioManager.AUDIOFOCUS_EXTRA_REQUEST_ZONE_ID,
               zoneId);

AudioAttributes attributesWithZone = new AudioAttributes.Builder()
     .setUsage(AudioAttributes.USAGE_MEDIA)
     .addBundle(bundle)
     .build();

//Create focus request using built attributesWithZone

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

HAL аудио фокус

Начиная с Android 11, HAL может запрашивать фокус от имени внешних потоков. Хотя это необязательно, использование этих API настоятельно рекомендуется, чтобы внешние звуки стали оптимальными участниками экосистемы Android и обеспечивали бесперебойный пользовательский опыт.

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

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

AudioControl@2.0

Версия 2.0 AudioControl HAL представляет следующие новые API:

API Цель
IAudioControl#registerFocusListener Регистрирует экземпляр IFocusListener с AudioControl HAL. Этот слушатель позволяет HAL запрашивать и отменять аудиофокус. HAl предоставляет экземпляр ICloseHandle , который Android может использовать для отмены регистрации слушателя.
IAudioControl#onAudioFocusChange Уведомляет HAL об изменениях статуса запросов фокусировки, сделанных HAL через IFocusListener , включая ответы на первоначальные запросы фокусировки.
IFocusListener#requestAudioFocus Запрашивает фокус от имени HAL для указанного использования, идентификатора зоны и типа усиления фокуса.
IFocusListener#abandonAudioFocus Отменяет существующие запросы фокуса HAL для указанного использования и идентификатора зоны.

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

За исключением registerFocusListener , эти запросы являются oneway , чтобы гарантировать, что Android не задержит HAL, пока обрабатывается запрос фокуса. HAL не должен ждать, пока получит фокус, прежде чем воспроизвести критические для безопасности звуки. Для HAL необязательно прослушивать и реагировать на изменения в аудиофокусе через IAudioControl#onAudioFocusChange .

OEM авто аудио фокус сервис

В Android 14 AAOS представила службы подключаемых модулей OEM для автомобилей, чтобы обеспечить возможность настройки некоторых компонентов автомобиля. Для Car Audio Plugin Service служба подключаемых модулей позволяет OEM-производителям управлять запросами фокусировки, перехваченными службой автомобильной аудиосистемы. Это дает OEM-производителям больше гибкости в плане управления фокусировкой в ​​соответствии с требованиями правил и положений. Таким образом, взаимодействие с аудиофокусировкой может отличаться у разных производителей и в разных регионах. Основная предпосылка для аудиофокусировки по-прежнему остается в силе: приложения должны по-прежнему запрашивать фокусировку для лучшего управления аудио с целью улучшения пользовательского опыта. В целом, для запроса аудиофокусировки приложениями по-прежнему применяются определенные правила:

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

  • Пока медиа-фокус активен:

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

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

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

  • Пока активны приложения с высоким приоритетом аудиофокусировки (включая телефонный звонок, экстренное оповещение или уведомление о безопасности), любой входящий запрос на отложенную аудиофокусировку должен быть удовлетворен или отложен по мере необходимости.

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

,

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

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

Фокус взаимодействия

Для поддержки AAOS запросы аудиофокуса обрабатываются на основе предопределенных взаимодействий между CarAudioContext запроса и текущих держателей фокуса. Существует три типа взаимодействий:

  • Эксклюзивный
  • Отклонять
  • Параллельный

Эксклюзивное взаимодействие

Это модель взаимодействия, наиболее часто используемая в Android.

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

Отклонить взаимодействие

При отклоняемых взаимодействиях входящий запрос всегда отклоняется. Например, при попытке воспроизвести музыку во время разговора. В этом случае, если Dialer удерживает аудиофокус для звонка, а второе приложение запрашивает фокус для воспроизведения музыки, музыкальное приложение получает AUDIOFOCUS_REQUEST_FAILED в ответ на запрос. Поскольку запрос фокуса отклоняется, потеря фокуса текущему держателю фокуса не отправляется.

Параллельное взаимодействие

Уникальным для AAOS является одновременное взаимодействие. Это дает приложениям, запрашивающим аудиофокус в автомобиле, возможность удерживать фокус одновременно с другими приложениями. Для одновременного взаимодействия должны быть выполнены следующие условия.:

Если эти критерии соблюдены, то запрос фокуса возвращается с AUDIOFOCUS_REQUEST_GRANTED в то время как текущий держатель фокуса не имеет изменений в фокусе. Однако, если текущий держатель фокуса выбирает получать события утки или делать паузу при укачивании, текущий держатель фокуса теряет фокус, как это происходит при исключительном взаимодействии.

Обработка параллельных потоков

Хотя параллельное взаимодействие имеет множество применений, будьте осторожны при микшировании и приглушении на аппаратном уровне между выходными устройствами. Мы настоятельно рекомендуем, чтобы экземпляры CarAudioContext , которым разрешено воспроизводиться одновременно, направлялись на разные выходные устройства.

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

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

Матрица взаимодействия

В этой таблице показана матрица взаимодействия, определенная CarAudioService . Каждая строка представляет CarAudioContext текущего держателя фокуса, а каждый столбец представляет входящий запрос.

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

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

Матрица взаимодействия аудиофокуса

Рисунок 1. Матрица взаимодействия аудиофокуса.

В Android 11 был представлен новый пользовательский параметр, позволяющий пользователям изменять поведение взаимодействия между навигацией и телефонными звонками. При установке android.car.KEY_AUDIO_FOCUS_NAVIGATION_REJECTED_DURING_CALL изменяет взаимодействие между входящими запросами фокуса NAVIGATION и текущими держателями фокуса CALL с concurrent на rejects . Если пользователь предпочитает, чтобы инструкции по навигации не прерывали вызов, он может включить этот параметр. Он сохраняется для пользователя и может быть установлен динамически, чтобы последующие запросы фокуса учитывали новую настройку.

Отложенный аудиофокус

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

Правила для отложенных запросов аудиофокуса

  • Только нетранзиентные запросы. Отложенный запрос может быть сделан только для нетранзиентных источников, чтобы избежать воспроизведения транзитного звука долгое время после того, как он становится актуальным.

  • Только один запрос может быть задержан за раз. Если задержанный запрос сделан, когда уже есть задержанный запрос, исходный задержанный запрос получает событие изменения AUDIOFOCUS_LOSS , а новый запрос получает синхронный ответ AUDIOFOCUS_REQUEST_DELAYED .

  • Отложенные запросы должны иметь OnAudioFocusChangeListener . После задержки запроса прослушиватель используется для уведомления запрашивающей стороны о том, когда запрос в конечном итоге будет удовлетворен ( AUDIOFOCUS_GAIN ) или если он будет отклонен позже ( AUDIOFOCUS_LOSS ).

Запрос отложенного фокуса

Чтобы создать запрос, который можно отложить:

  1. Используйте AudioFocusRequest.Builder#setAcceptsDelayedFocusGain .

    mMediaWithDelayedFocusListener = new MediaWithDelayedFocusListener();
    
    mDelayedFocusRequest = new AudioFocusRequest
         .Builder(AudioManager.AUDIOFOCUS_GAIN)
         .setAudioAttributes(mMusicAudioAttrib)
         .setOnAudioFocusChangeListener(mMediaWithDelayedFocusListener)
         .setForceDucking(false)
         .setWillPauseWhenDucked(false)
         .setAcceptsDelayedFocusGain(true)
         .build();
    
  2. При выполнении запроса обработайте ответ AUDIOFOCUS_REQUEST_DELAYED :

    int delayedFocusRequestResults = mAudioManager.requestAudioFocus(mDelayedFocusRequest);
    if (delayedFocusRequestResults == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {
        // start audio playback
        return;
    }
    if (delayedFocusRequestResults == AudioManager.AUDIOFOCUS_REQUEST_DELAYED) {
         // audio playback delayed to audio focus listener
         return;
    }
    
  3. Если запрос задерживается, прослушиватель фокуса обрабатывает изменения фокуса:

    private final class MediaWithDelayedFocusListener implements
    OnAudioFocusChangeListener {
           @Override
           public void onAudioFocusChange(int focusChange) {
               synchronized (mLock) {
                   switch (focusChange) {
                       case AudioManager.AUDIOFOCUS_GAIN:
                            // Start focus playback
                       case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT:
                            // Pause media transiently
                       case AudioManager.AUDIOFOCUS_LOSS:
                            // Stop media
    

Система принудительного затухания

Android 15 представляет системное затухание звука в AAOS. В Android аудиофокус не принудительно устанавливается системой. Таким образом, хотя разработчикам приложений рекомендуется соблюдать рекомендации по аудиофокусу, если приложение продолжает громко воспроизводить звук даже после потери аудиофокуса, система не может этого предотвратить.

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

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

Высокоуровневый дизайн

На следующем рисунке показана высокоуровневая конструкция и поддержка функции потери фокуса в автомобилях:

Высокоуровневый дизайн для системно-управляемой функции затухания

Рисунок 2. Высокоуровневая конструкция для системно-управляемой функции затухания.

  • Целевое затухание: Системное принудительное затухание в Android 15 специально разработано для ситуаций, когда приложение теряет аудиофокус, но продолжает воспроизводить звук.
  • Механизм затухания: когда приложение теряет аудиофокус и переключается на новое запрашивающее приложение:
    • Аудиофреймворк автоматически приглушает звук проигрываемого приложения.
    • После затухания система отключает аудиопоток.
    • Затем приложение получает уведомление о потере аудиофокуса.
    • Некорректно работающие приложения отключаются до тех пор, пока не восстановится звуковой фокус.
    • Логика по умолчанию — постепенное появление приложений, которые постепенно исчезают через 2 секунды. Однако OEM-производители могут настроить это на любое значение тайм-аута.
    • Аудиофреймворк использует конфигурации OEM для операций постепенного затухания и нарастания громкости.
  • Файл конфигурации OEM: Android 15 включает новый файл конфигурации car_audio_fade_configuration.xml :

    • Этот файл позволяет OEM-производителям определять критерии, при которых принудительное применение аудиофокуса системы к проигрывающему приложению.
    • Аудиофреймворк применяет затухание и отключение звука только в том случае, если проигрывающее приложение соответствует правилам, определенным OEM в этом XML-файле.
    • Это дает OEM-производителям возможность настраивать поведение функции на основе характеристик приложения или типов использования звука.
  • Управление функциями с помощью RRO: введен новый флаг функции наложения ресурсов времени выполнения (RRO) audioUseFadeManagerConfiguration для включения или отключения этой функции:

    • По умолчанию эта функция отключена.
    • Чтобы активировать системную потерю фокуса звука, OEM-производители должны установить этот флаг в true .
    • Хотя фреймворк автомобильной аудиосистемы ожидает допустимых определений конфигурации затухания при включении флага, отсутствие таких определений не приводит автоматически к фатальному исключению.
    • Все приложения конфигураций затухания должны иметь соответствующие определения затухания. Это фатальная ошибка — вызывать конфигурацию затухания (по ее имени) как часть конфигурации автомобильного аудио без предоставления допустимого определения.
    • Если флаг отключен, все определения конфигурации затухания и любые ссылки на конфигурации игнорируются.

Конфигурация менеджера затухания

Аудиофреймворк Android 15 представляет унифицированный FadeManagerConfiguration , чтобы предоставить OEM-производителям детальный контроль над поведением затухания звука. Этот фреймворк проиллюстрирован на рисунке 3:

Конфигурация менеджера затухания

Рисунок 3. Конфигурация менеджера затухания.

В эту конфигурацию входят:

  • Свойства перехода с затуханием: настройки для затухания и появления.
    • Может быть определен с помощью конкретных аудиоприменений или атрибутов.
    • Позволяет настраивать пользовательскую длительность.
    • Эти настройки используются для построения VolumeShaper.Configuration .
  • Политики затухания: правила, регулирующие момент затухания.
    • Глобальный переключатель для включения или отключения затухания.
    • Настраиваемый список вариантов использования звука с возможностью постепенного затухания (с возможностью постепенного затухания при потере фокуса).
    • Списки исключений (незатухающие) предотвращают затухание критических или обозначенных источников звука. Эти списки могут быть основаны на:
      • Типы контента
      • Аудио атрибуты
      • UID приложений (можно задать только во время выполнения)

Конфигурации OEM

В этом разделе мы рассмотрим доступные OEM-кастомизации.

XML-файл конфигурации затухания звука в автомобиле

В Android 15 представлен новый файл конфигурации car_audio_fade_configuration.xml , который позволяет OEM-производителям выполнять расширенную настройку поведения затухания звука при потере фокуса.

  • Этот XML-файл позволяет определять несколько отдельных конфигураций затухания, каждая из которых требует уникального имени для перекрестных ссылок в car_audio_configuration.xml .
  • Эти конфигурации можно гибко применять в различных аудиозонах и конфигурациях зон.
  • Примечательно, что каждая конфигурация затухания принимает только значения длительности в миллисекундах, которые система затем использует для внутренней генерации соответствующего VolumeShaper.Configuration .

Для практического руководства по реализации ознакомьтесь с примерами конфигураций, предоставленными для эмулятора, расположенными в файле device/generic/car/emulator/audio/car_audio_fade_configuration.xml .

XML-файл конфигурации автомобильной аудиосистемы

Android 15 представляет обновленный файл car_audio_configuration.xml , теперь версии 4, который включает новые теги applyFadeConfigs и fadeConfig . Тег applyFadeConfigs может содержать несколько определений fadeConfig , что позволяет гибко настраивать конфигурацию затухания. Каждое определение:

  • Необходимо включить один fadeConfig по умолчанию, обозначенный как isDefault = true .
  • Может включать несколько определений переходных fadeConfig . Эти переходные конфигурации применяются специально во время взаимодействий с потерей аудиофокуса и только тогда, когда приложение , получающее аудиофокус, соответствует критериям, определенным в переходной конфигурации.

Для практического руководства по реализации ознакомьтесь с примерами конфигураций, предоставленными для эмулятора, расположенными по адресу device/generic/car/emulator/audio/car_audio_configuration.xml .

Расширение сервиса OEM audio focus

OEM-производители, реализующие пользовательский сервис фокусировки звука автомобиля, имеют возможность гибко настраивать параметры затухания звука, включая их в OemCarAudioFocusResult . Этого можно добиться с помощью метода конструктора setAudioAttributesToCarAudioFadeConfigurationMap() :

/** @see OemCarAudioFocusResult#getAudioAttributesToCarAudioFadeConfigurationMap() **/
@NonNull
public Builder setAudioAttributesToCarAudioFadeConfigurationMap(@NonNull
        Map<AudioAttributes, CarAudioFadeConfiguration> attrsToCarAudioFadeConfig) {
}

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

Диаграмма последовательности

Эта диаграмма последовательности иллюстрирует поведение после предоставления аудиофокуса App2 и последующей потери аудиофокуса App1 :

  • После того, как служба автомобильной аудиосистемы отправляет потерю аудиофокуса в App1 , воспроизведение с проигрывателя App1 подвергается затуханию, как определено активными FadeManagerConfiguration s. После завершения операции затухания App1 получает стандартный обратный вызов потери аудиофокуса.
  • При желании звук для App1 может быть постепенно возвращен после настраиваемой длительности. OEM-производители могут гибко устанавливать эту длительность через Builder#setFadeInDurationForUsage(int, long) в соответствии с конкретными требованиями к продукту.

Диаграмма последовательности для функции затухания звука в автомобиле

Рисунок 4. Диаграмма последовательности для функции затухания звука в автомобиле.

Многозонное управление фокусом

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

Для всех приложений CarAudioService автоматически управляет фокусом. Аудио-зона запроса фокусировки определяется с соответствующим UserId или UID (для получения подробной информации см. Многозонную аудио-маршрутизацию ).

Запросить аудио из нескольких зон одновременно

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

//Create attribute with bundle and AUDIOFOCUS_EXTRA_REQUEST_ZONE_ID
Bundle bundle = new Bundle();
bundle.putInt(CarAudioManager.AUDIOFOCUS_EXTRA_REQUEST_ZONE_ID,
               zoneId);

AudioAttributes attributesWithZone = new AudioAttributes.Builder()
     .setUsage(AudioAttributes.USAGE_MEDIA)
     .addBundle(bundle)
     .build();

//Create focus request using built attributesWithZone

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

HAL Audio Focus

Начиная с Android 11, HAL может запросить фокус от имени внешних потоков. Хотя необязательно, использование этих API -интерфейсов очень рекомендуется позволять внешним звукам быть оптимальными участниками экосистемы Android и обеспечить беспрепятственный пользовательский опыт.

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

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

Audiocontrol@2.0

Версия 2.0 AudioControl HAL представляет эти новые API:

API Цель
IAudioControl#registerFocusListener Регистрирует экземпляр IFocusListener с аудиоконтролем HAL. Этот слушатель позволяет HAL запросить и отказаться от аудио фокусировки. HAL обеспечивает экземпляр ICloseHandle , который будет использоваться Android, чтобы нерегистрировать слушателя.
IAudioControl#onAudioFocusChange Уведомляет о HAL изменений в статусе для фокусировки запросов, сделанных HAL через IFocusListener , включая ответы на первоначальные запросы на фокусировку.
IFocusListener#requestAudioFocus Запросы сосредоточены на имени HAL для указанного использования, идентификатора зоны и типа усиления фокуса.
IFocusListener#abandonAudioFocus Отказ от существующих запросов на фокусировку HAL для указанного использования и идентификатора зоны.

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

Помимо registerFocusListener , эти запросы представляют собой oneway , чтобы убедиться, что Android не задерживает HAL, когда обрабатывается запрос на фокус. HAL не должен ждать, чтобы получить фокус, прежде чем играть критические звуки безопасности. Для HAL не обязательно прослушать и реагировать на изменения в фокусе аудио через IAudioControl#onAudioFocusChange .

OEM CAR Audio Focus Service

В Android 14 AAOS представил службы плагина CAR OEM, чтобы включить конфигурируемость для некоторых автомобильных компонентов. Для сервиса плагинов автомобилей служба плагинов позволяет OEM -производителям управлять запросами фокусировки, перехватываемых сервисом CAR Audio. Это дает OEM -производителям большую гибкость с точки зрения управления фокусом, как того требует правила и правила. Таким образом, взаимодействие с фокусом аудио может отличаться между производителями и от региона до региона. Основная предпосылка для аудио фокусировки по -прежнему сохраняется, что приложения по -прежнему должны запрашивать фокус для улучшения аудио управления для улучшения пользовательского опыта. В целом, определенные правила по -прежнему применяются для запроса фокусировки аудио приложения:

  • Без какого -либо постоянного, приложения с высоким приоритетом (включая телефонный звонок, аварийное оповещение или уведомление о безопасности) должны иметь возможность получить аудио фокусировку либо временно, либо навсегда.

  • В то время как медиа -фокус активен:

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

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

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

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

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