ऑडियो इनपुट शेयर किया जा रहा है

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

कभी-कभी दो या उससे ज़्यादा ऐप्लिकेशन, एक ही ऑडियो इनपुट को "कैप्चर" करना चाहते हैं. हो सकता है कि वे अलग-अलग काम कर रहे हों. उदाहरण के लिए, ऑडियो पाने वाले कुछ ऐप्लिकेशन "रिकॉर्ड कर सकते हैं", जैसे कि एक साधारण वॉइस रिकॉर्डर. वहीं, अन्य ऐप्लिकेशन "सुन सकते हैं", जैसे कि Google Assistant या बोले गए निर्देशों का जवाब देने वाली सुलभता सेवा.

दोनों ही मामलों में, ये ऐप्लिकेशन ऑडियो इनपुट पाना चाहते हैं. इस पूरे पेज पर, हम "कैप्चर" शब्द का इस्तेमाल करते हैं. भले ही, कोई ऐप्लिकेशन रिकॉर्ड कर रहा हो या सिर्फ़ सुन रहा हो.

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

Android 10 से पहले के वर्शन में ऐप्लिकेशन का व्यवहार

Android 10 से पहले, इनपुट ऑडियो स्ट्रीम को एक बार में सिर्फ़ एक ऐप्लिकेशन कैप्चर कर सकता था. अगर कोई ऐप्लिकेशन पहले से ही ऑडियो रिकॉर्ड कर रहा या सुन रहा है, तो आपका ऐप्लिकेशन एक AudioRecord ऑब्जेक्ट बना सकता है. हालांकि, AudioRecord.startRecording() को कॉल करने पर गड़बड़ी का मैसेज मिलेगा. ऐसा करने से रिकॉर्डिंग शुरू नहीं होगी.

इस नियम का एक अपवाद यह था कि जब किसी ऐप्लिकेशन (जैसे, Google Assistant या ऐक्सेसबिलिटी सेवा) के पास अनुमति android.permission.CAPTURE_AUDIO_HOTWORD होती थी और वह HOTWORD टाइप के ऑडियो सोर्स का इस्तेमाल करता था. इस मामले में, कोई दूसरा ऐप्लिकेशन रिकॉर्डिंग शुरू कर सकता है. जब ऐसा हुआ, तो खास ऐप्लिकेशन को बंद कर दिया गया और नए ऐप्लिकेशन ने इनपुट कैप्चर कर लिया.

Android 9 में एक और बदलाव किया गया था: सिर्फ़ फ़ोरग्राउंड में चल रहे ऐप्लिकेशन (या फ़ोरग्राउंड सेवा) ही ऑडियो इनपुट कैप्चर कर सकते हैं. जब किसी ऐसे ऐप्लिकेशन ने रिकॉर्डिंग शुरू की जो फ़ोरग्राउंड सेवा या फ़ोरग्राउंड यूज़र इंटरफ़ेस (यूआई) कॉम्पोनेंट के बिना काम करता है, तो ऐप्लिकेशन चलता रहा. हालांकि, उसे कोई आवाज़ नहीं मिली. भले ही, उस समय वह ऐप्लिकेशन ही ऑडियो रिकॉर्ड कर रहा हो.

Android 10 का व्यवहार

Android 10 से पहले, "पहले आओ, पहले पाओ" के आधार पर डिवाइसों को ऐक्सेस किया जाता था. जब कोई ऐप्लिकेशन ऑडियो कैप्चर करना शुरू करता है, तो ऑडियो इनपुट को कोई दूसरा ऐप्लिकेशन तब तक ऐक्सेस नहीं कर सकता, जब तक ऑडियो कैप्चर करने वाला ऐप्लिकेशन बंद नहीं हो जाता.

