Аудио фокус

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

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

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

Для поддержки 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
    

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

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

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

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

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

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

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

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

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

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