वॉल्यूम मैनेजमेंट

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

तय किए गए वॉल्यूम

AAOS को लागू करने वाले डिवाइसों में, आवाज़ को कंट्रोल करने के लिए सॉफ़्टवेयर मिक्सर के बजाय, हार्डवेयर एम्प्लीफ़ायर का इस्तेमाल किया जाता है. साइड इफ़ेक्ट से बचने के लिए, config_useFixedVolume फ़्लैग को true (ज़रूरत के मुताबिक ओवरले करें) पर सेट करें:

<resources>
    <!-- Car uses hardware amplifier for volume. -->
    <bool name="config_useFixedVolume">true</bool>
</resources>

जब config_useFixedVolume फ़्लैग सेट नहीं होता है या false पर सेट होता है, तो ऐप्लिकेशन, सॉफ़्टवेयर मिक्सर में स्ट्रीम टाइप के हिसाब से वॉल्यूम बदलने के लिए, AudioManager.setStreamVolume() को कॉल कर सकते हैं. हालांकि, ऐसा हमेशा सही नहीं होता. इसकी वजह यह है कि इससे अन्य ऐप्लिकेशन पर असर पड़ सकता है. साथ ही, सॉफ़्टवेयर मिक्सर में आवाज़ कम होने की वजह से, हार्डवेयर ऐम्प्लीफ़ायर को मिलने वाले सिग्नल में कम बिट उपलब्ध हो सकती हैं.

वॉल्यूम ग्रुप

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

वॉल्यूम ग्रुप तय करना

CarAudioService, car_audio_configuration.xml में तय किए गए वॉल्यूम ग्रुप का इस्तेमाल करता है:

<audioZoneConfiguration version="4">
    </deviceConfigurations>
    <activationVolumeConfigs>
        <activationVolumeConfig name="activation_volume_on_boot_config">
            <activationVolumeConfigEntry minActivationVolumePercentage="10" maxActivationVolumePercentage="90"
            invocationType="onBoot" />
        </activationVolumeConfig>
        ...
    </activationVolumeConfigs>
    <zones>
        <zone name="primary zone" isPrimary="true">
          <zoneConfigs>
              <zoneConfig name="primary zone config 0" isDefault="true">
                <volumeGroups>
                    <group activationConfig="activation_volume_on_boot_config">
                        <device address="bus0_media_out">
                            <context context="music"/>
                        </device>
                    </group>
                    <group>
                        <device address="bus1_navigation_out">
                            <context context="navigation"/>
                        </device>
                        <device address="bus2_voice_command_out">
                            <context context="voice_command"/>
                        </device>
                    </group>
                    ...
                </volumeGroups>
              </zoneConfig>
              ...
            </zoneConfigs>
        </zone>
     </zones>
</audioZoneConfiguration>

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

वॉल्यूम ग्रुप के गेन को कॉन्फ़िगर करना

हर वॉल्यूम ग्रुप के लिए, कम से कम, ज़्यादा से ज़्यादा, और डिफ़ॉल्ट गेन वैल्यू होती हैं. साथ ही, वॉल्यूम ग्रुप से जुड़े डिवाइसों के लिए, audio_policy_configuration.xml में कॉन्फ़िगर की गई वैल्यू के आधार पर, स्टेप साइज़ होता है.

<devicePort tagName="bus0_media_out" role="sink" type="AUDIO_DEVICE_OUT_BUS" address="bus0_media_out">
  <profile name="" format="AUDIO_FORMAT_PCM_16_BIT" samplingRates="48000" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/>
  <gains>
    <gain name="" mode="AUDIO_GAIN_MODE_JOINT"
      minValueMB="-3200" maxValueMB="600" defaultValueMB="0" stepValueMB="100"/>
  </gains>
</devicePort>

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

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

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

वॉल्यूम ग्रुप आइडेंटिफ़ायर

वॉल्यूम ग्रुप की पहचान रनटाइम में, एक्सएमएल फ़ाइल में तय किए गए क्रम के हिसाब से की जाती है. ऑडियो ज़ोन में आईडी की रेंज 0 से N-1 तक होती है. यहां N, उस ज़ोन में मौजूद वॉल्यूम ग्रुप की संख्या है. इस तरह, ज़ोन के हिसाब से वॉल्यूम ग्रुप आईडी अलग-अलग नहीं होते. इन आइडेंटिफ़ायर का इस्तेमाल, वॉल्यूम ग्रुप से जुड़े CarAudioManager एपीआई के लिए किया जाता है. अगर कोई एपीआई, zoneId के बिना groupId लेता है, तो वह डिफ़ॉल्ट रूप से प्राइमरी ऑडियो ज़ोन पर सेट हो जाता है.

एक से ज़्यादा ज़ोन के लिए वॉल्यूम मैनेज करने की सुविधा

हर ऑडियो ज़ोन में एक या उससे ज़्यादा वॉल्यूम ग्रुप होने चाहिए. साथ ही, हर वॉल्यूम ग्रुप सिर्फ़ एक ऑडियो ज़ोन से जुड़ा होना चाहिए. इस संबंध को car_audio_configuration.xml के हिस्से के तौर पर तय किया गया है. ज़्यादा जानने के लिए, ऊपर दिया गया उदाहरण देखें. यह उदाहरण, वॉल्यूम ग्रुप तय करना लेख में दिया गया है.

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

