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

वॉल्यूम मैनेजमेंट, 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 यह सुविधा, हर नए प्लेबैक पर नज़र रखती है. साथ ही, इन शर्तों के तहत कम से कम और ज़्यादा से ज़्यादा एक्टिवेशन वॉल्यूम लागू करती है:

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

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

      या

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

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

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

    या

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

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

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

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

  • KEYCODE_VOLUME_UP
  • KEYCODE_VOLUME_DOWN
  • KEYCODE_VOLUME_MUTE

डिफ़ॉल्ट रूप से, Android, वॉल्यूम बटन दबाने से जुड़े इवेंट को ऐप्लिकेशन पर भेजता है. ऑटोमोटिव से जुड़े कारोबारों को इन मुख्य इवेंट को CarAudioService से प्रोसेस करने के लिए मजबूर करना चाहिए. इसके बाद, CarAudioService, setGroupVolume या setMasterMute को कॉल करता है. इस व्यवहार को लागू करने के लिए, 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 के पास डकिंग के फ़ैसले लेने के लिए मुख्य जानकारी यह होती है कि क्या दोनों आउटपुट डिवाइसों में स्ट्रीम चालू हैं या नहीं.

कब झुकना है

हालांकि, यह तय करना ओईएम पर निर्भर करता है कि 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 से जुड़े यूज़र इंटरफ़ेस (यूआई) एलिमेंट (टाइटल और आइकॉन रिसॉर्स) शामिल होते हैं. इस फ़ाइल में, तय किए गए VolumeGroups को सही तरीके से रेंडर किया जाता है. इसके लिए, हर VolumeGroup में मौजूद, इस्तेमाल किए गए पहले संसाधन का इस्तेमाल किया जाता है.

उदाहरण के लिए, यहां दिए गए उदाहरण में 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 में बताई गई हैं. आवाज़ की सेटिंग के लिए यूज़र इंटरफ़ेस (यूआई), CarAudioManager के इन VolumeGroup-आधारित एपीआई का इस्तेमाल करता है:

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

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

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

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

CarVolumeGroupInfo

इवेंट कॉलबैक पाने वाले व्यक्ति के पास, कार के वॉल्यूम ग्रुप की जानकारी की सूची का ऐक्सेस होता है. इसका मतलब है कि ऐप्लिकेशन को Car audio framework को कोई अतिरिक्त कॉल करने की ज़रूरत नहीं है, ताकि वह मौजूदा स्थिति के बारे में जान सके. यह मिले हुए 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,..)) को ट्रिगर करते हैं.

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

  • वॉल्यूम ग्रुप की म्यूट स्थिति को 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 पर सेट करता है.

  • इस इंडेक्स को वॉल्यूम बढ़ाने में बदल दिया जाता है और Audio 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 की परिभाषा देखें.

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