ऑडियो फ़ोकस

लॉजिकल स्ट्रीम शुरू करने से पहले, एक ऐप उन्हीं ऑडियो विशेषताओं का उपयोग करके ऑडियो फोकस का अनुरोध करता है जैसा कि लॉजिकल स्ट्रीम के लिए उपयोग किया जाता है। ऐप को ऑटोमोटिव उपयोग के मामलों में अपेक्षित प्रदर्शन करने के लिए फोकस हानियों का सम्मान करना चाहिए।

हालाँकि फ़ोकस अनुरोध भेजने की अनुशंसा की जाती है, लेकिन इसे सिस्टम द्वारा लागू नहीं किया जाता है। इसलिए, फोकस को प्राथमिक ऑडियो नियंत्रण तंत्र के बजाय प्लेबैक के दौरान अप्रत्यक्ष रूप से नियंत्रित करने और संघर्ष से बचने के साधन के रूप में मानें। वाहन को ऑडियो सबसिस्टम के संचालन के लिए फोकस सिस्टम पर निर्भर नहीं होना चाहिए।

फोकस इंटरैक्शन

AAOS का समर्थन करने के लिए, ऑडियो फोकस अनुरोधों को अनुरोध के CarAudioContext और वर्तमान फोकस धारकों के बीच पूर्वनिर्धारित इंटरैक्शन के आधार पर नियंत्रित किया जाता है। अंतःक्रियाएँ तीन प्रकार की होती हैं:

  • अनन्य
  • अस्वीकार करना
  • समवर्ती

विशेष बातचीत

यह एंड्रॉइड के साथ सबसे अधिक उपयोग किया जाने वाला इंटरेक्शन मॉडल है।

विशिष्ट इंटरैक्शन में, एक समय में केवल एक ऐप को फोकस बनाए रखने की अनुमति होती है। इसलिए, आने वाले फोकस अनुरोध को फोकस दिया जाता है जबकि मौजूदा फोकस धारक फोकस खो देता है। चूंकि दोनों ऐप्स मीडिया चलाते हैं, इसलिए केवल एक ऐप को फोकस बनाए रखने की अनुमति है। परिणामस्वरूप, नए शुरू किए गए ऐप का फोकस अनुरोध AUDIOFOCUS_REQUEST_GRANTED के साथ लौटाया जाता है, जबकि वर्तमान में संगीत चलाने वाले ऐप को हानि स्थिति के साथ फोकस परिवर्तन ईवेंट प्राप्त होता है जो कि किए गए अनुरोध के प्रकार से मेल खाता है।

बातचीत को अस्वीकार करें

अस्वीकृत इंटरैक्शन के साथ, आने वाला अनुरोध हमेशा अस्वीकार कर दिया जाता है। उदाहरण के लिए, जब कॉल चालू होने के दौरान संगीत चलाने का प्रयास किया जा रहा हो। इस मामले में, यदि डायलर कॉल के लिए ऑडियो फोकस रखता है और दूसरा ऐप संगीत चलाने के लिए फोकस का अनुरोध करता है, तो संगीत ऐप को अनुरोध के जवाब में AUDIOFOCUS_REQUEST_FAILED प्राप्त होता है। चूँकि फोकस अनुरोध अस्वीकार कर दिया गया है, वर्तमान फोकस धारक को कोई फोकस हानि नहीं भेजी जाती है।

समवर्ती अंतःक्रिया

AAOS के लिए अद्वितीय समवर्ती इंटरैक्शन हैं। यह कार में ऑडियो फोकस का अनुरोध करने वाले ऐप्स को अन्य ऐप्स के साथ-साथ फोकस बनाए रखने की क्षमता देता है। समवर्ती बातचीत होने के लिए, निम्नलिखित शर्तों को पूरा करना होगा। यह:

  • आने वाले फ़ोकस अनुरोध को AudioManager.AUDIFOCUS_GAIN_TRANSIENT_MAY_DUCK के लिए पूछना चाहिए

  • वर्तमान फोकस धारक PauseWhenDucked(true) सेट नहीं करता है

  • वर्तमान फोकस धारक डक इवेंट प्राप्त न करने का विकल्प चुनता है

