ऑडियो से जुड़ी नीतियां कॉन्फ़िगर करना

Android 10 के रिलीज़ वर्शन में, ऑडियो पॉलिसी मैनेजर को फिर से फ़ैक्टर किया गया है. इससे, कार में इस्तेमाल होने वाले मुश्किल मामलों में ज़्यादा आसानी से काम किया जा सकता है:

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

Android 7.0 में, ऑडियो टोपोलॉजी के बारे में बताने के लिए, ऑडियो नीति कॉन्फ़िगरेशन फ़ाइल फ़ॉर्मैट (एक्सएमएल) पेश किया गया था.

Android के पिछले वर्शन में, आपके प्रॉडक्ट पर मौजूद ऑडियो डिवाइसों के बारे में जानकारी देने के लिए, device/<company>/<device>/audio/audio_policy.conf का इस्तेमाल करना ज़रूरी था. Galaxy Nexus के ऑडियो हार्डवेयर के लिए, इस फ़ाइल का उदाहरण device/samsung/tuna/audio/audio_policy.conf में देखा जा सकता है. हालांकि, CONF एक आसान, मालिकाना हक वाला फ़ॉर्मैट है. यह टेलीविज़न और ऑटोमोबाइल जैसे वर्टिकल के लिए, जटिल टोपोलॉजी के बारे में बताने के लिए बहुत सीमित है.

Android 7.0 में audio_policy.conf को बंद कर दिया गया था. साथ ही, एक्सएमएल फ़ाइल फ़ॉर्मैट का इस्तेमाल करके ऑडियो टोपोलॉजी तय करने की सुविधा जोड़ी गई थी. यह फ़ॉर्मैट, लोगों के लिए ज़्यादा आसानी से पढ़ा जा सकता है. इसमें एडिटिंग और पार्सिंग के कई टूल होते हैं. साथ ही, यह जटिल ऑडियो टोपोलॉजी के बारे में बताने के लिए काफ़ी फ़्लेक्सिबल होता है. Android 7.0, कॉन्फ़िगरेशन फ़ाइलों के एक्सएमएल फ़ॉर्मैट को चुनने के लिए, USE_XML_AUDIO_POLICY_CONF बिल्ड फ़्लैग का इस्तेमाल करता है.

एक्सएमएल फ़ॉर्मैट के फ़ायदे

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

  • Android 10 में, एक साथ एक से ज़्यादा ऐक्टिव रिकॉर्डिंग ऐप्लिकेशन इस्तेमाल किए जा सकते हैं.
    • एक साथ कई रिकॉर्डिंग शुरू होने की वजह से, रिकॉर्डिंग शुरू करने के अनुरोध को कभी अस्वीकार नहीं किया जाता.
    • registerAudioRecordingCallback(AudioManager.AudioRecordingCallback cb) कॉल बैक, क्लाइंट को कैप्चर पाथ में हुए बदलावों के बारे में सूचना देता है.
  • इन स्थितियों में, क्लाइंट को साइलेंट ऑडियो सैंपल मिलते हैं:
    • निजता से जुड़ा कोई इस्तेमाल का उदाहरण (जैसे, VOICE_COMMUNICATION) चालू है.
    • क्लाइंट के पास फ़ोरग्राउंड सेवा या फ़ोरग्राउंड यूज़र इंटरफ़ेस (यूआई) नहीं है.
    • नीति के तहत, इन खास भूमिकाओं को मान्यता दी जाती है:
      • ऐक्सेसिबिलिटी सेवा: निजता से जुड़े इस्तेमाल के उदाहरण के चालू होने पर भी रिकॉर्ड कर सकती है.
      • Assistant: अगर यूज़र इंटरफ़ेस (यूआई) सबसे ऊपर है, तो इसे निजता के लिहाज़ से संवेदनशील माना जाता है.
  • ऑडियो प्रोफ़ाइलों का स्ट्रक्चर, एचडीएमआई के सामान्य ऑडियो डिस्क्रिप्टर जैसा होता है. इससे हर ऑडियो फ़ॉर्मैट के लिए, सैंपलिंग रेट/चैनल मास्क का अलग सेट इस्तेमाल किया जा सकता है.
  • डिवाइसों और स्ट्रीम के बीच सभी संभावित कनेक्शन के बारे में साफ़ तौर पर बताया गया है. पहले, एक नियम के तहत एक ही एचएएल मॉड्यूल से जुड़े सभी डिवाइसों को कनेक्ट किया जा सकता था. इससे ऑडियो नीति, ऑडियो पैच एपीआई के ज़रिए किए गए कनेक्शन को कंट्रोल नहीं कर पाती थी. एक्सएमएल फ़ॉर्मैट में, टोपोलॉजी की जानकारी से कनेक्शन की सीमाओं के बारे में पता चलता है.
  • शामिल है के लिए सहायता से, स्टैंडर्ड A2DP, यूएसबी या फिर से सबमिट करने की परिभाषाओं को दोहराने से बचा जा सकता है.
  • वॉल्यूम कर्व को पसंद के मुताबिक बनाया जा सकता है. पहले, वॉल्यूम टेबल को हार्डकोड किया जाता था. वॉल्यूम टेबल को XML फ़ॉर्मैट में दिखाया जाता है और इन्हें पसंद के मुताबिक बनाया जा सकता है.

