ऑडियो रूटिंग

एंड्रॉइड 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 अक्षम कर दी जाएगी और OS 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 का उपयोग करने के लिए कॉन्फ़िगर किया गया है, तो इन उपकरणों के आउटपुट पर लागू करने के लिए प्रत्येक समूह के लिए वॉल्यूम स्तर एचएएल पर पारित किया जाएगा।

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

अधिभोगी क्षेत्र ऑडियो कॉन्फ़िगरेशन

एंड्रॉइड 11 में दो नए फ़ील्ड, audioZoneId और occupantZoneId पेश करने के लिए car_audio_configuration.xml और विस्तार किया गया। पहला, 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 में केवल एक से एक मैपिंग हो सकती है

एप्लिकेशन यूआईडी के माध्यम से रूटिंग

ऐप्स को क्वेरी करने और ऑडियो ज़ोन और फ़ोकस सेट करने की अनुमति देने के लिए 10 में CarAudioManager में छिपे हुए API की एक श्रृंखला पेश की गई थी।

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

उपरोक्त एपीआई प्रथम पक्ष एप्लिकेशन को एप्लिकेशन के यूआईडी के आधार पर ऑडियो रूटिंग प्रबंधित करने की अनुमति देती है। जैसे, ऑडियो ज़ोन आईडी और एप्लिकेशन की यूआईडी दोनों की भी आवश्यकता है। उस जानकारी के साथ, CarAudioManager#setZoneIdForUid API का उपयोग करके ऑडियो रूटिंग सेट की जा सकती है।

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

डिफ़ॉल्ट रूप से, सभी ऑडियो प्राथमिक क्षेत्र में रूट होते हैं। किसी एप्लिकेशन को किसी भिन्न ज़ोन में रूट करने के लिए अपडेट करने के लिए, 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 का उपयोग करके किया जा सकता है। इस एपीआई को उपयोगकर्ताओं को प्रबंधित करने के लिए अनुमति की आवश्यकता है। वर्तमान अपेक्षा यह है कि ओईएम किसी प्रकार के सिस्टम यूआई के माध्यम से उपयोगकर्ता को अधिभोग क्षेत्र असाइनमेंट का प्रबंधन कर सकें। एक बार यह हो जाने के बाद एप्लिकेशन लॉन्चिंग, ऑडियो रूटिंग, फोकस प्रबंधन सभी उपयोगकर्ता के लिए स्वचालित रूप से कॉन्फ़िगर हो जाएंगे।

setPreferredDevice के साथ रूटिंग

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

एपीआई का उपयोग किसी विशेष क्षेत्र और ऑडियो विशेषता उपयोग के लिए आउटपुट डिवाइस को क्वेरी करने के लिए किया जा सकता है। इस प्रकार प्रथम पक्ष एप्लिकेशन प्लेयर के setPreferredDevice API का उपयोग करके ऑडियो को विभिन्न क्षेत्रों में रूट कर सकते हैं। getOutputDeviceForUsage API के लिए PERMISSION_CAR_CONTROL_AUDIO_SETTINGS की आवश्यकता होती है और यह एक सिस्टम API है। नीचे किसी विशेष क्षेत्र के लिए मीडिया डिवाइस ढूंढने और setPreferredDevice API का उपयोग करके उस डिवाइस पर रूट करने का एक उदाहरण दिया गया है।

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