कम से कम और ज़्यादा से ज़्यादा ऐक्टिवेशन वॉल्यूम

Android 15 में, कार के ऑडियो सिस्टम में बेहतर सुरक्षा और उपयोगकर्ता के आराम के लिए, वॉल्यूम ग्रुप इंडेक्स को कंट्रोल करने की सुविधा जोड़ी गई है. इसके लिए, कम से कम और ज़्यादा से ज़्यादा ऐक्टिवेशन वॉल्यूम का इस्तेमाल किया जाता है. इन्हें कार के ऑडियो कॉन्फ़िगरेशन में कॉन्फ़िगर किया जाता है (वॉल्यूम ग्रुप तय करना देखें). इस सुविधा को चालू करने के लिए, कार सेवा से जुड़े RRO में audioUseMinMaxActivationVolume को true पर सेट करें.

activationVolumeConfigs में कई activationVolumeConfig एंट्री तय की जा सकती हैं. इनमें से हर एंट्री, कम से कम और ज़्यादा से ज़्यादा ऐक्टिवेशन कॉन्फ़िगरेशन को दिखाती है. हर activationVolumeConfig:

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

हर activationVolumeConfig में ये एट्रिब्यूट शामिल होते हैं:

  • minActivationVolumePercentage (पूर्णांक, 0 से 100 तक, वैकल्पिक, डिफ़ॉल्ट: 0): यह प्रतिशत के तौर पर, कम से कम ऐक्टिवेशन वॉल्यूम तय करता है.
  • maxActivationVolumePercentage (पूर्णांक, 0-100, ज़रूरी नहीं, डिफ़ॉल्ट: 100): यह प्रतिशत के तौर पर, ज़्यादा से ज़्यादा ऐक्टिवेशन वॉल्यूम तय करता है.
  • invocationType (स्ट्रिंग, ज़रूरी नहीं, डिफ़ॉल्ट: onPlaybackChanged): इससे यह तय होता है कि कम से कम और ज़्यादा से ज़्यादा ऐक्टिवेशन वॉल्यूम कब लागू होगा:

    • onBoot: बूट होने के बाद, वॉल्यूम ग्रुप पर पहली बार चालू किए गए नए डिवाइस पर ही लागू होता है.
    • onSourceChanged: यह सिर्फ़ वॉल्यूम ग्रुप पर, नए ऐप्लिकेशन या यूआईडी सोर्स के साथ चालू किए गए प्लेबैक पर लागू होता है.
    • onPlaybackChanged: इसे वॉल्यूम ग्रुप पर, हर नए तरीके से शुरू किए गए प्लेबैक पर लागू किया जाता है.

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

  • मौजूदा समय में चल रहे ट्रैक
  • कॉल की मौजूदा स्थिति
  • ऑडियो कंट्रोल HAL से ऑडियो फ़ोकस का मौजूदा अनुरोध. इसमें ऑडियो कंट्रोल HAL से ऑडियो फ़ोकस का अनुरोध यह सिग्नल देता है कि Android के बाहर ऑडियो चल रहा है

इस इमेज में, कम से कम और ज़्यादा से ज़्यादा ऐक्टिवेशन वॉल्यूम मैनेजमेंट की खास जानकारी दी गई है:

इमेज

पहली इमेज. ऑडियो डेटा के चालू पाथ के लिए, कम से कम और ज़्यादा से ज़्यादा ऐक्टिवेशन वॉल्यूम मैनेज करना.

तय की गई minActivationVolumePercentage, maxActivationVolumePercentage, कम से कम और ज़्यादा से ज़्यादा वॉल्यूम गेन इंडेक्स की मदद से, हर वॉल्यूम ग्रुप के लिए कम से कम और ज़्यादा से ज़्यादा ऐक्टिवेशन वॉल्यूम गेन इंडेक्स का हिसाब लगाया जा सकता है. CarAudioService यह सुविधा, हर नए प्लेबैक पर नज़र रखती है. साथ ही, इन शर्तों के तहत कम से कम और ज़्यादा से ज़्यादा आवाज़ के लेवल को लागू करती है:

  • इनवोकेशन टाइप मैच होना चाहिए: ऑडियो चलाने की सुविधा के चालू होने का टाइप (Audio Manager, Audio Control HAL या Telephony Manager से मिला) invocationType से मेल खाना चाहिए. invocationType, वॉल्यूम ग्रुप से जुड़े activationVolumeConfigEntry में दिया गया होता है.
  • वॉल्यूम इंडेक्स, तय सीमा से बाहर है: वॉल्यूम ग्रुप का मौजूदा वॉल्यूम गेन इंडेक्स, वॉल्यूम गेन इंडेक्स की तय की गई सीमा से बाहर होना चाहिए. खास तौर पर, इनमें से कोई एक शर्त पूरी होनी चाहिए:

    • यह इंडेक्स, कैलकुलेट किए गए कम से कम ऐक्टिवेशन वॉल्यूम गेन इंडेक्स से कम है.

      या

    • इंडेक्स, कैलकुलेट किए गए ज़्यादा से ज़्यादा ऐक्टिवेशन वॉल्यूम गेन इंडेक्स से ज़्यादा है.

