वॉल्यूम प्रबंधन

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

निश्चित वॉल्यूम का उपयोग करना

एएओएस कार्यान्वयन को सॉफ्टवेयर मिक्सर के बजाय हार्डवेयर एम्पलीफायर का उपयोग करके वॉल्यूम को नियंत्रित करना चाहिए। दुष्प्रभावों से बचने के लिए, config_useFixedVolume ध्वज को सत्य पर सेट करें (आवश्यकतानुसार ओवरले करें):

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

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

वॉल्यूम समूह

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

वॉल्यूम समूहों को परिभाषित करना

CarAudioService car_audio_configuration.xml में परिभाषित वॉल्यूम समूहों का उपयोग करता है:

<audioZoneConfiguration version="2.0">
    <zones>
        <zone name="primary zone" isPrimary="true">
            <volumeGroups>
                <group>
                    <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>
        </zone>
     </zones>
</audioZoneConfiguration>

उदाहरण car_audio_configuration.xml कार्यान्वयन।

प्रत्येक वॉल्यूम समूह में संबंधित पते के साथ एक या अधिक आउटपुट डिवाइस होने चाहिए। ये पते 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>

आरंभीकरण के दौरान, वॉल्यूम समूह संबंधित उपकरणों के लाभ मूल्यों की जांच करेगा और समूह को निम्नानुसार कॉन्फ़िगर करेगा:

  • चरण आकार। वॉल्यूम समूह द्वारा नियंत्रित सभी उपकरणों के लिए समान होना चाहिए
  • न्यूनतम लाभ. समूह में उपकरणों के बीच सबसे छोटा न्यूनतम लाभ
  • अधिकतम लाभ. समूह में उपकरणों के बीच उच्चतम अधिकतम लाभ
  • डिफ़ॉल्ट लाभ. समूह में डिवाइसों के बीच उच्चतम डिफ़ॉल्ट लाभ

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

वॉल्यूम समूह पहचानकर्ता

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

मल्टी-ज़ोन वॉल्यूम प्रबंधन

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

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

वॉल्यूम कुंजी घटनाओं को संभालना

एंड्रॉइड वॉल्यूम नियंत्रण के लिए कई कीकोड को परिभाषित करता है, जिसमें KEYCODE_VOLUME_UP , KEYCODE_VOLUME_DOWN और KEYCODE_VOLUME_MUTE शामिल हैं। डिफ़ॉल्ट रूप से, एंड्रॉइड वॉल्यूम कुंजी ईवेंट को एप्लिकेशन पर रूट करता है। ऑटोमोटिव कार्यान्वयन को इन प्रमुख घटनाओं को CarAudioService पर बाध्य करना चाहिए, जो उचित रूप से setGroupVolume या setMasterMute कॉल कर सकता है।

इस व्यवहार को बाध्य करने के लिए, config_handleVolumeKeysInWindowManager ध्वज को true पर सेट करें:

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

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

फीका और संतुलन

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

ऑडियोकंट्रोल एपीआई हैं:

  • setBalanceTowardRight(float value) । स्पीकर की आवाज़ को कार के दाएँ (+) या बाएँ (-) तरफ स्थानांतरित कर देता है। 0.0 केंद्रित है, +1.0 पूरी तरह से दाएँ है, -1.0 पूरी तरह बाएँ है, और -1 से 1 की सीमा के बाहर का मान एक त्रुटि है।
  • setFadeTowardFront(float value) - स्पीकर वॉल्यूम को कार के आगे (+) या पीछे (-) की ओर शिफ्ट करता है। 0.0 केन्द्रित है, +1.0 पूरी तरह से आगे की ओर है, -1.0 पूरी तरह से पीछे की ओर है, और -1 से 1 की सीमा के बाहर का मान एक त्रुटि है।

यह ओईएम पर निर्भर है कि वे यह तय करें कि इन मूल्यों को कैसे लागू किया जाना चाहिए और उन्हें उपयोगकर्ताओं के सामने कैसे लाया जाएगा। इन्हें मीडिया या बोर्ड भर में सभी एंड्रॉइड ध्वनियों पर सख्ती से लागू किया जा सकता है।

एंड्रॉइड 11 ने आउटपुट डिवाइस पर ऑडियो प्रभाव लागू करने के लिए समर्थन भी पेश किया। इसके साथ, इन एपीआई के बजाय उपयुक्त आउटपुट डिवाइस पर ऑडियो प्रभावों के माध्यम से वैकल्पिक रूप से फीका और संतुलन का प्रबंधन करना संभव है।

ऑडियो डकिंग

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

कब झुकना है

हालाँकि यह निर्धारित करना व्यक्तिगत ओईएम पर निर्भर है कि उनके एचएएल द्वारा डकिंग को कैसे संभाला जाएगा, कुछ सामान्य दिशानिर्देश हैं जिनकी हम अनुशंसा करते हैं। एंड्रॉइड के भीतर चलने वाली एकाधिक स्ट्रीम आमतौर पर तब होती हैं जब दो ऐप्स/सेवाएं एक साथ ऑडियो फोकस रखती हैं। इसे ध्यान में रखते हुए, यह जानने के लिए इंटरेक्शन मैट्रिक्स देखें कि एंड्रॉइड कब समवर्ती फोकस प्रदान कर सकता है और इसलिए, जब दो अलग-अलग स्ट्रीम को एक साथ चलाना संभव है।

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

अनुशंसित डकिंग व्यवहार

निम्नलिखित संभावित समवर्ती इंटरैक्शन हैं जहां हम डकिंग लागू करने की अनुशंसा करते हैं:

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

डकिंग करते समय अन्य विचार

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

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

सुरक्षा महत्वपूर्ण ध्वनियाँ

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

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

एएओएस वॉल्यूम सेटिंग्स यूआई को वॉल्यूम समूह कॉन्फ़िगरेशन से अलग करता है (जिसे वॉल्यूम समूहों को कॉन्फ़िगर करने में वर्णित अनुसार ओवरलेड किया जा सकता है)। यह पृथक्करण सुनिश्चित करता है कि यदि भविष्य में वॉल्यूम समूह कॉन्फ़िगरेशन बदलता है तो किसी बदलाव की आवश्यकता नहीं है।

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

उदाहरण के लिए, निम्न उदाहरण एक वॉल्यूमग्रुप को परिभाषित करता है जिसमें voice_communication और voice_communication_signalling दोनों शामिल हैं। कार सेटिंग्स यूआई का डिफ़ॉल्ट कार्यान्वयन 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 में घोषित किए गए हैं। वॉल्यूम सेटिंग्स यूआई निम्नलिखित वॉल्यूमग्रुप-आधारित कारऑडियोमैनेजर एपीआई का उपयोग करता है:

  • getVolumeGroupCount() यह जानने के लिए कि कितने नियंत्रण बनाए जाने चाहिए।
  • निचली और ऊपरी सीमाएं प्राप्त करने के लिए getGroupMinVolume() और getGroupMaxVolume()
  • वर्तमान वॉल्यूम प्राप्त करने के लिए getGroupVolume()
  • वॉल्यूम परिवर्तन पर सूचना प्राप्त करने के लिए registerVolumeChangeObserver()