ऑटोमोटिव ऑडियो

Android Automotive OS (AAOS) को मुख्य Android ऑडियो स्टैक पर बनाया जाता है, ताकि वाहन में सूचना और मनोरंजन की सुविधा देने वाले डिवाइस के तौर पर इस्तेमाल के लिए, इस्तेमाल के उदाहरण वाले ऐप्लिकेशन उपलब्ध हों. एएओएस, सूचना और मनोरंजन की सुविधा देने वाली आवाज़ों के लिए ज़िम्मेदार है. इनमें मीडिया, नेविगेशन, और हालांकि, वह उन घंटी और चेतावनियों के लिए सीधे तौर पर ज़िम्मेदार नहीं होगा उपलब्धता और समय से जुड़ी सख्त शर्तें. AAOS संगठन, सिग्नल और ऑडियो को मैनेज करने में वाहन की मदद करने वाले तरीके होते हैं. आख़िर में, यह वाहन पर निर्भर करता है ताकि यह तय किया जा सके कि ड्राइवर को कौनसी आवाज़ें सुनाई जानी चाहिए और यात्रियों के लिए, सुरक्षा से जुड़ी ज़रूरी आवाज़ों और नियमों के पालन की आवाज़ को सही तरीके से सेट करना बिना किसी रुकावट के सुना.

Android, वाहन के मीडिया अनुभव को मैनेज करता है. इसलिए, बाहरी मीडिया सोर्स जैसे कि रेडियो ट्यूनर को ऐसे ऐप्लिकेशन के तौर पर दिखाया जाना चाहिए जो ऑडियो को हैंडल कर सकें फ़ोकस और मीडिया के मुख्य इवेंट.

Android 11 वर्शन में, वाहन संबंधित ऑडियो की सुविधा में ये बदलाव किए गए हैं सहायता:

Android की आवाज़ें और स्ट्रीम

वाहन संबंधित ऑडियो सिस्टम, इन आवाज़ों और स्ट्रीम को हैंडल करते हैं:

स्ट्रीम पर आधारित आर्किटेक्चर का डायग्राम

पहला डायग्राम. स्ट्रीम पर आधारित आर्किटेक्चर का डायग्राम

Android, Android ऐप्लिकेशन से आने वाली आवाज़ों को मैनेज करता है और उन ऐप्लिकेशन को कंट्रोल करता है और आउटपुट डिवाइस की आवाज़ को HAL पर इस आधार पर रूट किया जाता है कि साउंड:

  • लॉजिकल स्ट्रीम, जिसे मुख्य ऑडियो के सोर्स कहा जाता है नाम, ऑडियो एट्रिब्यूट के साथ टैग किए जाते हैं.
  • फ़िज़िकल स्ट्रीम, जिसे मुख्य ऑडियो में शामिल डिवाइस कहा जाता है नामांकरण, इस्तेमाल करने के बाद संदर्भ की कोई जानकारी नहीं होती.

विश्वसनीयता के लिए, बाहरी साउंड का इस्तेमाल किया जाता है. ये साउंड इंडिपेंडेंट किसी सोर्स से लिए जाते हैं सोर्स, जैसे कि सीटबेल्ट की चेतावनी वाली घंटी) को Android के बाहर मैनेज किया जाता है. इनके नीचे, एचएएल या यहां तक कि अलग हार्डवेयर में भी. सिस्टम लागू करने वालों को ऐसा मिक्सर देना चाहिए जो Android से साउंड इनपुट की एक या ज़्यादा स्ट्रीम स्वीकार करता है और फिर उन्हें एक साथ जोड़ता है यह ज़रूरी है कि बाहरी साउंड सोर्स के साथ सही तरीके से स्ट्रीम किया जाए, वाहन.

यह पक्का करना कि एचएएल को लागू करना और एक्सटर्नल मिक्सर की ज़िम्मेदारी है Android के दिए गए डिवाइस में, सुरक्षा से जुड़ी गंभीर आवाज़ें सुनाई देती हैं और उन्हें मिक्स करने के लिए इस्तेमाल किया जाता है स्ट्रीम करता है और उन्हें सही स्पीकर पर रूट करता है.

Android साउंड