Android 10 में प्राथमिकता तय करने की एक स्कीम लागू की गई है. इसकी मदद से, ऐप्लिकेशन के चलने के दौरान इनपुट ऑडियो स्ट्रीम को एक ऐप्लिकेशन से दूसरे ऐप्लिकेशन पर स्विच किया जा सकता है. ज़्यादातर मामलों में, अगर किसी नए ऐप्लिकेशन को ऑडियो इनपुट मिलता है, तो पहले कैप्चर किया गया ऐप्लिकेशन चलता रहता है, लेकिन कोई आवाज़ नहीं आती है. कुछ मामलों में, सिस्टम दोनों ऐप्लिकेशन में ऑडियो चलाना जारी रख सकता है. शेयर करने की अलग-अलग स्थितियों के बारे में यहां बताया गया है.

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

ऑडियो कैप्चर करने के लिए, Android दो तरह के ऐप्लिकेशन में अंतर करता है:

  • "सामान्य" ऐप्लिकेशन, उपयोगकर्ता इंस्टॉल करता है.
  • डिवाइस पर "खास अधिकार वाले" ऐप्लिकेशन पहले से इंस्टॉल होते हैं. इनमें Google Assistant और सुलभता से जुड़ी सभी सेवाएं शामिल हैं.

इसके अलावा, अगर कोई ऐप्लिकेशन "निजता से जुड़ी संवेदनशील जानकारी" वाले ऑडियो सोर्स का इस्तेमाल करता है, तो उस ऐप्लिकेशन के साथ अलग व्यवहार किया जाता है: CAMCORDER या VOICE_COMMUNICATION.

ऑडियो इनपुट का इस्तेमाल करने और उसे शेयर करने के लिए, प्राथमिकता तय करने के नियम यहां दिए गए हैं:

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

शेयर करने की स्थितियां

जब दो ऐप्लिकेशन ऑडियो रिकॉर्ड करने की कोशिश कर रहे हों, तो हो सकता है कि दोनों को इनपुट सिग्नल मिल जाए या किसी एक को कोई सिग्नल न मिले.

चार मुख्य स्थितियां होती हैं:

  • Assistant + सामान्य ऐप्लिकेशन
  • सुलभता सेवा + सामान्य ऐप्लिकेशन
  • दो सामान्य ऐप्लिकेशन
  • वॉइस कॉल + सामान्य ऐप्लिकेशन

Assistant + सामान्य ऐप्लिकेशन

Assistant को खास सुविधाओं वाला ऐप्लिकेशन माना जाता है, क्योंकि यह पहले से इंस्टॉल होता है और इसमें भूमिका RoleManager.ROLE_ASSISTANT होती है. इस भूमिका वाले किसी भी अन्य पहले से इंस्टॉल किए गए ऐप्लिकेशन के साथ भी इसी तरह से व्यवहार किया जाता है.

Android, इन नियमों के मुताबिक इनपुट ऑडियो शेयर करता है:

  • Assistant को ऑडियो तब तक मिल सकता है, जब तक कोई दूसरा ऐप्लिकेशन निजता से जुड़े ऑडियो सोर्स का इस्तेमाल करके, ऑडियो रिकॉर्ड नहीं कर रहा हो. भले ही, वह ऐप्लिकेशन फ़ोरग्राउंड में हो या बैकग्राउंड में.

  • जब तक Assistant की स्क्रीन पर सबसे ऊपर यूज़र इंटरफ़ेस (यूआई) कॉम्पोनेंट नहीं दिखता, तब तक ऐप्लिकेशन को ऑडियो मिलता रहता है.

ध्यान दें कि दोनों ऐप्लिकेशन को ऑडियो सिर्फ़ तब मिलता है, जब Assistant बैकग्राउंड में हो और दूसरा ऐप्लिकेशन, निजता से जुड़े संवेदनशील ऑडियो सोर्स से ऑडियो कैप्चर न कर रहा हो.

सुलभता सेवा + साधारण ऐप्लिकेशन

AccessibilityService के लिए, एलान करना ज़रूरी है.

Android इन नियमों के मुताबिक इनपुट ऑडियो शेयर करता है:

  • अगर सेवा का यूआई सबसे ऊपर है, तो सेवा और ऐप्लिकेशन, दोनों को ऑडियो इनपुट मिलेगा. इस तरीके से, वॉइस कॉल या वीडियो कैप्चर करने के कंट्रोल को वॉइस कमांड से कंट्रोल करने जैसी सुविधाएं मिलती हैं.

  • अगर सेवा सबसे ऊपर नहीं है, तो इस मामले को दो ऐप्लिकेशन वाले सामान्य मामले की तरह माना जाता है.

