ऑडियो रूटिंग

Android 10 में, car_audio_configuration.xml, car_volumes_groups.xml और IAudioControl.getBusForContext की जगह लेता है. नई कॉन्फ़िगरेशन फ़ाइल में, ज़ोन की सूची दी गई है. हर ज़ोन में एक या उससे ज़्यादा वॉल्यूम ग्रुप होते हैं. इनमें उनसे जुड़े डिवाइस भी होते हैं. साथ ही, हर डिवाइस में ऐसे कॉन्टेक्स्ट होते हैं जिन्हें उस ज़ोन में रूट किया जाना चाहिए. यह ज़रूरी है कि हर ज़ोन में सभी कॉन्टेक्स्ट दिखाए जाएं.

ऑडियो रूटिंग कॉन्फ़िगर करना

ऑडियो नीति फ़ाइलें, आम तौर पर वेंडर पार्टीशन में मौजूद होती हैं. इनसे बोर्ड के ऑडियो हार्डवेयर कॉन्फ़िगरेशन के बारे में पता चलता है. car_audio_configuration.xml में रेफ़र किए गए सभी डिवाइसों की जानकारी, audio_policy_configuration.xml में दी जानी चाहिए.

AAOS रूटिंग की सुविधा चालू करना

AAOS पर आधारित रूटिंग का इस्तेमाल करने के लिए, आपको audioUseDynamicRouting फ़्लैग को true पर सेट करना होगा:

<resources>
    <bool name="audioUseDynamicRouting">true</bool>
</resources>

false के बंद होने पर, रूटिंग और CarAudioService की ज़्यादातर सुविधाएं बंद हो जाएंगी. साथ ही, ओएस AudioService के डिफ़ॉल्ट तरीके से काम करेगा.

प्राइमरी ज़ोन

डिफ़ॉल्ट रूप से, सभी ऑडियो को प्राइमरी ज़ोन पर भेजा जाएगा. सिर्फ़ एक प्राइमरी ज़ोन हो सकता है. कॉन्फ़िगरेशन में, isPrimary="true" एट्रिब्यूट से इसकी जानकारी मिलती है.

कॉन्फ़िगरेशन का सैंपल

उदाहरण के लिए, किसी वाहन में दो ज़ोन हो सकते हैं — एक मुख्य ज़ोन और पीछे की सीट पर मनोरंजन वाला सिस्टम. इसके आधार पर, किसी संभावित car_audio_configuration.xml को इस तरह परिभाषित किया जाएगा:

<audioZoneConfiguration version="2.0">
       <zone name="primary zone" isPrimary="true">
           <volumeGroups>
               <group>
                   <device address="bus0_media_out">
                       <context context="music"/>
                       <context context="announcement"/>
                   </device>
                   <device address="bus3_call_ring_out">
                       <context context="call_ring"/>
                   </device>
                   <device address="bus6_notification_out">
                       <context context="notification"/>
                   </device>
                   <device address="bus7_system_sound_out">
                       <context context="system_sound"/>
                       <context context="emergency"/>
                       <context context="safety"/>
                       <context context="vehicle_status"/>
                   </device>
               </group>
               <group>
                   <device address="bus1_navigation_out">
                       <context context="navigation"/>
                   </device>
                   <device address="bus2_voice_command_out">
                       <context context="voice_command"/>
                   </device>
               </group>
               <group>
                   <device address="bus4_call_out">
                       <context context="call"/>
                   </device>
               </group>
               <group>
                   <device address="bus5_alarm_out">
                       <context context="alarm"/>
                   </device>
               </group>
           </volumeGroups>
       </zone>
        <zone name="rear seat zone" audioZoneId="1">
           <volumeGroups>
               <group>
                   <device address="bus100_rear_seat">
                       <context context="music"/>
                       <context context="navigation"/>
                       <context context="voice_command"/>
                       <context context="call_ring"/>
                       <context context="call"/>
                       <context context="alarm"/>
                       <context context="notification"/>
                       <context context="system_sound"/>
                       <context context="emergency"/>
                       <context context="safety"/>
                       <context context="vehicle_status"/>
                       <context context="announcement"/>
                   </device>
               </group>
           </volumeGroups>
    </zones>
</audioZoneConfiguration>

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

सेकंडरी ज़ोन के लिए, एक आउटपुट डिवाइस से आउटपुट मिलने की उम्मीद है. इस उदाहरण में, सभी इस्तेमाल को एक ही डिवाइस और वॉल्यूम ग्रुप पर भेजा गया है, ताकि चीज़ों को आसान रखा जा सके.

ऑक्युपेंट ज़ोन के लिए ऑडियो कॉन्फ़िगरेशन

Android 11 में car_audio_configuration.xml को और बड़ा किया गया, ताकि दो नए फ़ील्ड, audioZoneId और occupantZoneId को जोड़ा जा सके. पहले, audioZoneId का इस्तेमाल ज़ोन मैनेजमेंट को बेहतर तरीके से कंट्रोल करने के लिए किया जा सकता है. दूसरी ओर, occupantZoneId का इस्तेमाल, यूज़र आईडी के आधार पर रूटिंग को कॉन्फ़िगर करने के लिए किया जा सकता है.

