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

В 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 ) в 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 .