Начиная с Android 14, партнерам и производителям SoC рекомендуется заменить текущую реализацию HIDL HAL на реализацию AIDL HAL.
Для обеспечения плавного перехода от HIDL Audio HAL к AIDL Audio HAL на этой странице выделены некоторые ключевые различия. На этой странице также показано соответствие между интерфейсами AIDL и HIDL для Audio 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.Во избежание путаницы с использованием термина «устройство» для обозначения типов аудиоустройств, в HIDL Audio HAL
IDeviceпереименован вIModuleв AIDL Audio HAL.Интерфейс AIDL Audio HAL заменяет
IPrimaryDevice. Этот фреймворк отправляет обновления о текущем режиме звука и повороте экрана каждому экземпляруIModule. Специальный интерфейсIBluetoothобрабатывает параметры, связанные с синхронным соединением Bluetooth (BT SCO) и профилем громкой связи (HFP). Специальный интерфейсITelephonyпредоставляет элементы управления, специфичные для телефонии. Вы можете получить экземпляры обоих этих интерфейсов из основного экземпляра интерфейсаIModule. Дополнительную информацию см. в сравнительных таблицах по Core HAL и функциональности, связанной с функциями .В AIDL Audio HAL удалена
IDevicesFactoryво избежание избыточности. Модули HAL (то есть экземпляры интерфейсаIModule) теперь регистрируются непосредственно в Service Manager с использованием имен экземпляров модулей, таких какbluetoothилиr_submix. Единственное исключение —primaryмодуль, который регистрируется под именем экземпляраdefault.
Сопоставление AIDL и HIDL Audio HAL
В таблицах в следующих разделах показано соответствие между интерфейсами HIDL и AIDL Audio HAL. Дополнительную информацию о структуре каталогов см. в разделе Audio HAL .
Core 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-файлов обозначаются угловыми скобками.
| Методы интерфейса HIDL API и элементы конфигурационных файлов | Методы интерфейса AIDL API |
|---|---|
<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 |
Конфигурации аудиопортов и потоки
| Методы интерфейса HIDL API | Методы интерфейса AIDL API |
|---|---|
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 вместе с размером кадра в байтах. Размер буфера в байтах можно рассчитать, умножив эти два числа. |
Подключение звуковых эффектов
| Методы интерфейса HIDL API | Методы интерфейса AIDL API |
|---|---|
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 | Методы интерфейса AIDL API |
|---|---|
<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.
Функционал, связанный с функциями
| Методы интерфейса HIDL API | Интерфейс 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 |
Устаревшие методы
| Методы интерфейса HIDL API | Комментарии |
|---|---|
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 | Устарело в разделе «Влияние» AIDL HAL |
EFFECT_CMD_SET_PARAM_COMMIT | Устарело в разделе «Влияние» 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 |