ऐप्लिकेशन में एक या उससे ज़्यादा ऐसे प्लेयर हो सकते हैं जो स्टैंडर्ड Android का इस्तेमाल करके इंटरैक्ट करते हों एपीआई (उदाहरण के लिए, AudioManager फ़ोकस कंट्रोल या MediaPlayer के लिए करने के लिए डिज़ाइन किया गया है. यह डेटा यह सिंगल चैनल मोनो या 7.1 सराउंड साउंड हो सकता है, लेकिन इसे रूट किया जाता है और सिंगल सोर्स. ऐप्लिकेशन स्ट्रीम AudioAttributes से जुड़ी है इनसे सिस्टम को यह संकेत मिलता है कि ऑडियो को कैसे दिखाया जाना चाहिए.

लॉजिकल स्ट्रीम को AudioService के ज़रिए भेजा जाता है और इन्हें एक (और का इस्तेमाल सिर्फ़ एक) किया जा सकता है. AudioFlinger में मौजूद एक मिक्सर का इस्तेमाल किया. ऑडियो एट्रिब्यूट को अलग-अलग करने के बाद स्ट्रीम में जोड़ दिया है, तो वे अब उपलब्ध नहीं हैं.

इसके बाद, हर लाइव स्ट्रीम को ऑडियो एचएएल को डिलीवर किया जाता है, ताकि उसे रेंडर किया जा सके हार्डवेयर. ऑटोमोटिव ऐप्लिकेशन में, रेंडरिंग हार्डवेयर लोकल कोडेक हो सकता है (यह मोबाइल डिवाइसों की तरह ही) या किसी दूसरी जगह से इंस्टॉल किया गया रिमोट प्रोसेसर नेटवर्क. दोनों ही मामलों में, ऑडियो एचएएल को लागू करने का काम होता है. सैंपल डेटा को इकट्ठा कर सकता है और उसकी आवाज़ सुन सकता है.

बाहरी स्ट्रीम

ऐसी साउंड स्ट्रीम जिन्हें Android के ज़रिए रूट नहीं किया जाना चाहिए (सर्टिफ़िकेशन या समय की वजह के बीच में) सीधे एक्सटर्नल मिक्सर को भेजी जा सकती हैं. Android 11 के हिसाब से, एचएएल अब इन बाहरी आवाज़ों पर फ़ोकस करने का अनुरोध कर सकता है, ताकि Android को जानकारी दी जा सके जैसे कि मीडिया को रोकना या मीडिया को रोकना ध्यान लगाने से रोका जा सकता है.

अगर बाहरी स्ट्रीम ऐसे मीडिया सोर्स हैं जिन्हें आवाज़ के साथ इंटरैक्ट करना चाहिए Android आस-पास की जगह की जानकारी जनरेट कर रहा है. उदाहरण के लिए, किसी बाहरी ट्यूनर चालू है), उन बाहरी स्ट्रीम को Android ऐप्लिकेशन. ऐसा ऐप्लिकेशन, मीडिया सोर्स की ओर से ऑडियो फ़ोकस का अनुरोध करेगा के बजाय एचएएल की तरह काम करता है. साथ ही, फ़ोकस करने वाली सूचनाओं के जवाब देता है Android फ़ोकस के हिसाब से बाहरी सोर्स को चालू/बंद करना की नीति देखें. यह ऐप्लिकेशन, मीडिया से जुड़े मुख्य इवेंट को मैनेज करने के लिए भी ज़िम्मेदार होता है, जैसे कि चलाना/रोकना. ऐसे बाहरी डिवाइसों को कंट्रोल करने का एक तरीका HwAudioSource है.

आउटपुट डिवाइस

ऑडियो एचएएल लेवल पर, डिवाइस AUDIO_DEVICE_OUT_BUS यह वाहन के ऑडियो सिस्टम में इस्तेमाल करने के लिए एक सामान्य आउटपुट डिवाइस उपलब्ध कराता है. बस डिवाइस, पते वाले पोर्ट का इस्तेमाल करता है (जहां हर पोर्ट, फ़िज़िकल स्ट्रीम) शामिल है और उम्मीद की जाती है कि यह आउटपुट डिवाइस टाइप ही एक वाहन.