अगर किसी वॉल्यूम ग्रुप के लिए ऐक्टिवेशन मैच होता है, तो उसके वॉल्यूम गेन इंडेक्स को इनमें से किसी एक वैल्यू पर सेट किया जाएगा:

  • अगर कम से कम एक्टिवेशन वॉल्यूम गेन इंडेक्स, कम से कम एक्टिवेशन वॉल्यूम गेन इंडेक्स से कम है

    या

  • अगर मैक्सिमम ऐक्टिवेशन वॉल्यूम गेन इंडेक्स, मैक्सिमम ऐक्टिवेशन वॉल्यूम गेन इंडेक्स से ज़्यादा है, तो मैक्सिमम ऐक्टिवेशन वॉल्यूम गेन इंडेक्स

इसके अलावा, इवेंट टाइप EVENT_TYPE_VOLUME_GAIN_INDEX_CHANGED वाला कार वॉल्यूम ग्रुप इवेंट, रजिस्टर किए गए सभी वॉल्यूम ग्रुप इवेंट कॉलबैक को भेजा जाता है.

आवाज़ कम-ज़्यादा करने वाले बटन के इवेंट मैनेज करना

Android, वॉल्यूम कंट्रोल के लिए कई कीकोड तय करता है. इनमें ये शामिल हैं:

  • KEYCODE_VOLUME_UP
  • KEYCODE_VOLUME_DOWN
  • KEYCODE_VOLUME_MUTE

डिफ़ॉल्ट रूप से, Android वॉल्यूम बटन दबाने से जुड़े इवेंट को ऐप्लिकेशन पर भेजता है. ऑटोमोटिव कंपनियों को, इन मुख्य इवेंट को CarAudioService से प्रोसेस करने के लिए मजबूर करना चाहिए. इसके बाद, CarAudioService या setMasterMute को कॉल किया जाता है.setGroupVolume इस व्यवहार को लागू करने के लिए, config_handleVolumeKeysInWindowManager फ़्लैग को true पर सेट करें:

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

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

फ़ेड और बैलेंस

AudioControl HAL के दोनों वर्शन में, वाहन में फ़ेड और बैलेंस सेट करने के लिए एपीआई शामिल होते हैं. CarAudioManager के लिए सिस्टम एपीआई, AudioControl HAL को वैल्यू पास करते हैं. इन एपीआई के लिए android.car.permission.CAR_CONTROL_AUDIO_VOLUME की ज़रूरत होती है. AudioControl API ये हैं:

  • setBalanceTowardRight(float value) से, स्पीकर का वॉल्यूम कार की दाईं (+) या बाईं (-) ओर शिफ्ट हो जाता है.

    • 0.0 को बीच में रखा गया है
    • +1.0 पूरी तरह से सही है
    • -1.0 का मतलब है कि आवाज़ पूरी तरह से बाईं ओर है
    • -1 से 1 के बीच की वैल्यू न होने पर गड़बड़ी होती है
  • setFadeTowardFront(float value) से, स्पीकर की आवाज़ को कार के आगे (+) या पीछे (-) की ओर किया जाता है.

    • 0.0 को बीच में रखा गया है
    • +1.0 पूरी तरह से आगे की ओर है
    • -1.0 का मतलब है कि आवाज़ पूरी तरह से पीछे से आ रही है
    • -1 से 1 के बीच की वैल्यू न होने पर गड़बड़ी होती है

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

ऑडियो डकिंग

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

कब झुकना है

हालांकि, यह तय करना ओईएम पर निर्भर करता है कि HAL, डकिंग को कैसे मैनेज करता है. हमारा सुझाव है कि आप इन दिशा-निर्देशों का पालन करें.

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

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

यहां कुछ ऐसी संभावित स्थितियां दी गई हैं जिनमें डकिंग का इस्तेमाल करने का सुझाव दिया जाता है.

इंटरैक्शन कार्रवाई
EMERGENCY SAFETY को छोड़कर, बाकी सभी सूचनाओं को खारिज या म्यूट कर देता है
SAFETY EMERGENCY को छोड़कर, बाकी सभी आवाज़ों को कम कर देता है
NAVIGATION SAFETY और EMERGENCY को छोड़कर, बाकी सभी को डक करता है
CALL SAFETY, EMERGENCY, और NAVIGATION को छोड़कर, बाकी सभी चीज़ें डक कर दी जाती हैं
VOICE बतख CALL_RING
VEHICLE_SOUNDS आपके पास यह तय करने का विकल्प होता है कि चालू आवाज़ कितनी ज़रूरी है और क्या यह अन्य आवाज़ों को कम करेगी या नहीं.
MUSIC और ANNOUNCEMENT हर चीज़ से डक किया गया. हालांकि, टच इंटरैक्शन की टोन को SYSTEM_SOUND के तौर पर चलाया जाता है.

नीचे झुकते समय ध्यान रखने वाली बातें

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

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

सुरक्षा के लिए ज़रूरी आवाज़ें

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

