Начиная с Android 14, партнерам и поставщикам SoC рекомендуется заменить текущую реализацию HIDL HAL на реализацию AIDL HAL.
Для облегчения перехода с HIDL Audio HAL на AIDL Audio HAL на этой странице выделены некоторые ключевые различия. Здесь также показано соответствие интерфейсов AIDL и HIDL для Audio HAL.
Разница между реализациями AIDL и HIDL Audio HAL
Основные различия между структурой 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) и профилем Hands-Free (HFP). Выделенный интерфейс- ITelephonyпредоставляет элементы управления, специфичные для телефонии. Экземпляры обоих этих интерфейсов можно получить из основного экземпляра интерфейса- IModule. Подробнее см. в сравнительных таблицах по основным HAL и функциональным возможностям .
- IDevicesFactoryудалена из AIDL Audio HAL для предотвращения избыточности. Модули HAL (то есть экземпляры интерфейса- IModule) теперь регистрируются непосредственно в диспетчере служб, используя имена экземпляров модулей, например,- bluetoothили- r_submix. Единственным исключением является- primaryмодуль, который регистрируется под именем экземпляра- default.
Сопоставление AIDL и HIDL Audio HAL
В таблицах в следующих разделах показано соответствие интерфейсов HIDL и AIDL Audio HAL. Подробнее о структуре каталогов см. в разделе «Audio HAL» .
Ядро HAL
 Все интерфейсы HIDL находятся в пакете android.hardware.audio@NM , где NM обозначает версию Major.Minor . Все интерфейсы AIDL находятся в пакете android.hardware.audio.core .
| Интерфейсы API HIDL и файлы конфигурации | Интерфейсы API AIDL | 
|---|---|
| IDevicesFactory | Регистрация IModuleвServiceManager. | 
| IDevice | IModule | 
| IPrimaryDevice | ITelephonyIBluetooth | 
| IStreamIStreamInIStreamOut | StreamDescriptorIStreamInIStreamCommonIStreamOut | 
| audio_policy_configuration.xmlaudio_policy_engine_configuration.xml | IConfigIModule | 
| Настраиваемые файлы аудиополитики | Используйте реализацию HIDL для Android 14. | 
Аудиопорты, динамические профили, маршруты и патчи
В этой таблице элементы XML-файлов обозначены с помощью угловых скобок.
| Методы интерфейса API HIDL и элементы файлов конфигурации | Методы интерфейса API AIDL | 
|---|---|
| <attachedDevices><defaultOutputDevice><mixPorts><devicePorts> | IModule.getAudioPorts | 
| IDevice.getAudioPortIDevice.setConnectedState | IModule.connectExternalDeviceIModule.disconnectExternalDevice | 
| IStream.getSupportedProfiles | IModule.connectExternalDevice | 
| < routes> | IModule.getAudioRoutes | 
| IDevice.createAudioPatchIDevice.updateAudioPatchIDevice.releaseAudioPatchIStream.getDevicesIStream.setDevicesСпецификация устройства в IDevice.openInputStreamIDevice.openOutputStream | IModule.setAudioPatchIModule.setAudioPortConfigIModule.resetAudioPatch | 
Конфигурации аудиопортов и потоки
| Методы интерфейса API HIDL | Методы интерфейса API AIDL | 
|---|---|
| IStream.getAudioPropertiesIStream.setAudioPropertiesIStreamIn.getAudioSource | IModule.getAudioPortConfigsIModule.setAudioPortConfig | 
| IDevice.openInputStreamIDevice.openOutputStreamIStreamIn.prepareForReadingIStreamOut.prepareForWritingIStream.createMmapBuffer | IModule.openInputStreamIModule.openOutputStream | 
| IStream.close | IStreamCommon.close | 
| IStreamIn.updateSinkMetadataIStreamOut.updateSourceMetadata | IStreamIn.updateMetadataIStreamOut.updateMetadata | 
| IStream.standby | StreamDescriptor.Command.standby | 
| IStream.pauseIStream.resume | StreamDescriptor.Command.pause.start | 
| IStream.startIStream.stop(Трансляции MMAP) | StreamDescriptor.Command.startили.burst.pause(вход) и/или.flush(выход) | 
| IStreamOut.drainIStreamOut.flush | StreamDescriptor.Command.drain.flush | 
| IStreamOut.setCallbackIStreamOut.clearCallback | IModule.openOutputStreamIStreamCommon.close | 
| IStreamOut.getPresentationPositionиIStreamIn.getCapturePositionIStreamOut.getLatencyIStream.getMmapPositionIStreamIn.getInputFramesLost | StreamDescriptor.Reply.observableStreamDescriptor.Reply.latencyMsStreamDescriptor.Reply.hardwareStreamDescriptor.Reply.xrunFrames | 
| IDevice.getInputBufferSizeIStreamOut.getLatencyIStream.getBufferSizeIStream.getFrameSizeIStream.getFrameCount | IModule.setAudioPatch, номинальная задержка и минимальный размер буфера являются частью структурыAudioPatch, возвращаемой HAL. Фактический размер буфера в кадрах, как и размер кадра в байтах, является частью структурыStreamDescriptor. Размер буфера в байтах можно рассчитать, умножив эти два числа. | 
Подключение аудиоэффектов
| Методы интерфейса API HIDL | Методы интерфейса API AIDL | 
|---|---|
| IDevice.addDeviceEffectIDevice.removeDeviceEffect | IModule.addDeviceEffectIModule.removeDeviceEffect | 
| IStream.addEffectIStream.removeEffect | IStreamCommon.addEffectIStreamCommon.removeEffect | 
Общесистемная конфигурация
 Общесистемная конфигурация, ранее определённая в XML-файлах конфигурации аудиополитики (а именно, audio_policy_configuration.xml и audio_policy_engine_configuration.xml ), должна быть предоставлена через IConfig . Однако для упрощения перехода на AIDL поставщики по-прежнему могут использовать те же XML-файлы, которые они использовали ранее для настройки общесистемной конфигурации. Эталонная реализация IConfig содержит код, необходимый для представления информации из XML-файла с использованием типов данных AIDL, что упрощает преобразование из XML в AIDL.
