कार ऑडियो सेवा, कारों में इस्तेमाल के उदाहरणों को आसान बनाने के लिए, कोर ऑडियो डाइनैमिक ऑडियो नीति का इस्तेमाल करती है.
हर यात्री के लिए अलग-अलग ऑडियो चलाने की सुविधा को मल्टी-ज़ोन ऑडियो कहा जाता है. इसमें हर ज़ोन में एक साथ आवाज़ चलाने की सुविधा होती है.
डाइनैमिक ऑडियो ज़ोन कॉन्फ़िगरेशन.
प्राइमरी ज़ोन में बैठे यात्री के लिए ऑडियो कास्ट करने की सुविधा.
यात्री के लिए ऑडियो मिरर करने की सुविधा.
हर इस्तेमाल के उदाहरण में, कार ऑडियो सेवा, डाइनैमिक ऑडियो नीति का इस्तेमाल करके, ऑडियो को तय किए गए आउटपुट डिवाइस पर अपने-आप रूट करती है.
मल्टी-ज़ोन ऑडियो
मल्टी-ज़ोन ऑडियो की मदद से, एक साथ कई उपयोगकर्ता 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 , ऑक्यूपेंट ज़ोन से डिसप्ले, अन्य पेरिफ़ेरल, और उपयोगकर्ता के लिए भी मैपिंग तय करता है. यह तब होता है, जब उपयोगकर्ता किसी डिसप्ले में लॉग इन करता है. किसी ऑडियो ज़ोन में ये चीज़ें होती हैं:
एक ऑडियो ज़ोन आईडी और एक ऑक्यूपेंट ज़ोन आईडी.
- ऑडियो ज़ोन को ऑक्यूपेंट ज़ोन (सीट, डिसप्ले, और अन्य पेरिफ़ेरल) पर मैप करता है
- लॉग इन करने पर, किस यूज़र आईडी को ऑडियो ज़ोन असाइन किया जाता है, यह मैप करता है
ऑडियो कॉन्फ़िगरेशन की सूची. हर ऑडियो कॉन्फ़िगरेशन में, वॉल्यूम ग्रुप का एक सेट होता है. हर वॉल्यूम ग्रुप में, ऑडियो बस डिवाइसों का एक सेट होता है.
वॉल्यूम बदलने पर, किसी ग्रुप में मौजूद सभी ऑडियो डिवाइसों को एक ही तरीके से कंट्रोल किया जाता है.
हर ऑडियो डिवाइस को, ऑडियो एट्रिब्यूट की एक सूची असाइन की जाती है. इस जानकारी का इस्तेमाल, अलग-अलग तरीके से असाइन किए गए ऑडियो एट्रिब्यूट के साथ ऑडियो नीति के मिक्स बनाने के लिए किया जाता है.
इस कॉन्फ़िगरेशन की मदद से, हर ज़ोन में अलग-अलग आउटपुट डिवाइसों पर, अलग-अलग ऑडियो एट्रिब्यूट के इस्तेमाल को रूट किया जा सकता है. इस्तेमाल के उदाहरण के आधार पर, अलग-अलग आवाज़ें एक साथ चलाई जा सकती हैं. उदाहरण के लिए, मुख्य केबिन (प्राइमरी ज़ोन) को सभी स्पीकर पर मीडिया की आवाज़ें चलाने के लिए कॉन्फ़िगर किया जा सकता है. हालांकि, नेविगेशन की आवाज़ें सिर्फ़ ड्राइवर के पास वाले स्पीकर पर चलाई जा सकती हैं. आवाज़ एक साथ चलाने की सुविधा की मदद से, मुख्य केबिन में मीडिया की आवाज़ें चलती रहती हैं. वहीं, ड्राइवर को नेविगेशन की आवाज़ें सुनाई देती हैं.
मल्टी-ज़ोन ऑडियो में यात्री के लॉग इन करने का वर्कफ़्लो
यहां दिए गए क्रम के डायग्राम में, किसी यात्री के अपने डिसप्ले में लॉग इन करने पर, ऑडियो रूटिंग की सुविधा चालू करने का फ़्लो दिखाया गया है:
दूसरी इमेज.
इस क्रम में, उपयोगकर्ता के लॉग इन करने की जानकारी, ऑक्यूपेंट ज़ोन सेवा के ज़रिए कार ऑडियो सेवा को भेजी जाती है.
कार ऑडियो सेवा (किसी खास ऑडियो ज़ोन के लिए), उपयोगकर्ता के डिवाइस की अफ़िनिटी हटाने के लिए,
AudioPolicy#removeUserIdDeviceAffinityAPI का इस्तेमाल करती है. यह एपीआई, यूज़र आईडी लेता है. इस मामले में, पिछले ज़ोन का उपयोगकर्ता.AudioPolicy#setUserIdDeviceAffinityAPI, नए उपयोगकर्ता को किसी ज़ोन में असाइन करता है. इसके लिए, यूज़र आईडी और किसी खास ज़ोन कॉन्फ़िगरेशन के लिए सभी डिवाइसों की जानकारी ली जाती है.
डाइनैमिक ज़ोन कॉन्फ़िगरेशन
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>
ऑडियो कॉन्फ़िगरेशन को मैनेज करने के लिए, कार ऑडियो मैनेजर, कॉन्फ़िगरेशन को मैनेज करने के लिए एपीआई उपलब्ध कराता है:
- किसी ज़ोन के लिए उपलब्ध कॉन्फ़िगरेशन के बारे में क्वेरी करना.
- किसी ज़ोन के लिए, फ़िलहाल सेट किए गए कॉन्फ़िगरेशन के बारे में क्वेरी करना.
- किसी दूसरे कॉन्फ़िगरेशन पर स्विच करना.
सिस्टम यूज़र इंटरफ़ेस (यूआई) वाला कोई ऐप्लिकेशन या सेवा, ऑडियो ज़ोन के लिए कॉन्फ़िगरेशन को मैनेज करने के लिए इन एपीआई का इस्तेमाल कर सकती है. इसके बारे में चौथी इमेज में दिखाया गया है. क्वेरी एपीआई, दोनों को यात्री के लिए उपलब्ध कराता है. उपयोगकर्ता, मनचाहे कॉन्फ़िगरेशन के लिए किसी निर्देश पर टैप करके, कोई दूसरा कॉन्फ़िगरेशन चुन सकता है.
चौथी इमेज. डाइनैमिक ज़ोन कॉन्फ़िगरेशन का वर्कफ़्लो.
प्राइमरी ज़ोन में बैठे यात्री के लिए ऑडियो कास्ट करने की सुविधा
प्राइमरी ज़ोन में बैठे यात्री के लिए ऑडियो कास्ट करने की सुविधा, Android 14 में जोड़ी गई है. इसकी मदद से, यात्री प्राइमरी ज़ोन में अपने मीडिया का ऑडियो कास्ट कर सकते हैं. इस तरह, यात्री के मीडिया के ऑडियो को मुख्य केबिन में कास्ट किया जा सकता है. वहीं, ड्राइवर के पास पूरा कंट्रोल रहता है.
यहां दी गई इमेज में, प्राइमरी ज़ोन में बैठे यात्री के लिए मीडिया का ऑडियो कास्ट करने की सुविधा के आर्किटेक्चर का आसान वर्शन दिखाया गया है.
पांचवीं इमेज. डाइनैमिक ज़ोन कॉन्फ़िगरेशन का वर्कफ़्लो.
इस इमेज में दिखाया गया है कि ड्राइवर के लिए मीडिया आउटपुट डिवाइस को यात्री के साथ शेयर किया जाता है. ऐसा सिर्फ़ तब होता है, जब यात्री, प्राइमरी ज़ोन में कास्ट करने के मोड में होता है. ड्राइवर के लिए ऑडियो रूटिंग को मैनेज करने के लिए, डाइनैमिक ऑडियो नीति का भी इस्तेमाल किया जाता है. हालांकि, ड्राइवर के लिए डिवाइस की अफ़िनिटी में कोई बदलाव नहीं किया जाता है. यात्री के लिए, आउटपुट डिवाइसों की सूची में ये बदलाव किए जाते हैं:
- यात्री के लिए मीडिया आउटपुट डिवाइस को, डिवाइसों की सूची से हटा दिया जाता है
- ड्राइवर के लिए मीडिया आउटपुट डिवाइस को, डिवाइसों की सूची में जोड़ दिया जाता है
- यात्री के ऑडियो ज़ोन के लिए बाकी आउटपुट डिवाइस, डिवाइसों की सूची में बने रहते हैं
डिवाइसों की इस नई सूची को, AudioPolicy#setUserIdDeviceAffinity API की मदद से यात्री को असाइन किया जाता है. एपीआई को पास किए गए पैरामीटर, डिवाइसों की सूची और यात्री का यूज़र आईडी होते हैं. जब ऑडियो सिस्टम की ऑडियो नीति सेवा, यह क्वेरी करती है कि यात्री से जुड़े किसी मीडिया ट्रैक के लिए, कौनसे ऑडियो मिक्स को चुना जाना है, तो प्राइमरी ज़ोन से जुड़े मीडिया ऑडियो मिक्स को चुना जाता है.
प्राइमरी ज़ोन में ऑडियो कास्ट करने के लिए, यह ज़रूरी है कि प्राइमरी ज़ोन के मीडिया आउटपुट डिवाइस को, ऑडियो एट्रिब्यूट के अन्य इस्तेमाल से अलग रखा जाए. ऐसा न करने पर, ऑडियो मिक्स बनाते समय, अन्य ऑडियो एट्रिब्यूट को मिक्स में जोड़ दिया जाता है. जब ऑडियो सिस्टम, मिक्स चुनने की प्रोसेस पूरी करता है, तो मिक्स से जुड़ी सभी आवाज़ें, मुख्य केबिन में चलाने के लिए चुनी जाती हैं.
यात्री के ज़ोन में ऑडियो मिरर करने की सुविधा
ऑडियो मिरर करने की सुविधा की मदद से, यात्री ऑडियो शेयर कर सकते हैं. मिरर करने की सुविधा, हर ऑडियो ज़ोन में ऑडियो डेटा की डुप्लीकेट कॉपी बनाती है, ताकि सभी यात्री एक ही ऑडियो सुन सकें. इस मामले में, ऑडियो मिरर करने की सुविधा का इस्तेमाल करने वाले यात्रियों के साथ, ऑडियो फ़ोकस शेयर किया जाता है.
ऑडियो मिरर करने के लिए रूटिंग
ऑडियो मिरर करने की सुविधा चालू करने के लिए, कम से कम दो यात्रियों की ज़रूरत होती है. इसलिए, सिर्फ़ दो यात्री ऑडियो ज़ोन वाले ऑडियो कॉन्फ़िगरेशन के लिए, एक मिरर आउटपुट डिवाइस की ज़रूरत होगी. ऊपर दी गई परिभाषा के मुताबिक, मिरर करने के दो सेशन एक साथ शुरू किए जा सकते हैं.
यहां दी गई इमेज में, दो यात्रियों के बीच मल्टी-ज़ोन ऑडियो मिरर करने की सुविधा का आसान डायग्राम दिखाया गया है. दोनों यात्रियों का ऑडियो, ऑडियो मिरर डिवाइस bus_1000 पर रूट किया जाता है. ऑडियो HAL, सोर्स ज़ोन के लिए सिग्नल की डुप्लीकेट कॉपी बनाता है.
छठी इमेज. डाइनैमिक ज़ोन कॉन्फ़िगरेशन का वर्कफ़्लो.
यह रूटिंग सिर्फ़ तब चालू होती है, जब यात्री, मिरर करने के मोड में होते हैं. ऐसा न होने पर, ऑडियो ज़ोन के लिए संबंधित डिवाइस, यात्रियों को असाइन किए जाते हैं.
जब किसी यात्री के लिए पहली बार मिरर करने की सुविधा चालू की जाती है, तो AudioPolicy#setUserIdDeviceAffinity API, रूटिंग में बदलाव करता है:
- यात्री के लिए मीडिया आउटपुट डिवाइस को, डिवाइसों की सूची से हटा दिया जाता है.
- मिरर आउटपुट डिवाइस को, डिवाइसों की सूची में जोड़ दिया जाता है.
- यात्री के ऑडियो ज़ोन के लिए बाकी आउटपुट डिवाइस, डिवाइसों की सूची में बने रहते हैं.
डिवाइसों की सूची के साथ, एपीआई को डिवाइसों की अपडेट की गई सूची और यात्री के यूज़र आईडी के साथ कॉल किया जाता है. यहां दी गई इमेज में, ऑडियो मिरर करने के वर्कफ़्लो का क्रम डायग्राम दिखाया गया है.
सातवीं इमेज. ऑडियो मिरर करने का वर्कफ़्लो.
सातवीं इमेज में, ऑडियो मिरर करने की सुविधा को मैनेज करने के लिए, कार ऑडियो मैनेजर के एपीआई को मीडिया सिस्टम सेवा से कॉल किया जाता है. खास तौर पर, यूज़र 1 और यूज़र 2 के लिए ऑडियो मिरर करने की सुविधा चालू करने वाला एपीआई, CarAudioManager#enableMirrorForAudioZones.
कार ऑडियो सेवा, ऊपर बताए गए तरीके से, यात्रियों के लिए ऑडियो रूटिंग को कॉन्फ़िगर करती है. कार ऑडियो सेवा, ऑडियो HAL को एक सिग्नल भी भेजती है, ताकि मिरर डिवाइस से आने वाले ऑडियो को कॉन्फ़िगर किया जा सके और संबंधित ज़ोन के लिए उसकी डुप्लीकेट कॉपी बनाई जा सके.
ऊपर दी गई इमेज में, कार ऑडियो सेवा, mirroring_src=bus_1000;mirroring_dest=bus_10,bus_20 भेजती है
यहां,
bus_1000 सोर्स बस है. वहीं, bus_10 और bus_20 डेस्टिनेशन
बसें हैं.
क्रम के डायग्राम में, AudioManager#setParameters API के ज़रिए भेजे गए सिग्नल को नहीं दिखाया गया है. यह सिग्नल, ऑडियो सेवा के ज़रिए 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>