लागू करने के लिए, सिस्टम में सभी Android साउंड के लिए एक बस पोर्ट का इस्तेमाल किया जा सकता है इस केस में Android सभी चीज़ों को एक साथ मिला कर एक स्ट्रीम के रूप में डिलीवर करता है. इसके अलावा, एचएएल हर CarAudioContext के लिए एक बस पोर्ट दे सकता है, ताकि किसी भी तरह की आवाज़ की एक साथ डिलीवरी. इसकी वजह से एचएएल का इस्तेमाल करना मुमकिन हो गया है अपनी पसंद के हिसाब से, अलग-अलग साउंड को मिक्स और डक किया जा सकता है.

आउटपुट वाले डिवाइसों पर ऑडियो कॉन्टेक्स्ट असाइन किए जाते हैं car_audio_configuration.xml.

माइक्रोफ़ोन इनपुट

ऑडियो कैप्चर करते समय, ऑडियो एचएएल को एक openInputStream मिलता है जिसमें एक AudioSource आर्ग्युमेंट शामिल है, जो बताता है कि माइक्रोफ़ोन इनपुट प्रोसेस होना चाहिए.

VOICE_RECOGNITION का सोर्स (खास तौर पर Google Assistant) ऐसे स्टीरियो माइक्रोफ़ोन स्ट्रीम की उम्मीद करता है जिसमें इको रद्द करने का इफ़ेक्ट (अगर उपलब्ध हो) है, लेकिन इस पर कोई दूसरी प्रोसेस लागू नहीं की गई है. बीमफ़ॉर्मिंग का काम Assistant द्वारा किया जाना आवश्यक है.

मल्टी-चैनल माइक्रोफ़ोन इनपुट