यदि ये मानदंड पूरे हो जाते हैं, तो फ़ोकस अनुरोध AUDIOFOCUS_REQUEST_GRANTED के साथ वापस आ जाता है, जबकि वर्तमान फ़ोकस धारक के फ़ोकस में कोई बदलाव नहीं होता है। हालाँकि, यदि वर्तमान फोकस धारक डक इवेंट प्राप्त करने या डक होने पर रुकने का विकल्प चुनता है, तो वर्तमान फोकस धारक फोकस खो देता है, जैसा कि एक विशेष इंटरैक्शन के साथ होता है।

समवर्ती धाराओं को संभालना

जबकि समवर्ती इंटरैक्शन के कई उपयोग हैं, आउटपुट डिवाइसों में हार्डवेयर स्तर पर मिश्रण और डकिंग में सावधान रहें। हम पुरजोर अनुशंसा करते हैं कि CarAudioContext जिन्हें एक साथ चलाने की अनुमति है, उन्हें विभिन्न आउटपुट डिवाइसों पर रूट किया जाना चाहिए।

समवर्ती धाराओं के लिए अलग-अलग आउटपुट डिवाइस होने से, यह एचएएल को किसी एक धारा को मिश्रित करने से पहले डक करने, या भौतिक धाराओं को वाहन में विभिन्न स्पीकरों तक रूट करने में सक्षम बनाता है। यदि तार्किक धाराओं को एंड्रॉइड के भीतर मिश्रित किया जाता है, तो लाभ अपरिवर्तित रहता है और उसी भौतिक स्ट्रीम के हिस्से के रूप में वितरित किया जाता है।

उदाहरण के लिए, जब नेविगेशन और मीडिया एक साथ वितरित किए जाते हैं, तो मीडिया स्ट्रीम के लिए लाभ को अस्थायी रूप से कम किया जा सकता है (या रोका जा सकता है) ताकि नेविगेशन निर्देशों को अधिक स्पष्ट रूप से सुना जा सके। वैकल्पिक रूप से, नेविगेशन स्ट्रीम को ड्राइवर साइड स्पीकर पर रूट किया जा सकता है जबकि मीडिया बाकी केबिन में चलता रहता है।

इंटरेक्शन मैट्रिक्स

नीचे दी गई तालिका CarAudioService द्वारा परिभाषित इंटरेक्शन मैट्रिक्स दिखाती है। प्रत्येक पंक्ति वर्तमान फोकस धारक के CarAudioContext प्रतिनिधित्व करती है और प्रत्येक कॉलम आने वाले अनुरोध का प्रतिनिधित्व करता है।

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

समवर्ती इंटरैक्शन के कारण, एक से अधिक फोकस धारक होना संभव है। इस मामले में, कौन सा इंटरैक्शन लागू करना है यह निर्धारित करने से पहले आने वाले फोकस अनुरोध की तुलना प्रत्येक मौजूदा फोकस धारक के साथ की जाती है। इस मामले में, सबसे रूढ़िवादी बातचीत जीतती है। अस्वीकार, फिर अनन्य, और अंत में समवर्ती।

ऑडियो फोकस इंटरेक्शन मैट्रिक्स

चित्र 1. ऑडियो फोकस इंटरेक्शन मैट्रिक्स।

एंड्रॉइड 11 में, उपयोगकर्ताओं को नेविगेशन और फोन कॉल के बीच इंटरैक्शन व्यवहार को बदलने की अनुमति देने के लिए एक नई उपयोगकर्ता सेटिंग पेश की गई थी। सेट होने पर, android.car.KEY_AUDIO_FOCUS_NAVIGATION_REJECTED_DURING_CALL आने वाले NAVIGATION फ़ोकस अनुरोधों और वर्तमान CALL फ़ोकस धारकों के बीच इंटरेक्शन को समवर्ती से अस्वीकार में बदल देता है। यदि कोई उपयोगकर्ता चाहता है कि नेविगेशन निर्देश कॉल में बाधा न डालें, तो वह सेटिंग सक्षम कर सकता है। यह उपयोगकर्ता के लिए कायम है, और इसे गतिशील रूप से सेट किया जा सकता है ताकि बाद के फोकस अनुरोध नई सेटिंग का सम्मान करें।

