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

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

कभी-कभी दो या उससे ज़्यादा ऐप्लिकेशन, एक ही ऑडियो इनपुट को "कैप्चर" करना चाहते हैं. हो सकता है कि वे अलग-अलग काम कर रहे हों. उदाहरण के लिए, ऑडियो पाने वाले कुछ ऐप्लिकेशन "रिकॉर्ड कर सकते हैं", जैसे कि एक साधारण वॉइस रिकॉर्डर. वहीं, अन्य ऐप्लिकेशन "सुन सकते हैं", जैसे कि 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() को कॉल करें.