AIDL और HIDL Audio HAL की तुलना

Android 14 से, पार्टनर और एसओसी वेंडर को मौजूदा एचआईडीएल एचएएल को एआईडीएल एचएएल से बदलने का सुझाव दिया जाता है.

एचआईडीएल ऑडियो एचएएल से एआईडीएल ऑडियो एचएएल पर आसानी से स्विच करने के लिए, इस पेज पर कुछ मुख्य अंतरों के बारे में बताया गया है. इस पेज पर, ऑडियो एचएएल के लिए एआईडीएल और एचआईडीएल इंटरफ़ेस के बीच मैपिंग भी दिखाई गई है.

AIDL और HIDL ऑडियो HAL को लागू करने के बीच अंतर

HIDL और AIDL के स्ट्रक्चर के बीच मुख्य अंतर यहां दिए गए हैं:

  • एआईडीएल ऑडियो कोर एचएएल में, IConfig इंटरफ़ेस को एचआईडीएल एचएएल में एक्सएमएल फ़ाइलों में मौजूद सिस्टम-वाइड पैरामीटर के विकल्प के तौर पर पेश किया गया है. फ़्रेमवर्क, इन पैरामीटर को वेंडर कॉन्फ़िगरेशन फ़ाइल के बजाय Core HAL से पढ़ता है. उदाहरण के लिए, उपयोगकर्ता कंट्रोल के लिए उपलब्ध कराए गए सराउंड फ़ॉर्मैट की सूची, Core HAL में IConfig.getSurroundSoundConfig तरीके से दी जाती है.

    एआईडीएल ऑडियो इफ़ेक्ट एचएएल में, एचआईडीएल इफ़ेक्ट एचएएल की एक्सएमएल फ़ाइलों में तय किए गए effectProxy लॉजिक को ऑडियो फ़्रेमवर्क में ले जाया जाता है. ऑडियो फ़्रेमवर्क, सिस्टम में मौजूद सभी इफ़ेक्ट इंस्टेंस के लिए IFactory.queryEffects का इस्तेमाल करके क्वेरी करता है. साथ ही, सभी इफ़ेक्ट प्रोसेसिंग के लिए IFactory.queryProcessing का इस्तेमाल करके क्वेरी करता है.

  • ऑडियो डिवाइस टाइप के लिए डिवाइस शब्द के इस्तेमाल से होने वाले भ्रम से बचने के लिए, HIDL ऑडियो एचएएल में IDevice का नाम बदलकर AIDL ऑडियो एचएएल में IModule कर दिया गया है.

  • IPrimaryDevice को एआईडीएल ऑडियो एचएएल में बदल दिया गया है. मौजूदा ऑडियो मोड और स्क्रीन रोटेशन के बारे में अपडेट, हर IModule इंस्टेंस को भेजे जाते हैं. ब्लूटूथ सिंक्रोनस कनेक्शन ओरिएंटेड (बीटी एससीओ) और हैंड्स-फ़्री प्रोफ़ाइल (एचएफ़पी) से जुड़े पैरामीटर, IBluetooth इंटरफ़ेस की मदद से मैनेज किए जाते हैं. ITelephony का खास इंटरफ़ेस, टेलीफ़ोनी से जुड़े कंट्रोल उपलब्ध कराता है. इन दोनों इंटरफ़ेस के इंस्टेंस, IModule इंटरफ़ेस के प्राइमरी इंस्टेंस से वापस पाए जा सकते हैं. ज़्यादा जानकारी के लिए, कोर HAL और सुविधा से जुड़ी फ़ंक्शनैलिटी पर तुलना के लिए दी गई टेबल देखें.

  • रिडंडेंसी से बचने के लिए, IDevicesFactory को AIDL ऑडियो HAL में हटा दिया गया है. HAL मॉड्यूल (यानी कि IModule इंटरफ़ेस इंस्टेंस) अब सीधे तौर पर सर्विस मैनेजर के साथ रजिस्टर किए जाते हैं. इसके लिए, इंस्टेंस के नाम का इस्तेमाल किया जाता है. जैसे, bluetooth या r_submix. हालांकि, primary मॉड्यूल को default इंस्टेंस के नाम से रजिस्टर किया जाता है.

एआईडीएल और एचआईडीएल ऑडियो एचएएल मैपिंग

यहां दिए गए सेक्शन में मौजूद टेबल में, HIDL और AIDL ऑडियो HAL इंटरफ़ेस के बीच मैपिंग दिखाई गई है. डायरेक्ट्री स्ट्रक्चर के बारे में ज़्यादा जानकारी के लिए, ऑडियो एचएएल की README फ़ाइल देखें.

कोर HAL