विलंबित ऑडियो फोकस

एंड्रॉइड 11 में, AAOS ने विलंबित ऑडियो फोकस के अनुरोध के लिए समर्थन जोड़ा। यह गैर-क्षणिक फोकस अनुरोधों को विलंबित करने की अनुमति देता है जब वर्तमान फोकस धारकों के साथ उनकी बातचीत के परिणामस्वरूप आम तौर पर उन्हें अस्वीकार कर दिया जाएगा। एक बार जब फोकस में बदलाव के परिणामस्वरूप ऐसी स्थिति बन जाती है जहां विलंबित अनुरोध फोकस प्राप्त कर सकता है, तो अनुरोध स्वीकार कर लिया जाता है।

विलंबित ऑडियो फोकस अनुरोधों के लिए नियम

  • केवल गैर-क्षणिक अनुरोध। विलंबित अनुरोध केवल गैर-क्षणिक स्रोतों के लिए किया जा सकता है ताकि प्रासंगिक होने के लंबे समय बाद तक क्षणिक ध्वनि बजने से बचा जा सके।

  • एक समय में केवल एक ही अनुरोध में देरी की जा सकती है। यदि पहले से ही विलंबित अनुरोध होने पर विलंब योग्य अनुरोध किया जाता है, तो मूल विलंबित अनुरोध को AUDIOFOCUS_LOSS परिवर्तन ईवेंट प्राप्त होता है और नए अनुरोध को AUDIOFOCUS_REQUEST_DELAYED की एक समकालिक प्रतिक्रिया प्राप्त होती है।

  • विलंबित अनुरोधों में एक OnAudioFocusChangeListener होना चाहिए। एक बार अनुरोध विलंबित हो जाने पर, श्रोता का उपयोग अनुरोधकर्ता को सूचित करने के लिए किया जाता है जब अनुरोध अंततः स्वीकार कर लिया जाता है ( AUDIOFOCUS_GAIN ), या यदि इसे बाद में अस्वीकार कर दिया जाता है ( AUDIOFOCUS_LOSS )।

विलंबित फोकस का अनुरोध करें

