Android 10 улучшает пользовательский опыт, требующий одновременного выполнения нескольких активных аудиозаписей, например, если пользователь хочет управлять VoIP-вызовом или видеорегистратором с помощью голосовых команд, предоставляемых службой специальных возможностей.
Аудиофреймворк реализует политику, позволяющую только определенным привилегированным приложениям производить захват одновременно с обычными приложениями.
Политика параллельного доступа реализуется путём отключения звука захваченного звука, а не путём запрета приложению начать захват. Это позволяет фреймворку динамически реагировать на изменения количества и типов активных сценариев использования захвата, не мешая приложению начать захват в случае, если оно может восстановить полный доступ к микрофону после того, как другое приложение завершит захват.
Следствием для аудио HAL и аудиоподсистемы является то, что они должны поддерживать несколько активных входных потоков одновременно, даже если в некоторых случаях только один поток обеспечивает не-молчаливый звук для активного клиента.
Требования CDD
Требования к поддержке одновременного захвата см. в CDD .
Захват ситуаций из аудио HAL
Сценарий одновременного захвата может привести к разным ситуациям с точки зрения количества активных входных потоков, выбора устройства ввода или конфигурации предварительной обработки.
Параллелизм может иметь место между следующими процессами:
- Несколько входных потоков от прикладного процессора (AP)
- Входные потоки и голосовой вызов
- Входные потоки и аудио DSP, реализующие маломощное обнаружение ключевых слов
Одновременная активность входных потоков AP
Файл конфигурации звуковой политики audio_policy_configuration.xml
используется звуковой платформой для определения того, сколько входных потоков может быть открыто и активно одновременно.
Как минимум, аудио HAL должен поддерживать по крайней мере один экземпляр каждого входного профиля ( mixPort
роли sink
), перечисленного в открытом и активном файле конфигурации .
Выбор устройства
Когда несколько активных клиентов подключены к одному и тому же входному потоку HAL, фреймворк выбирает подходящее устройство для этого входного потока на основе приоритета варианта использования.
Если активны несколько входных потоков, каждый поток может иметь свой выбор устройств.
Если технология совместима, рекомендуется, чтобы аудио HAL и подсистема позволяли захватывать разные потоки с разных устройств, например, с Bluetooth-гарнитуры и встроенного микрофона.
В случае несовместимости (например, два устройства используют один и тот же цифровой аудиоинтерфейс или бэкэнд) звуковой HAL должен выбрать, какой поток управляет выбором устройства.
В этом случае:
- Результирующее состояние должно быть последовательным и предлагать тот же выбор устройства при повторении одного и того же сценария.
- Когда состояние параллелизма заканчивается, оставшийся активный поток должен быть направлен на первоначально запрошенное устройство в этом потоке.
Если порядок приоритетов определяется аудио HAL между активными вариантами использования, следуйте тому же порядку, который указан в source_priority()
в frameworks/av/services/audiopolicy/common/include/policy.h
Выбор предварительной обработки
Аудиофреймворк может запрашивать предварительную обработку входного потока с помощью методов HAL addEffect()
или removeEffect()
.
Для предварительной обработки заданного входного потока аудиофреймворк включает только конфигурацию, соответствующую активному варианту использования с наивысшим приоритетом во входном потоке. Однако при активации и деактивации вариантов использования может происходить перекрытие, что приводит к запуску двух одновременно активных процессов (например, двух экземпляров эхоподавителя) в одном и том же входном потоке. В этом случае реализация HAL выбирает, какой запрос принять; она отслеживает активные запросы и восстанавливает правильное состояние при отключении любого из процессов.
Когда одновременно активны несколько потоков захвата, разные запросы предварительной обработки могут выполняться на разных потоках.
Реализации HAL и аудиоподсистемы должны позволять применять различную предварительную обработку к разным потокам, даже если они используют одно и то же входное устройство. То есть предварительная обработка должна применяться после демультиплексирования потоков из основного источника захвата.
Если по техническим причинам в данной аудиоподсистеме это невозможно, аудио HAL должен применять правила приоритета, аналогичные тем, что перечислены в разделе Выбор устройства .
Одновременный голосовой вызов и захват из точки доступа
Захват с точки доступа может происходить во время активного голосового вызова. Эта ситуация не нова в Android 10 и не связана напрямую с функцией одновременного захвата, но полезно упомянуть правила для этого сценария.
Во время вызова необходимы два разных типа захвата от точки доступа.
Захват вызова RX и TX
Захват вызовов RX и TX инициируется использованием источника звука AudioSource.VOICE_UPLINK
или AudioSource.VOICE_DOWNLINK
и/или устройства AudioDevice.IN_TELEPHONY_RX
.
Аудио HAL должны быть представлены на входном профиле ( mixPort
роли sink
) с доступным маршрутом от устройства AudioDevice.IN_TELEPHONY_RX
.
При установленном вызове (аудиорежим AudioMode.IN_CALL
) должна быть возможность иметь по крайней мере один активный поток захвата с устройства AudioDevice.IN_TELEPHONY_RX
.
Захват с устройств ввода во время активного вызова
Когда вызов активен (аудиорежим AudioMode.IN_CALL
), должна быть возможность открывать и активировать входные потоки от точки доступа, как указано в разделе «Одновременная активность входных потоков точки доступа» .
Однако приоритет при выборе устройства и предварительной обработке всегда должен отдаваться голосовому вызову на случай возникновения конфликта с запросами от входных потоков точки доступа.
Одновременный захват с DSP и AP
Если аудиоподсистема содержит DSP-процессор с поддержкой функций маломощного аудиоконтекста или распознавания ключевых слов, реализация должна поддерживать одновременный захват данных с точки доступа и аудио DSP. Это включает как захват DSP на начальном этапе обнаружения, так и захват данных с помощью AudioSource.HOTWORD
после того, как обнаружение было запущено DSP.
Это должно быть отражено флагом параллельного захвата, сообщаемым звуковым триггером HAL через дескриптор реализации: ISoundTriggerHw.Properties.concurrentCapture = true
.
Аудио-HAL также должен предоставлять профиль ввода, специфичный для захвата ключевых слов, определяемый флагом AudioInputFlag.HW_HOTWORD
. Реализация должна поддерживать открытие и активацию потоков в этом профиле, количество которых должно быть не менее числа звуковых моделей, которые может одновременно загрузить звуковой триггер HAL.
Захват с этого входного профиля должен быть возможен, пока активны другие входные профили.
Последствия для реализаций Assistant
Требования к использованию данных и уведомлению пользователей
Поскольку одновременное использование микрофона при злоупотреблении может привести к утечке личных данных пользователя, нам необходимо применить следующие условия и гарантии к привилегированным предустановленным приложениям, запрашивающим роль Помощника.
- Данные, собранные через микрофон, не должны покидать устройство, пока пользователь не взаимодействует с Ассистентом. Например, после активации голосового помощника.
- Приложения, прослушивающие одновременно, должны показывать пользователю визуальные подсказки после обнаружения ключевого слова. Это помогает ему понять, что дальнейшие разговоры будут проходить через другое приложение, например, через Помощника.
- Пользователи должны иметь возможность отключать микрофон или триггеры Помощника.
- При хранении аудиозаписей пользователи должны иметь возможность доступа к ним, просмотра и удаления записей в любое время.
Функциональные улучшения для Android 10
Помощники не блокируют друг друга
На устройствах с Android 9 и более ранних версиях, когда на устройстве постоянно активны два помощника, только один из них может ожидать голосового сообщения. Поэтому приходилось переключаться между ними. В Android 10 помощник по умолчанию может одновременно слушать другого помощника. Это обеспечивает гораздо более удобную работу с обоими помощниками.
Приложения, удерживающие микрофон открытым
Когда приложения вроде Shazam или Waze удерживают микрофон открытым, помощник по умолчанию может продолжать слушать голосовое сообщение.
Для приложений-помощников, не являющихся приложениями по умолчанию, никаких изменений в поведении для Android 10 не произошло.
Пример реализации аудио HAL
Пример реализации аудио HAL, соответствующей рекомендациям данного документа, можно найти в AOSP .