ऑडियो फ़ोकस

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

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

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

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

  • खास प्रॉडक्ट
  • अस्वीकार करें
  • एक साथ

खास इंटरैक्शन

यह इंटरैक्शन मॉडल, Android के साथ सबसे ज़्यादा इस्तेमाल किया जाता है.

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

इंटरैक्शन अस्वीकार करना

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

एक साथ कई इंटरैक्शन

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

  • फ़ोकस के लिए आने वाले अनुरोध में, AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK का अनुरोध करना ज़रूरी है

  • फ़िलहाल फ़ोकस में मौजूद ऑब्जेक्ट के लिए, setPauseWhenDucked(true) सेट नहीं किया गया है

  • फ़िलहाल फ़ोकस में रहने वाले व्यक्ति ने, आवाज़ कम होने के इवेंट पाने का विकल्प नहीं चुना है

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

एक साथ कई डिवाइसों पर स्ट्रीम करने की सुविधा

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

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

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

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

नीचे दी गई टेबल में, CarAudioService के हिसाब से इंटरैक्शन मैट्रिक दिखाई गई है. हर पंक्ति, फ़ोकस में मौजूद मौजूदा उपयोगकर्ता के CarAudioContext को दिखाती है और हर कॉलम, आने वाले अनुरोध को दिखाता है.

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

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

पहली इमेज. ऑडियो फ़ोकस इंटरैक्शन मैट्रिक्स.

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

ऑडियो फ़ोकस में देरी

Android 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

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

HAL ऑडियो फ़ोकस

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

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

आपातकालीन या सुरक्षा से जुड़ी अहम आवाज़ें चलाते समय, एचएएल को Android स्ट्रीम को ज़रूरत के हिसाब से म्यूट करना चाहिए. इससे यह पक्का किया जा सकेगा कि ये आवाज़ें साफ़ तौर पर सुनाई दें.

AudioControl@2.0

AudioControl HAL के वर्शन 2.0 में ये नए एपीआई शामिल किए गए हैं:

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

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

registerFocusListener के अलावा, ये अनुरोध oneway होते हैं. इससे यह पक्का होता है कि फ़ोकस अनुरोध को प्रोसेस करने के दौरान, Android, एचएएल को देर न करे. HAL को सुरक्षा से जुड़ी अहम आवाज़ें चलाने से पहले, फ़ोकस हासिल करने का इंतज़ार नहीं करना चाहिए. IAudioControl#onAudioFocusChange के ज़रिए ऑडियो फ़ोकस में होने वाले बदलावों को सुनना और उनका जवाब देना, एचएएल के लिए ज़रूरी नहीं है.

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

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

  • फ़ोन कॉल, आपातकालीन सूचना या सुरक्षा से जुड़ी सूचना जैसी किसी भी 'ज़्यादा प्राथमिकता' वाली ऑडियो फ़ोकस सुविधा के बिना, ऐप्लिकेशन को कुछ समय के लिए या हमेशा के लिए ऑडियो फ़ोकस मिलना चाहिए.

  • मीडिया फ़ोकस चालू होने पर:

    • कॉल के इस्तेमाल पर फ़ोकस करने का अनुरोध करने वाले ऐप्लिकेशन को कॉल एक साथ या सिर्फ़ एक ऐप्लिकेशन को मिलना चाहिए.

    • नेविगेशन के इस्तेमाल पर फ़ोकस करने का अनुरोध करने वाले ऐप्लिकेशन को, नेविगेशन पर फ़ोकस एक साथ या सिर्फ़ एक ऐप्लिकेशन को मिलना चाहिए.

    • Assistant के इस्तेमाल पर फ़ोकस करने का अनुरोध करने वाले ऐप्लिकेशन, एक साथ या सिर्फ़ एक ऐप्लिकेशन के लिए फ़ोकस पा सकते हैं.

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

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