| Элементы файла конфигурации HIDL | Методы интерфейса API AIDL | 
|---|---|
| <globalConfiguration><speaker_drc_enabled><call_screen_mode_supported><engine_library> | Разделено на два разных метода: ITelephony.getSupportedAudioModesIConfig.getEngineConfig | 
| <volumes>, ИЛИ<volumeGroups>,<ProductStrategies> | IConfig.getEngineConfig | 
| <surroundSound> | IConfig.getSurroundSoundConfig | 
- speaker_drc_enabledудалён из файла конфигурации, поскольку он не используется в системе. На всех устройствах DRC должен быть включён.
Функциональность, связанная с функциями
| Методы интерфейса API HIDL | API-интерфейс AIDL | 
|---|---|
| IDevice.setMasterVolumeIDevice.getMasterVolumeIDevice.setMicMuteIDevice.getMicMuteIDevice.setMasterMuteIDevice.getMasterMute | IModule.\* | 
| IPrimaryDevice.getTtyModeIPrimaryDevice.setTtyModeIPrimaryDevice.getHacEnabledIPrimaryDevice.setHacEnabledIPrimaryDevice.setVoiceVolume | ITelephony.TelecomConfig.\* | 
| IPrimaryDevice.setBtScoHeadsetDebugNameIPrimaryDevice.getBtScoNrecEnabledIPrimaryDevice.setBtScoNrecEnabledIPrimaryDevice.getBtScoWidebandEnabledIPrimaryDevice.setBtScoWidebandEnabled,IPrimaryDevice.getBtHfpEnabledIPrimaryDevice.setBtHfpEnabledIPrimaryDevice.setBtHfpSampleRateIPrimaryDevice.setBtHfpVolume | IBluetooth.ScoConfig.\*IBluetooth.HfpConfig.\* | 
| IPrimaryDevice.setModeIPrimaryDevice.updateRotation | ITelephony.switchAudioModeIModule.updateAudioModeIModule.updateScreenRotation | 
| IDevice.setScreenStateIDevice.getMicrophones | IModule.updateScreenStateIModule.getMicrophones | 
| IDevice.getHwAvSyncIStream.setHwAvSync | IModule.generateHwAvSyncIdIStreamCommon.updateHwAvSyncId | 
| IStreamIn.setGainIStreamIn.setMicrophoneDirectionIStreamIn.setMicrophoneFieldDimension | IStreamIn.setHwGainIStreamIn.setMicrophoneDirectionIStreamIn.setMicrophoneFieldDimension | 
| IStreamOut.getDualMonoModeIStreamOut.setDualMonoModeIStreamOut.getPlaybackRateParametersIStreamOut.setPlaybackRateParametersIStreamOut.selectPresentationIStreamOut.getAudioDescriptionMixLevelIStreamOut.setAudioDescriptionMixLevelIStreamOut.setLatencyModeIStreamOut.getRecommendedLatencyModes | IStreamOut.\* | 
| IStreamOut.setEventCallbackIStreamOut.setLatencyModeCallback | IModule.openOutputStream(обратные вызовы объединены вIStreamOutEventCallback) | 
| IDevice.get/setParametersIStream.get/setParameters | IModule.get/setVendorParametersIStreamCommon.get/setVendorParameters | 
Устаревшие методы
| Методы интерфейса API HIDL | Комментарии | 
|---|---|
| IDevice.initCheckIDevice.close | Модуль HAL публикуется в ServiceManagerтолько после успешной инициализации. С этого момента он считается постоянным и не может быть закрыт. | 
| IDevice.supportsAudioPatchesIStreamOut.supportsPauseAndResumeIStreamOut.supportsDrain | Поддержка исправлений, паузы, возобновления и слива обязательна. | 
| IStreamOut.getRenderPositionIStreamOut.getNextWriteTimestamp | Устаревший. | 
Расширения поставщиков
 В API HIDL расширения вендоров реализуются с помощью методов getParameters или setParameters из интерфейсов IDevice и IStream . Эти методы принимают произвольные строки. В API AIDL существуют соответствующие методы, такие как getVendorParameters или setVendorParameters , которые принимают произвольные экземпляры Parcelable , используя инкапсуляцию в ParcelableHolders .