वॉल्यूम की सेटिंग के यूज़र इंटरफ़ेस (यूआई) को कॉन्फ़िगर करना

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

कार की सेटिंग के यूज़र इंटरफ़ेस (यूआई) में, packages/apps/Car/Settings/res/xml/car_volume_items.xml में हर AudioAttributes.USAGE से जुड़े यूज़र इंटरफ़ेस (यूआई) एलिमेंट (टाइटल और आइकॉन रिसॉर्स) शामिल होते हैं. इस फ़ाइल में, हर VolumeGroup में मौजूद पहले इस्तेमाल से जुड़े संसाधनों का इस्तेमाल करके, तय किए गए VolumeGroups को सही तरीके से रेंडर किया जाता है.

उदाहरण के लिए, यहां दिए गए उदाहरण में VolumeGroup को voice_communication और voice_communication_signalling के तौर पर तय किया गया है. कार की सेटिंग के यूज़र इंटरफ़ेस (यूआई) के डिफ़ॉल्ट तरीके से लागू करने पर, VolumeGroup रेंडर होता है. ऐसा इसलिए होता है, क्योंकि voice_communication से जुड़े संसाधनों का इस्तेमाल किया जाता है. साथ ही, फ़ाइल में यह पहला मैच होता है.

<carVolumeItems xmlns:car="http://schemas.android.com/apk/res-auto">
    <item car:usage="voice_communication"
          car:title="@*android:string/volume_call"
          car:icon="@*android:drawable/ic_audio_ring_notif"/>
    <item car:usage="voice_communication_signalling"
          car:title="@*android:string/volume_call"
          car:icon="@*android:drawable/ic_audio_ring_notif"/>
    <item car:usage="media"
          car:title="@*android:string/volume_music"
          car:icon="@*android:drawable/ic_audio_media"/>
    <item car:usage="game"
          car:title="@*android:string/volume_music"
          car:icon="@*android:drawable/ic_audio_media"/>
    <item car:usage="alarm"
          car:title="@*android:string/volume_alarm"
          car:icon="@*android:drawable/ic_audio_alarm"/>
    <item car:usage="assistance_navigation_guidance"
          car:title="@string/navi_volume_title"
          car:icon="@drawable/ic_audio_navi"/>
    <item car:usage="notification_ringtone"
          car:title="@*android:string/volume_ringtone"
          car:icon="@*android:drawable/ic_audio_ring_notif"/>
    <item car:usage="assistant"
          car:title="@*android:string/volume_unknown"
          car:icon="@*android:drawable/ic_audio_vol"/>
    <item car:usage="notification"
          car:title="@*android:string/volume_notification"
          car:icon="@*android:drawable/ic_audio_ring_notif"/>
    <item car:usage="notification_communication_request"
          car:title="@*android:string/volume_notification"
          car:icon="@*android:drawable/ic_audio_ring_notif"/>
    <item car:usage="notification_communication_instant"
          car:title="@*android:string/volume_notification"
          car:icon="@*android:drawable/ic_audio_ring_notif"/>
    <item car:usage="notification_communication_delayed"
          car:title="@*android:string/volume_notification"
          car:icon="@*android:drawable/ic_audio_ring_notif"/>
    <item car:usage="notification_event"
          car:title="@*android:string/volume_notification"
          car:icon="@*android:drawable/ic_audio_ring_notif"/>
    <item car:usage="assistance_accessibility"
          car:title="@*android:string/volume_notification"
          car:icon="@*android:drawable/ic_audio_ring_notif"/>
    <item car:usage="assistance_sonification"
          car:title="@*android:string/volume_unknown"
          car:icon="@*android:drawable/ic_audio_vol"/>
    <item car:usage="unknown"
          car:title="@*android:string/volume_unknown"
          car:icon="@*android:drawable/ic_audio_vol"/>
</carVolumeItems>

ऊपर दिए गए कॉन्फ़िगरेशन में इस्तेमाल किए गए एट्रिब्यूट और वैल्यू, packages/apps/Car/Settings/res/values/attrs.xml में बताई गई हैं. आवाज़ की सेटिंग वाले यूज़र इंटरफ़ेस (यूआई) में, VolumeGroup पर आधारित CarAudioManager API का इस्तेमाल किया जाता है:

  • getVolumeGroupCount() यह तय करता है कि कितने कंट्रोलर बनाए जाने चाहिए.
  • निचली और ऊपरी सीमाएं पाने के लिए, getGroupMinVolume() और getGroupMaxVolume() का इस्तेमाल करें.
  • getGroupVolume() पर टैप करें.
  • registerVolumeChangeObserver() को आवाज़ में हुए बदलावों की सूचना दी जाएगी.

कार वॉल्यूम ग्रुप इवेंट

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

  • CarVolumeGroupInfo की सूची
  • EventTypes (बिट-मैप किया गया)
  • ExtraInfos की सूची

CarVolumeGroupInfo

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

EventTypes

