ऑडियो रूटिंग

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, इसके बाद हर ग्रुप के लिए आवाज़ के लेवल पास कर दिए जाएंगे की मदद से इन डिवाइसों के आउटपुट पर लागू करने के लिए, HAL पर जा सकते हैं.

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

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

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

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

<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");
}

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

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

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

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

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

setPreferred Device की मदद से रूटिंग करना

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

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

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