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

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

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

Android 11 में, वाहन से जुड़ी ऑडियो सेटिंग में ये बदलाव किए गए हैं:

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

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

स्ट्रीम-सेंट्रिक आर्किटेक्चर का डायग्राम

पहली इमेज. स्ट्रीम-सेंट्रिक आर्किटेक्चर का डायग्राम

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

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

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

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

Android की आवाज़ें

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

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

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

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

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

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

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

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

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

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

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

ऑडियो कैप्चर करते समय, Audio HAL को एक 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 10 के बाद, Android फ़्रेमवर्क एक साथ कई इनपुट कैप्चर करने की सुविधा देता है. हालांकि, उपयोगकर्ता की निजता को सुरक्षित रखने के लिए, इस सुविधा पर कुछ पाबंदियां भी हैं. इन पाबंदियों के तहत, 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 के जैसे ही माना जाता है. हालांकि, मीडिया चलाने के लिए इस पर भरोसा नहीं किया जाना चाहिए.

सिस्टम के इस्तेमाल से जुड़ी जानकारी

Android 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 में ऑडियो कॉन्टेक्स्ट ये हैं:

CarAudioContext असोसिएटेड एट्रिब्यूट के इस्तेमाल
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 में, एक से ज़्यादा ज़ोन में ऑडियो चलाने की सुविधा उपलब्ध है. इसकी मदद से, OEM अलग-अलग ज़ोन में ऑडियो को कॉन्फ़िगर कर सकते हैं. हर ज़ोन, वाहन में मौजूद डिवाइसों का एक कलेक्शन होता है. इसमें वॉल्यूम ग्रुप, कॉन्टेक्स्ट के लिए रूटिंग कॉन्फ़िगरेशन, और फ़ोकस मैनेजमेंट की सुविधाएं होती हैं. इस तरह, मुख्य केबिन को एक ऑडियोज़ोन के तौर पर कॉन्फ़िगर किया जा सकता है, जबकि पीछे की डिसप्ले के हेडफ़ोन जैक को दूसरे ज़ोन के तौर पर कॉन्फ़िगर किया जा सकता है.

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

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

अलग-अलग ज़ोन के लिए ऑडियो कॉन्फ़िगर करना

इमेज 2. अलग-अलग ज़ोन के लिए ऑडियो कॉन्फ़िगर करना

ऑडियो एचएएल

वाहन में ऑडियो की सुविधा देने के लिए, स्टैंडर्ड 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", और "USB" के साथ काम करता है. मॉड्यूल के नाम और उससे जुड़े ऑडियो ड्राइवर को audio.primary.$(variant).so में कंपाइल किया जाना चाहिए.
  • devicePorts. इसमें सभी इनपुट और आउटपुट डिवाइसों के डिवाइस डिस्क्रिप्टर की सूची होती है. इनमें हमेशा जुड़े रहने वाले डिवाइस और हटाए जा सकने वाले डिवाइस शामिल होते हैं. इन डिवाइसों को इस मॉड्यूल से ऐक्सेस किया जा सकता है.
    • हर आउटपुट डिवाइस के लिए, गेन कंट्रोल तय किया जा सकता है. इसमें मिलीबेल में कम से कम/ज़्यादा से ज़्यादा/डिफ़ॉल्ट/चरण की वैल्यू होती है. 1 मिलीबेल = 1/100 dB = 1/1000 बेल.
    • डिवाइस ढूंढने के लिए, devicePort इंस्टेंस के address एट्रिब्यूट का इस्तेमाल किया जा सकता है. भले ही, AUDIO_DEVICE_OUT_BUS जैसे डिवाइस टाइप वाले एक से ज़्यादा डिवाइस हों.
  • mixPorts. इसमें ऑडियो एचएएल की ओर से एक्सपोज़ की गई सभी आउटपुट और इनपुट स्ट्रीम की सूची होती है. हर mixPort इंस्टेंस को Android AudioService के लिए, एक फ़िज़िकल स्ट्रीम माना जा सकता है.
  • routes. इनपुट और आउटपुट डिवाइसों या स्ट्रीम और डिवाइस के बीच संभावित कनेक्शन की सूची तय करता है.

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