इससे पता चलता है कि CarVolumeGroupInfo का कौनसा पहलू बदला है. ऐप्लिकेशन इसका इस्तेमाल, बदलावों की पहचान करने और ज़रूरी कार्रवाइयां करने के लिए कर सकते हैं. उदाहरण के लिए, EVENT_TYPE_VOLUME_MAX_INDEX_CHANGED से पता चलता है कि CarVolumeGroups के ज़्यादा से ज़्यादा वॉल्यूम गेन इंडेक्स में बदलाव हुआ है. साथ ही, CarVolumeGroupInfo.getMaxVolumeGainIndex() से इसके बारे में क्वेरी की जा सकती है.

यहां दी गई टेबल में, EventType और CarVolumeGroupInfo के बीच के संबंध को दिखाया गया है.

EventType CarVolumeGroupInfo
EVENT_TYPE_VOLUME_GAIN_INDEX_CHANGED CarVolumeGroupInfo.getVolumeGainIndex()
EVENT_TYPE_VOLUME_MIN_INDEX_CHANGED CarVolumeGroupInfo.getMinVolumeGainIndex()
EVENT_TYPE_VOLUME_MAX_INDEX_CHANGED CarVolumeGroupInfo.getMaxVolumeGainIndex()
EVENT_TYPE_MUTE_CHANGED CarVolumeGroupInfo.isMuted()
EVENT_TYPE_VOLUME_BLOCKED_CHANGED CarVolumeGroupInfo.isBlocked()
EVENT_TYPE_ATTENUATION_CHANGED CarVolumeGroupInfo.isAttenuated()
EVENT_TYPE_ZONE_CONFIGURATION_CHANGED CarVolumeGroupInfo.getAudioAttributes()

ExtraInfos

इससे यह पता चलता है कि CarVolumeGroup में बदलाव क्यों हुआ है. ऐप्लिकेशन इस जानकारी का इस्तेमाल, उपयोगकर्ता को कार्रवाई करने के लिए सूचना देने या सूचना देने के लिए कर सकते हैं. उदाहरण के लिए, EXTRA_INFO_TRANSIENT_ATTENUATION_THERMAL से पता चलता है कि डिवाइस ज़्यादा गर्म होने की वजह से, कुछ समय के लिए सिग्नल कमज़ोर हो गया है. अगर उपयोगकर्ता आवाज़ बढ़ाने की कोशिश करता है, तो ऐप्लिकेशन उसे इसकी जानकारी दे सकता है.

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

कार का ऑडियो फ़्रेमवर्क, AudioControl HAL IAudioGainCallback पर निर्भर करता है, ताकि ExtraInfos के बारे में सुझाव दिए जा सकें. ज़्यादा जानने के लिए, ऑडियो गेन कॉलबैक देखें.

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

कार के वॉल्यूम ग्रुप के इवेंट का कॉलबैक

Android 14, विशेषाधिकार वाले ऐप्लिकेशन और प्लैटफ़ॉर्म ऐप्लिकेशन के लिए एक नया कॉलबैक उपलब्ध कराता है. इससे वे CarVolumeGroupEvents के लिए रजिस्टर कर सकते हैं और इसकी सूचना पा सकते हैं.

  • कॉल बैक के लिए रजिस्टर करने के लिए, CarAudioManager#registerCarVolumeGroupEventCallback() का इस्तेमाल करें

  • कॉलबैक का रजिस्ट्रेशन रद्द करने के लिए, CarAudioManager#unregisterCarVolumeGroupEventCallback() का इस्तेमाल करें

अगर कोई ऐप्लिकेशन, नए CarVolumeGroupEventCallback और लेगसी CarVolumeCallback, दोनों के साथ रजिस्टर करता है, तो इवेंट CarVolumeGroupEventCallbacks को प्राथमिकता दी जाती है. कार का ऑडियो स्टैक अब CarVolumeCallback को ट्रिगर नहीं करता. इससे एक ही इवेंट के लिए, एक ही ऐप्लिकेशन को डुप्लीकेट ट्रिगर नहीं किया जा सकेगा.

हमारा सुझाव है कि ग्रुप के वॉल्यूम और म्यूट करने से जुड़े बदलावों को मैनेज करने के लिए, CarVolumeGroupEventCallback का इस्तेमाल करें.

ऑडियो गेन कॉलबैक

Android 13 से, AudioControl HAL, कार के ऑडियो सिस्टम में होने वाले बदलावों की वजह से, वॉल्यूम लेवल के अपडेट को मैनेज करने के लिए, एसिंक्रोनस कॉलबैक को ट्रिगर कर सकता है.

HAL API

AudioControl @2.0 AIDL

AudioControl AIDL HAL के वर्शन 2.0 में, ये एपीआई जोड़े गए हैं:

एपीआई मकसद
IAudioControl#registerGainCallback यह AudioControl HAL के साथ IAudioGainCallback का इंस्टेंस रजिस्टर करता है.
IAudioGainCallback#onAudioDeviceGainsChanged ऑडियो गेन कॉन्फ़िगरेशन में हुए बदलावों की सूचना देने के लिए, असिंक्रोनस कॉलबैक.

AudioControl HAL कॉलबैक में, वजहों की सूचियां और उनसे जुड़े AudioGainConfigInfo शामिल होते हैं. इनमें ये शामिल हैं:

  • ज़ोन आईडी
  • डिवाइस के पोर्ट का पता
  • वॉल्यूम इंडेक्स > इंडेक्स, प्रतिबंधित इंडेक्स या अपडेट इंडेक्स हो सकता है.