दो सामान्य ऐप्लिकेशन

जब दो ऐप्लिकेशन एक साथ कैप्चर कर रहे होते हैं, तो सिर्फ़ एक ऐप्लिकेशन को ऑडियो मिलता है और दूसरे को साइलेंट ऑडियो मिलता है.

Android, इन नियमों के मुताबिक इनपुट ऑडियो शेयर करता है:

  • अगर कोई भी ऐप्लिकेशन निजता के लिहाज़ से संवेदनशील नहीं है, तो सबसे ऊपर यूज़र इंटरफ़ेस (यूआई) वाले ऐप्लिकेशन को ऑडियो मिलता है. अगर किसी भी ऐप्लिकेशन में यूज़र इंटरफ़ेस (यूआई) नहीं है, तो ऑडियो उस ऐप्लिकेशन को मिलेगा जिसने सबसे हाल ही में ऑडियो रिकॉर्ड करना शुरू किया है.
  • अगर इनमें से कोई ऐप्लिकेशन निजता के हिसाब से संवेदनशील है, तो उसे ऑडियो सुनाई देगा और दूसरे ऐप्लिकेशन में आवाज़ नहीं आएगी. भले ही, उसमें सबसे ऊपर यूज़र इंटरफ़ेस (यूआई) हो या हाल ही में फ़ोटो कैप्चर करना शुरू किया गया हो.
  • अगर दोनों ऐप्लिकेशन निजता के लिहाज़ से संवेदनशील हैं, तो हाल ही में रिकॉर्डिंग शुरू करने वाले ऐप्लिकेशन को ऑडियो मिलता है और दूसरे ऐप्लिकेशन को कोई आवाज़ नहीं मिलती.

वॉइस कॉल + सामान्य ऐप्लिकेशन

अगर AudioManager.getMode() से मिला ऑडियो मोड, MODE_IN_CALL या MODE_IN_COMMUNICATION है, तो इसका मतलब है कि वॉइस कॉल चालू है.

Android, इन नियमों के मुताबिक इनपुट ऑडियो शेयर करता है:

  • कॉल में हमेशा ऑडियो सुनाई देता है.
  • अगर ऐप्लिकेशन सुलभता सेवा है, तो वह ऑडियो रिकॉर्ड कर सकता है.
  • अगर ऐप्लिकेशन, पहले से इंस्टॉल किया गया ऐप्लिकेशन है और उसके पास अनुमति CAPTURE_AUDIO_OUTPUT है, तो वह वॉइस कॉल रिकॉर्ड कर सकता है.

    वॉइस कॉल के अपलिंक (TX), डाउनलिंक (RX) या दोनों को कैप्चर करने के लिए, ऐप्लिकेशन को ऑडियो सोर्स MediaRecorder.AudioSource.VOICE_UPLINK या MediaRecorder.AudioSource.VOICE_DOWNLINK और/या डिवाइस AudioDeviceInfo.TYPE_TELEPHONY की जानकारी देनी होगी.

Android 11 के साथ काम करने का तरीका

Android 11 (एपीआई लेवल 30), ऊपर बताई गई Android 10 की प्राथमिकता वाली स्कीम का पालन करता है. यह AudioRecord, MediaRecorder, और AAudioStream में नए तरीके भी उपलब्ध कराता है. इनकी मदद से, एक साथ ऑडियो कैप्चर करने की सुविधा को चालू और बंद किया जा सकता है. इससे कोई फ़र्क़ नहीं पड़ता कि इस्तेमाल के लिए कौनसा उदाहरण चुना गया है.

नए तरीके ये हैं:

जब setPrivacySensitive() true होता है, तो कैप्चर के इस्तेमाल का उदाहरण निजी होता है. साथ ही, Assistant के पास विशेष सुविधाएं होने पर भी, वह एक साथ कैप्चर नहीं कर सकती. यह सेटिंग, ऑडियो सोर्स पर निर्भर डिफ़ॉल्ट व्यवहार को बदल देती है. उदाहरण के लिए, VOICE_COMMUNICATION डिफ़ॉल्ट रूप से निजी होता है, लेकिन UNPROCESSED नहीं.

