AAOS के पास 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>
शुरू करने के दौरान, वॉल्यूम ग्रुप, इससे जुड़े डिवाइसों की गेन वैल्यू की जांच करेगा और ग्रुप को इस तरह कॉन्फ़िगर करेगा:
- स्टेप साइज़. यह वॉल्यूम ग्रुप से कंट्रोल किए जाने वाले सभी डिवाइसों के लिए एक जैसा होना चाहिए
- कम से कम गेन. ग्रुप में शामिल डिवाइसों में सबसे कम गेन
- ज़्यादा से ज़्यादा फ़ायदा. ग्रुप में मौजूद डिवाइसों में सबसे ज़्यादा गेन
- डिफ़ॉल्ट गेन. ग्रुप में शामिल डिवाइसों में सबसे ज़्यादा डिफ़ॉल्ट गेन
इन वैल्यू को कॉन्फ़िगर करने के तरीके की वजह से, वॉल्यूम ग्रुप के गेन को वॉल्यूम ग्रुप से जुड़े डिवाइस के लिए तय की गई रेंज से बाहर सेट किया जा सकता है. इस मामले में, उस डिवाइस के लिए गेन को डिवाइस की कम से कम या ज़्यादा से ज़्यादा गेन वैल्यू पर सेट किया जाएगा. यह इस बात पर निर्भर करेगा कि वॉल्यूम ग्रुप की वैल्यू, रेंज से कम है या ज़्यादा.
वॉल्यूम ग्रुप आइडेंटिफ़ायर
वॉल्यूम ग्रुप की पहचान, रनटाइम के दौरान एक्सएमएल फ़ाइल में तय किए गए क्रम के हिसाब से की जाती है.
किसी ऑडियो ज़ोन में आईडी की सीमा 0 से N-1 तक होती है. यहां N, उस ज़ोन में वॉल्यूम ग्रुप की संख्या है. इस तरह, वॉल्यूम ग्रुप आईडी सभी ज़ोन में यूनीक नहीं होते. इन आइडेंटिफ़ायर का इस्तेमाल, वॉल्यूम ग्रुप से जुड़े CarAudioManager
एपीआई के लिए किया जाता है. zoneId
के बिना groupId
को स्वीकार करने वाला कोई भी एपीआई, डिफ़ॉल्ट रूप से मुख्य ऑडियो ज़ोन पर सेट हो जाएगा.
एक से ज़्यादा ज़ोन में आवाज़ को मैनेज करना
हर ऑडियो ज़ोन में एक या उससे ज़्यादा वॉल्यूम ग्रुप होने चाहिए. साथ ही, हर वॉल्यूम ग्रुप सिर्फ़ एक ऑडियो ज़ोन से जुड़ा होना चाहिए. इस संबंध के बारे में car_audio_configuration.xml
में बताया गया है. ऊपर दिए गए वॉल्यूम ग्रुप तय करना सेक्शन में दिया गया उदाहरण देखें.
हर ज़ोन के लिए वॉल्यूम के मौजूदा लेवल, उस ज़ोन से जुड़े उपयोगकर्ता के लिए सेव रहते हैं. ये सेटिंग, ज़ोन के हिसाब से होती हैं. इसका मतलब है कि अगर कोई उपयोगकर्ता मुख्य ज़ोन से जुड़े डिसप्ले पर साइन इन करता है और बाद में किसी दूसरे ऑडियो ज़ोन से जुड़े ज़ोन में साइन इन करता है, तो पहले ज़ोन के लिए लोड और सेव किए गए वॉल्यूम लेवल, दूसरे ज़ोन के वॉल्यूम लेवल से अलग होंगे.
आवाज़ कम-ज़्यादा करने वाले बटन से होने वाले इवेंट मैनेज करना
Android, वॉल्यूम कंट्रोल के लिए कई कीकोड तय करता है. इनमें KEYCODE_VOLUME_UP
, KEYCODE_VOLUME_DOWN
, और KEYCODE_VOLUME_MUTE
शामिल हैं. डिफ़ॉल्ट रूप से, Android आवाज़ कम या ज़्यादा करने वाले बटन के इवेंट को ऐप्लिकेशन पर भेजता है. वाहन से जुड़े इवेंट लागू करने के लिए, इन मुख्य इवेंट को 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 की रेंज से बाहर की वैल्यू गड़बड़ी है.
यह OEM तय करते हैं कि इन वैल्यू को कैसे लागू किया जाए और उपयोगकर्ताओं को ये कैसे दिखेंगी. इन्हें सिर्फ़ मीडिया पर या पूरे डिवाइस पर, Android की सभी आवाज़ों पर लागू किया जा सकता है.
Android 11 में, आउटपुट डिवाइसों पर ऑडियो इफ़ेक्ट लागू करने की सुविधा भी जोड़ी गई है. इसकी मदद से, इन एपीआई के बजाय सही आउटपुट डिवाइसों पर ऑडियो इफ़ेक्ट के ज़रिए, फ़ेड और बैलेंस को मैनेज किया जा सकता है.
ऑडियो डकिंग
ऑडियो डकिंग तब होती है, जब वाहन में एक स्ट्रीम के लिए गेन कम किया जाता है, ताकि उसी समय चल रही दूसरी स्ट्रीम को ज़्यादा साफ़ तौर पर सुना जा सके. AAOS में, ऑडियो डकिंग की सुविधा को लागू करने का काम एचएएल पर छोड़ दिया गया है, क्योंकि Android के बाहर ऐसी कई आवाज़ें हो सकती हैं जिन पर ओएस का कोई कंट्रोल नहीं होता. Android 11 में, डकिंग से जुड़े फ़ैसले लेने के लिए, एचएएल के पास यह मुख्य जानकारी उपलब्ध होती है कि दोनों आउटपुट डिवाइसों पर ऐक्टिव स्ट्रीम चालू हैं या नहीं.
कब डक करना है
यह तय करना हर OEM की ज़िम्मेदारी है कि उनके एचएएल में डकिंग की सुविधा को कैसे मैनेज किया जाएगा. हालांकि, हम कुछ सामान्य दिशा-निर्देश बताना चाहते हैं. Android डिवाइस पर एक साथ कई स्ट्रीम चलने की समस्या, ज़्यादातर तब होती है, जब दो ऐप्लिकेशन/सेवाएं एक साथ ऑडियो फ़ोकस रखती हैं. इस बात को ध्यान में रखते हुए, इंटरैक्शन मैट्रिक देखें. इससे आपको यह जानने में मदद मिलेगी कि Android कब एक साथ फ़ोकस दे सकता है और इसलिए, कब दो अलग-अलग स्ट्रीम एक साथ चल सकती हैं.
ध्यान रखें कि Android, किसी भी स्ट्रीम को आपस में तब मिलाएगा, जब उस पर कोई फ़ायदा लागू न किया गया हो. इसलिए, जिस स्ट्रीम को किसी दूसरी स्ट्रीम के साथ चलाने पर डक करना है उसे अलग-अलग आउटपुट डिवाइसों पर भेजा जाना चाहिए, ताकि HAL उन्हें एक साथ मिक्स करने से पहले डकिंग लागू कर सके.
वीडियो के वॉल्यूम को कम करने के लिए सुझाया गया तरीका
यहां ऐसे संभावित इंटरैक्शन दिए गए हैं जिनमें हमारा सुझाव है कि डकिंग का इस्तेमाल किया जाए:
EMERGENCY
.SAFETY
को छोड़कर, बाकी सभी आवाज़ों को कम या म्यूट करें, ताकि ड्राइवर को आवाज़ सुनाई देSAFETY
.EMERGENCY
को छोड़कर, बाकी सभी आवाज़ों को कम करें, ताकि ड्राइवर को आवाज़ सुनाई देNAVIGATION
.SAFETY
औरEMERGENCY
के अलावा, सभी चीज़ों को छिपाएंCALL
.SAFETY
,EMERGENCY
, औरNAVIGATION
को छोड़कर, बाकी सभी को छिपाएंVOICE
. बत्तखCALL_RING
- यह तय करना OEMs की ज़िम्मेदारी है कि चालू
VEHICLE_SOUNDS
की क्या अहमियत है. साथ ही, यह भी तय करना कि ड्राइवर को सुनाई देने के लिए, अन्य आवाज़ों को कम करना चाहिए या नहीं. MUSIC
औरANNOUNCEMENT
को हर चीज़ से डक किया जाना चाहिए. हालांकि, टच इंटरैक्शन के लिए इस्तेमाल होने वाली टोन को अभीSYSTEM_SOUND
के तौर पर चलाया जाता है
वीडियो के ऑडियो को कम करते समय ध्यान में रखने वाली अन्य बातें
नेविगेशन या असिस्टेंट जैसे कुछ ऐप्लिकेशन/सेवाएं, अपनी कार्रवाइयां पूरी करने के लिए कई प्लेयर का इस्तेमाल कर सकती हैं. OEM को इन आउटपुट डिवाइसों से स्ट्रीम डेटा बंद होने के आधार पर, आवाज़ को बहुत तेज़ी से कम करने से बचना चाहिए. इससे यह पक्का किया जा सकेगा कि नेविगेशन या सहायक ऐप्लिकेशन से अगला वीडियो चलाने पर, उपयोगकर्ता को मीडिया की आवाज़ फिर से कम होने से पहले, कुछ समय के लिए पूरी आवाज़ न मिले.
जिन वाहनों में अलग-अलग साउंड स्टेज हैं और जिनमें आवाज़ को अलग-अलग जगहों पर भेजने की सुविधा है उनके लिए, डक करने के बजाय ऑडियो को कार के अलग-अलग हिस्सों में भेजने का विकल्प भी होता है. उदाहरण के लिए, नेविगेशन के निर्देशों को ड्राइवर के हेडरेस्ट स्पीकर पर भेजा जा सकता है, जबकि संगीत सामान्य वॉल्यूम पर पूरे केबिन में चलता रहेगा.
सुरक्षा से जुड़ी अहम आवाज़ें
Android 11 में एचएएल ऑडियो फ़ोकस एपीआई को पेश किया गया है. हालांकि, यह एचएएल पर निर्भर करता है कि सुरक्षा से जुड़ी अहम आवाज़ों को अन्य आवाज़ों के मुकाबले प्राथमिकता दी जाए या नहीं. भले ही, एचएएल USAGE_EMERGENCY
के लिए ऑडियो फ़ोकस रखता हो, लेकिन इससे यह गारंटी नहीं मिलती कि Android में मौजूद ऐप्लिकेशन और सेवाएं आवाज़ नहीं चलाएंगी. यह तय करना HAL के लिए है कि सुरक्षा से जुड़ी अहम आवाज़ें चलने पर, Android की किन स्ट्रीम को मिक्स या म्यूट किया जाना चाहिए.
वॉल्यूम की सेटिंग के यूज़र इंटरफ़ेस (यूआई) को कॉन्फ़िगर करना
AAOS, वॉल्यूम ग्रुप कॉन्फ़िगरेशन से वॉल्यूम सेटिंग यूज़र इंटरफ़ेस (यूआई) को अलग करता है. वॉल्यूम ग्रुप कॉन्फ़िगरेशन को, वॉल्यूम ग्रुप कॉन्फ़िगर करने के तरीके में बताए गए तरीके के मुताबिक ओवरले किया जा सकता है. अलग-अलग सेक्शन बनाने से यह पक्का होता है कि आने वाले समय में वॉल्यूम ग्रुप के कॉन्फ़िगरेशन में बदलाव होने पर, आपको कोई बदलाव नहीं करना पड़ेगा.
कार की सेटिंग के यूज़र इंटरफ़ेस (यूआई) में, packages/apps/Car/Settings/res/xml/car_volume_items.xml
फ़ाइल में हर तय किए गए AudioAttributes.USAGE
से जुड़े यूआई एलिमेंट (टाइटल और आइकॉन रिसॉर्स) होते हैं. यह फ़ाइल, तय किए गए VolumeGroups
को सही तरीके से रेंडर करती है. इसके लिए, यह हर VolumeGroup में मौजूद, पहले इस्तेमाल किए गए संसाधनों का इस्तेमाल करती है.
उदाहरण के लिए, यहां दिए गए उदाहरण में VolumeGroup को इस तरह से परिभाषित किया गया है कि इसमें voice_communication
और voice_communication_signalling
, दोनों शामिल हैं. कार की सेटिंग के यूज़र इंटरफ़ेस (यूआई) को डिफ़ॉल्ट रूप से लागू करने पर, voice_communication
से जुड़े रिसॉर्स का इस्तेमाल करके VolumeGroup रेंडर होता है, क्योंकि यह फ़ाइल में सबसे पहले होता है.
<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 एपीआई का इस्तेमाल किया जाता है:
getVolumeGroupCount()
को यह जानने के लिए कि कितने कंट्रोल ड्रॉ किए जाने चाहिए.getGroupMinVolume()
औरgetGroupMaxVolume()
, ताकि निचली और ऊपरी सीमा का पता चल सके.getGroupVolume()
का इस्तेमाल करके, वॉल्यूम का मौजूदा लेवल देखें.registerVolumeChangeObserver()
पर क्लिक करें.