कार का ऑडियो कॉन्फ़िगरेशन

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

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

कार के ऑडियो आर्किटेक्चर की खास जानकारी

पहली इमेज. कार के ऑडियो आर्किटेक्चर की खास जानकारी.

कार ऑडियो कॉन्फ़िगरेशन फ़ाइल को डिवाइस पर vendor\etc\ या system\etc\ में डालें. vendor\etc\, वह जगह है जहां कार ऑडियो सेवा, फ़ाइल को सबसे पहले खोजती है. कार की ऑडियो सेवाएं, ऑडियो कॉन्फ़िगरेशन तय करने के लिए car_audio_configuration.xml को पढ़ती हैं.

कार के ऑडियो ज़ोन:

  • हर ऑडियो ज़ोन का एक यूनीक ऑडियो ज़ोन आईडी होता है.
  • हर ऑडियो ज़ोन को, कार में मौजूद लोगों के ज़ोन से मैप किया जा सकता है.
  • हर ज़ोन में ऑडियो से जुड़ी कार्रवाइयां, एक-दूसरे से अलग होती हैं:

    • ऑडियो फ़ोकस
    • ऑडियो रूटिंग
    • ऑडियो डकिंग
  • कार के वॉल्यूम ग्रुप:

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

    • ऑडियो कॉन्टेक्स्ट को ऑडियो डिवाइसों पर मैप करना. इसका इस्तेमाल करके, ऑडियो मिक्स बनाएं. यह मिक्स, ऑडियो के इस्तेमाल को आउटपुट डिवाइस पर मैप करता है.

    • सभी ऑडियो कॉन्टेक्स्ट को एक ज़ोन में दिखाया जाना चाहिए. इससे, ऑडियो एट्रिब्यूट के सभी इस्तेमाल के लिए, ऑडियो रूटिंग को सही तरीके से सेट अप किया जा सकता है.

ऑडियो कॉन्टेक्स्ट

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

इस टेबल में, ऑडियो कॉन्टेक्स्ट और इस्तेमाल के बीच की मैपिंग के बारे में बताया गया है. हाइलाइट की गई पंक्तियां, सिस्टम के नए इस्तेमाल के लिए दी गई हैं.

CarAudioContext असोसिएटेड एट्रिब्यूटयूज़
संगीत UNKNOWN
GAME
MEDIA
नेविगेशन ASSISTANCE_NAVIGATION_GUIDANCE
VOICE_COMMAND ASSISTANT
ASSISTANCE_ACCESSIBILITY
CALL_RING NOTIFICATION_RINGTONE
कॉल करें VOICE_COMMUNICATION
VOICE_COMMUNICATION_SIGNALING
अलार्म ALARM
सूचना NOTIFICATION
NOTIFICATION_*
SYSTEM_SOUND ASSISTANCE_SONIFICATION
आपातकालीन आवाज़ों की सूचना EMERGENCY
Safety SAFETY
VEHICLE_STATUS VEHICLE_STATUS
एलान ANNOUNCEMENT

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

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

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

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

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

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

सैंपल कॉन्फ़िगरेशन (दूसरा वर्शन)

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

<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>
               </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>
               <group>
                   <device address="bus7_system_sound_out">
                       <context context="system_sound"/>
                       <context context="emergency"/>
                       <context context="safety"/>
                       <context context="vehicle_status"/>
                   </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 का इस्तेमाल किया जा सकता है.

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

<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 हमेशा PRIMARY_AUDIO_ZONE आईडी होता है. अगर isPrimary="true" की वैल्यू दी गई है, तो audioZoneId की वैल्यू देने की ज़रूरत नहीं है.

  • audioZoneId और occupantZoneId नंबर दोहराए नहीं जा सकते.

  • audioZoneId और occupantZoneId के बीच सिर्फ़ एक-एक मैपिंग हो सकती है.

Android 14 के लिए कार के ऑडियो सिस्टम का कॉन्फ़िगरेशन

Android 14 में, AAOS ने OEM प्लग इन सेवा को लॉन्च किया है. इसकी मदद से, कार की ऑडियो सेवा की निगरानी में ऑडियो व्यवहार को ज़्यादा बेहतर तरीके से मैनेज किया जा सकता है. नई प्लग इन सेवाओं के साथ-साथ, कार के ऑडियो कॉन्फ़िगरेशन फ़ाइल में ये बदलाव भी किए गए हैं:

  • OEM की ओर से तय किया गया कार ऑडियो का कॉन्टेक्स्ट
  • प्राइमरी ज़ोन के अलावा अन्य ज़ोन के डाइनैमिक कॉन्फ़िगरेशन