कॉन्फ़िगरेशन में बदलाव

जब एक साथ कई ऐप्लिकेशन ऑडियो रिकॉर्ड कर रहे होते हैं, तो उनमें से सिर्फ़ एक या दो ऐप्लिकेशन "चालू" (ऑडियो रिकॉर्ड कर रहे) होते हैं. बाकी ऐप्लिकेशन म्यूट (कोई ऑडियो रिकॉर्ड नहीं कर रहे) होते हैं. जब चालू ऐप्लिकेशन में बदलाव होता है, तब ऑडियो फ़्रेमवर्क इन नियमों के मुताबिक ऑडियो पाथ को फिर से कॉन्फ़िगर कर सकता है:

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

ज़्यादा प्राथमिकता वाले ऐप्लिकेशन के चालू होने पर, हो सकता है कि किसी ऐप्लिकेशन की आवाज़ बंद हो जाए. इसलिए, कॉन्फ़िगरेशन में बदलाव होने पर सूचना पाने के लिए, AudioRecord या MediaRecorder ऑब्जेक्ट पर AudioManager.AudioRecordingCallback को रजिस्टर किया जा सकता है. ये बदलाव हो सकते हैं:

  • आवाज़ को म्यूट या अनम्यूट करके रिकॉर्ड करना
  • डिवाइस बदला गया
  • प्री-प्रोसेसिंग बदली गई
  • स्ट्रीम की प्रॉपर्टी बदली गई हैं (सैंपलिंग रेट, चैनल मास्क, सैंपल फ़ॉर्मैट)

कैप्चर करने की प्रोसेस शुरू करने से पहले, आपको AudioRecord.registerAudioRecordingCallback() को कॉल करना होगा. कॉलबैक सिर्फ़ तब लागू होता है, जब ऐप्लिकेशन को ऑडियो मिल रहा हो और कोई बदलाव हो रहा हो.

onRecordingConfigChanged() वाला तरीका, AudioRecordingConfiguration दिखाता है. इसमें ऑडियो कैप्चर की मौजूदा स्थिति होती है. बदलाव के बारे में जानने के लिए, इन तरीकों का इस्तेमाल करें:

isClientSilenced()
अगर कैप्चर करने की नीति की वजह से, क्लाइंट को दिखाया जा रहा ऑडियो फ़िलहाल बंद है, तो यह फ़ंक्शन 'सही है' दिखाता है.
getAudioDevice()
चालू ऑडियो डिवाइस को दिखाता है.
getEffects()
चालू प्री-प्रोसेसिंग इफ़ेक्ट को दिखाता है. ध्यान दें कि अगर क्लाइंट सबसे ज़्यादा प्राथमिकता वाला ऐप्लिकेशन नहीं है, तो हो सकता है कि चालू इफ़ेक्ट, getClientEffects() से मिले इफ़ेक्ट से अलग हो.
getFormat()
स्ट्रीम की प्रॉपर्टी दिखाता है. ध्यान दें कि क्लाइंट को मिले ऑडियो का असल डेटा, getClientFormat() से मिले ज़रूरी फ़ॉर्मैट के हिसाब से ही काम करता है. यह फ़्रेमवर्क, हार्डवेयर इंटरफ़ेस में इस्तेमाल किए गए फ़ॉर्मैट से, क्लाइंट के तय किए गए फ़ॉर्मैट में ज़रूरी रीसैंपलिंग, चैनल, और फ़ॉर्मैट कन्वर्ज़न अपने-आप करता है.
AudioRecord.getActiveRecordingConfiguration().
यह रिकॉर्डिंग का चालू कॉन्फ़िगरेशन दिखाता है.

डिवाइस पर चल रही सभी रिकॉर्डिंग की सामान्य जानकारी पाने के लिए, AudioManager.getActiveRecordingConfigurations() को कॉल करें.