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

В Android audio 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 .