ऑडियो प्रभाव

Android 11 से, डिवाइस बनाने वाली कंपनियों के पास यह सुविधा है कि वे ऑडियो कैप्चर या चलाने के लिए किसी ऑडियो डिवाइस को चुनने पर, कुछ ऑडियो इफ़ेक्ट अपने-आप अटैच और चालू कर सकें. एक बड़ा सुधार यह है कि ऑडियो पाथ पर डाले गए ऑडियो इफ़ेक्ट, ऑडियो इफ़ेक्ट फ़्रेमवर्क से कंट्रोल किए जा सकते हैं. ऑडियो पाथ, ऑडियो एचएएल (इनपुट डिवाइस और आउटपुट डिवाइस के बीच सीधा कनेक्शन) के नीचे पूरी तरह से लागू किया जाता है.

इस सुविधा को मुख्य रूप से ऑटोमोटिव ओईएम के लिए बनाया गया है. हालांकि, इसका इस्तेमाल Android के अन्य डिवाइसों में भी किया जा सकता है. उदाहरण के लिए, एक ऐप्लिकेशन, ऑडियो डीएसपी के ज़रिए सीधे तौर पर स्पीकर से कनेक्ट होने पर, FM ट्यूनर के आउटपुट पर आवाज़ को बेहतर बनाने वाला इफ़ेक्ट डाल रहा है.

ज़रूरी शर्तें

  • किसी भी अन्य ऑडियो इफ़ेक्ट की तरह, इस इफ़ेक्ट को भी वेंडर लाइब्रेरी से लागू किया जाना चाहिए. साथ ही, इसे audio_effects.xml कॉन्फ़िगरेशन फ़ाइल में शामिल किया जाना चाहिए.
  • इफ़ेक्ट, प्रीप्रोसेसिंग या पोस्टप्रोसेसिंग टाइप का होना चाहिए. जैसे, TYPE_PRE_PROC या TYPE_POST_PROC फ़्लैग, EffectDescriptor.flags में सेट किया गया हो.
  • अगर इफ़ेक्ट को लागू करने के लिए, हार्डवेयर की मदद से तेज़ी लाई जाती है (EffectDescriptor.flags में HW_ACC_TUNNEL फ़्लैग सेट किया गया है), तो इसे ऐसे ऑडियो पाथ से जोड़ा जा सकता है जो पूरी तरह से एचएएल से कनेक्ट हो. इसमें ऑडियो एचएएल पर कोई प्लेबैक या कैप्चर ऑडियो स्ट्रीम नहीं खुलती.

डिवाइस इफ़ेक्ट बनाना और उसे चालू करना

डिवाइस के हिसाब से ऑडियो इफ़ेक्ट को इंस्टैंशिएट करने के लिए, यहां दिए गए दो तरीकों में से किसी एक का इस्तेमाल किया जा सकता है.

ऑडियो इफ़ेक्ट कॉन्फ़िगरेशन फ़ाइल का इस्तेमाल करना

इस तरीके से, ऑडियो इफ़ेक्ट को स्टैटिक तौर पर बनाया जा सकता है. इसे किसी भी ऑडियो पाथ से सिस्टमैटिक तरीके से अटैच किया जाता है और चालू किया जाता है. इसके लिए, किसी डिवाइस को सिंक या सोर्स के तौर पर चुना जाता है.

इसके लिए, audio_effects.xml फ़ाइल में यह सेक्शन जोड़ें:

<deviceEffects>
<devicePort type="AUDIO_DEVICE_IN_BUILTIN_MIC" address="bottom">
      	<apply effect="agc"/>
      </devicePort>
  </deviceEffects>
  

सिस्टम एपीआई का इस्तेमाल करना

डिवाइस इफ़ेक्ट बनाने और उसे चालू करने के लिए, android.media.audiofx.AudioEffect क्लास में एक नया @SystemApi कंस्ट्रक्टर जोड़ा गया है:

AudioEffect(@NonNull UUID uuid, @NonNull AudioDeviceAttributes device);

यूनीक ऑडियो इफ़ेक्ट आईडी और ऑडियो डिवाइस डिस्क्रिप्टर तय करके, इफ़ेक्ट बनाया जा सकता है. इसके बाद, इसे मौजूदा AudioEffect API की मदद से चालू या बंद किया जा सकता है.

यह क्वेरी करने के लिए भी एक एपीआई उपलब्ध है कि कोई सुविधा, किसी डिवाइस/इफ़ेक्ट के कॉम्बिनेशन के साथ काम करती है या नहीं.

static boolean isEffectSupportedForDevice(
            @NonNull UUID uuid, @NonNull AudioDeviceAttributes device);

नए HAL API

ऑडियो इफ़ेक्ट एचएएल

ऑडियो इफ़ेक्ट HAL V6.0 में, createEffect() तरीके के लिए नया सिग्नेचर है. इससे किसी डिवाइस से जुड़ा इफ़ेक्ट बनाया जा सकता है:

IEffectFactory::createEffect(Uuid uid, AudioSession session,
AudioIoHandle ioHandle, AudioPortHandle device)
  • AudioSession के लिए दी गई वैल्यू AudioSessionConsts.DEVICE होनी चाहिए.
  • अगर session AudioSessionConsts.DEVICE है, तो AudioIoHandle को अनदेखा कर दिया जाता है.
  • device की पहचान, ऑडियो फ़्रेमवर्क से असाइन किए गए यूनीक AudioPortHandle से की जाती है. यह तब असाइन किया जाता है, जब डिवाइस को IDevice::createAudioPatch() तरीके से ऑडियो एचएएल पर चुना जाता है.

ऑडियो एचएएल

डिवाइस इफ़ेक्ट की सुविधा के लिए, ऑडियो एचएएल को IDevice::createAudioPatch() एपीआई का इस्तेमाल करके, ऑडियो राउटिंग कंट्रोल को लागू करना होगा. इसकी जानकारी, IDevice::supportsAudioPatches() तरीके से रिपोर्टिंग करने वाले true से मिलती है.

दो नए एपीआई तरीके, IDevice::addDeviceEffect(AudioPortHandle device, uint64_t effectId) और IDevice::removeDeviceEffect(AudioPortHandle device, uint64_t effectId) HAL को यह बताते हैं कि किसी डिवाइस पर डिवाइस इफ़ेक्ट चालू या बंद कर दिया गया है.

डिवाइस की पहचान उसके AudioPortHandle आईडी से की जाती है. इस आईडी का इस्तेमाल तब किया जाता है, जब IDevice::createAudioPatch() तरीके से ऑडियो पैच बनाया जाता है.

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