एंड्रॉइड ऑटोमोटिव ओएस (एएओएस) एक वाहन में इंफोटेनमेंट सिस्टम के रूप में संचालन के लिए उपयोग के मामलों का समर्थन करने के लिए कोर एंड्रॉइड ऑडियो स्टैक पर बनाता है। एएओएस इन्फोटेनमेंट ध्वनियों (अर्थात, मीडिया, नेविगेशन और संचार) के लिए जिम्मेदार है, लेकिन उन झंकार और चेतावनियों के लिए सीधे तौर पर जिम्मेदार नहीं है जिनकी उपलब्धता और समय की सख्त आवश्यकताएं हैं। जबकि AAOS वाहन को ऑडियो प्रबंधित करने में मदद करने के लिए सिग्नल और तंत्र प्रदान करता है, अंत में यह वाहन पर निर्भर है कि वह ड्राइवर और यात्रियों के लिए कौन सी ध्वनियाँ बजाना चाहिए, यह सुनिश्चित करते हुए कि सुरक्षा संबंधी महत्वपूर्ण ध्वनियाँ और नियामक ध्वनियाँ ठीक से सुनी जा सकें। रुकावट.
चूंकि एंड्रॉइड वाहन के मीडिया अनुभव को प्रबंधित करता है, रेडियो ट्यूनर जैसे बाहरी मीडिया स्रोतों को ऐप्स द्वारा दर्शाया जाना चाहिए, जो स्रोत के लिए ऑडियो फोकस और मीडिया कुंजी घटनाओं को संभाल सकते हैं।
Android 11 में ऑटोमोटिव-संबंधित ऑडियो समर्थन में निम्नलिखित परिवर्तन शामिल हैं:
- संबंधित उपयोगकर्ता आईडी के आधार पर स्वचालित ऑडियो ज़ोन चयन
- ऑटोमोटिव-विशिष्ट ध्वनियों का समर्थन करने के लिए नई प्रणाली का उपयोग
- एचएएल ऑडियो फोकस समर्थन
- गैर-क्षणिक धाराओं के लिए विलंबित ऑडियो फोकस
- नेविगेशन और कॉल के बीच इंटरैक्शन को नियंत्रित करने के लिए उपयोगकर्ता सेटिंग
Android ध्वनियाँ और धाराएँ
ऑटोमोटिव ऑडियो सिस्टम निम्नलिखित ध्वनियों और धाराओं को संभालते हैं:
चित्र 1. स्ट्रीम-केंद्रित वास्तुकला आरेख
एंड्रॉइड एंड्रॉइड ऐप्स से आने वाली ध्वनियों को प्रबंधित करता है, उन ऐप्स को नियंत्रित करता है और ध्वनि के प्रकार के आधार पर उनकी ध्वनियों को एचएएल पर आउटपुट डिवाइस पर रूट करता है:
- तार्किक धाराएँ , जिन्हें कोर ऑडियो नामकरण में स्रोतों के रूप में जाना जाता है, ऑडियो विशेषताओं के साथ टैग की जाती हैं।
- भौतिक स्ट्रीम , जिन्हें कोर ऑडियो नामकरण में डिवाइस के रूप में जाना जाता है, में मिश्रण के बाद कोई संदर्भ जानकारी नहीं होती है।
विश्वसनीयता के लिए, बाहरी ध्वनियों (सीटबेल्ट चेतावनी झंकार जैसे स्वतंत्र स्रोतों से आने वाली) को एंड्रॉइड के बाहर, एचएएल के नीचे या यहां तक कि अलग हार्डवेयर में प्रबंधित किया जाता है। सिस्टम कार्यान्वयनकर्ताओं को एक मिक्सर प्रदान करना होगा जो एंड्रॉइड से ध्वनि इनपुट की एक या अधिक धाराओं को स्वीकार करता है और फिर उन धाराओं को वाहन के लिए आवश्यक बाहरी ध्वनि स्रोतों के साथ उपयुक्त तरीके से जोड़ता है।
एचएएल कार्यान्वयन और बाहरी मिक्सर यह सुनिश्चित करने के लिए जिम्मेदार हैं कि सुरक्षा-महत्वपूर्ण बाहरी ध्वनियां सुनी जाती हैं और एंड्रॉइड-प्रदत्त स्ट्रीम में मिश्रण करने और उन्हें उपयुक्त स्पीकर तक रूट करने के लिए जिम्मेदार हैं।
एंड्रॉइड लगता है
ऐप्स में एक या अधिक प्लेयर हो सकते हैं जो ऑडियो डेटा की एक या अधिक तार्किक स्ट्रीम उत्सर्जित करने के लिए मानक एंड्रॉइड एपीआई (उदाहरण के लिए, फोकस नियंत्रण के लिए ऑडियोमैनेजर या स्ट्रीमिंग के लिए मीडियाप्लेयर ) के माध्यम से इंटरैक्ट करते हैं। यह डेटा एकल चैनल मोनो या 7.1 सराउंड हो सकता है, लेकिन इसे रूट किया जाता है और एकल स्रोत के रूप में माना जाता है। ऐप स्ट्रीम AudioAttributes से संबद्ध है जो सिस्टम को संकेत देता है कि ऑडियो को कैसे व्यक्त किया जाना चाहिए।
तार्किक धाराएँ AudioService के माध्यम से भेजी जाती हैं और उपलब्ध भौतिक आउटपुट स्ट्रीम में से एक (और केवल एक) पर रूट की जाती हैं, जिनमें से प्रत्येक AudioFlinger के भीतर एक मिक्सर का आउटपुट है। ऑडियो विशेषताओं को भौतिक स्ट्रीम में मिला दिए जाने के बाद, वे अब उपलब्ध नहीं हैं।
फिर प्रत्येक भौतिक स्ट्रीम को हार्डवेयर पर प्रस्तुत करने के लिए ऑडियो एचएएल को वितरित किया जाता है। ऑटोमोटिव ऐप्स में, रेंडरिंग हार्डवेयर स्थानीय कोडेक्स (मोबाइल उपकरणों के समान) या वाहन के भौतिक नेटवर्क पर एक रिमोट प्रोसेसर हो सकता है। किसी भी तरह से, वास्तविक नमूना डेटा वितरित करना और इसे श्रव्य बनाना ऑडियो एचएएल कार्यान्वयन का काम है।
बाहरी धाराएँ
ध्वनि स्ट्रीम जिन्हें एंड्रॉइड के माध्यम से रूट नहीं किया जाना चाहिए (प्रमाणीकरण या समय संबंधी कारणों से) सीधे बाहरी मिक्सर को भेजा जा सकता है। एंड्रॉइड 11 के अनुसार, एचएएल अब एंड्रॉइड को सूचित करने के लिए इन बाहरी ध्वनियों के लिए फोकस का अनुरोध करने में सक्षम है ताकि वह मीडिया को रोकने या दूसरों को फोकस हासिल करने से रोकने जैसी उचित कार्रवाई कर सके।
यदि बाहरी स्ट्रीम मीडिया स्रोत हैं जिन्हें एंड्रॉइड द्वारा उत्पन्न ध्वनि वातावरण के साथ इंटरैक्ट करना चाहिए (उदाहरण के लिए, बाहरी ट्यूनर चालू होने पर एमपी 3 प्लेबैक बंद करें), तो उन बाहरी स्ट्रीम को एंड्रॉइड ऐप द्वारा दर्शाया जाना चाहिए। ऐसा ऐप एचएएल के बजाय मीडिया स्रोत की ओर से ऑडियो फोकस का अनुरोध करेगा, और एंड्रॉइड फोकस नीति में फिट होने के लिए आवश्यक बाहरी स्रोत को शुरू/बंद करके फोकस सूचनाओं का जवाब देगा। ऐप प्ले/पॉज़ जैसी मीडिया प्रमुख घटनाओं को संभालने के लिए भी ज़िम्मेदार है। ऐसे बाहरी उपकरणों को नियंत्रित करने के लिए एक सुझाया गया तंत्र HwAudioSource है।
आउटपुट डिवाइस
ऑडियो HAL स्तर पर, डिवाइस प्रकार AUDIO_DEVICE_OUT_BUS
वाहन ऑडियो सिस्टम में उपयोग के लिए एक सामान्य आउटपुट डिवाइस प्रदान करता है। बस डिवाइस एड्रेसेबल पोर्ट्स (जहां प्रत्येक पोर्ट भौतिक स्ट्रीम के लिए अंतिम बिंदु है) का समर्थन करता है और वाहन में एकमात्र समर्थित आउटपुट डिवाइस प्रकार होने की उम्मीद है।
एक सिस्टम कार्यान्वयन सभी एंड्रॉइड ध्वनियों के लिए एक बस पोर्ट का उपयोग कर सकता है, इस स्थिति में एंड्रॉइड सब कुछ एक साथ मिलाता है और इसे एक स्ट्रीम के रूप में वितरित करता है। वैकल्पिक रूप से, HAL किसी भी प्रकार की ध्वनि की समवर्ती डिलीवरी की अनुमति देने के लिए प्रत्येक CarAudioContext
के लिए एक बस पोर्ट प्रदान कर सकता है। इससे एचएएल कार्यान्वयन के लिए इच्छानुसार विभिन्न ध्वनियों को मिलाना और डुबाना संभव हो जाता है।
आउटपुट डिवाइसों के लिए ऑडियो संदर्भों का असाइनमेंट car_audio_configuration.xml
के माध्यम से किया जाता है।
माइक्रोफ़ोन इनपुट
ऑडियो कैप्चर करते समय, ऑडियो एचएएल को एक openInputStream
कॉल प्राप्त होती है जिसमें एक AudioSource
तर्क शामिल होता है जो दर्शाता है कि माइक्रोफ़ोन इनपुट को कैसे संसाधित किया जाना चाहिए।
VOICE_RECOGNITION
स्रोत (विशेष रूप से Google सहायक) एक स्टीरियो माइक्रोफोन स्ट्रीम की अपेक्षा करता है जिसमें इको रद्दीकरण प्रभाव होता है (यदि उपलब्ध हो) लेकिन इस पर कोई अन्य प्रसंस्करण लागू नहीं होता है। बीमफॉर्मिंग सहायक द्वारा किए जाने की उम्मीद है।
मल्टी-चैनल माइक्रोफ़ोन इनपुट
दो से अधिक चैनल (स्टीरियो) वाले डिवाइस से ऑडियो कैप्चर करने के लिए, पोजिशनल इंडेक्स मास्क (जैसे CHANNEL_IN_LEFT
) के बजाय चैनल इंडेक्स मास्क का उपयोग करें। उदाहरण:
final AudioFormat audioFormat = new AudioFormat.Builder() .setEncoding(AudioFormat.ENCODING_PCM_16BIT) .setSampleRate(44100) .setChannelIndexMask(0xf /* 4 channels, 0..3 */) .build(); final AudioRecord audioRecord = new AudioRecord.Builder() .setAudioFormat(audioFormat) .build(); audioRecord.setPreferredDevice(someAudioDeviceInfo);
जब setChannelMask
और setChannelIndexMask
दोनों सेट होते हैं, AudioRecord
केवल setChannelMask
(अधिकतम दो चैनल) द्वारा निर्धारित मान का उपयोग करता है।
समवर्ती कब्जा
एंड्रॉइड 10 के अनुसार, एंड्रॉइड फ्रेमवर्क इनपुट के समवर्ती कैप्चरिंग का समर्थन करता है, लेकिन उपयोगकर्ता की गोपनीयता की सुरक्षा के लिए प्रतिबंधों के साथ। इन प्रतिबंधों के भाग के रूप में, AUDIO_SOURCE_FM_TUNER
जैसे आभासी स्रोतों को नजरअंदाज कर दिया जाता है, और इस तरह उन्हें नियमित इनपुट (जैसे माइक्रोफ़ोन) के साथ समवर्ती रूप से कैप्चर करने की अनुमति दी जाती है। HwAudioSources
समवर्ती कैप्चर प्रतिबंधों का हिस्सा भी नहीं माना जाता है।
AUDIO_DEVICE_IN_BUS
डिवाइस या द्वितीयक AUDIO_DEVICE_IN_FM_TUNER
डिवाइस के साथ काम करने के लिए डिज़ाइन किए गए ऐप्स को उन डिवाइसों की स्पष्ट रूप से पहचान करने और Android डिफ़ॉल्ट स्रोत चयन तर्क को बायपास करने के लिए AudioRecord.setPreferredDevice()
उपयोग करने पर भरोसा करना चाहिए।
ऑडियो उपयोग
AAOS मुख्य रूप से रूटिंग, वॉल्यूम समायोजन और फोकस प्रबंधन के लिए AudioAttributes.AttributeUsages
का उपयोग करता है। उपयोग इस बात का प्रतिनिधित्व करते हैं कि स्ट्रीम "क्यों" चलाई जा रही है। इसलिए, सभी स्ट्रीम और ऑडियो फोकस अनुरोधों को अपने ऑडियो प्लेबैक के लिए उपयोग निर्दिष्ट करना चाहिए। जब AudioAttributes ऑब्जेक्ट बनाते समय विशेष रूप से सेट नहीं किया जाता है, तो उपयोग USAGE_UNKNOWN
पर डिफ़ॉल्ट हो जाएगा। हालाँकि इसे वर्तमान में USAGE_MEDIA
के समान माना जाता है, लेकिन मीडिया प्लेबैक के लिए इस व्यवहार पर भरोसा नहीं किया जाना चाहिए।
सिस्टम उपयोग
एंड्रॉइड 11 में, सिस्टम उपयोग पेश किए गए थे। ये उपयोग पहले से स्थापित उपयोगों के समान ही व्यवहार करते हैं, सिवाय इसके कि उन्हें उपयोग करने के लिए सिस्टम एपीआई के साथ-साथ android.permission.MODIFY_AUDIO_ROUTING
की आवश्यकता होती है। नए सिस्टम उपयोग हैं:
-
USAGE_EMERGENCY
-
USAGE_SAFETY
-
USAGE_VEHICLE_STATUS
-
USAGE_ANNOUNCEMENT
सिस्टम उपयोग के साथ AudioAttributes
बनाने के लिए, setUsage
के बजाय AudioAttributes.Builder#setSystemUsage
का उपयोग करें। इस विधि को गैर-सिस्टम उपयोग के साथ कॉल करने के परिणामस्वरूप एक IllegalArgumentException
फेंक दिया जाएगा। इसके अलावा, यदि किसी बिल्डर पर सिस्टम का उपयोग और उपयोग दोनों सेट किया गया है, तो यह निर्माण करते समय एक IllegalArgumentException
फेंक देगा।
यह जांचने के लिए कि AudioAttributes
उदाहरण के साथ कौन सा उपयोग जुड़ा है, AudioAttributes#getSystemUsage
पर कॉल करें। यह संबंधित उपयोग या सिस्टम उपयोग लौटाता है।
ऑडियो प्रसंग
AAOS ऑडियो के कॉन्फ़िगरेशन को सरल बनाने के लिए, समान उपयोगों को CarAudioContext
में समूहीकृत किया गया है। रूटिंग, वॉल्यूम समूह और ऑडियो फोकस प्रबंधन को परिभाषित करने के लिए इन ऑडियो संदर्भों का उपयोग पूरे CarAudioService
में किया जाता है।
Android 11 में ऑडियो संदर्भ हैं:
कारऑडियोकॉन्टेक्स्ट | संबद्ध गुण उपयोग |
---|---|
MUSIC | UNKNOWN, GAME, MEDIA |
NAVIGATION | ASSISTANCE_NAVIGATION_GUIDANCE |
VOICE_COMMAND | ASSISTANT, ASSISTANCE_ACCESSIBILITY |
CALL_RING | NOTIFICATION_RINGTONE |
CALL | VOICE_COMMUNICATION, VOICE_COMMUNICATION_SIGNALING |
ALARM | ALARM |
NOTIFICATION | NOTIFICATION, NOTIFICATION_* |
SYSTEM_SOUND | ASSISTANCE_SONIFICATION |
EMERGENCY | EMERGENCY |
SAFETY | SAFETY |
VEHICLE_STATUS | VEHICLE_STATUS |
ANNOUNCEMENT | ANNOUNCEMENT |
ऑडियो संदर्भों और उपयोगों के बीच मानचित्रण। हाइलाइट की गई पंक्तियाँ नए सिस्टम उपयोगों के लिए हैं।
मल्टी-ज़ोन ऑडियो
ऑटोमोटिव के साथ प्लेटफ़ॉर्म के साथ इंटरैक्ट करने वाले और अलग-अलग मीडिया का उपभोग करने वाले समवर्ती उपयोगकर्ताओं के आसपास उपयोग के मामलों का एक नया सेट आता है। उदाहरण के लिए, ड्राइवर केबिन में संगीत बजा सकता है जबकि पिछली सीट पर बैठे यात्री पीछे के डिस्प्ले पर यूट्यूब वीडियो देख रहे हैं। मल्टी-ज़ोन ऑडियो विभिन्न ऑडियो स्रोतों को वाहन के विभिन्न क्षेत्रों में एक साथ चलाने की अनुमति देकर इसे सक्षम बनाता है।
एंड्रॉइड 10 में शुरू होने वाला मल्टी-ज़ोन ऑडियो ओईएम को ऑडियो को अलग-अलग ज़ोन में कॉन्फ़िगर करने में सक्षम बनाता है। प्रत्येक ज़ोन अपने स्वयं के वॉल्यूम समूहों, संदर्भों के लिए रूटिंग कॉन्फ़िगरेशन और फ़ोकस प्रबंधन के साथ वाहन के भीतर उपकरणों का एक संग्रह है। इस तरीके से, मुख्य केबिन को एक ऑडियो ज़ोन के रूप में कॉन्फ़िगर किया जा सकता है, जबकि रियर डिस्प्ले के हेडफोन जैक को दूसरे ज़ोन के रूप में कॉन्फ़िगर किया जा सकता है।
ज़ोन को car_audio_configuration.xml
के भाग के रूप में परिभाषित किया गया है। CarAudioService
फिर कॉन्फ़िगरेशन को पढ़ता है और AudioService को उनके संबंधित क्षेत्र के आधार पर ऑडियो स्ट्रीम को रूट करने में मदद करता है। प्रत्येक ज़ोन अभी भी संदर्भों और एप्लिकेशन यूआईडी के आधार पर रूटिंग के नियमों को परिभाषित करता है। जब कोई प्लेयर बनाया जाता है, CarAudioService
यह निर्धारित करता है कि प्लेयर किस क्षेत्र से जुड़ा है, और फिर उपयोग के आधार पर, AudioFlinger को ऑडियो को किस डिवाइस पर रूट करना चाहिए।
प्रत्येक ऑडियो ज़ोन के लिए फोकस भी स्वतंत्र रूप से बनाए रखा जाता है। यह विभिन्न क्षेत्रों में एप्लिकेशन को एक-दूसरे के साथ हस्तक्षेप किए बिना स्वतंत्र रूप से ऑडियो उत्पन्न करने में सक्षम बनाता है, जबकि एप्लिकेशन अभी भी अपने क्षेत्र के भीतर फोकस में बदलाव का सम्मान करते हैं। CarAudioService
के भीतर CarZonesAudioFocus
प्रत्येक क्षेत्र के लिए फोकस प्रबंधित करने के लिए जिम्मेदार है।
चित्र 2. मल्टी-ज़ोन ऑडियो कॉन्फ़िगर करें
ऑडियो एचएएल
ऑटोमोटिव ऑडियो कार्यान्वयन मानक एंड्रॉइड ऑडियो एचएएल पर निर्भर करता है, जिसमें निम्नलिखित शामिल हैं:
-
IDevice.hal
। इनपुट और आउटपुट स्ट्रीम बनाता है, मुख्य वॉल्यूम और म्यूटिंग को संभालता है, और उपयोग करता है:-
createAudioPatch
। उपकरणों के बीच बाहरी-बाहरी पैच बनाने के लिए। - प्रत्येक भौतिक स्ट्रीम के लिए वॉल्यूम प्रदान करने के लिए
IDevice.setAudioPortConfig()
।
-
-
IStream.hal
। इनपुट और आउटपुट वेरिएंट के साथ, हार्डवेयर से ऑडियो नमूनों की स्ट्रीमिंग का प्रबंधन करता है।
ऑटोमोटिव उपकरण प्रकार
निम्नलिखित डिवाइस प्रकार ऑटोमोटिव प्लेटफ़ॉर्म के लिए प्रासंगिक हैं।
उपकरण का प्रकार | विवरण |
---|---|
AUDIO_DEVICE_OUT_BUS | एंड्रॉइड से प्राथमिक आउटपुट (इस प्रकार एंड्रॉइड से सभी ऑडियो वाहन तक पहुंचाए जाते हैं)। प्रत्येक संदर्भ के लिए धाराओं को स्पष्ट करने के लिए पते के रूप में उपयोग किया जाता है। |
AUDIO_DEVICE_OUT_TELEPHONY_TX | ट्रांसमिशन के लिए सेलुलर रेडियो पर ऑडियो रूट करने के लिए उपयोग किया जाता है। |
AUDIO_DEVICE_IN_BUS | अन्यथा वर्गीकृत नहीं किए गए इनपुट के लिए उपयोग किया जाता है। |
AUDIO_DEVICE_IN_FM_TUNER | केवल प्रसारण रेडियो इनपुट के लिए उपयोग किया जाता है। |
AUDIO_DEVICE_IN_TV_TUNER | यदि मौजूद हो तो टीवी डिवाइस के लिए उपयोग किया जाता है। |
AUDIO_DEVICE_IN_LINE | AUX इनपुट जैक के लिए उपयोग किया जाता है। |
AUDIO_DEVICE_IN_BLUETOOTH_A2DP | ब्लूटूथ पर संगीत प्राप्त हुआ। |
AUDIO_DEVICE_IN_TELEPHONY_RX | फ़ोन कॉल से जुड़े सेल्युलर रेडियो से प्राप्त ऑडियो के लिए उपयोग किया जाता है। |
ऑडियो डिवाइस कॉन्फ़िगर करना
Android पर दृश्यमान ऑडियो डिवाइस को /audio_policy_configuration.xml
में परिभाषित किया जाना चाहिए, जिसमें निम्नलिखित घटक शामिल हैं:
- मोड्यूल का नाम। "प्राथमिक" (ऑटोमोटिव उपयोग के मामलों के लिए प्रयुक्त), "ए2डीपी", "रिमोट_सबमिक्स", और "यूएसबी" का समर्थन करता है। मॉड्यूल नाम और संबंधित ऑडियो ड्राइवर को
audio.primary.$(variant).so
पर संकलित किया जाना चाहिए। - डिवाइसपोर्ट्स। इसमें सभी इनपुट और आउटपुट डिवाइस (स्थायी रूप से संलग्न डिवाइस और हटाने योग्य डिवाइस शामिल हैं) के लिए डिवाइस डिस्क्रिप्टर की एक सूची शामिल है जिसे इस मॉड्यूल से एक्सेस किया जा सकता है।
- प्रत्येक आउटपुट डिवाइस के लिए, आप लाभ नियंत्रण को परिभाषित कर सकते हैं जिसमें मिलीबेल में न्यूनतम/अधिकतम/डिफ़ॉल्ट/चरण मान शामिल हैं (1 मिलीबेल = 1/100 डीबी = 1/1000 बेल)।
- डिवाइसपोर्ट इंस्टेंस पर एड्रेस विशेषता का उपयोग डिवाइस को खोजने के लिए किया जा सकता है, भले ही
AUDIO_DEVICE_OUT_BUS
जैसे समान डिवाइस प्रकार वाले कई डिवाइस हों। - मिक्सपोर्ट्स। इसमें ऑडियो एचएएल द्वारा प्रदर्शित सभी आउटपुट और इनपुट स्ट्रीम की एक सूची शामिल है। प्रत्येक मिक्सपोर्ट इंस्टेंस को एंड्रॉइड ऑडियो सर्विस के लिए एक भौतिक स्ट्रीम के रूप में माना जा सकता है।
- मार्ग. इनपुट और आउटपुट डिवाइस के बीच या स्ट्रीम और डिवाइस के बीच संभावित कनेक्शन की एक सूची को परिभाषित करता है।
निम्नलिखित उदाहरण एक आउटपुट डिवाइस बस0_फोन_आउट को परिभाषित करता है जिसमें सभी एंड्रॉइड ऑडियो स्ट्रीम मिक्सर_बस0_फोन_आउट द्वारा मिश्रित होते हैं। मार्ग mixer_bus0_phone_out
के आउटपुट स्ट्रीम को डिवाइस bus0_phone_out
पर ले जाता है।
<audioPolicyConfiguration version="1.0" xmlns:xi="http://www.w3.org/2001/XInclude"> <modules> <module name="primary" halVersion="3.0"> <attachedDevices> <item>bus0_phone_out</item> <defaultOutputDevice>bus0_phone_out</defaultOutputDevice> <mixPorts> <mixPort name="mixport_bus0_phone_out" role="source" flags="AUDIO_OUTPUT_FLAG_PRIMARY"> <profile name="" format="AUDIO_FORMAT_PCM_16_BIT" samplingRates="48000" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/> </mixPort> </mixPorts> <devicePorts> <devicePort tagName="bus0_phone_out" role="sink" type="AUDIO_DEVICE_OUT_BUS" address="BUS00_PHONE"> <profile name="" format="AUDIO_FORMAT_PCM_16_BIT" samplingRates="48000" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/> <gains> <gain name="" mode="AUDIO_GAIN_MODE_JOINT" minValueMB="-8400" maxValueMB="4000" defaultValueMB="0" stepValueMB="100"/> </gains> </devicePort> </devicePorts> <routes> <route type="mix" sink="bus0_phone_out" sources="mixport_bus0_phone_out"/> </routes> </module> </modules> </audioPolicyConfiguration>