frameworks/av/services/audiopolicy/config/audio_policy_configuration.xml पर मौजूद टेंप्लेट में, इनमें से कई सुविधाओं का इस्तेमाल दिखाया गया है.

फ़ाइल फ़ॉर्मैट और जगह

ऑडियो से जुड़ी नई नीति की कॉन्फ़िगरेशन फ़ाइल audio_policy_configuration.xml है और यह /system/etc में मौजूद है. यहां दिए गए उदाहरणों में, Android 12 और इससे पहले के वर्शन के लिए, XML फ़ाइल फ़ॉर्मैट में ऑडियो नीति का सामान्य कॉन्फ़िगरेशन दिखाया गया है.

टॉप-लेवल स्ट्रक्चर में ऐसे मॉड्यूल होते हैं जो हर ऑडियो एचएएल हार्डवेयर मॉड्यूल से जुड़े होते हैं. हर मॉड्यूल में मिक्स पोर्ट, डिवाइस पोर्ट, और रास्तों की सूची होती है:

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

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

फ़ाइलें शामिल करना

एक्सएमएल इन्क्लूज़न (XInclude) तरीके का इस्तेमाल करके, ऑडियो से जुड़ी नीति के कॉन्फ़िगरेशन की जानकारी को अन्य एक्सएमएल फ़ाइलों में शामिल किया जा सकता है. शामिल की गई सभी फ़ाइलों में, ऊपर बताया गया स्ट्रक्चर होना चाहिए. साथ ही, इन पाबंदियों का पालन करना ज़रूरी है:

  • फ़ाइलों में सिर्फ़ टॉप-लेवल के एलिमेंट शामिल किए जा सकते हैं.
  • फ़ाइलों में XInclude एलिमेंट नहीं होने चाहिए.

इसमें शामिल करें का इस्तेमाल, सभी ऑडियो नीति कॉन्फ़िगरेशन फ़ाइलों में स्टैंडर्ड Android Open Source Project (AOSP) ऑडियो HAL मॉड्यूल कॉन्फ़िगरेशन की जानकारी कॉपी करने से बचने के लिए किया जाता है. ऐसा करने से, गड़बड़ियां होने की आशंका कम हो जाती है. ऑडियो नीति के कॉन्फ़िगरेशन की स्टैंडर्ड एक्सएमएल फ़ाइल, इन ऑडियो एचएएल के लिए उपलब्ध कराई गई है:

  • A2DP: a2dp_audio_policy_configuration.xml
  • सबमिक्स को फिर से रूट करना: rsubmix_audio_policy_configuration.xml
  • यूएसबी: usb_audio_policy_configuration.xml

ऑडियो नीति के कोड का संगठन

AudioPolicyManager.cpp को कई मॉड्यूल में बांटा गया है, ताकि इसे आसानी से मैनेज और कॉन्फ़िगर किया जा सके. frameworks/av/services/audiopolicy के संगठन में ये मॉड्यूल शामिल हैं.

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