सभी एचआईडीएल इंटरफ़ेस, android.hardware.audio@N.M पैकेज में होते हैं. यहां N.M, Major.Minor वर्शन को दिखाता है. सभी AIDL इंटरफ़ेस, android.hardware.audio.core पैकेज में मौजूद हैं.

HIDL API इंटरफ़ेस और कॉन्फ़िगरेशन फ़ाइलें AIDL API इंटरफ़ेस
IDevicesFactory ServiceManager की मदद से, IModule का रजिस्ट्रेशन.
IDevice IModule
IPrimaryDevice ITelephony
IBluetooth
IStream
IStreamIn
IStreamOut
StreamDescriptor
IStreamIn
IStreamCommon
IStreamOut
audio_policy_configuration.xml
audio_policy_engine_configuration.xml
IConfig
IModule
ऑडियो से जुड़ी नीति की कॉन्फ़िगर की जा सकने वाली फ़ाइलें Android 14 के लिए, एचआईडीएल लागू करने की सुविधा का इस्तेमाल करें.

ऑडियो पोर्ट, डाइनैमिक प्रोफ़ाइलें, रूट, और पैच

इस टेबल में, एक्सएमएल फ़ाइलों के एलिमेंट को ऐंगल ब्रैकेट का इस्तेमाल करके दिखाया गया है.

HIDL API इंटरफ़ेस के तरीके और कॉन्फ़िगरेशन फ़ाइलों के एलिमेंट AIDL एपीआई इंटरफ़ेस के तरीके
<attachedDevices>
<defaultOutputDevice>
<mixPorts>
<devicePorts>
IModule.getAudioPorts
IDevice.getAudioPort
IDevice.setConnectedState
IModule.getAudioPort
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 एपीआई इंटरफ़ेस के तरीके
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
IStream.start
IStream.stop
StreamDescriptor.Command.pause
.start
.start
.drain
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, सामान्य इंतज़ार का समय, और कम से कम बफ़र साइज़, HAL से मिले AudioPatch स्ट्रक्चर का हिस्सा हैं. फ़्रेम में बफ़र का असल साइज़, StreamDescriptor स्ट्रक्चर का हिस्सा होता है. इसमें बाइट में फ़्रेम का साइज़ भी शामिल होता है. बफ़र का साइज़ बाइट में होता है. इसे इन दोनों संख्याओं को गुणा करके कैलकुलेट किया जा सकता है.

ऑडियो इफ़ेक्ट कनेक्शन

HIDL API इंटरफ़ेस के तरीके AIDL एपीआई इंटरफ़ेस के तरीके
IDevice.addDeviceEffect
IDevice.removeDeviceEffect
IModule.addDeviceEffect
IModule.removeDeviceEffect
IStream.addEffect
IStream.removeEffect
IStreamCommon.addEffect
IStreamCommon.removeEffect

पूरे सिस्टम के लिए कॉन्फ़िगरेशन

सिस्टम-वाइड कॉन्फ़िगरेशन, जिसे पहले ऑडियो नीति की एक्सएमएल कॉन्फ़िगरेशन फ़ाइलों (जैसे कि audio_policy_configuration.xml और audio_policy_engine_configuration.xml) में तय किया गया था उसे IConfig के ज़रिए उपलब्ध कराना होगा. हालांकि, AIDL पर स्विच करने की प्रोसेस को आसान बनाने के लिए, वेंडर के पास अब भी उन एक्सएमएल फ़ाइलों का इस्तेमाल करने का विकल्प है जिनका इस्तेमाल वे पहले सिस्टम-वाइड कॉन्फ़िगरेशन सेट करने के लिए करते थे. IConfig के लिए रेफ़रंस इंप्लीमेंटेशन में, AIDL डेटा टाइप का इस्तेमाल करके एक्सएमएल फ़ाइल से जानकारी दिखाने के लिए ज़रूरी कोड शामिल होता है. इससे एक्सएमएल को AIDL में बदलने में आसानी होती है.

HIDL कॉन्फ़िगरेशन फ़ाइल के एलिमेंट AIDL एपीआई इंटरफ़ेस के तरीके
<globalConfiguration>
<speaker_drc_enabled>1

<call_screen_mode_supported>
<engine_library>
इन्हें दो अलग-अलग तरीकों में बांटा गया है:
ITelephony.getSupportedAudioModes
IConfig.getEngineConfig
<volumes> या
<volumeGroups>, <ProductStrategies>
IConfig.getEngineConfig
<surroundSound> IConfig.getSurroundSoundConfig

  1. speaker_drc_enabled को कॉन्फ़िगरेशन फ़ाइल से हटा दिया गया है, क्योंकि इस कॉन्फ़िगरेशन आइटम का इस्तेमाल सिस्टम में नहीं किया जाता. सभी डिवाइसों पर डीआसी की सुविधा चालू होनी चाहिए. <ahref="#fnref1" rev="footnote"> </ahref="#fnref1">

