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

In Android audio, audio_devices_t is used to represent the audio device type. It's widely used in audio source code as a bit field to filter or select one or more specified devices. Prior to Android 11, there was a limit of 30 audio input/output device types, and no spare slots to add new audio device types. We've removed the limit on the number of audio device types to allow new audio device types to be added.

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

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

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

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

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

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

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

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

Выполнение

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

  1. Удалите все данные об устройствах из битового поля.

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

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

    Before Android 11, audio device types can be used as a bitfield. In that case, it's common to use bit operations for device types comparisons. When new, enumerated audio device types are added, the bit operations may cause unexpected results. Instead, use helper functions as an alternative. If there's a single audio device type, then use direct comparison to compare the two values. To check if an audio device type is of a specified category, use helper functions in /system/media/audio/include/system/audio.h . For example, audio_is_output_device(audio_devices_t device) .

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

    There are some predefined values for groups of audio device types, AUDIO_DEVICE_OUT_ALL , in system/media/audio/include/system/audio-base-utils.h . All these values are reserved but might be deprecated as they won't be correct when new enumerated audio device types are added. There are new groups of audio device types defined in audio-base-utils.h , which are arrays of audio device types, such as AUDIO_DEVICE_OUT_ALL_ARRAY .

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

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

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

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

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

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

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

    To enable the audio patch feature, the audio HAL should set the major HAL version to 3.0 or higher. Refer to Device::supportsAudioPatches() in default HIDL implementation for more information, which can also be found on audio HAL for Cuttlefish.

Настройка

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

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

If new audio device types are added and OEMs want to use them, they have to upgrade their audio HAL implementation and move to HIDL version 6.0 or higher. It's mandatory to upgrade the major HAL version to 3.0 and implement the create_audio_patch and release_audio_patch methods, because using set_parameters to route the stream can cause unexpected results when new audio device types are added.

Валидация

Для производителей оборудования (OEM) необходимо обновить свои реализации HAL. Для проверки корректной работы реализации можно использовать VTS для аудио HAL. Все тесты можно найти в файлах VTS .