इन नए फ़ील्ड का इस्तेमाल करने के लिए, car_audio_configuration.xml का V2 वर्शन होना ज़रूरी है. ऊपर दिए गए ऑडियो कॉन्फ़िगरेशन को फिर से देखें. हालांकि, ऑक्युपेंट ज़ोन आईडी और ऑडियो ज़ोन आईडी मैपिंग के लिए नए फ़ील्ड का इस्तेमाल करें. वॉल्यूम ग्रुप की परिभाषाओं के बिना, नया कॉन्फ़िगरेशन इस तरह सेट अप किया जा सकता है:

<audioZoneConfiguration version="2.0">
       <zone name="primary zone" isPrimary="true" occupantZoneId="0">
         ...
       </zone>
       <zone name="rear seat zone" audioZoneId="1" occupantZoneId="1">
         ...
       </zone>
    </zones>
</audioZoneConfiguration>

ऊपर दिए गए कॉन्फ़िगरेशन में, मुख्य ज़ोन से ऑक्युपेंट ज़ोन 0 और audioZoneId 1 से occupantZoneId 1 के लिए मैपिंग तय की गई है. आम तौर पर, ऑक्युपेंट ज़ोन और ऑडियो ज़ोन के बीच किसी भी तरह की मैपिंग को कॉन्फ़िगर किया जा सकता है. हालांकि, मैपिंग एक-एक होनी चाहिए. यहां दो नए फ़ील्ड तय करने वाले नियम दिए गए हैं:

  • प्राइमरी ज़ोन के लिए audioZoneId हमेशा शून्य होता है
  • audioZoneId और occupantZoneId नंबर दोहराए नहीं जा सकते
  • audioZoneId और occupantZoneId के बीच सिर्फ़ एक-एक मैपिंग हो सकती है

ऐप्लिकेशन यूआईडी के ज़रिए रूटिंग

CarAudioManager में 10 में, छिपे हुए एपीआई की एक सीरीज़ शुरू की गई थी, ताकि ऐप्लिकेशन ऑडियो ज़ोन और फ़ोकस के बारे में क्वेरी कर सकें और उन्हें सेट कर सकें.

int[] getAudioZoneIds();
int getZoneIdForUid(int uid);
boolean setZoneIdForUid(int zoneId, int uid);
boolean clearZoneIdForUid(int uid);

ऊपर दिए गए एपीआई की मदद से, पहले पक्ष के ऐप्लिकेशन को ऐप्लिकेशन के यूआईडी के आधार पर ऑडियो रूटिंग मैनेज करने की अनुमति मिलती है. इसलिए, ऑडियो ज़ोन आईडी और ऐप्लिकेशन का यूआईडी, दोनों की ज़रूरत होती है. इस जानकारी के आधार पर, CarAudioManager#setZoneIdForUid एपीआई का इस्तेमाल करके ऑडियो रूटिंग सेट की जा सकती है.

किसी ऐप्लिकेशन के लिए ज़ोन बदलना

डिफ़ॉल्ट रूप से, सभी ऑडियो प्राइमरी ज़ोन में रूट होते हैं. किसी ऐप्लिकेशन को किसी दूसरे ज़ोन पर भेजने के लिए, CarAudioManager#setZoneIdForUid का इस्तेमाल करें:

// Find zone to play
int zoneId = ...

// Find application's uid
Int uid = mContext.getPackageManager()
        .getApplicationInfo(mContext.getPackageName(), 0)
        .uid;

if (mCarAudioManager.setZoneIdForUid(zoneId, info.uid)) {
    Log.d(TAG, "Zone successfully updated");
} else {
    Log.d(TAG, "Failed to change zone");
}

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

यूज़र आईडी की मदद से रूटिंग

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

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

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

setPreferredDevice की मदद से रूटिंग

ऊपर बताए गए बदलावों के साथ-साथ, Android 11 में हर ज़ोन से जुड़े आउटपुट डिवाइसों के बारे में क्वेरी करने के लिए, एक नया एपीआई भी है. इसका नाम CarAudioManager#getOutputDeviceForUsage(int zoneId, int usage) है.

इस एपीआई का इस्तेमाल, किसी खास ज़ोन और ऑडियो एट्रिब्यूट के इस्तेमाल के लिए, आउटपुट डिवाइस के बारे में क्वेरी करने के लिए किया जा सकता है. इस तरह, पहले पक्ष के ऐप्लिकेशन, प्लेयर के setPreferredDevice API का इस्तेमाल करके, ऑडियो को अलग-अलग ज़ोन में भेज सकते हैं. getOutputDeviceForUsage एपीआई के लिए PERMISSION_CAR_CONTROL_AUDIO_SETTINGS ज़रूरी है और यह एक सिस्टम एपीआई है. यहां किसी खास ज़ोन के लिए मीडिया डिवाइस ढूंढने और setPreferredDevice एपीआई का इस्तेमाल करके उस डिवाइस पर रूट करने का उदाहरण दिया गया है.

audioZoneId = ... ;
mediaDeviceInfo = mCarAudioManager
            .getOutputDeviceForUsage(audioZoneId, AudioAttributes.USAGE_MEDIA);
…
mPlayer.setPreferredDevice(mediaDeviceInfo);