सुविधा से जुड़ी फ़ंक्शनैलिटी

HIDL 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.setGain
IStreamIn.setMicrophoneDirection
IStreamIn.setMicrophoneFieldDimension
IStreamIn.setHwGain
IStreamIn.setMicrophoneDirection
IStreamIn.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.initCheck
IDevice.close
HAL मॉड्यूल, ServiceManager के साथ खुद को सिर्फ़ तब पब्लिश करता है, जब वह सही तरीके से शुरू हो जाता है. इसके बाद, इसे हमेशा के लिए बंद कर दिया जाता है और इसे वापस नहीं खोला जा सकता.
IDevice.supportsAudioPatches
IStreamOut.supportsPauseAndResume
IStreamOut.supportsDrain
पैच, रोकने, फिर से शुरू करने, और ड्रेन करने की सुविधा ज़रूरी है.
IStreamOut.getRenderPosition
IStreamOut.getNextWriteTimestamp
पुराना हो गया है.

वेंडर एक्सटेंशन

एचआईडीएल एपीआई में, वेंडर एक्सटेंशन को IDevice और IStream इंटरफ़ेस के getParameters या setParameters तरीकों का इस्तेमाल करके लागू किया जाता है. ये तरीके, आर्बिट्रेरी स्ट्रिंग स्वीकार करते हैं. AIDL API में, इससे जुड़े तरीके मौजूद हैं. जैसे, getVendorParameters या setVendorParameters. ये ParcelableHolders में इनकैप्सुलेशन का इस्तेमाल करके, मनमाने Parcelable इंस्टेंस लेते हैं.

अन्य बदलाव

अन्य सामान्य बदलाव यहां दिए गए हैं:

  1. एचएएल एपीआई की जांच करने की सुविधा को बेहतर बनाने के लिए, AIDL वर्शन में हम डीबग करने के विकल्प उपलब्ध कराते हैं. इनका इस्तेमाल VTS टेस्ट करते हैं. ये ModuleDebug पार्सल करने लायक ऑब्जेक्ट के ज़रिए उपलब्ध होते हैं. इन विकल्पों से एचएएल को कुछ सुविधाओं (जैसे, बाहरी डिवाइसों को कनेक्ट करना) को एमुलेट करने का निर्देश मिलता है. इसके लिए, मैन्युअल तरीके से कार्रवाई करने और बाहरी टेस्टिंग उपकरण का इस्तेमाल करने की ज़रूरत होती है.

  2. जब सिस्टम प्रॉपर्टी sys.audio.restart.hal की वैल्यू को 1 पर सेट किया जाता है, तब HAL सेवाओं को रीस्टार्ट करना ज़रूरी होता है. रीस्टार्ट audioserver.rc के ज़रिए किया जाता है. HAL लागू करते समय, audioserver.rc फ़ाइल में दिए गए HAL सेवा के सही नाम का इस्तेमाल करें. Android 14 में, vendor.audio-hal-aidl नाम को खास तौर पर एचएएल के एआईडीएल वर्शन के लिए जोड़ा गया है.

इफ़ेक्ट एचएएल

सभी एचआईडीएल इंटरफ़ेस, android.hardware.audio.effect@N.M* पैकेज में होते हैं. यहां N.M, Major.Minor वर्शन है. सभी एआईडीएल इंटरफ़ेस, android.hardware.audio.effect पैकेज में होते हैं.

HIDL API इंटरफ़ेस और कॉन्फ़िगरेशन फ़ाइलें AIDL API इंटरफ़ेस
IEffectsFactory IFactory
IEffect IEffect
audio_effects.xml IEffect

इफ़ेक्ट फ़ैक्ट्री

HIDL API इंटरफ़ेस
(android.hardware.audio.effect@X.X)
AIDL API इंटरफ़ेस
(android.hardware.audio.effect)
IEffectsFactory.getAllDescriptors IFactory.queryEffects जिसमें UUID पैरामीटर की वैल्यू शून्य हो
IEffectsFactory.getDescriptor IFactory.queryEffects with UUID parameter
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 पर मैप करें
लागू नहीं 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 इफ़ेक्ट एआईडीएल एचएएल में बंद कर दिया गया है
EFFECT_CMD_SET_PARAM_COMMIT इफ़ेक्ट एआईडीएल एचएएल में बंद कर दिया गया है
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 मैनेज करता है.

सामान्य इफ़ेक्ट पैरामीटर की परिभाषा

एचआईडीएल डेफ़िनिशन
(android.hardware.audio.effect@X.X)
एआईडीएल की परिभाषा
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