OEM की ओर से तय किया गया कार ऑडियो का कॉन्टेक्स्ट

Android 14 में, कार ऑडियो सेवा की मदद से ऑडियो कॉन्फ़िगरेशन को आसानी से चालू किया जा सकता है. इससे, ऑडियो के इस्तेमाल को ऊपर बताए गए स्टैटिक ऑडियो कॉन्टेक्स्ट से अलग ग्रुप में रखा जा सकता है. OEM के तय किए गए इस कॉन्टेक्स्ट को car_audio_configuration.xml वर्शन 3 फ़ाइल में तय किया जा सकता है.

इसके बजाय, फ़िलहाल तय किए गए स्टैटिक ऑडियो कॉन्टेक्स्ट का इस्तेमाल किया जाता है. OEM के तय किए गए कार ऑडियो कॉन्टेक्स्ट का सामान्य फ़ॉर्मैट यहां दिखाया गया है.

हर OEM कॉन्टेक्स्ट के लिए, name के साथ-साथ ऑडियो एट्रिब्यूट के इस्तेमाल की सूची ज़रूरी है. ऊपर दिए गए उदाहरण में, दो कॉन्टेक्स्ट तय किए गए हैं:

<carAudioConfiguration version="3">
    <oemContexts>
        <oemContext name="media">
            <audioAttributes>
                <usage value="AUDIO_USAGE_MEDIA" />
    <usage value="AUDIO_USAGE_UNKNOWN"/>
            </audioAttributes>
        </oemContext>
        <oemContext name="game">
            <audioAttributes>
                <usage value="AUDIO_USAGE_GAME" />
            </audioAttributes>
        </oemContext>
...
  • media कॉन्टेक्स्ट में AUDIO_USAGE_MEDIA और AUDIO_USAGE_UNKNOWN शामिल हैं
  • game कॉन्टेक्स्ट में सिर्फ़ AUDIO_USAGE_GAME है

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

  • OEM कॉन्टेक्स्ट की परिभाषाएं देना ज़रूरी नहीं है. इसके बजाय, स्टैटिक ऑडियो कॉन्टेक्स्ट का इस्तेमाल किया जाता है.

  • कॉन्टेक्स्ट के नाम दोहराएं नहीं.

  • ऑडियो एट्रिब्यूट के इस्तेमाल को एक से ज़्यादा संदर्भों में असाइन न करें.

  • कॉन्टेक्स्ट बनाने के लिए, AudioAttributes में बताए गए ऑडियो के सभी इस्तेमाल का इस्तेमाल किया जाना चाहिए.

असल में, OEM ऑडियो कॉन्टेक्स्ट की परिभाषा के लिए, ऑडियो के इस्तेमाल की android.audio.policy.configuration.V7_0.AudioUsage स्ट्रिंग का इस्तेमाल किया जाना चाहिए. आने वाले समय में, ऑडियो एट्रिब्यूट के नए इस्तेमाल को सबसे सही संदर्भ में असाइन किया जाएगा. इससे, एक Android वर्शन से दूसरे वर्शन पर माइग्रेट करते समय होने वाली गड़बड़ियों को कम किया जा सकेगा.

OEM प्लग इन ऑडियो सेवा को और बेहतर बनाने के लिए, OEM के तय किए गए कॉन्टेक्स्ट को लॉन्च किया गया था. हालांकि, अब भी OEM प्लग इन सेवा के बिना इसका इस्तेमाल किया जा सकता है. ऑडियो का व्यवहार, स्टैटिक ऑडियो सेवा जैसा ही होता है:

  • ऑडियो फ़ोकस इंटरैक्शन. ऑडियो एट्रिब्यूट का इस्तेमाल, ऑडियो फ़ोकस इंटरैक्शन मैट्रिक के हिसाब से, सबसे अच्छी तरह से मैच करने वाले व्यवहार का पता लगाने के लिए किया जाता है. ज़्यादा जानकारी के लिए, ऑडियो फ़ोकस लेख पढ़ें.

  • ऑडियो वॉल्यूम कंट्रोल ऑडियो एट्रिब्यूट का इस्तेमाल, सबसे अच्छी तरह से मैच करने वाले आइटम का पता लगाने के लिए किया जाता है:

    • OEM के तय किए गए कॉन्टेक्स्ट के आधार पर वॉल्यूम ग्रुप.
    • कॉन्फ़िगर की गई स्टैटिक वॉल्यूम सूची से प्राथमिकता.
  • ऑडियो डकिंग की सुविधा का काम करने का तरीका:

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

    • ऑडियो एट्रिब्यूट का इस्तेमाल, स्टैटिक ऑडियो डकिंग मैट्रिक के आधार पर, डक करने के लिए मिलते-जुलते स्टैटिक कॉन्टेक्स्ट को मैप करने के लिए किया जाता है.

