Ограничение по типу устройства

В аудио Android audio_devices_t используется для представления типа аудиоустройства. Оно широко используется в исходном коде аудио как битовое поле для фильтрации или выбора одного или нескольких указанных устройств. До Android 11 существовало ограничение в 30 типов аудиоустройств ввода/вывода и не было свободных слотов для добавления новых типов аудиоустройств. Мы сняли ограничение на количество типов аудиоустройств, чтобы можно было добавлять новые типы аудиоустройств.

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

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

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

Примеры и источник

До Android 11 существовало два типичных варианта использования типов аудиоустройств в качестве битовых масок.

  • Использование значения audio_devices_t для представления нескольких аудиоустройств.
  • Проверка того, содержит ли значение audio_devices_t типы аудиоустройств из указанной категории.

Для представления нескольких типов аудиоустройств используется класс с именем DeviceTypeSet в файле /libaudiofoundation/include/media/AudioContainers.h , который является контейнером std::set audio_devices_t . Класс объявлен в доступной поставщику библиотеке libaudiofoundation . Для представления нескольких типов аудиоустройств в коде C можно использовать массив или список audio_devices_t .

Чтобы проверить, относится ли один тип устройства к указанной категории, используйте вспомогательные функции audio_is_.*_device в /system/media/audio/include/system/audio.h . В случае нескольких типов аудиоустройств используйте вспомогательные функции в libaudiofoundation . Например, используйте areAllOfSameDeviceType (DeviceTypeSet, std::function ) areAllOfSameDeviceType (DeviceTypeSet, std::function ) в AudioContainers.h , чтобы проверить, относятся ли все заданные типы аудиоустройств к одному и тому же типу.

Выполнение

OEM-производителям необходимо удалить представление битового поля типа аудиоустройства из реализации аудио HAL.

  1. Удалите всю память устройств на битовом поле.

    audio_devices_t не следует использовать для представления нескольких типов аудиоустройств. Вместо этого используйте список или вектор.

  2. Прекратите использовать битовые операции для сравнения типов устройств.

    До Android 11 типы аудиоустройств можно было использовать как битовое поле. В этом случае для сравнения типов устройств обычно используются битовые операции. При добавлении новых перечислимых типов аудиоустройств битовые операции могут привести к неожиданным результатам. Вместо этого используйте вспомогательные функции в качестве альтернативы. Если существует один тип аудиоустройства, используйте прямое сравнение для сравнения двух значений. Чтобы проверить, принадлежит ли тип аудиоустройства к указанной категории, используйте вспомогательные функции в /system/media/audio/include/system/audio.h . Например, audio_is_output_device(audio_devices_t device) .

  3. Прекратите использовать предопределенные значения для групп типов аудиоустройств.

    Существует несколько предопределенных значений для групп типов аудиоустройств, AUDIO_DEVICE_OUT_ALL , в system/media/audio/include/system/audio-base-utils.h . Все эти значения зарезервированы, но могут быть признаны устаревшими, поскольку они не будут правильными при добавлении новых перечислимых типов аудиоустройств. В audio-base-utils.h определены новые группы типов аудиоустройств, которые представляют собой массивы типов аудиоустройств, например AUDIO_DEVICE_OUT_ALL_ARRAY .

  4. Реализуйте методы create_audio_patch() и release_audio_patch() для маршрутизации вместо set_parameters .

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

    В настоящее время требуются два типа аудиопатчей:

    • Смешивайте с патчами устройства для воспроизведения
    • Устройство для микширования патчей для записи

    В последующих обновлениях могут потребоваться дополнительные исправления для устройств между устройствами.

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

    Если используется устаревший аудио HAL и оболочка AOSP HIDL, устаревший аудио HAL должен установить основную версию HAL на 3.0.

    Чтобы включить функцию исправления звука, аудио HAL должен установить основную версию HAL на 3.0 или выше. Обратитесь к Device::supportsAudioPatches() в реализации HIDL по умолчанию для получения дополнительной информации, которую также можно найти в аудио HAL для Cuttlefish.

Кастомизация

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

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

Если добавляются новые типы аудиоустройств и OEM-производители хотят их использовать, им необходимо обновить свою реализацию аудио HAL и перейти на HIDL версии 6.0 или выше. Обязательно обновить основную версию HAL до 3.0 и реализовать методы create_audio_patch и release_audio_patch , поскольку использование set_parameters для маршрутизации потока может привести к неожиданным результатам при добавлении новых типов аудиоустройств.

Проверка

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