Другие изменения
Другие общие изменения таковы:
- Для улучшения тестируемости API HAL в версии AIDL мы добавили возможности отладки, используемые тестами VTS и доступные через пакет - ModuleDebug. Эти возможности предписывают HAL эмулировать определённую функциональность (например, подключение внешних устройств), которая в противном случае потребовала бы ручного вмешательства и использования внешнего тестового оборудования.
- Когда фреймворк или тест VTS устанавливает системное свойство - sys.audio.restart.halв- 1, службы HAL должны перезапуститься. Перезапуск выполняется в файле- audioserver.rc. При реализации HAL используйте соответствующее имя службы HAL, указанное в файле- audioserver.rc. В Android 14 имя- vendor.audio-hal-aidlдобавлено специально для версии HAL AIDL.
Эффекты HAL
 Все интерфейсы HIDL находятся в пакете android.hardware.audio.effect@NM* , где NM — версия Major.Minor . Все интерфейсы AIDL находятся в пакете android.hardware.audio.effect .
| Интерфейсы API HIDL и файлы конфигурации | Интерфейсы API AIDL | 
|---|---|
| IEffectsFactory | IFactory | 
| IEffect | IEffect | 
| audio_effects.xml | IEffect | 
Фабрика эффектов
| Интерфейсы API HIDL (android.hardware.audio.effect@XX) | Интерфейсы API AIDL (android.hardware.audio.effect) | 
|---|---|
| IEffectsFactory.getAllDescriptors | IFactory.queryEffectsс нулевым параметром UUID | 
| IEffectsFactory.getDescriptor | IFactory.queryEffectsс параметром UUID | 
| IEffectsFactory.createEffect | IFactory.createEffect | 
| audio_effects.xml | IFactory.queryProcessingIFactory.queryEffects | 
Интерфейсы эффектов
| Интерфейсы API HIDL (android.hardware.audio.effect@XX) | Интерфейсы API AIDL (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 | 
Команды эффектов
| Интерфейсы API HIDL (android.hardware.audio.effect@XX) | Интерфейсы API AIDL (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 | Устаревшее в Effects AIDL HAL | 
| EFFECT_CMD_SET_PARAM_COMMIT | Устаревшее в Effects AIDL HAL | 
| EFFECT_CMD_SET_CONFIGEFFECT_CMD_SET_PARAMEFFECT_CMD_SET_DEVICEEFFECT_CMD_SET_VOLUMEEFFECT_CMD_SET_AUDIO_MODEEFFECT_CMD_SET_CONFIG_REVERSEEFFECT_CMD_SET_INPUT_DEVICEEFFECT_CMD_SET_FEATURE_CONFIGEFFECT_CMD_SET_AUDIO_SOURCE | IEffect.setParameter | 
| EFFECT_CMD_GET_PARAMEFFECT_CMD_GET_CONFIGEFFECT_CMD_GET_CONFIG_REVERSEEFFECT_CMD_GET_FEATURE_SUPPORTED_CONFIGSEFFECT_CMD_GET_FEATURE_CONFIGVISUALIZER_CMD_MEASUREEFFECT_CMD_FIRST_PROPRIETARY(то же самое, что и VISUALIZER_CMD_CAPTURE) | IEffect.getParameter | 
| EFFECT_CMD_OFFLOAD | Устарело. В AIDL переключение режимов разгрузки и без разгрузки осуществляется в фреймворке. | 
| EFFECT_CMD_DUMP | Обрабатывается встроенной транзакцией-связкой AIBinder_dump. | 
Определение параметров общего эффекта
| Определение HIDL (android.hardware.audio.effect@XX) | Определение AIDL | 
|---|---|
| Types.hal | Flags.aidlParameter.aidl | 
Определение специфических эффектов
| Интерфейсы API HIDL (android.hardware.audio.effect@XX) | Интерфейсы API AIDL (android.hardware.audio.effect) | 
|---|---|
| I $EffectType$ .hal | $EffectType$ .aidl | 