इन वजहों को मुख्य रूप से इन कैटगरी में बांटा जा सकता है:

  • पाबंदी लगने की वजहें. वॉल्यूम और म्यूट करने की सुविधा में कुछ समय के लिए बदलाव होता है.
  • अपडेट की वजहें. वॉल्यूम के व्यवहार में हमेशा के लिए बदलाव.

पाबंदियों के टाइप

AudioControl HAL AIDL V3 से, पाबंदियों के ये टाइप इस्तेमाल किए जा सकते हैं:

  • म्यूट करें
  • ब्लॉक करना
  • पाबंदी
  • क्षीणता
पाबंदी लागू है उपयोगकर्ता के ट्रिगर करने पर आवाज़ में बदलाव होना उपयोगकर्ता की ओर से ट्रिगर किया गया म्यूट करने का टॉगल
म्यूट करें ❌ (अनम्यूट करें)

✔ (म्यूट करें)
ब्लॉक करना
पाबंदी ❌ (तय सीमा से ज़्यादा)

✔ (तय सीमा से कम)
क्षीणता

पाबंदियों को इस क्रम में प्राथमिकता दी जाती है: आवाज़ बंद करना > ब्लॉक करना > सीमित करना > कम करना.

म्यूट करने से जुड़ी पाबंदियां

म्यूट करने से जुड़ी पाबंदियां ये हैं:

  • Reasons.TCU_MUTE
  • Reasons.REMOTE_MUTE

कार ऑडियो फ़्रेमवर्क, इन दो म्यूट स्थितियों को अंदरूनी तौर पर बनाए रखता है:

  • उपयोगकर्ता को म्यूट करना. उपयोगकर्ता के अनुरोध के आधार पर टॉगल किया जाता है. यह अनुरोध, CarAudioManager या मुख्य इवेंट के ज़रिए किया जाता है.

  • HAL mute. AudioGain कॉलबैक के ज़रिए मिली म्यूट करने की पाबंदियों के आधार पर टॉगल किया जाता है.

सेटिंग ऐप्लिकेशन जैसे सुनने वाले ऐप्लिकेशन के लिए, वॉल्यूम ग्रुप के पूरी तरह म्यूट होने की स्थिति (CarVolumeGroupInfo.isMuted()) इस बात पर निर्भर करेगी कि ऊपर दिए गए दोनों म्यूट में से कोई एक चालू है या नहीं.

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

इंटरैक्शन का उदाहरण: HAL म्यूट करने की सुविधा चालू है और उपयोगकर्ता ने म्यूट टॉगल करने का अनुरोध किया है

जब HAL म्यूट करने की सुविधा चालू हो और उपयोगकर्ता के म्यूट करने की सुविधा बंद हो, तब:

  • वॉल्यूम ग्रुप की पूरी म्यूट स्थिति को true में बदल दिया गया है.
  • उपयोगकर्ता के म्यूट करने के अनुरोधों को प्रोसेस किया जाएगा.
    • वजह: उपयोगकर्ताओं की निजता को बनाए रखने के लिए, उनके म्यूट करने के अनुरोधों को हमेशा स्वीकार किया जाना चाहिए.

जब HAL म्यूट करने की सुविधा और उपयोगकर्ता के लिए म्यूट करने की सुविधा चालू हो:

  • वॉल्यूम ग्रुप की पूरी म्यूट स्थिति को true में बदल दिया गया है.

  • उपयोगकर्ता के अनम्यूट करने के अनुरोधों को NOT प्रोसेस किया जाएगा. कैश की गई उपयोगकर्ता की म्यूट स्थिति चालू रहती है.

    • वजह: उपयोगकर्ता के अनम्यूट करने के अनुरोधों को सिर्फ़ तब स्वीकार किया जाएगा, जब कोई पाबंदी लागू न हो.

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

इंटरैक्शन का उदाहरण: उपयोगकर्ता के म्यूट करने की सुविधा में कोई बदलाव नहीं हुआ है, जबकि HAL म्यूट करने की सुविधा चालू और बंद की गई है

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

  • वॉल्यूम ग्रुप की पूरी म्यूट स्थिति को true में बदल दिया गया है.
  • HAL म्यूट की सुविधा चालू होने पर, उपयोगकर्ता के आवाज़ बदलने के अनुरोध NOT प्रोसेस किए जाएंगे.

    • वजह: म्यूट किए जाने पर, उपयोगकर्ता को आवाज़ नहीं सुनाई देती. आवाज़ में बदलाव करने की अनुमति देने से, आवाज़ अचानक से बहुत तेज़ हो सकती है. इससे उपयोगकर्ता की सुरक्षा को खतरा हो सकता है.

    • वजह: वॉल्यूम ऐप्लिकेशन, कॉल बैक के लिए रजिस्टर कर सकते हैं. साथ ही, उपयोगकर्ता के किसी भी इंटरैक्शन के बिना, अपने-आप अनम्यूट हो सकते हैं. ऐसा तब होता है, जब ओईएम को ऐसा ही व्यवहार चाहिए होता है. इसके लिए, उन्हें CarAudioManager.setVolumeGroupMute(...,/* mute=*/ true,..)) को ट्रिगर करना होता है.