यह कुकी, उन नियमों को लागू करती है जिनसे यह तय होता है कि किसी खास इस्तेमाल के लिए, कौनसा डिवाइस और वॉल्यूम इस्तेमाल किया जाना चाहिए. यह सामान्य हिस्से के साथ एक स्टैंडर्ड इंटरफ़ेस लागू करता है. जैसे, किसी दिए गए प्लेबैक या कैप्चर के इस्तेमाल के उदाहरण के लिए सही डिवाइस पाना या कनेक्ट किए गए डिवाइसों या बाहरी स्थिति (यानी, कॉल की स्थिति, जिसमें डिवाइस का इस्तेमाल करना ज़रूरी है) को सेट करना. इससे राउटिंग के फ़ैसले में बदलाव किया जा सकता है.

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

/engineconfigurable नीति इंजन को लागू करने के लिए, पैरामीटर फ़्रेमवर्क का इस्तेमाल किया जाता है. इसके बारे में यहां बताया गया है. कॉन्फ़िगरेशन, पैरामीटर फ़्रेमवर्क पर आधारित होता है. साथ ही, नीति को एक्सएमएल फ़ाइलों से तय किया जाता है.
/enginedefault नीति इंजन को लागू करने की सुविधा, Android Audio Policy Manager को लागू करने की पिछली सुविधाओं पर आधारित है. यह डिफ़ॉल्ट सेटिंग है. इसमें हार्ड कोड किए गए ऐसे नियम शामिल होते हैं जो Nexus और AOSP के लागू करने के तरीके से मेल खाते हैं.
/service इसमें बाइंडर इंटरफ़ेस, थ्रेडिंग, और फ़्रेमवर्क के बाकी हिस्सों के साथ इंटरफ़ेस के लिए लॉकिंग लागू करना शामिल है.

पैरामीटर फ़्रेमवर्क का इस्तेमाल करके कॉन्फ़िगरेशन

ऑडियो नीति के कोड को इस तरह से व्यवस्थित किया गया है कि इसे समझना और बनाए रखना आसान हो. साथ ही, यह कॉन्फ़िगरेशन फ़ाइलों से पूरी तरह से तय की गई ऑडियो नीति के साथ काम करता है. संगठन और ऑडियो नीति का डिज़ाइन, Intel के पैरामीटर फ़्रेमवर्क पर आधारित है. यह पैरामीटर को मैनेज करने के लिए, प्लगिन और नियम पर आधारित फ़्रेमवर्क है.

कॉन्फ़िगर की जा सकने वाली ऑडियो नीति का इस्तेमाल करके, वेंडर और ओईएम ये काम कर सकते हैं:

  • किसी सिस्टम की संरचना और उसके पैरामीटर के बारे में एक्सएमएल में जानकारी दें.
  • बताए गए पैरामीटर को ऐक्सेस करने के लिए, C++ में कोड लिखें या बैकएंड (प्लगिन) का फिर से इस्तेमाल करें.
  • उन शर्तों/नियमों को तय करें जिनके आधार पर किसी पैरामीटर को कोई वैल्यू असाइन की जानी चाहिए. इसके लिए, एक्सएमएल या डोमेन के हिसाब से तय की गई भाषा का इस्तेमाल करें.

AOSP में, ऑडियो नीति के कॉन्फ़िगरेशन फ़ाइल का एक उदाहरण शामिल है. इसमें Frameworks/av/services/audiopolicy/engineconfigurable/parameter-framework/example/Settings/PolicyConfigurableDomains.xml पर पैरामीटर फ़्रेमवर्क का इस्तेमाल किया गया है. ज़्यादा जानकारी के लिए, पैरामीटर फ़्रेमवर्क के बारे में Intel का दस्तावेज़ देखें.

Android 10 या इससे पहले के वर्शन में, कॉन्फ़िगर की जा सकने वाली ऑडियो नीति को बिल्ड विकल्प USE_CONFIGURABLE_AUDIO_POLICY का इस्तेमाल करके चुना जाता है. Android 11 या इसके बाद के वर्शन में, ऑडियो नीति इंजन का वर्शन audio_policy_configuration.xml फ़ाइल में चुना जाता है. कॉन्फ़िगर की जा सकने वाली ऑडियो नीति इंजन को चुनने के लिए, globalConfiguration एलिमेंट के engine_library एट्रिब्यूट की वैल्यू को configurable पर सेट करें. उदाहरण के लिए:

