Начиная с Android 14, партнерам и поставщикам SoC рекомендуется заменить текущую реализацию HIDL HAL на реализацию AIDL HAL.
Чтобы упростить переход с HIDL Audio HAL на AIDL Audio HAL, на этой странице описаны некоторые ключевые различия между ними. На этой странице также приведено сопоставление интерфейсов AIDL и HIDL для HAL аудио.
Различия между реализациями Audio HAL на основе AIDL и HIDL
Основные различия между структурами HIDL и AIDL перечислены ниже.
В AIDL Audio Core HAL интерфейс
IConfigзаменяет системные параметры в XML-файлах в HIDL HAL. Фреймворк считывает эти параметры из Core HAL, а не из файла конфигурации поставщика. Например, список форматов объемного звука, доступных пользователю, предоставляется методомIConfig.getSurroundSoundConfigв Core HAL.В AIDL Audio Effects HAL логика
effectProxy, определенная в XML-файлах в HIDL Effects HAL, переносится в аудиофреймворк. Аудиофреймворк запрашивает все экземпляры эффектов в системе с помощьюIFactory.queryEffectsи все обработки эффектов с помощьюIFactory.queryProcessing.Чтобы избежать путаницы с использованием термина устройство для типов аудиоустройств,
IDeviceв HIDL Audio HAL переименован вIModuleв AIDL Audio HAL.AIDL Audio HAL заменяет
IPrimaryDevice. Фреймворк отправляет обновления о текущем режиме аудио и повороте экрана каждому экземпляруIModule. Специальный интерфейсIBluetoothобрабатывает параметры, связанные с синхронным подключением Bluetooth (BT SCO) и профилем голосового управления (HFP). Специальный интерфейсITelephonyпозволяет управлять функциями телефонии. Вы можете получить экземпляры обоих этих интерфейсов из основного экземпляра интерфейсаIModule. Подробнее об основном HAL и функциях, связанных с возможностями…IDevicesFactoryудален из AIDL Audio HAL, чтобы избежать избыточности. Модули HAL (то есть экземпляры интерфейсаIModule) теперь регистрируются непосредственно в Менеджере сервисов, используя имена экземпляров модулей, напримерbluetoothилиr_submix. Единственное исключение – модульprimary, который регистрируется под названием экземпляраdefault.
Сопоставление AIDL и HIDL Audio HAL
В таблицах ниже показано сопоставление интерфейсов HIDL и AIDL Audio HAL. Подробнее о структуре каталогов можно узнать в разделе Аудио HAL.
Основной уровень HAL
Все интерфейсы HIDL находятся в пакете android.hardware.audio@N.M, где N.M – версия Major.Minor. Все интерфейсы AIDL находятся в пакете android.hardware.audio.core.
| Интерфейсы HIDL API и файлы конфигурации | Интерфейсы AIDL API |
|---|---|
IDevicesFactory |
Регистрация IModule с помощью ServiceManager. |
IDevice |
IModule |
IPrimaryDevice |
ITelephony IBluetooth |
IStream IStreamIn
IStreamOut |
StreamDescriptor IStreamIn
IStreamCommon
IStreamOut |
audio_policy_configuration.xml
audio_policy_engine_configuration.xml |
IConfig IModule |
| Настраиваемые файлы правил для аудио | Используйте реализацию HIDL для Android 14. |
Аудиопорты, динамические профили, маршруты и патчи
В этой таблице элементы XML-файлов обозначены угловыми скобками.
| Методы интерфейса HIDL API и элементы файлов конфигурации | Методы интерфейса AIDL API |
|---|---|
<attachedDevices>
<defaultOutputDevice>
<mixPorts>
<devicePorts> |
IModule.getAudioPorts |
IDevice.getAudioPort
IDevice.setConnectedState |
IModule.connectExternalDevice
IModule.disconnectExternalDevice |
IStream.getSupportedProfiles |
IModule.connectExternalDevice |
<routes> |
IModule.getAudioRoutes |
IDevice.createAudioPatch
IDevice.updateAudioPatch
IDevice.releaseAudioPatch
IStream.getDevices
IStream.setDevices
Спецификация устройства в IDevice.openInputStream
IDevice.openOutputStream |
IModule.setAudioPatch
IModule.setAudioPortConfig
IModule.resetAudioPatch |
Конфигурации аудиопортов и потоков
| Методы интерфейса HIDL API | Методы интерфейса AIDL API |
|---|---|
IStream.getAudioProperties
IStream.setAudioProperties
IStreamIn.getAudioSource |
IModule.getAudioPortConfigs
IModule.setAudioPortConfig |
IDevice.openInputStream
IDevice.openOutputStream
IStreamIn.prepareForReading
IStreamOut.prepareForWriting
IStream.createMmapBuffer |
IModule.openInputStream
IModule.openOutputStream |
IStream.close |
IStreamCommon.close |
IStreamIn.updateSinkMetadata
IStreamOut.updateSourceMetadata |
IStreamIn.updateMetadata
IStreamOut.updateMetadata |
IStream.standby |
StreamDescriptor.Command.standby |
IStream.pause IStream.resume |
StreamDescriptor.Command.pause .start |
IStream.start IStream.stop (потоки MMAP) |
StreamDescriptor.Command.start или .burst
.pause (вход) и/или .flush (выход) |
IStreamOut.drain IStreamOut.flush |
StreamDescriptor.Command.drain .flush |
IStreamOut.setCallback
IStreamOut.clearCallback |
IModule.openOutputStream
IStreamCommon.close |
IStreamOut.getPresentationPosition и IStreamIn.getCapturePosition
IStreamOut.getLatency
IStream.getMmapPosition
IStreamIn.getInputFramesLost |
StreamDescriptor.Reply.observable
StreamDescriptor.Reply.latencyMs
StreamDescriptor.Reply.hardware
StreamDescriptor.Reply.xrunFrames |
IDevice.getInputBufferSize
IStreamOut.getLatency
IStream.getBufferSize
IStream.getFrameSize
IStream.getFrameCount |
IModule.setAudioPatch, номинальная задержка и минимальный размер буфера являются частью структуры AudioPatch, возвращаемой HAL.
Фактический размер буфера в кадрах является частью структуры StreamDescriptor
вместе с размером кадра в байтах. Размер буфера в байтах можно рассчитать, умножив эти два числа. |
Подключение аудиоэффектов
| Методы интерфейса HIDL API | Методы интерфейса AIDL API |
|---|---|
IDevice.addDeviceEffect
IDevice.removeDeviceEffect |
IModule.addDeviceEffect
IModule.removeDeviceEffect |
IStream.addEffect
IStream.removeEffect |
IStreamCommon.addEffect
IStreamCommon.removeEffect |
Конфигурация на уровне системы
Общесистемная конфигурация, которая ранее определялась в XML-файлах конфигурации правил аудио (а именно audio_policy_configuration.xml и audio_policy_engine_configuration.xml), должна быть предоставлена через IConfig.
Однако, чтобы упростить переход на AIDL, поставщики могут использовать те же XML-файлы, которые они использовали ранее для настройки конфигурации на уровне системы. В эталонной реализации для IConfig содержится код, необходимый для представления информации из XML-файла с помощью типов данных AIDL, что упрощает преобразование из XML в AIDL.
| Элементы файла конфигурации HIDL | Методы интерфейса AIDL API |
|---|---|
<globalConfiguration>
<speaker_drc_enabled><call_screen_mode_supported>
<engine_library> |
Разделены на два метода:
ITelephony.getSupportedAudioModes
IConfig.getEngineConfig |
<volumes> ИЛИ
<volumeGroups>, <ProductStrategies>
|
IConfig.getEngineConfig |
<surroundSound> |
IConfig.getSurroundSoundConfig |
-
speaker_drc_enabledудален из файла конфигурации, так как этот элемент конфигурации не используется в системе. На всех устройствах должна быть включена функция DRC. <ahref="#fnref1" rev="footnote"> </ahref="#fnref1">
Функции, связанные с функциями
| Методы интерфейса HIDL API | Интерфейс AIDL API |
|---|---|
IDevice.setMasterVolume
IDevice.getMasterVolume
IDevice.setMicMute
IDevice.getMicMute
IDevice.setMasterMute
IDevice.getMasterMute |
IModule.\* |
IPrimaryDevice.getTtyMode
IPrimaryDevice.setTtyMode
IPrimaryDevice.getHacEnabled
IPrimaryDevice.setHacEnabled
IPrimaryDevice.setVoiceVolume |
ITelephony.TelecomConfig.\* |
IPrimaryDevice.setBtScoHeadsetDebugName
IPrimaryDevice.getBtScoNrecEnabled
IPrimaryDevice.setBtScoNrecEnabled
IPrimaryDevice.getBtScoWidebandEnabled
IPrimaryDevice.setBtScoWidebandEnabled,
IPrimaryDevice.getBtHfpEnabled
IPrimaryDevice.setBtHfpEnabled
IPrimaryDevice.setBtHfpSampleRate
IPrimaryDevice.setBtHfpVolume |
IBluetooth.ScoConfig.\*
IBluetooth.HfpConfig.\* |
IPrimaryDevice.setMode
IPrimaryDevice.updateRotation |
ITelephony.switchAudioMode
IModule.updateAudioMode
IModule.updateScreenRotation |
IDevice.setScreenState
IDevice.getMicrophones |
IModule.updateScreenState
IModule.getMicrophones |
IDevice.getHwAvSync
IStream.setHwAvSync |
IModule.generateHwAvSyncId
IStreamCommon.updateHwAvSyncId |
IStreamIn.setGainIStreamIn.setMicrophoneDirectionIStreamIn.setMicrophoneFieldDimension |
IStreamIn.setHwGainIStreamIn.setMicrophoneDirectionIStreamIn.setMicrophoneFieldDimension |
IStreamOut.getDualMonoMode
IStreamOut.setDualMonoMode
IStreamOut.getPlaybackRateParameters
IStreamOut.setPlaybackRateParameters
IStreamOut.selectPresentation
IStreamOut.getAudioDescriptionMixLevel
IStreamOut.setAudioDescriptionMixLevel
IStreamOut.setLatencyMode
IStreamOut.getRecommendedLatencyModes |
IStreamOut.\* |
IStreamOut.setEventCallback
IStreamOut.setLatencyModeCallback |
IModule.openOutputStream (обратные вызовы объединены в IStreamOutEventCallback) |
IDevice.get/setParameters
IStream.get/setParameters |
IModule.get/setVendorParameters
IStreamCommon.get/setVendorParameters |
Устаревшие методы
| Методы интерфейса HIDL API | Комментарии |
|---|---|
IDevice.initCheckIDevice.close |
Модуль HAL публикует себя с помощью ServiceManager только после успешной инициализации. После этого он считается постоянным и не может быть закрыт. |
IDevice.supportsAudioPatches
IStreamOut.supportsPauseAndResume
IStreamOut.supportsDrain |
Поддержка исправлений, приостановки, возобновления и очистки обязательна. |
IStreamOut.getRenderPosition
IStreamOut.getNextWriteTimestamp |
Устарело. |
Расширения поставщиков
В HIDL API расширения поставщика реализуются с помощью методов getParameters или setParameters из интерфейсов IDevice и IStream. Эти методы принимают произвольные строки.
В AIDL API есть соответствующие методы, например getVendorParameters или setVendorParameters, которые принимают произвольные экземпляры Parcelable, используя инкапсуляцию в ParcelableHolders.
Другие изменения
Другие общие изменения:
Чтобы улучшить тестируемость API HAL, в версии AIDL мы добавили параметры отладки, которые используются в тестах VTS и доступны через
ModuleDebugparcelable. Эти параметры указывают HAL на необходимость эмулировать определенные функции (например, подключение внешних устройств), которые в противном случае требуют ручного вмешательства и использования внешнего оборудования для тестирования.Когда фреймворк или набор тестов VTS устанавливает для системного свойства
sys.audio.restart.halзначение1, службы HAL должны перезапуститься. Файлaudioserver.rcотвечает за перезапуск. При реализации HAL используйте подходящее название сервиса HAL, указанное в файлеaudioserver.rc. В Android 14 названиеvendor.audio-hal-aidlдобавляется специально для AIDL-версии HAL.
HAL эффектов
Все интерфейсы HIDL находятся в пакете android.hardware.audio.effect@N.M*, где N.M – версия Major.Minor. Все интерфейсы AIDL находятся в пакете android.hardware.audio.effect.
| Интерфейсы HIDL API и файлы конфигурации | Интерфейсы AIDL API |
|---|---|
IEffectsFactory |
IFactory |
IEffect |
IEffect |
audio_effects.xml |
IEffect |
Effect Factory
| Интерфейсы HIDL API (android.hardware.audio.effect@X.X) |
Интерфейсы AIDL API (android.hardware.audio.effect) |
|---|---|
IEffectsFactory.getAllDescriptors |
IFactory.queryEffects с пустым параметром UUID |
IEffectsFactory.getDescriptor |
IFactory.queryEffects с параметром UUID |
IEffectsFactory.createEffect |
IFactory.createEffect |
audio_effects.xml |
IFactory.queryProcessing
IFactory.queryEffects |
Интерфейсы эффектов
| Интерфейсы HIDL API (android.hardware.audio.effect@X.X) |
Интерфейсы AIDL API (android.hardware.audio.effect) |
|---|---|
IEffect.init |
IEffect.open |
IEffect.setConfig |
IEffect.setParameter |
IEffect.enable |
IEffect.command(CommandId::START) |
IEffect.disable |
IEffect.command(CommandId::STOP) |
IEffect.reset |
IEffect.command(CommandId::RESET) |
IEffect.getDescriptor |
IEffect.getDescriptor |
IEffect.command |
Сопоставьте с IEffect.command, IEffect.setParameter или IEffect.getParameter в зависимости от типа устаревшей команды HIDL.
|
| Н/Д | IEffect.getState |
IEffect.setParameter |
IEffect.setParameter |
IEffect.getParameter |
IEffect.getParameter |
Команды эффектов
| Интерфейсы HIDL API (android.hardware.audio.effect@X.X) |
Интерфейсы AIDL API (android.hardware.audio.effect) |
|---|---|
EFFECT_CMD_INIT |
IEffect.open |
EFFECT_CMD_RESET |
CommandId.RESET |
EFFECT_CMD_ENABLE |
IEffect.command(CommandId::START) |
EFFECT_CMD_DISABLE |
IEffect.command(CommandId::STOP) |
EFFECT_CMD_SET_PARAM_DEFERRED |
Устаревшие функции в HAL Effects AIDL |
EFFECT_CMD_SET_PARAM_COMMIT |
Устарело в Effects AIDL HAL |
EFFECT_CMD_SET_CONFIG
EFFECT_CMD_SET_PARAM
EFFECT_CMD_SET_DEVICE
EFFECT_CMD_SET_VOLUME
EFFECT_CMD_SET_AUDIO_MODE
EFFECT_CMD_SET_CONFIG_REVERSE
EFFECT_CMD_SET_INPUT_DEVICE
EFFECT_CMD_SET_FEATURE_CONFIG
EFFECT_CMD_SET_AUDIO_SOURCE |
IEffect.setParameter |
EFFECT_CMD_GET_PARAM
EFFECT_CMD_GET_CONFIG
EFFECT_CMD_GET_CONFIG_REVERSE
EFFECT_CMD_GET_FEATURE_SUPPORTED_CONFIGS
EFFECT_CMD_GET_FEATURE_CONFIG
VISUALIZER_CMD_MEASURE
EFFECT_CMD_FIRST_PROPRIETARY
(то же, что и VISUALIZER_CMD_CAPTURE) |
IEffect.getParameter |
EFFECT_CMD_OFFLOAD |
Больше не используется.
В AIDL переключение между режимами разгрузки и без разгрузки обрабатывается в фреймворке. |
EFFECT_CMD_DUMP |
Обрабатывается встроенной транзакцией связывания AIBinder_dump. |
Определение параметров общего эффекта
| Определение HIDL (android.hardware.audio.effect@X.X) |
Определение AIDL |
|---|---|
Types.hal |
Flags.aidl
Parameter.aidl
|
Определение особых эффектов
| Интерфейсы HIDL API (android.hardware.audio.effect@X.X) |
Интерфейсы AIDL API (android.hardware.audio.effect) |
|---|---|
I$EffectType$.hal |
$EffectType$.aidl |