ऐसा अनुरोध बनाने के लिए जिसमें विलंब हो सकता है:

  1. AudioFocusRequest.Builder#setAcceptsDelayedFocusGain का उपयोग करें।

    mMediaWithDelayedFocusListener = new MediaWithDelayedFocusListener();
    
    mDelayedFocusRequest = new AudioFocusRequest
         .Builder(AudioManager.AUDIOFOCUS_GAIN)
         .setAudioAttributes(mMusicAudioAttrib)
         .setOnAudioFocusChangeListener(mMediaWithDelayedFocusListener)
         .setForceDucking(false)
         .setWillPauseWhenDucked(false)
         .setAcceptsDelayedFocusGain(true)
         .build();
    
  2. अनुरोध करते समय, AUDIOFOCUS_REQUEST_DELAYED प्रतिक्रिया संभालें:

    int delayedFocusRequestResults = mAudioManager.requestAudioFocus(mDelayedFocusRequest);
    if (delayedFocusRequestResults == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {
        // start audio playback
        return;
    }
    if (delayedFocusRequestResults == AudioManager.AUDIOFOCUS_REQUEST_DELAYED) {
         // audio playback delayed to audio focus listener
         return;
    }
    
  3. जब अनुरोध में देरी होती है, तो फोकस श्रोता फोकस में परिवर्तन को संभालता है:

    private final class MediaWithDelayedFocusListener implements
    OnAudioFocusChangeListener {
           @Override
           public void onAudioFocusChange(int focusChange) {
               synchronized (mLock) {
                   switch (focusChange) {
                       case AudioManager.AUDIOFOCUS_GAIN:
                           … // Start focus playback
                       case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT:
                           … // Pause media transiently
                       case AudioManager.AUDIOFOCUS_LOSS:
                           … // Stop media
    

मल्टी-ज़ोन फोकस प्रबंधन

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

सभी ऐप्स के लिए, CarAudioService स्वचालित रूप से फोकस प्रबंधित करता है। फ़ोकस अनुरोध का ऑडियो ज़ोन उसके संबद्ध UserId या UID द्वारा निर्धारित किया जाता है (विवरण के लिए, ऑडियो रूटिंग देखें)।

एक साथ कई क्षेत्रों से ऑडियो का अनुरोध करें

यदि कोई ऐप एक साथ कई ज़ोन में ऑडियो चलाना चाहता है, तो उसे बंडल में AUDIOFOCUS_EXTRA_REQUEST_ZONE_ID शामिल करके प्रत्येक ज़ोन के लिए फ़ोकस का अनुरोध करना होगा:

//Create attribute with bundle and AUDIOFOCUS_EXTRA_REQUEST_ZONE_ID
Bundle bundle = new Bundle();
bundle.putInt(CarAudioManager.AUDIOFOCUS_EXTRA_REQUEST_ZONE_ID,
               zoneId);

AudioAttributes attributesWithZone = new AudioAttributes.Builder()
     .setUsage(AudioAttributes.USAGE_MEDIA)
     .addBundle(bundle)
     .build();

//Create focus request using built attributesWithZone

यह बंडल पैरामीटर अनुरोधकर्ता को निर्दिष्ट ज़ोन आईडी का उपयोग करने के लिए स्वचालित ऑडियो ज़ोन मैपिंग को ओवरराइड करने की अनुमति देता है। इसलिए, एक ऐप अलग-अलग ऑडियो ज़ोन के लिए अलग-अलग अनुरोध जारी कर सकता है।

एचएएल ऑडियो फोकस

एंड्रॉइड 11 से शुरू होकर, एचएएल बाहरी स्ट्रीम की ओर से फोकस का अनुरोध करने में सक्षम है। वैकल्पिक होते हुए भी, बाहरी ध्वनियों को एंड्रॉइड इकोसिस्टम में इष्टतम भागीदार बनाने और एक सहज उपयोगकर्ता अनुभव प्रदान करने के लिए इन एपीआई के उपयोग को अत्यधिक प्रोत्साहित किया जाता है।

एचएएल अंतिम निर्धारण करता है कि किन ध्वनियों को प्राथमिकता मिलनी चाहिए। इस हद तक, आपातकालीन और सुरक्षा संबंधी महत्वपूर्ण ध्वनियाँ बजाई जानी चाहिए चाहे एचएएल को ऑडियो फोकस दिया गया हो या नहीं और एचएएल द्वारा ऑडियो फोकस खो देने पर भी उचित तरीके से बजाना जारी रखा जाना चाहिए। सरकारी विनियमों द्वारा अपेक्षित किसी भी ध्वनि के लिए भी यही सच है।

आपातकालीन या सुरक्षा-महत्वपूर्ण ध्वनियाँ बजाते समय एचएएल को एंड्रॉइड स्ट्रीम को सक्रिय रूप से म्यूट करना चाहिए ताकि यह सुनिश्चित हो सके कि उन्हें स्पष्ट रूप से सुना जा सके।

AudioControl@2.0

ऑडियोकंट्रोल एचएएल का संस्करण 2.0 इन नए एपीआई को प्रस्तुत करता है:

एपीआई उद्देश्य
IAudioControl#registerFocusListener AudioControl HAL के साथ IFocusListener का एक उदाहरण पंजीकृत करता है। यह श्रोता एचएएल को ऑडियो फोकस का अनुरोध करने और छोड़ने में सक्षम बनाता है। HAL श्रोता को अपंजीकृत करने के लिए Android द्वारा उपयोग किया जाने वाला ICloseHandle उदाहरण प्रदान करता है।
IAudioControl#onAudioFocusChange प्रारंभिक फोकस अनुरोधों की प्रतिक्रियाओं सहित, IFocusListener के माध्यम से HAL द्वारा किए गए फोकस अनुरोधों की स्थिति में परिवर्तन के बारे में HAL को सूचित करता है।
IFocusListener#requestAudioFocus निर्दिष्ट उपयोग, ज़ोन आईडी और फ़ोकस लाभ प्रकार के लिए एचएएल की ओर से फ़ोकस का अनुरोध किया जाता है।
IFocusListener#abandonAudioFocus निर्दिष्ट उपयोग और ज़ोन आईडी के लिए मौजूदा एचएएल फोकस अनुरोधों को छोड़ देता है।

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

registerFocusListener के अलावा, ये अनुरोध यह सुनिश्चित करने के लिए oneway हैं कि फोकस अनुरोध संसाधित होने पर एंड्रॉइड एचएएल में देरी नहीं करता है। एचएएल को सुरक्षा-महत्वपूर्ण ध्वनियाँ बजाने से पहले फोकस हासिल करने का इंतजार नहीं करना चाहिए। एचएएल के लिए IAudioControl#onAudioFocusChange के माध्यम से ऑडियो फोकस में बदलावों को सुनना और उनका जवाब देना वैकल्पिक है।

OEM कार ऑडियो फोकस सेवा

एंड्रॉइड 14 में, AAOS ने कुछ कार घटकों के लिए कॉन्फ़िगरेशन सक्षम करने के लिए कार OEM प्लगइन सेवाएं पेश कीं। कार ऑडियो प्लगइन सेवा के लिए, प्लगइन सेवा ओईएम को कार ऑडियो सेवा द्वारा इंटरसेप्ट किए गए फोकस अनुरोधों को प्रबंधित करने की अनुमति देती है। यह ओईएम को नियमों और विनियमों के अनुसार फोकस प्रबंधित करने के मामले में अधिक लचीलापन देता है। इस प्रकार, ऑडियो फोकस इंटरैक्शन निर्माताओं और एक क्षेत्र से दूसरे क्षेत्र के बीच भिन्न हो सकता है। ऑडियो फोकस के लिए मूल आधार अभी भी कायम है, कि ऐप्स को उपयोगकर्ता अनुभव को बढ़ाने के लिए बेहतर ऑडियो प्रबंधन के लिए फोकस का अनुरोध करना चाहिए। सामान्य तौर पर, ऐप्स द्वारा ऑडियो फोकस अनुरोध के लिए कुछ नियम अभी भी लागू होते हैं:

  • बिना किसी स्थिति के, उच्च प्राथमिकता वाले ऑडियो फोकस (फोन कॉल, आपातकालीन चेतावनी या सुरक्षा अधिसूचना सहित) ऐप्स को क्षणिक या स्थायी रूप से ऑडियो फोकस प्राप्त करने में सक्षम होना चाहिए।

  • जबकि मीडिया फोकस सक्रिय है:

    • कॉल उपयोग फ़ोकस का अनुरोध करने वाले ऐप्स को समवर्ती या विशेष रूप से कॉल प्राप्त करने में सक्षम होना चाहिए।

    • नेविगेशन उपयोग फ़ोकस का अनुरोध करने वाले ऐप्स को समवर्ती या विशेष रूप से नेविगेशन फ़ोकस प्राप्त करने में सक्षम होना चाहिए।

    • सहायक उपयोग फ़ोकस का अनुरोध करने वाले ऐप्स को समवर्ती या विशेष रूप से उपयोग फ़ोकस प्राप्त करने में सक्षम होना चाहिए।

  • जबकि उच्च प्राथमिकता वाले ऑडियो फोकस (फोन कॉल, आपातकालीन चेतावनी, या सुरक्षा अधिसूचना सहित) ऐप्स सक्रिय हैं, किसी भी आने वाले विलंबित ऑडियो फोकस अनुरोध को आवश्यकतानुसार स्वीकार किया जाना चाहिए या विलंबित किया जाना चाहिए।

हालाँकि ऊपर दिए गए सुझाव संपूर्ण नहीं हैं, फिर भी यदि कोई सक्रिय उच्च प्राथमिकता वाली ध्वनि मौजूद नहीं है तो वे फोकस प्राप्त करने के लिए अनुरोध करने वाले ऐप्स की मदद कर सकते हैं। भले ही उच्च प्राथमिकता वाली ध्वनियाँ सक्रिय हों, विलंबित फ़ोकस अनुरोधों का अभी भी सम्मान किया जाना चाहिए और उच्च प्राथमिकता वाली ध्वनि बंद होने पर फ़ोकस प्राप्त करने में सक्षम होना चाहिए।