<audioPolicyConfiguration>
    <globalConfiguration engine_library="configurable" />
...
</audioPolicyConfiguration>

ऑडियो रूटिंग से जुड़े एपीआई

Android 6.0 में, सार्वजनिक Enumeration और Selection API लॉन्च किया गया था. यह ऑडियो पैच/ऑडियो पोर्ट इंफ़्रास्ट्रक्चर के ऊपर काम करता है. इससे ऐप्लिकेशन डेवलपर, कनेक्ट किए गए ऑडियो रिकॉर्ड या ट्रैक के लिए, किसी खास डिवाइस के आउटपुट या इनपुट को प्राथमिकता दे सकते हैं.

Android 7.0 में, Enumeration and Selection API की पुष्टि CTS टेस्ट से की जाती है. साथ ही, इसे नेटिव C/C++ (OpenSL ES) ऑडियो स्ट्रीम के लिए राउटिंग की सुविधा शामिल करने के लिए बढ़ाया जाता है. नेटिव स्ट्रीम की राउटिंग अब भी Java में की जाती है. इसमें एक AudioRouting इंटरफ़ेस जोड़ा गया है. यह AudioTrack और AudioRecord क्लास के लिए खास तौर पर बनाए गए राउटिंग के तरीकों को बदलता है, उन्हें एक साथ जोड़ता है, और उन्हें बंद कर देता है.

Enumeration और Selection API के बारे में जानकारी के लिए, Android कॉन्फ़िगरेशन इंटरफ़ेस और OpenSLES_AndroidConfiguration.h देखें. ऑडियो रूटिंग के बारे में ज़्यादा जानने के लिए, AudioRouting देखें.

मल्टी-चैनल की सुविधा

अगर आपका हार्डवेयर और ड्राइवर, एचडीएमआई के ज़रिए मल्टीचैनल ऑडियो की सुविधा के साथ काम करता है, तो ऑडियो स्ट्रीम को सीधे ऑडियो हार्डवेयर पर आउटपुट किया जा सकता है. इससे AudioFlinger मिक्सर बायपास हो जाता है. इसलिए, इसे दो चैनलों में डाउनमिक्स नहीं किया जाता. ऑडियो एचएएल को यह बताना होगा कि आउटपुट स्ट्रीम प्रोफ़ाइल, मल्टीचैनल ऑडियो की सुविधाओं के साथ काम करती है या नहीं. अगर एचएएल अपनी क्षमताओं को दिखाता है, तो डिफ़ॉल्ट नीति मैनेजर, एचडीएमआई पर मल्टीचैनल ऑडियो चलाने की अनुमति देता है. लागू करने से जुड़ी जानकारी के लिए, device/samsung/tuna/audio/audio_hw.c देखें.

यह बताने के लिए कि आपके प्रॉडक्ट में मल्टीचैनल ऑडियो आउटपुट है, ऑडियो नीति कॉन्फ़िगरेशन फ़ाइल में बदलाव करें. इससे आपके प्रॉडक्ट के लिए मल्टीचैनल आउटपुट के बारे में जानकारी दी जा सकेगी. frameworks/av/services/audiopolicy/config/primary_audio_policy_configuration_tv.xml के इस उदाहरण में, डाइनैमिक चैनल मास्क दिखाया गया है. इसका मतलब है कि ऑडियो नीति मैनेजर, कनेक्ट होने के बाद एचडीएमआई सिंक की सुविधा के साथ काम करने वाले चैनल मास्क के बारे में क्वेरी करता है.

आपके पास स्टैटिक चैनल मास्क भी तय करने का विकल्प होता है. जैसे, AUDIO_CHANNEL_OUT_5POINT1. जब ऑडियो डिवाइस पर मल्टीचैनल ऑडियो की सुविधा काम नहीं करती है, तो AudioFlinger का मिक्सर, कॉन्टेंट को अपने-आप स्टीरियो में डाउनमिक्स कर देता है.

मीडिया कोडेक

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