जब उपयोगकर्ता के म्यूट करने की सुविधा बंद हो और HAL के म्यूट करने की सुविधा भी बंद हो, तब:

  • वॉल्यूम ग्रुप की म्यूट स्थिति को false में बदल दिया गया है.

    वजह: म्यूट किए गए वीडियो को स्टिकी स्टेट में रखने और उपयोगकर्ता से वीडियो को अनम्यूट करने का अनुरोध करने से, उपयोगकर्ता को बेवजह रुकावट आ सकती है. ऐसा तब होता है, जब म्यूट करने की स्थिति को बार-बार टॉगल किया जाता है.

  • उपयोगकर्ताओं के वॉल्यूम बदलने के अनुरोधों को सामान्य तरीके से प्रोसेस किया जाएगा.

ब्लॉक करना

ब्लॉक करने से जुड़ी पाबंदियां ये हैं:

  • Reasons.FORCED_MASTER_MUTE
  • Reasons.REMOTE_MUTE
  • Reasons.TCU_MUTE.

ब्लॉक करने से जुड़ी पाबंदियां लागू होने पर, उपयोगकर्ता ये काम नहीं कर सकते:

  • वॉल्यूम कम या ज़्यादा करने के अनुरोध प्रोसेस नहीं किए जाएंगे.
  • म्यूट करने की सुविधा को टॉगल करने की प्रोसेस पूरी हो गई है.

पाबंदी

सीमा से जुड़ी पाबंदियां ये हैं:

  • Reasons.THERMAL_LIMITATION
  • Reasons.SUSPEND_EXIT_VOL_LIMITATION

जब सीमा से जुड़ी पाबंदियां लागू होती हैं, तब उपयोगकर्ता ये काम नहीं कर सकते:

  • आवाज़ कम या ज़्यादा करना:

    • सीमा के अंदर प्रोसेस किए जाते हैं
    • ऊपर दी गई सीमा से ज़्यादा डेटा प्रोसेस नहीं किया जाता
  • म्यूट करने की सुविधा को टॉगल करने की प्रोसेस पूरी हो गई है.

क्षीणता

सिग्नल कमज़ोर होने से जुड़ी पाबंदियां ये हैं:

  • Reasons.ADAS_DUCKING
  • Reasons.NAV_DUCKING
  • Reasons.PROJECTION_DUCKING

जब एटेन्यूशन से जुड़ी पाबंदियां लागू होती हैं, तब उपयोगकर्ता इन कार्रवाइयों के लिए अनुरोध नहीं कर सकते:

  • आवाज़ कम या ज़्यादा करने के अनुरोध प्रोसेस किए जाते हैं. वॉल्यूम का नया लेवल, कम किए गए वॉल्यूम पर सेट होता है. यह पहले वाले वॉल्यूम पर सेट नहीं होता. आने वाले समय में वॉल्यूम में होने वाले बदलाव, इसी लेवल से किए जाएंगे.

  • म्यूट करने की सुविधा चालू या बंद की गई.

इंडेक्स में अपडेट करना

यहां एसिंक्रोनस वॉल्यूम इंडेक्स अपडेट का उदाहरण दिया गया है: Reasons.EXTERNAL_AMP_VOL_FEEDBACK.

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

उदाहरण

इस्तेमाल का उदाहरण: उपयोगकर्ता ने वॉल्यूम इंडेक्स को 30 पर अपडेट किया

  • उपयोगकर्ता, आवाज़ कम या ज़्यादा करने वाले ऐप्लिकेशन का इस्तेमाल करके, आवाज़ के इंडेक्स को 30 पर सेट करता है.

  • इस इंडेक्स को वॉल्यूम बढ़ाने में बदल दिया जाता है और इसे ऑडियो HAL को भेज दिया जाता है.

  • वेंडर के लागू किए गएAudio HAL को वॉल्यूम बढ़ाने की नई सुविधा मिलती है और यह ऑडियो सिस्टम (जैसे, बाहरी ऐंप) को अपडेट करता है.

  • ऑडियो सिस्टम जवाब देता है कि वॉल्यूम लेवल को सिर्फ़ इंडेक्स 15 पर अपडेट किया गया है. Android को इसकी वजह नहीं पता.

  • वेंडर की ओर से लागू किए गए AudioControl HAL ट्रिगर:

    IAudioGainCallback.onAudioDeviceGainsChanged(EXTERNAL_AMP_VOL_FEEDBACK, {...,  15 /* New index */})
    
  • कार में ऑडियो की सुविधा देने वाली सेवा, कॉल बैक से मिले नए इंडेक्स का इस्तेमाल करती है. इसका इस्तेमाल, डेटा को सेव करने और वॉल्यूम ऐप्लिकेशन को कॉल बैक करने के लिए किया जाता है. उपयोगकर्ता ने 30 इंडेक्स का अनुरोध किया है. हालांकि, ऑडियो सिस्टम एसिंक्रोनस फ़ीडबैक, इंडेक्स को 15 पर अपडेट करता है.