दो से ज़्यादा चैनल (स्टीरियो) वाले डिवाइस से ऑडियो कैप्चर करने के लिए, किसी स्थितित्मक इंडेक्स मास्क (जैसे कि 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 (ज़्यादा से ज़्यादा दो चैनल).

समवर्ती कैप्चर

Android फ़्रेमवर्क, Android 10 के बाद के वर्शन कुछ पाबंदियों के साथ बनाया है, ताकि उपयोगकर्ता की निजता की सुरक्षा की जा सके. हिस्से के तौर पर पर पाबंदी है, जैसे कि वर्चुअल सोर्स AUDIO_SOURCE_FM_TUNER को अनदेखा किया जाता है और इसलिए इन्हें अनुमति दी जाती है किसी सामान्य इनपुट (जैसे कि माइक्रोफ़ोन) के साथ एक साथ कैप्चर किया जाता है. HwAudioSources को भी एक साथ चल रहे इवेंट का हिस्सा नहीं माना जाता कैप्चर प्रतिबंध.

ऐसे ऐप्लिकेशन जो AUDIO_DEVICE_IN_BUS डिवाइसों या सेकंडरी AUDIO_DEVICE_IN_FM_TUNER डिवाइसों को साफ़ तौर पर, उन डिवाइसों की पहचान करना और AudioRecord.setPreferredDevice() का इस्तेमाल करना को बायपास करने के लिए कहा जाता है.

इस्तेमाल किए गए ऑडियो

AAOS मुख्य तौर पर AudioAttributes.AttributeUsages का इस्तेमाल करती है ये सुविधाएं, रूटिंग, आवाज़ घटाने या बढ़ाने, और फ़ोकस मैनेजमेंट के लिए उपलब्ध हैं. इस्तेमाल "क्यों" का प्रतिनिधित्व स्ट्रीम चलाई जा रही है. इसलिए, सभी स्ट्रीम और ऑडियो फ़ोकस अनुरोधों को उनके ऑडियो प्लेबैक के इस्तेमाल के बारे में बताना चाहिए. टास्क कब शुरू होगा किसी Audioattribute ऑब्जेक्ट को बनाते समय खास तौर पर सेट नहीं किया जाता है, तो इस्तेमाल डिफ़ॉल्ट रूप से USAGE_UNKNOWN पर सेट है. फ़िलहाल, इसे वैसा ही माना जा रहा है USAGE_MEDIA के तौर पर, मीडिया के लिए इस व्यवहार पर भरोसा नहीं किया जाना चाहिए प्लेबैक.

सिस्टम के इस्तेमाल

Android 11 में, सिस्टम इस्तेमाल करने की सुविधा शुरू की गई. ये इस्तेमाल काम करते हैं पहले से तय इस्तेमाल की तरह ही, इसके लिए सिस्टम एपीआई की ज़रूरत होती है android.permission.MODIFY_AUDIO_ROUTING भी इस्तेमाल किए जा सकते हैं. नया सिस्टम का इस्तेमाल इस तरह से किया गया है:

  • USAGE_EMERGENCY
  • USAGE_SAFETY
  • USAGE_VEHICLE_STATUS
  • USAGE_ANNOUNCEMENT

सिस्टम के इस्तेमाल के साथ AudioAttributes बनाने के लिए, इसका इस्तेमाल करें AudioAttributes.Builder#setSystemUsage setUsage के बजाय. गैर-सिस्टम उपयोग के साथ इस तरीके को कॉल करना ऐसा करने से 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

ऑडियो के कॉन्टेक्स्ट और इस्तेमाल के बीच मैप करना. हाइलाइट की गई पंक्तियां, नई सिस्टम के इस्तेमाल.

मल्टी-ज़ोन ऑडियो

वाहन संबंधित सुविधाओं के साथ, एक साथ कई उपयोगकर्ताओं को सेवाएं इस्तेमाल करने के नए उदाहरण प्लैटफ़ॉर्म के साथ इंटरैक्ट करते हुए और अलग से मीडिया का इस्तेमाल करना चाहते हैं. इसके लिए उदाहरण के लिए, ड्राइवर केबिन में संगीत चला सकता है, जबकि पीछे की सीट पर बैठा कोई व्यक्ति फ़ोन के पीछे मौजूद डिसप्ले पर YouTube वीडियो देखा जा रहा है. मल्टी-ज़ोन ऑडियो से यह सुविधा चालू होती है इसकी मदद से, अलग-अलग जगहों पर अलग-अलग ऑडियो सोर्स को एक साथ चलाया जा सकता है करते हैं.

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

ये ज़ोन, car_audio_configuration.xml के हिस्से के तौर पर तय किए जाते हैं. इसके बाद, CarAudioService कॉन्फ़िगरेशन को पढ़ता है और AudioService में मदद करता है ऑडियो स्ट्रीम को उनसे जुड़े ज़ोन के आधार पर रूट कर सकता है. हर ज़ोन अब भी तय करता है कॉन्टेक्स्ट और ऐप्लिकेशन के uid के आधार पर रूटिंग के लिए नियम. जब कोई खिलाड़ी बनाया गया, CarAudioService से तय होता है कि प्लेयर किस ज़ोन के लिए है जो AudioFlinger से जुड़ा है और फिर उसके इस्तेमाल के मुताबिक ऑडियो को रूट करना चाहिए.

हर ऑडियो ज़ोन के लिए, फ़ोकस को अलग से बनाए रखा जाता है. यह चालू करता है अलग-अलग ज़ोन में मौजूद ऐप्लिकेशन, ताकि बिना किसी रुकावट के स्वतंत्र रूप से ऑडियो जनरेट किया जा सके एक-दूसरे के साथ हस्तक्षेप करते हुए आवेदनों को अभी भी जो अपने हिसाब से काम करते हैं. CarZonesAudioFocus में से CarAudioService, हर एक के लिए फ़ोकस मैनेज करने के लिए ज़िम्मेदार है ज़ोन.

मल्टी-ज़ोन ऑडियो कॉन्फ़िगर करें

दूसरी इमेज. मल्टी-ज़ोन ऑडियो कॉन्फ़िगर करें

ऑडियो एचएएल

वाहन से जुड़े ऑडियो लागू करने के लिए स्टैंडर्ड Android Audio HAL का इस्तेमाल किया जाता है, इसमें ये शामिल हैं:

  • IDevice.hal. इनपुट और आउटपुट स्ट्रीम बनाता है, मुख्य वॉल्यूम और म्यूट को हैंडल करता है और इनका इस्तेमाल करता है:
    • createAudioPatch. डिवाइसों के बीच बाहरी-बाहरी पैच बनाने के लिए.
    • हर फ़िज़िकल स्ट्रीम की आवाज़ बढ़ाने के लिए IDevice.setAudioPortConfig().
  • IStream.hal. इनपुट और आउटपुट वैरिएंट के साथ-साथ, यह हार्डवेयर में और उससे ऑडियो सैंपल को स्ट्रीम करने का काम करती है.

वाहन संबंधित डिवाइस के टाइप

नीचे दिए गए डिवाइस, वाहन संबंधित प्लैटफ़ॉर्म के लिए काम के हैं.

डिवाइस किस तरह का है ब्यौरा
AUDIO_DEVICE_OUT_BUS Android का प्राइमरी आउटपुट (Android से आने वाले सभी ऑडियो को गाड़ी में डिलीवर किया जाता है). इसका इस्तेमाल स्ट्रीम को साफ़ तौर पर पहचानने के लिए पते के तौर पर किया जाता है हर संदर्भ के लिए.
AUDIO_DEVICE_OUT_TELEPHONY_TX ट्रांसमिशन के लिए सेल्युलर रेडियो में रूट किए गए ऑडियो के लिए इस्तेमाल किया जाता है.
AUDIO_DEVICE_IN_BUS इसका इस्तेमाल ऐसे इनपुट के लिए किया जाता है जिन्हें किसी अन्य कैटगरी में नहीं रखा जाता.
AUDIO_DEVICE_IN_FM_TUNER सिर्फ़ ब्रॉडकास्ट रेडियो इनपुट के लिए इस्तेमाल किया जाता है.
AUDIO_DEVICE_IN_TV_TUNER मौजूद होने पर टीवी डिवाइस के लिए इस्तेमाल किया जाता है.
AUDIO_DEVICE_IN_LINE इसका इस्तेमाल ऑक्स इनपुट जैक के लिए किया जाता है.
AUDIO_DEVICE_IN_BLUETOOTH_A2DP ब्लूटूथ पर संगीत मिला.
AUDIO_DEVICE_IN_TELEPHONY_RX किसी फ़ोन से जुड़े सेल्युलर रेडियो से मिलने वाले ऑडियो के लिए इस्तेमाल किया जाता है कॉल.

ऑडियो डिवाइस कॉन्फ़िगर किए जा रहे हैं

Android को दिखने वाले ऑडियो डिवाइस /audio_policy_configuration.xml, जिसमें ये कॉम्पोनेंट शामिल हैं:

  • मॉड्यूल का नाम. "प्राइमरी" के साथ काम करता है (वाहन संबंधित कामों में इस्तेमाल होता है), "A2DP", "remote_submix", और "यूएसबी". मॉड्यूल का नाम और उससे जुड़े ऑडियो ड्राइवर को audio.primary.$(variant).so में कंपाइल किया जाना चाहिए.
  • डिवाइस पोर्ट. इसमें सभी इनपुट और आउटपुट के लिए, डिवाइस डिस्क्रिप्टर की सूची होती है डिवाइस (इसमें स्थायी रूप से अटैच किए गए डिवाइस और हटाए जा सकने वाले डिवाइस शामिल हैं) इस मॉड्यूल से ऐक्सेस किया गया है.
    • हर आउटपुट डिवाइस के लिए, गेन कंट्रोल को तय किया जा सकता है, जिसमें मिलीबेल में कम से कम/ज़्यादा से ज़्यादा/डिफ़ॉल्ट/चरण की वैल्यू (1 मिलीबेल = 1/100 डीबी = 1/1000 बेल्ट).
    • devicePort इंस्टेंस पर पता विशेषता का इस्तेमाल भले ही डिवाइस के एक ही टाइप के कई डिवाइस हों AUDIO_DEVICE_OUT_BUS.
  • मिक्सपोर्ट. इसमें उन सभी आउटपुट और इनपुट स्ट्रीम की सूची होती है जिन्हें ऑडियो एचएएल. हर मिक्सपोर्ट इंस्टेंस को फ़िज़िकल स्ट्रीम माना जा सकता है Android ऑडियो सेवा.
  • इस्तेमाल कर सकते हैं. इनपुट और आउटपुट के बीच संभावित कनेक्शन की सूची के बारे में बताता है डिवाइस या स्ट्रीम और डिवाइस के बीच में आएँ.

इस उदाहरण में एक आउटपुट डिवाइस बस0_phone_out बताया गया है, जिसमें सभी Android ऑडियो स्ट्रीम को मिक्सर_बू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>