कार में ऑडियो सेवा, Core Audio की डाइनैमिक ऑडियो नीति का इस्तेमाल करती है. इससे कार में इस्तेमाल के उदाहरणों को आसानी से लागू किया जा सकता है.
हर यात्री के लिए अलग-अलग ऑडियो चलाने की सुविधा. इसे मल्टी-ज़ोन ऑडियो कहा जाता है. इसमें हर ज़ोन में एक साथ ऑडियो चलाया जा सकता है.
डाइनैमिक ऑडियो ज़ोन कॉन्फ़िगरेशन.
यात्री के प्राइमरी ज़ोन में ऑडियो कास्ट करने की सुविधा.
यात्री के ऑडियो को मिरर करना.
हर इस्तेमाल के उदाहरण में, कार ऑडियो सेवा डाइनैमिक ऑडियो नीति का इस्तेमाल करती है, ताकि ऑडियो को तय किए गए आउटपुट डिवाइस पर अपने-आप भेजा जा सके.
मल्टी-ज़ोन ऑडियो
मल्टी-ज़ोन ऑडियो की सुविधा की मदद से, एक साथ कई उपयोगकर्ता AAOS से इंटरैक्ट कर सकते हैं. किसी ज़ोन से आउटपुट डिवाइसों का एक सेट जुड़ा होता है. साथ ही, हर ज़ोन में ऑडियो फ़ोकस और वॉल्यूम लेवल को बनाए रखा जाता है. ड्राइवर के पास मुख्य ज़ोन (आम तौर पर, मुख्य केबिन) में किसी दूसरे सोर्स से ऑडियो सुनने का विकल्प होता है. वहीं, पैसेंजर अपने हिसाब से ऑडियो सुन सकते हैं.
मल्टी-ज़ोन ऑडियो आर्किटेक्चर
पहली इमेज. कार में ऑडियो सेवा का आर्किटेक्चर.
कार के ऑडियो ज़ोन, ऑडियो आउटपुट, ऑडियो फ़ोकस, और अन्य ऑडियो सेटिंग के ऐब्स्ट्रैक्शन होते हैं. इन सभी को अलग-अलग मैनेज किया जा सकता है. राउटिंग के लिए, हर ज़ोन को ऑडियो आउटपुट बस डिवाइसों के सेट के तौर पर तय किया जाता है. इन्हें ऑडियो नीति के कॉन्फ़िगरेशन में व्यवस्थित किया जाता है. हर ऑडियो ज़ोन के लिए, डिवाइस अलग-अलग होते हैं. पहले डायग्राम में, बस डिवाइस 1 से 5 ज़ोन ज़ीरो में, बस डिवाइस 6 से 8 ज़ोन एक में, और बस डिवाइस 9 से 11 ज़ोन दो में आते हैं.
कार के ऑडियो का कॉन्फ़िगरेशन
आम तौर पर, आउटपुट डिवाइसों को एक ऑडियो ज़ोन असाइन किया जाता है. हर ऑडियो ज़ोन को car_audio_configuration.xml
में तय किया जाता है. यहां दिए गए कोड स्निपेट में, पहली इमेज के लिए कार ऑडियो कॉन्फ़िगरेशन दिखाया गया है:
<carAudioConfiguration version="3">
<zones>
<zone name="Zone0" audioZneId="0" occupantZoneId="0">
<zoneConfigs>
<zoneConfig name="config0" isDefault="true">
<volumeGoups>
<group>
<device address="bus_1">
<context context="music"/>
</device>
</group>
<group>
<device address="bus_2">
<context context="navigation"/>
</device>
</group>
...
</volumeGroups>
</zoneConfig>
</zoneConfigs>
</zone>
<zone name="Zone1" audioZoneId="1" occupantZoneId="1">
<zoneConfigs>
<zoneConfig name="config0" isDefault="true">
<volumeGroups>
<group>
<device address="bus_6">
<context context="music"/>
</device>
</group>
<group>
<device address="bus_7">
<context context="navigation"/>
</device>
</group>
...
</volumeGroups>
</zoneConfig>
</zoneConfigs>
</zone>
...
...
</zones>
</carAudioConfiguration>
occupantZoneId
, कार की सेवा से जुड़ी परिभाषा है. इसे CarOccupantZoneManager
मैनेज करता है. इसका इस्तेमाल कारों में किया जाता है. इससे कार में मौजूद किसी उपयोगकर्ता को सीट की किसी खास जगह पर मैप किया जाता है. CarOccupantZoneService
यह भी तय करता है कि उपयोगकर्ता के डिसप्ले में लॉग इन करने के बाद, डिसप्ले, अन्य पेरिफ़ेरल, और उपयोगकर्ता के बीच मैपिंग कैसे की जाएगी. ऑडियो ज़ोन में ये शामिल होते हैं:
ऑडियो ज़ोन आईडी और ऑक्यूपेंट ज़ोन आईडी.
- Maps ऑडियो ज़ोन को सीट, डिसप्ले, और अन्य पेरिफ़ेरल जैसे ऑक्यूपेंट ज़ोन पर मैप करता है
- यह कुकी, लॉग इन करने पर यह मैप करती है कि किस यूज़र आईडी को ऑडियो ज़ोन असाइन किया गया है
ऑडियो कॉन्फ़िगरेशन की सूची. हर ऑडियो कॉन्फ़िगरेशन में वॉल्यूम ग्रुप का एक सेट होता है. हर वॉल्यूम ग्रुप में, ऑडियो बस डिवाइसों का एक सेट होता है.
वॉल्यूम बदलने पर, ग्रुप में शामिल सभी ऑडियो डिवाइसों को एक ही तरह से कंट्रोल किया जाता है.
हर ऑडियो डिवाइस को ऑडियो एट्रिब्यूट की सूची असाइन की जाती है. इस जानकारी का इस्तेमाल, ऑडियो एट्रिब्यूट के लिए अलग-अलग वैल्यू असाइन करके, ऑडियो नीति के मिक्स बनाने के लिए किया जाता है.
इस कॉन्फ़िगरेशन की मदद से, अलग-अलग ऑडियो एट्रिब्यूट के इस्तेमाल को हर ज़ोन में अलग-अलग आउटपुट डिवाइसों पर रूट किया जा सकता है. इस्तेमाल के उदाहरण के आधार पर, अलग-अलग आवाज़ें एक साथ सुनाई जा सकती हैं. उदाहरण के लिए, मुख्य केबिन (प्राइमरी ज़ोन) को इस तरह कॉन्फ़िगर किया जा सकता है कि सभी स्पीकर पर मीडिया की आवाज़ सुनाई दे, लेकिन नेविगेशन की आवाज़ सिर्फ़ ड्राइवर के सबसे नज़दीक वाले स्पीकर पर सुनाई दे. आवाज़ एक साथ चलने की सुविधा की मदद से, ड्राइवर को नेविगेशन की जानकारी मिलती रहती है. वहीं, मुख्य केबिन में बैठे लोग मीडिया का आनंद लेते रहते हैं.
मल्टी-ज़ोन ऑडियो सिस्टम में यात्री के लॉगिन करने का वर्कफ़्लो
नीचे दिए गए क्रम के डायग्राम में, ऑडियो राउटिंग की सुविधा चालू करने का फ़्लो दिखाया गया है. यह तब चालू होती है, जब कोई यात्री अपने डिसप्ले में लॉग इन करता है:
दूसरी इमेज.
इस क्रम में, उपयोगकर्ता के लॉगिन को कार की ऑडियो सेवा में, ऑक्यूपेंट ज़ोन सेवा के ज़रिए भेजा जाता है.
कार में मौजूद ऑडियो सेवा (किसी खास ऑडियो ज़ोन के लिए), उपयोगकर्ता के डिवाइस की अफ़िनिटी हटाने के लिए
AudioPolicy#removeUserIdDeviceAffinity
एपीआई का इस्तेमाल करती है. यह एपीआई, यूज़र आईडी लेता है. इस मामले में, पिछले ज़ोन का उपयोगकर्ता.AudioPolicy#setUserIdDeviceAffinity
एपीआई, नए उपयोगकर्ता को किसी ज़ोन में असाइन करता है. इसमें उपयोगकर्ता आईडी और किसी ज़ोन के सभी डिवाइसों के लिए कॉन्फ़िगरेशन शामिल होता है.
डाइनैमिक ज़ोन कॉन्फ़िगरेशन
Android 14 में, डाइनैमिक ज़ोन कॉन्फ़िगरेशन की सुविधा जोड़ी गई है. इससे ओईएम, यात्रियों के लिए अलग-अलग डिवाइसों को कॉन्फ़िगर कर सकते हैं. इस सुविधा की मदद से, पीछे की सीट पर बैठे लोग, हेडरेस्ट में लगे स्पीकर और हेडफ़ोन के बीच स्विच कर सकते हैं.
इस मामले में, दो कॉन्फ़िगरेशन ज़रूरी हैं. एक-एक पोर्ट, पिछली सीट के हेडरेस्ट और हेडफ़ोन के लिए. किसी उपयोगकर्ता के ऑडियो को एक बार में सिर्फ़ एक कॉन्फ़िगरेशन पर रूट किया जाता है.
तीसरी इमेज. डाइनैमिक ज़ोन कॉन्फ़िगरेशन वर्कफ़्लो.
तीसरी इमेज में, डाइनैमिक ज़ोन कॉन्फ़िगरेशन वर्कफ़्लो का आर्किटेक्चर दिखाया गया है. ऑडियो ज़ोन 1 में दो कॉन्फ़िगरेशन हैं: Config 0
और Config 1
. ये दोनों कॉन्फ़िगरेशन, आउटपुट डिवाइस स्पीकर और हेडरेस्ट से जुड़े हैं.
लॉग इन करने पर, उपयोगकर्ता को डिफ़ॉल्ट कॉन्फ़िगरेशन अपने-आप असाइन हो जाता है. जब उपयोगकर्ता कॉन्फ़िगरेशन बदलने का विकल्प चुनता है, तो आम तौर पर सिस्टम यूज़र इंटरफ़ेस (यूआई) के ज़रिए, कार ऑडियो सेवा दो कॉन्फ़िगरेशन के बीच स्विच करती है. इस तरह, आउटपुट डिवाइस को Z1 के स्पीकर और Z1 के हेडरेस्ट के बीच स्विच किया जाता है.
यहां दिए गए कोड स्निपेट में, डाइनैमिक ज़ोन कॉन्फ़िगरेशन का सेटअप दिखाया गया है.
<carAudioConfiguration version="3">
<zones>
<zone name="Zone1" audioZoneId="1" occupantZoneId="1">
<zoneConfigs>
<zoneConfig name="Zone 1 Config 0" isDefault="true">
<volumeGroups>
<group>
<device address="bus_100">
<context context="music"/>
***
</device>
</group>
</volumeGroups>
</zoneConfig>
<zoneConfig name="Zone 1 Config 1">
<volumeGroups>
<group>
<device address="bus_101">
<context context="music"/>
***
</device>
</group>
</volumeGroups>
</zoneConfig>
</zoneConfigs>
</zone>
</zones>
कार ऑडियो मैनेजर, ऑडियो कॉन्फ़िगरेशन को मैनेज करने के लिए एपीआई उपलब्ध कराता है. इससे इन कॉन्फ़िगरेशन को मैनेज करना आसान हो जाता है:
- किसी ज़ोन के लिए उपलब्ध क्वेरी कॉन्फ़िगरेशन.
- किसी ज़ोन के लिए, फ़िलहाल सेट किए गए कॉन्फ़िगरेशन के बारे में क्वेरी करें.
- किसी दूसरे कॉन्फ़िगरेशन पर स्विच करें.
सिस्टम यूज़र इंटरफ़ेस (यूआई) ऐप्लिकेशन या सेवा, इन एपीआई का इस्तेमाल करके ऑडियो ज़ोन के कॉन्फ़िगरेशन को मैनेज कर सकती है. इसे चौथे डायग्राम में दिखाया गया है. Query API, यात्री को ये दोनों विकल्प दिखाता है. उपयोगकर्ता, अपनी पसंद के कॉन्फ़िगरेशन के लिए कमांड पर टैप करके, कोई दूसरा कॉन्फ़िगरेशन चुन सकता है.
चौथी इमेज. डाइनैमिक ज़ोन कॉन्फ़िगरेशन वर्कफ़्लो.
प्राइमरी ज़ोन में मौजूद यात्री के लिए ऑडियो कास्ट करने की सुविधा
प्राइमरी ज़ोन में मौजूद पैसेंजर के लिए ऑडियो कास्ट करने की सुविधा, Android 14 में जोड़ी गई है. इससे पैसेंजर, प्राइमरी ज़ोन में अपना मीडिया ऑडियो कास्ट कर सकते हैं. इस तरह, यात्री के मीडिया का ऑडियो, मुख्य केबिन में कास्ट किया जा सकता है. हालांकि, ड्राइवर के पास पूरा कंट्रोल रहेगा.
नीचे दी गई इमेज में, प्राइमरी ज़ोन में यात्रियों के लिए ऑडियो कास्ट करने की सुविधा के आर्किटेक्चर का आसान वर्शन दिखाया गया है.
पांचवीं इमेज. डाइनैमिक ज़ोन कॉन्फ़िगरेशन वर्कफ़्लो.
इस इमेज में दिखाया गया है कि ड्राइवर के लिए मीडिया आउटपुट डिवाइस को यात्री के साथ शेयर किया गया है. ऐसा सिर्फ़ तब होता है, जब यात्री कास्ट टू प्राइमरी ज़ोन मोड में हो. डाइनैमिक ऑडियो नीति का इस्तेमाल, ड्राइवर के लिए ऑडियो रूटिंग को मैनेज करने के लिए भी किया जाता है. हालांकि, ड्राइवर के लिए डिवाइसों के अफ़िनिटी में कोई बदलाव नहीं किया जाता. यात्री के लिए, आउटपुट डिवाइसों की सूची में ये बदलाव किए गए हैं:
- यात्री के लिए मीडिया आउटपुट डिवाइस को डिवाइसों की सूची से हटा दिया गया है
- ड्राइवर के लिए मीडिया आउटपुट डिवाइस को डिवाइसों की सूची में जोड़ा गया है
- यात्री के ऑडियो ज़ोन के लिए, बाकी आउटपुट डिवाइसों को डिवाइसों की सूची में रखा जाता है
डिवाइसों की यह नई सूची, यात्री को AudioPolicy#setUserIdDeviceAffinity
एपीआई से असाइन की जाती है. एपीआई को पास किए गए पैरामीटर, डिवाइसों की सूची और यात्री का यूज़र आईडी है. जब ऑडियो सिस्टम की ऑडियो नीति सेवा यह क्वेरी करती है कि यात्री से जुड़े मीडिया ट्रैक के लिए कौनसी ऑडियो मिक्सिंग चुनी जानी है, तो प्राइमरी ज़ोन से जुड़ी मीडिया ऑडियो मिक्सिंग को चुना जाता है.
प्राइमरी ज़ोन में ऑडियो कास्ट करने के लिए, यह ज़रूरी है कि प्राइमरी ज़ोन का मीडिया आउटपुट डिवाइस, ऑडियो एट्रिब्यूट के अन्य इस्तेमाल से अलग हो. ऐसा न होने पर, ऑडियो मिक्स बनाते समय, मिक्स में अन्य ऑडियो एट्रिब्यूट जोड़ दिए जाते हैं. जब ऑडियो सिस्टम, मिक्स का चुनाव करता है, तो मिक्स से जुड़े सभी साउंड, मुख्य केबिन में चलाने के लिए चुने जाते हैं.
पैसेंजर ज़ोन में ऑडियो मिरर करने की सुविधा
ऑडियो मिरर करने की सुविधा से, यात्री ऑडियो शेयर कर पाते हैं. मिरर करने की सुविधा, हर ऑडियो ज़ोन में ऑडियो डेटा को डुप्लीकेट करती है, ताकि सभी यात्री एक जैसा ऑडियो सुन सकें. इस मामले में, ऑडियो फ़ोकस को ऑडियो मिररिंग में शामिल यात्रियों के साथ शेयर किया जाता है.
ऑडियो मिरर रूटिंग
ऑडियो मिररिंग की सुविधा चालू करने के लिए, कम से कम दो यात्रियों का होना ज़रूरी है. इस वजह से, सिर्फ़ दो पैसेंजर ऑडियो ज़ोन वाले ऑडियो कॉन्फ़िगरेशन के लिए, एक मिरर आउटपुट डिवाइस की ज़रूरत होगी. ऊपर दी गई परिभाषा के हिसाब से, एक साथ दो मिररिंग सेशन शुरू किए जा सकते हैं.
नीचे दिए गए डायग्राम में, दो यात्रियों के बीच मल्टी-ज़ोन ऑडियो मिररिंग की सुविधा को आसान तरीके से दिखाया गया है. दोनों यात्रियों का ऑडियो, ऑडियो मिरर डिवाइस bus_1000
पर रूट किया जाता है. ऑडियो HAL, सिग्नल को सोर्स ज़ोन में डुप्लीकेट करता है.
छठी इमेज. डाइनैमिक ज़ोन कॉन्फ़िगरेशन वर्कफ़्लो.
यह सुविधा सिर्फ़ तब चालू होती है, जब यात्री मिररिंग मोड में हों. अगर ऐसा नहीं है, तो ऑडियो ज़ोन के लिए उपलब्ध डिवाइस, यात्रियों को असाइन कर दिए जाते हैं.
जब किसी यात्री के लिए स्क्रीन शेयर करने की सुविधा पहली बार चालू की जाती है, तो AudioPolicy#setUserIdDeviceAffinity
एपीआई रूटिंग में बदलाव करता है:
- यात्री के लिए मीडिया आउटपुट डिवाइस को डिवाइसों की सूची से हटा दिया जाता है.
- स्क्रीन शेयर करने वाले डिवाइस को, डिवाइसों की सूची में जोड़ा गया.
- पैसेंजर ऑडियो ज़ोन के लिए, बाकी आउटपुट डिवाइसों को डिवाइसों की सूची में रखा जाता है.
डिवाइसों की सूची के साथ, एपीआई को डिवाइसों की अपडेट की गई सूची और यात्री के उपयोगकर्ता आईडी के साथ कॉल किया जाता है. इस इमेज में, ऑडियो मिरर करने के वर्कफ़्लो का क्रमवार डायग्राम दिया गया है.
सातवीं इमेज. ऑडियो शेयर करने का वर्कफ़्लो.
सातवीं इमेज में, ऑडियो मिररिंग को मैनेज करने के लिए कार ऑडियो मैनेजर के एपीआई को मीडिया सिस्टम सर्विस से कॉल किया जाता है. खास तौर पर, पहले और दूसरे उपयोगकर्ता के लिए ऑडियो मिररिंग की सुविधा चालू करने वाला एपीआई, CarAudioManager#enableMirrorForAudioZones
.
कार में मौजूद ऑडियो सेवा, कार में बैठे लोगों के लिए ऑडियो रूटिंग को ऊपर बताए गए तरीके से कॉन्फ़िगर करती है. कार ऑडियो सेवा, ऑडियो HAL को भी एक सिग्नल भेजती है, ताकि मिरर किए गए डिवाइस से आने वाले ऑडियो को कॉन्फ़िगर किया जा सके और उसे संबंधित ज़ोन में डुप्लीकेट किया जा सके.
ऊपर दी गई इमेज में, कार ऑडियो सेवा mirroring_src=bus_1000;mirroring_dest=bus_10,bus_20
भेजती है
कहां,
bus_1000
सोर्स बस है और bus_10
और bus_20
डेस्टिनेशन बसें हैं.
सीक्वेंस डायग्राम में, AudioManager#setParameters
एपीआई के ज़रिए भेजे गए सिग्नल को नहीं दिखाया गया है. यह सिग्नल, ऑडियो सेवा के ज़रिए HAL तक पहुंचता है.
ऑडियो मिरर करने की सुविधा बंद करने पर, यह सिग्नल भेजा जाता है:
mirroring_src=bus_1000;mirroring=off
. इस सिग्नल का इस्तेमाल HAL कर सकता है. इससे ऑडियो मिररिंग की सुविधा चालू न होने पर, ऑडियो डुप्लीकेट होने की समस्या को बंद किया जा सकता है. ऑडियो मिररिंग की सुविधा वाले डिवाइसों को तय करने के लिए, कार के ऑडियो कॉन्फ़िगरेशन फ़ाइल में mirroringDevices
नाम का एक सेक्शन होता है. इसे यहां दिए गए स्निपेट में दिखाया गया है.
इस स्निपेट में, दो मिररिंग डिवाइसों को तय किया गया है: bus_1000
और bus_2000
. इससे चार लोग ऑडियो मिररिंग की सुविधा का इस्तेमाल कर सकते हैं.
<carAudioConfiguration version="3">
<mirroringDevices>
<mirroringDevice address="bus_1000"/>
<mirroringDevice address="bus_2000"/>
</mirroringDevices>
<zones>
....
</zones>
</carAudioConfiguration>