इस्तेमाल का उदाहरण: निलंबित किए गए खाते को वापस लाने के बाद पहली बार ऑडियो चलाना

  • निलंबित करने से पहले वॉल्यूम इंडेक्स 95 पर सेट किया गया था. इसकी रेंज [0-99] है.

  • Android निलंबित हो जाता है.

  • Android ऐप्लिकेशन के बंद होने के बाद, उसे निलंबित करें (उदाहरण के लिए, फिर से शुरू करें):

    • वेंडर Audio HAL/AudioControl HAL, ऑडियो सिस्टम पर स्थानीय तौर पर 30 का सुरक्षित इंडेक्स लागू करता है.

    • वेंडर AudioControl HAL भी सुरक्षित इंडेक्स के लिए कॉलबैक को ट्रिगर करता है:

    IAudioGainCallback.onAudioDeviceGainsChanged(SUSPEND_EXIT_VOL_LIMITATION, {...,  30 /* safe index */})
    
  • कार में ऑडियो की सुविधा देने वाली सेवा, कॉलबैक से मिले नए इंडेक्स का इस्तेमाल करती है. इसका इस्तेमाल, इंडेक्स को सेव करने के लिए किया जाता है. साथ ही, यह सेवा वॉल्यूम ऐप्लिकेशन को इंडेक्स सिंक करने के लिए, अपने कॉलबैक का इस्तेमाल करती है. निलंबित किए जाने से पहले वॉल्यूम इंडेक्स 95 है. हालांकि, फिर से शुरू करने के बाद, AudioControl HAL लागू करने वाले व्यक्ति ने इस इंडेक्स को आवाज़ के सुरक्षित लेवल 30 पर सेट कर दिया है.

डाइनैमिक वॉल्यूम कॉन्फ़िगरेशन

इस सुविधा के लिए, हम इस्तेमाल के इन मुख्य उदाहरणों पर विचार करते हैं:

  1. वाहन के प्रोडक्शन के बंद होने (ईओएल) का कॉन्फ़िगरेशन.

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

    • कार बनाने वाली कंपनियों को, सर्विस शेड्यूल के दौरान वॉल्यूम कॉन्फ़िगरेशन को अपडेट करना पड़ सकता है.

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

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

डिज़ाइन

डाइनैमिक वॉल्यूम कॉन्फ़िगरेशन को तीन चरणों में पूरा किया जाता है:

  • डिस्कवरी. वेंडर के AudioControl HAL को, वेंडर के मालिकाना हक वाले कस्टम आईपीसी मैकेनिज़्म के ज़रिए वॉल्यूम की नई रेंज के अपडेट मिलते हैं.

    इसका पता चलने पर, AudioControl::IModuleChangeCallback के ज़रिए कॉलबैक जनरेट किया जाता है.

  • अपडेट करें. कार का ऑडियो स्टैक, वॉल्यूम ग्रुप की स्थितियों को नई वॉल्यूम रेंज के साथ अपडेट करता है.

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

  • कॉलबैक.

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

    • CarVolumeGroupEvent में अपडेट किया गया CarVolumeGroupInfo, इवेंट टाइप (क्या बदला) और अतिरिक्त जानकारी (बदलाव क्यों हुआ) शामिल होती है.

इमेज

दूसरी इमेज. वॉल्यूम के डाइनैमिक कॉन्फ़िगरेशन की सुविधा.

HAL API

AudioControl @ 3.0 AIDL

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

एपीआई
IAudioControl#setModuleChangeCallback यह AudioControl HAL के साथ IModuleChangeCallback का इंस्टेंस सेट करता है.
IAudioControl#clearModuleChangeCallback यह फ़ंक्शन, AudioControl HAL के साथ पहले सेट किए गए IModuleChangeCallback के इंस्टेंस को मिटाता है.
IModuleChangeCallback#onAudioPortsChanged AudioPorts में हुए बदलावों की सूचना देने के लिए कॉलबैक

क्रम

डाइनैमिक वॉल्यूम कॉन्फ़िगरेशन का क्रम डायग्राम यहां दिखाया गया है.

इमेज

तीसरी इमेज. डाइनैमिक वॉल्यूम कॉन्फ़िगरेशन के लिए सीक्वेंस डायग्राम.

मुख्य पहलू

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

  • कॉलबैक के हिस्से के तौर पर दिए गए AudioPorts, Automotive BUS की परिभाषा से ज़रूर मेल खाने चाहिए:

    • डिवाइस पोर्ट. IN_DEVICE, OUT_DEVICE
    • कनेक्शन. BUS
    • पता. ऑडियो एचएएल की परिभाषा में बताया गया है
    • गेन मोड. JOINT
  • वेंडर को Audio HAL की नीति में, वॉल्यूम रेंज की परिभाषाओं का सुपरसेट तय करना होगा. साथ ही, वाहन के अलग-अलग वैरिएंट के लिए इसे पसंद के मुताबिक बनाने के लिए, कॉलबैक का इस्तेमाल करना होगा. ज़्यादा जानकारी के लिए, IModuleChangeCallbac AIDL की परिभाषा देखें.

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