Аудио фокус

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

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

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

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

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

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

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

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

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

При взаимодействии отклонения входящий запрос всегда отклоняется. Например, при попытке воспроизвести музыку во время разговора. В этом случае, если номеронабиратель удерживает фокус звука для вызова, а второе приложение запрашивает фокус для воспроизведения музыки, музыкальное приложение получает 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 с одновременного на отклоненное . Если пользователь предпочитает, чтобы инструкции по навигации не прерывали вызов, он может включить эту настройку. Это сохраняется для пользователя и может быть установлено динамически, чтобы последующие запросы фокуса учитывали новый параметр.

Задержка аудиофокуса

В 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 при воспроизведении экстренных или критических для безопасности звуков, чтобы обеспечить их четкую слышимость.

АудиоКонтроль@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-производителей автомобилей, позволяющие настраивать некоторые компоненты автомобиля. Что касается службы подключаемых модулей автомобильной аудиосистемы , служба подключаемых модулей позволяет OEM-производителям управлять запросами фокусировки, перехваченными службой автомобильной аудиосистемы. Это дает OEM-производителям больше гибкости в плане управления фокусом в соответствии с требованиями правил и положений. Таким образом, взаимодействие аудиофокуса может различаться у разных производителей и от региона к региону. Основная предпосылка фокуса на звуке по-прежнему сохраняется: приложения по-прежнему должны запрашивать фокус для лучшего управления звуком, чтобы улучшить взаимодействие с пользователем. В целом, к запросу фокуса звука со стороны приложений по-прежнему применяются определенные правила:

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

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

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

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

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

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

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