डाइनैमिक ऑडियो ज़ोन के कॉन्फ़िगरेशन

Android 14 में, ऑडियो ज़ोन के डाइनैमिक कॉन्फ़िगरेशन को शामिल करने के लिए, ऑडियो ज़ोन तय करने के लिए कार के ऑडियो कॉन्फ़िगरेशन स्कीमा को भी वर्शन 3 पर अपडेट किया गया है. नए स्कीमा के लिए, हर ज़ोन के लिए कॉन्फ़िगरेशन सेट अप करना ज़रूरी है.

<carAudioConfiguration version="3">
    <!-- optional OEM context -->
    <oemContexts>
      <oemContext name="media">
        <audioAttributes>
          <usage value="AUDIO_USAGE_MEDIA" />
          <usage value="AUDIO_USAGE_UNKNOWN"/>
        </audioAttributes>
      </oemContext>
      <oemContext name="game">
        <audioAttributes>
          <usage value="AUDIO_USAGE_GAME" />
        </audioAttributes>
      </oemContext>
...
    </oemContexts>
  <zones>
    <zone name="primary zone" isPrimary="true" occupantZoneId="0">
      <zoneConfigs>
        <zoneConfig name="primary zone config 0" isDefault="true">
          <volumeGroups>
            <group>
              <device address="bus0_media_out">
                <context context="media"/>
            <context context="game"/>
                <context context="announcement"/>
              </device>
              <device address="bus6_notification_out">
                <context context="notification"/>
              </device>
            </group>
  ...
      </zoneConfigs>
    </zone
  </zones>

ज़्यादा जानने के लिए, device/generic/car/emulator/audio/car_audio_configuration.xml में बताई गई वर्शन 3 फ़ाइल देखें. Android 14 से, प्राइमरी ज़ोन में सिर्फ़ एक (1) कॉन्फ़िगरेशन हो सकता है. प्राइमरी ज़ोन के अलावा, अन्य ज़ोन में कई कॉन्फ़िगरेशन हो सकते हैं. कार के ऑडियो कॉन्फ़िगरेशन पर ये नियम लागू होते हैं:

  • मुख्य ऑडियो ज़ोन में सिर्फ़ एक कॉन्फ़िगरेशन हो सकता है.

  • प्राइमरी ऑडियो ज़ोन के अलावा, अन्य ऑडियो ज़ोन में एक से ज़्यादा कॉन्फ़िगरेशन हो सकते हैं.

  • हर ऑडियो ज़ोन और ऑडियो ज़ोन कॉन्फ़िगरेशन के लिए, नाम यूनीक होना चाहिए.

  • ऑडियो ज़ोन में, ऑडियो कॉन्फ़िगरेशन अलग-अलग हो सकते हैं:

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

  • एक ही वॉल्यूम ग्रुप में शामिल ऑडियो डिवाइसों के लिए, ऑडियो वॉल्यूम बढ़ाने या घटाने की सुविधा के कॉन्फ़िगरेशन एक ही होने चाहिए.

  • हर ऑडियो कॉन्फ़िगरेशन के लिए, सभी ऑडियो कॉन्टेक्स्ट (OEM या स्टैटिक) असाइन किए जाने चाहिए.

नए सिस्टम के साथ काम करने की सुविधा

car_audio_configuration.xml के नए वर्शन में हर अपडेट के साथ नई सुविधाएं आती हैं. हालांकि, AAOS के नए वर्शन में अब भी पुरानी फ़ाइलों का इस्तेमाल किया जा सकता है. Android के नए वर्शन पर अपडेट करने वाले OEM, car_audio_configuration.xml फ़ाइल का फिर से इस्तेमाल कर सकते हैं.

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