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

Android 14 में, Android Automotive Operating System (AAOS), कॉन्फ़िगर की जा सकने वाली ऑडियो नीति (सीएपी) इंजन का इस्तेमाल करता है. इससे प्राइमरी ऑडियो ज़ोन में कार के ऑडियो को मैनेज किया जा सकता है. खास तौर पर, CAP इंजन की मदद से AAOS, सिर्फ़ ऑडियो रूटिंग, सिर्फ़ ऑडियो वॉल्यूम या रूटिंग और वॉल्यूम, दोनों को एक साथ कंट्रोल कर सकता है. इन फ़्लैग का इस्तेमाल करके, व्यवहार को कंट्रोल किया जा सकता है:

  • सीएपी के वॉल्यूम को मैनेज करने की सुविधा चालू करने के लिए, useCoreAudioVolume फ़्लैग का इस्तेमाल करें. इस वैल्यू के true होने पर, कार ऑडियो सेवा, वॉल्यूम ग्रुप को मैनेज करने के लिए ऑडियो मैनेजर एपीआई का इस्तेमाल करती है.

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

ऑडियो पॉलिसी इंजन, Android में डिफ़ॉल्ट रूप से भी काम करता है. यह डिफ़ॉल्ट ऑडियो पॉलिसी इंजन के तौर पर काम करता है.

बैकग्राउंड

CAP इंजन, Intel के पैरामीटर फ़्रेमवर्क पर आधारित है. यह पैरामीटर को मैनेज करने के लिए, प्लगिन और नियम पर आधारित फ़्रेमवर्क है. खास तौर पर, Android में ऑडियो मैनेज करने के लिए, CAP इंजन ने एक्सएमएल फ़ाइलों के नियमों को तय करने की सुविधा शुरू की है. इससे यह तय किया जा सकता है कि:

  • ऑडियो प्रॉडक्ट की रणनीति
  • ऑडियो आउटपुट डिवाइस चुनने के नियम
  • ऑडियो इनपुट डिवाइस चुनने के नियम
  • वॉल्यूम और म्यूट करने की सुविधा को मैनेज करने के नियम, साथ ही वॉल्यूम की टेबल

Android 16 से पहले CAP को शुरू करना

नीचे दी गई इमेज में, Android 6 के हिसाब से कॉन्फ़िगर किए जा सकने वाले ऑडियो पॉलिसी इंजन के कॉन्फ़िगरेशन मैनेजमेंट के बारे में खास जानकारी दी गई है:

Android 16 से पहले के वर्शन में, CAP इंजन का आर्किटेक्चर

पहली इमेज. Android 6 के बाद से, सीएपी इंजन के कॉन्फ़िगरेशन को मैनेज करने की सुविधा.

आंकड़े में दिखाए गए तरीके से, CAP इंजन कॉन्फ़िगरेशन को ऑडियो नीति सेवा से हासिल किया जाता है. इसके लिए, vendor पार्टीशन में मौजूद audio_policy_engine_configuration.xml फ़ाइल से जानकारी पार्स की जाती है. CAP इंजन कॉन्फ़िगरेशन फ़ाइल, ज़रूरी जानकारी पाने के लिए audio_policy_engine_configuration.xsd में तय किए गए स्कीमा का इस्तेमाल करती है. audio_policy_engine_configuration.xml, वाहन उद्योग का एक उदाहरण है. अन्य फ़ॉर्म फ़ैक्टर के लिए ऐसे ही उदाहरण, frameworks/av/services/audiopolicy/engineconfigurable/config/example/ फ़ोल्डर में दिए गए हैं.

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

Android 16 से पहले के वर्शन के लिए, CAP इंजन लोड पाथ

दूसरी इमेज. ऑडियो नीति सेवा में लोड की गई सीएपी की जानकारी.

Android 15 और इससे पहले के वर्शन में CAP स्ट्रक्चर फ़ाइलें

स्ट्रक्चर और सेटिंग पाने के लिए, ऑडियो नीति सेवा, ParameterFrameworkConfigurationPolicy.xml फ़ाइल को पढ़ती है. यह स्ट्रक्चर की जानकारी को इस तरह से रेफ़र करता है:

<StructureDescriptionFileLocation Path="Structure/Policy/PolicyClass.xml"/>

इससे फ़ाइल में स्ट्रक्चर की जानकारी मिलती है:

/vendor/etc/parameter-framework/Structure/Policy/PolicyClass.xml

Android में एक स्केलेटन स्ट्रक्चर दिया गया है. स्ट्रक्चर की जानकारी के लिए, प्रॉडक्ट की रणनीति के स्ट्रक्चर की जानकारी ज़रूरी होती है. इसलिए, Android buildStrategiesStructureFile.py जनरेशन टूल उपलब्ध कराता है. यह टूल, प्रॉडक्ट की रणनीति की उपलब्ध एक्सएमएल फ़ाइल से जानकारी जनरेट कर सकता है. इसे genrule default buildstrategiesstructurerule के ज़रिए इस तरह से रेफ़रंस किया जा सकता है:

genrule {
    name: "buildstrategiesstructure_gen",
    defaults: ["buildstrategiesstructurerule"],
    srcs: [
        ":audio_policy_engine_configuration_files",
    ],
}

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

Android 15 और इससे पहले के वर्शन में, CAP सेटिंग फ़ाइलें

स्ट्रक्चर की तरह ही, सेटिंग की जानकारी भी ParameterFrameworkConfigurationPolicy.xml फ़ाइल में रेफ़रंस की जाती है. यह जानकारी, पैरामीटर के नियमों और वैल्यू को दिखाती है. इसे इस तरह रेफ़रंस किया जाता है:

<SettingsConfiguration>
  <ConfigurableDomainsFileLocation Path="Settings/Policy/PolicyConfigurableDomains.xml"/>
</SettingsConfiguration>

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

एआईडीएल ऑडियो एचएएल कैप को शुरू करना

Android 16 से, AIDL Audio HAL API की परिभाषा को ऑडियो पॉलिसी इंजन कॉन्फ़िगरेशन, AudioHalCapConfiguration.aidl के साथ बढ़ाया गया है. नीचे दी गई इमेज में, Android 16 के हिसाब से CAP इंजन के कॉन्फ़िगरेशन मैनेजमेंट के बारे में खास जानकारी दी गई है:

CAP इंजन एडल आर्किटेक्चर

तीसरी इमेज. Android 16 के हिसाब से, सीएपी इंजन कॉन्फ़िगरेशन मैनेजमेंट.

ऑडियो पॉलिसी सेवा, AIDL Audio HAL API का इस्तेमाल करके, सीधे तौर पर CAP इंजन की जानकारी हासिल करती है. इसके लिए, वह डिवाइस के वेंडर पार्टीशन में मौजूद एक्सएमएल फ़ाइलों से जानकारी पार्स नहीं करती.

इस कॉन्फ़िगरेशन में, पैरामीटर फ़्रेमवर्क का स्ट्रक्चर अब भी ऑडियो सर्वर साइड पर CAP इंजन से लोड होता है.

CAP इंजन का aidl लोड पाथ

चौथी इमेज. कैप इंजन का स्ट्रक्चर.

सभी मामलों में, कॉन्फ़िगरेशन में प्रॉडक्ट की रणनीतियों, वॉल्यूम ग्रुप, और शर्तों से जुड़ी पूरी जानकारी दी जानी चाहिए.

नीचे दिए गए डायग्राम में, AIDL ऑडियो HAL API की खास जानकारी दी गई है. इनका इस्तेमाल ऑडियो पॉलिसी सेवा, CAP इंजन कॉन्फ़िगरेशन पाने के लिए करती है:

CAP इंजन के AIDL एपीआई पांचवी इमेज. AIDL ऑडियो HAL API.

इस सेटअप में, ऑडियो पॉलिसी सेवा, AIDL ऑडियो HAL से यह जानकारी हासिल करती है:

  • कॉन्फ़िगरेशन
  • रणनीतियां
  • अंक
  • शर्तें
  • सेटिंग

डिफ़ॉल्ट AIDL ऑडियो HAL लोडर

HIDL से AIDL पर आसानी से स्विच करने के लिए, डिफ़ॉल्ट ऑडियो AIDL ऑडियो HAL, एक्सएमएल CAP इंजन लोडर उपलब्ध कराता है. वेंडर, इस लोडर का सीधे तौर पर इस्तेमाल कर सकते हैं. इसके लिए, उन्हें अपने ऑडियो HAL को डिफ़ॉल्ट ऑडियो HAL के साथ बढ़ाना होगा या libaudioserviceexampleimpl लाइब्रेरी का रेफ़रंस देना होगा.

डिफ़ॉल्ट एआईडीएल ऑडियो एचएएल लोडर, audio_policy_engine_configuration.xml का इस्तेमाल करके यह जानकारी हासिल करता है:

  • कॉन्फ़िगरेशन
  • रणनीतियां
  • अंक
  • शर्तें

स्ट्रक्चर की जानकारी, PolicyConfigurableDomains.xml फ़ाइल से मिलती है. पिछले सिस्टम और इस सिस्टम के बीच मुख्य अंतर यह है कि ऑडियो HAL को स्ट्रक्चर की जानकारी, ऑडियो पॉलिसी सेवा में पैरामीटर फ़्रेमवर्क के बजाय AIDL से मिलती है.

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

एआईडीएल कॉन्फ़िगरेशन में स्ट्रक्चर

Android 16 और इसके बाद के वर्शन में, ऑडियो पॉलिसी सेवा ParameterFrameworkConfigurationCap.xml को पढ़कर और पार्स करके स्ट्रक्चर की जानकारी हासिल करती है [file](https://cs.android.com/android/platform/superproject/+/android-latest-release:frameworks/av/services/audiopolicy/engineconfigurable/wrapper/ParameterManagerWrapper.cpp;l=71

). खास तौर पर, इसे स्ट्रक्चर के ब्यौरे वाली फ़ाइल से जानकारी मिलती है:

<StructureDescriptionFileLocation Path="Structure/Policy/CapClass.xml"/>

फ़्रेमवर्क, ज़रूरी फ़ाइलों को /etc/parameter-framework/ फ़ोल्डर में डालता है. इस फ़ोल्डर में ज़रूरी जानकारी होती है.

स्ट्रक्चर, उन पैरामीटर को दिखाता है जिन्हें कंट्रोल किया जाना चाहिए. इसलिए, उन्हें कॉन्फ़िगरेशन या डोमेन में रेफ़रंस दिया जाना चाहिए. इसके लिए, AIDL इंजन कॉन्फ़िगरेशन को पैरामीटर के लिए पहले से तय किया गया नाम इस्तेमाल करना चाहिए. प्रॉडक्ट की रणनीतियों के लिए, स्ट्रक्चर CapProductStrategies.xml में कॉन्फ़िगर किए जाते हैं.

प्रॉडक्ट की डिफ़ॉल्ट रणनीतियां

प्रॉडक्ट की रणनीतियां, STRATEGY_ प्रीफ़िक्स से शुरू होती हैं. ये रणनीतियां, डिफ़ॉल्ट इंजन में दिए गए डिफ़ॉल्ट से शुरू होती हैं:

  • STRATEGY_PHONE
  • STRATEGY_SONIFICATION
  • STRATEGY_ENFORCED_AUDIBLE
  • STRATEGY_ACCESSIBILITY
  • STRATEGY_SONIFICATION_RESPECTFUL
  • STRATEGY_MEDIA
  • STRATEGY_DTMF
  • STRATEGY_CALL_ASSISTANT
  • STRATEGY_TRANSMITTED_THROUGH_SPEAKER

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

AIDL के साथ काम न करने वाले कॉन्फ़िगरेशन पैरामीटर का नाम
/Policy/policy/product_strategies/media/device_address
/Policy/policy/product_strategies/media/selected_output_devices/mask
AIDL कॉन्फ़िगरेशन पैरामीटर का नाम
/Policy/policy/product_strategies/STRATEGY_MEDIA/device_address
/Policy/policy/product_strategies/STRATEGY_MEDIA/selected_output_devices/mask
ओईएम की तय की गई प्रॉडक्ट रणनीतियां

कॉन्फ़िगर किए जा सकने वाले इंजन की मदद से, ओईएम प्रॉडक्ट की रणनीतियों की परिभाषा बदल सकते हैं. इस सुविधा को जारी रखने के लिए, प्रॉडक्ट की रणनीति वाली फ़ाइल CapProductStrategies.xml में vx_1000 से vx_1039 तक, वेंडर के हिसाब से 40 प्रॉडक्ट की रणनीतियां भी दी गई हैं. सभी वेंडर एक्सटेंशन, vx_ प्रीफ़िक्स से शुरू होने चाहिए. इसके बाद, एक ऐसा नंबर होना चाहिए जो एआईडीएल ऑडियो एचएएल प्रॉडक्ट रणनीति की परिभाषा में प्रॉडक्ट रणनीति आईडी को दिखाता हो. बाकी परिभाषाएँ (उदाहरण के लिए, ऑडियो एट्रिब्यूट ग्रुप, नाम) ऑडियो HAL इंजन कॉन्फ़िगरेशन में मौजूद AudioHALProductStrategy ऑब्जेक्ट से मिलती हैं.

डिफ़ॉल्ट प्रॉडक्ट की रणनीतियों की तरह ही, वेंडर के तय किए गए ओईएम के रेफ़रंस को भी, गैर-एआईडीएल कॉन्फ़िगरेशन और एआईडीएल कॉन्फ़िगरेशन के बीच अडैप्ट किया जाना चाहिए. उदाहरण के लिए:

AIDL के साथ काम न करने वाले कॉन्फ़िगरेशन पैरामीटर का नाम
/Policy/policy/product_strategies/oem_extension_strategy/device_address
/Policy/policy/product_strategies/oem_extension_strategy/selected_output_devices/mask
AIDL कॉन्फ़िगरेशन पैरामीटर का नाम
/Policy/policy/product_strategies/vx_1037/device_address
/Policy/policy/product_strategies/vx_1037/selected_output_devices/mask

प्रॉडक्ट की रणनीतियां

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

  • इस्तेमाल के टाइप से पता चलता है कि आवाज़ क्यों चलाई जा रही है. जैसे, मीडिया, सूचना, कॉल.
  • कॉन्टेंट टाइप से पता चलता है कि क्या चलाया जा रहा है. जैसे, संगीत, भाषण, वीडियो, और सोनिफ़िकेशन.
  • फ़्लैग टाइप, स्ट्रीम के हिसाब से अलग-अलग व्यवहार या अनुरोधों के बारे में बताते हैं.
  • टैग टाइप, वेंडर स्ट्रिंग वैल्यू की किसी भी सूची के साथ काम करते हैं.
    • हर स्ट्रिंग की शुरुआत VX_ से होनी चाहिए. इसके बाद, अक्षरों और अंकों वाली स्ट्रिंग (उदाहरण के लिए, VX_OEM, VX_NAVIGATION) होनी चाहिए
<ProductStrategy name="music" id="1008">
    <AttributesGroup streamType="AUDIO_STREAM_MUSIC" volumeGroup="media">
        <Attributes> <Usage value="AUDIO_USAGE_MEDIA"/> </Attributes>
        <Attributes> <Usage value="AUDIO_USAGE_GAME"/> </Attributes>
        <!-- Default product strategy has empty attributes -->
        <Attributes></Attributes>
    </AttributesGroup>
</ProductStrategy>

इस उद्धरण में, कार के इम्यूलेटर में इस्तेमाल की गई प्रॉडक्ट रणनीति का उदाहरण दिखाया गया है. इसमें दो ऑडियो एट्रिब्यूट हैं. इनमें से एक में ऑडियो के इस्तेमाल से जुड़ा मीडिया और दूसरे में गेम शामिल है. यह प्रॉडक्ट रणनीति, कार ऑडियो सेवा में इस्तेमाल किए गए MUSIC ऑडियो कॉन्टेक्स्ट से मेल खाती है. हालांकि, ऐसा होना ज़रूरी नहीं है. Android के साथ CAP का इस्तेमाल करने वाले ओईएम के लिए, मुख्य सुविधाओं में से एक यह है कि इससे ऑडियो ग्रुपिंग की परिभाषाओं को ज़्यादा आसानी से तय किया जा सकता है.

वॉल्यूम ग्रुप

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

<volumeGroup>
    <name>media</name>
    <indexMin>0</indexMin>
    <indexMax>40</indexMax>
    <volume deviceCategory="DEVICE_CATEGORY_SPEAKER">
        <point>0,-2400</point>
        <point>33,-1600</point>
        <point>66,-800</point>
        <point>100,0</point>
    </volume>
</volumeGroup>

इस परिभाषा में वॉल्यूम ग्रुप में ये शामिल हैं:

  • ग्रुप का नाम
  • ग्रुप का सबसे छोटा इंडेक्स
  • ग्रुप का ज़्यादा से ज़्यादा इंडेक्स
  • वॉल्यूम ग्रुप कर्व

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

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

कॉन्फ़िगरेशन

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

आकृति 5 में दिखाया गया है कि एपीआई में कई डोमेन शामिल हैं. हर डोमेन का मकसद, लॉजिक को छोटी-छोटी राउटिंग समस्याओं में बांटना है, ताकि उन्हें हल किया जा सके. उदाहरण के लिए, डिवाइस 1, डिवाइस 2.

हर डोमेन में कॉन्फ़िगरेशन होते हैं और हर कॉन्फ़िगरेशन में नियमों का एक सेट होता है. नियम, AudioPolicyManager की ओर से दी गई शर्तों के आधार पर तय किए जाते हैं:

  • ऑडियो मोड
  • इनपुट और आउटपुट के लिए उपलब्ध डिवाइस
  • इनपुट और आउटपुट डिवाइसों के उपलब्ध पते
  • इसके लिए इस्तेमाल करें
    • मीडिया
    • कम्यूनिकेशन
    • रिकॉर्डिंग
    • डॉक
    • सिस्टम
    • एचडीएमआई सिस्टम ऑडियो
    • एन्कोड किया गया सराउंड साउंड
    • रिंगटोन के साथ वाइब्रेट हो

हर डोमेन में ऐसे कॉन्फ़िगरेशन होते हैं जो यह तय करते हैं कि व्यवहार पर किन नियमों का असर पड़ना चाहिए. ध्यान दें कि कॉन्फ़िगरेशन का क्रम मायने रखता है. यह पक्का करना ज़रूरी है कि कॉन्फ़िगरेशन, ज़रूरी क्रम में हों. किसी कॉन्फ़िगरेशन के नियमों की पुष्टि हो जाने के बाद, कॉन्फ़िगरेशन को चुना जाता है.

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


supDomain: DeviceForProductStrategies
  supDomain: Music
    domain: SelectedDevice
      conf: BluetoothA2dp
        ForceUseForMedia IsNot NO_BT_A2DP
        ForceUseForCommunication IsNot BT_SCO
        AvailableOutputDevices Includes BLUETOOTH_A2DP
        component:/Policy/policy/product_strategies/vx_1000/selected_output_devices/mask
          bluetooth_a2dp = 1
          bus = 0
      conf: Bus
        AvailableOutputDevices Includes Bus
        AvailableOutputDevicesAddresses Includes BUS00_MEDIA
        component: /Policy/policy/product_strategies/vx_1000/selected_output_devices/mask
          bluetooth_a2dp = 0
          bus = 1
      conf: Default
        component: /Policy/policy/product_strategies/vx_1000/selected_output_devices/mask
          bluetooth_a2dp = 0
          bus = 0

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

  • संगीत से जुड़े प्रॉडक्ट की रणनीति के लिए, ब्लूटूथ A2DP डिवाइस चुनें (आईडी 1000, vx_1000)
    • मीडिया के लिए इस्तेमाल किए जाने पर, A2DP को शामिल नहीं करता
    • अगर इसका इस्तेमाल बातचीत के लिए किया जाता है, तो यह बीटी एससीओ नहीं है
    • अगर डिवाइसों पर उपलब्ध है, तो BT A2DP शामिल करें
  • बस डिवाइस चुनें
    • अगर बस डिवाइस उपलब्ध है
    • अगर पता BUS00_MEDIA है
  • इसके अलावा, डिफ़ॉल्ट आउटपुट डिवाइस चुनें

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

  1. Android.bp फ़ाइल में, फ़ाइल के लिए फ़ाइलग्रुप बनाएं:

    filegroup {
        name: ":device_for_product_strategies.pfw",
        srcs: ["engine/parameter-framework/Settings/device_for_product_strategyies.pfw"],
    }
    
  2. फ़ाइल को अन्य PfW फ़ाइलों में जोड़ें (अगर कोई हो).

    filegroup {
        name: "edd_files",
        srcs: [
            ":device_for_input_source.pfw",
            ":volumes.pfw",
            ":device_for_product_strategyies.pfw",
        ],
    }
    
  3. इससे मिलता-जुलता डोमेन जनरेशन का नियम बनाएं:

    genrule {
        name: "domaingeneratorpolicyrule_gen",
        defaults: ["domaingeneratorpolicyrule"],
        srcs: [
            ":audio_policy_engine_criterion_types",
            ":audio_policy_pfw_structure_files",
            ":audio_policy_pfw_toplevel",
            ":edd_files",
        ],
    }
    

    यहां domaingeneratorpolicyrule, फ़्रेमवर्क की ओर से उपलब्ध कराया गया जनरेशन नियम है. इसका इस्तेमाल PolicyConfigurableDomains.xml फ़ाइल जनरेट करने के लिए किया जाता है. डोमेन जनरेशन के नियमों में शामिल अन्य सोर्स फ़ाइलें (scrs) यहां दी गई हैं:

    सोर्स ब्यौरा
    audio_policy_pfw_toplevel टॉप-लेवल की पैरामीटर-फ़्रेमवर्क कॉन्फ़िगरेशन फ़ाइल.
    audio_policy_pfw_structure_files डोमेन जनरेशन स्ट्रक्चर फ़ाइलें. इनका इस्तेमाल कॉन्फ़िगरेशन फ़ाइलें जनरेट करने के लिए किया जाता है.
    audio_policy_engine_criterion_types शर्तों के टाइप वाली एक्सएमएल फ़ाइल. इसमें जनरेशन के दौरान इस्तेमाल की गई शर्तों के बारे में बताया जाता है.
    edd_files एकल डोमेन फ़ाइलों की सूची. हर फ़ाइल में एक <ConfigurableDomain> टैग होता है.

बिल्ड में जनरेशन का नियम लागू करने के बाद, सभी डोमेन के साथ PolicyConfigurableDomains.xml जनरेट होता है. यहां PfW के उदाहरण के नियमों का इस्तेमाल करके जनरेट की गई फ़ाइल का एक हिस्सा दिखाया गया है:

---ConfigurableDomain Name="DeviceForProductStrategies.Music.SelectedDevice"---
<Configurations>
  <Configuration Name="BluetoothA2dp">
    <CompoundRule Type="All">
      <SelectionCriterionRule SelectionCriterion="ForceUseForMedia" MatchesWhen="IsNot" Value="NO_BT_A2DP"/>
      <SelectionCriterionRule SelectionCriterion="ForceUseForCommunication" MatchesWhen="IsNot" Value="BT_SCO"/>
      <SelectionCriterionRule SelectionCriterion="AvailableOutputDevices" MatchesWhen="Includes" Value="BLUETOOTH_A2DP"/>
    </CompoundRule>
  </Configuration>
  <Configuration Name="Bus">
    <CompoundRule Type="All">
      <SelectionCriterionRule SelectionCriterion="AvailableOutputDevices" MatchesWhen="Includes" Value="BUS"/>
      <SelectionCriterionRule SelectionCriterion="AvailableOutputDevicesAddresses" MatchesWhen="Includes" Value="BUS00_MEDIA"/>
    </CompoundRule>
  </Configuration>
  <Configuration Name="Default">
    <CompoundRule Type="All"/>
  </Configuration>
</Configurations>
Android 16 से पहले CAP को शुरू करना देखें.

CAP डीबग करना

CAP कॉन्फ़िगरेशन को डंप करने के लिए, remote-process का इस्तेमाल किया जा सकता है:

adb root && adb remount
adb shell remote-process unix:///dev/socket/audioserver/policy_debug dumpDomains

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

- ConfigurableDomain: DeviceForProductStrategies.Music.SelectedDevice =
 {Sequence aware: no, Last applied configuration: Bus}
  - Configuration: BluetoothA2dp
    - CompoundRule = All
      - SelectionCriterionRule = ForceUseForMedia IsNot NO_BT_A2DP
      - SelectionCriterionRule = ForceUseForCommunication IsNot BT_SCO
      - SelectionCriterionRule = AvailableOutputDevices Includes BLUETOOTH_A2DP
  - Configuration: Bus
    - CompoundRule = All
      - SelectionCriterionRule = AvailableOutputDevices Includes BUS
      - SelectionCriterionRule = AvailableOutputDevicesAddresses Includes BUS00_MEDIA_CARD_0_DEV_0
  - Configuration: Default
    - CompoundRule = All

CAP पैरामीटर फ़्रेमवर्क को डीबग करने के लिए उपलब्ध अन्य कमांड के बारे में ज़्यादा जानने के लिए, इस टूल का इस्तेमाल करें:

adb shell remote-process unix:///dev/socket/audioserver/policy_debug help

इस टूल का इस्तेमाल करने के लिए, OEM मैन्युफ़ैक्चरर को डिवाइस में ट्यूनिंग की अनुमति देनी होगी. डिवाइस में ट्यूनिंग की सुविधा है या नहीं, यह देखने के लिए इस निर्देश का इस्तेमाल करें:

adb shell cat /system/etc/parameter-framework/ParameterFrameworkConfigurationCap.xml

Android 15 और इससे पहले के वर्शन में, फ़ाइल अलग हो सकती है. इसलिए, इस कमांड का इस्तेमाल करें:

adb shell cat /system/etc/parameter-framework/ParameterFrameworkConfigurationPolicy.xml

फ़ाइल में, सर्वर पोर्ट के साथ-साथ TuningAllowed="true" भी होना चाहिए:

<?xml version="1.0" encoding="UTF-8"?>
<ParameterFrameworkConfiguration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    SystemClassName="Policy" TuningAllowed="true" ServerPort="unix:///dev/socket/audioserver/policy_debug">
    <SubsystemPlugins>
        <Location Folder="">
            <Plugin Name="libpolicy-subsystem.so"/>
        </Location>
    </SubsystemPlugins>
    <StructureDescriptionFileLocation Path="Structure/Policy/CapClass.xml"/>
</ParameterFrameworkConfiguration>

यह फ़ाइल, बिल्ड इमेज के टाइप के हिसाब से अपने-आप जनरेट होती है. इसके अलावा, लेगसी बिल्ड के लिए रिलीज़ या डीबग के लिए किसी दूसरी फ़ाइल का इस्तेमाल किया जा सकता है. रिलीज़ बिल्ड, सॉकेट पोर्ट के बिना TuningAllowed को false पर सेट करता है. रिलीज़ बिल्ड में इसके लिए सॉकेट इस्तेमाल करने की अनुमति नहीं है. इंजीनियरिंग और userdebug बिल्ड, इसे इस्तेमाल किए गए सॉकेट पोर्ट के साथ true पर सेट करते हैं. ध्यान दें कि यह audio_policy_pfw_toplevel से जुड़ी फ़ाइल है. रिमोट-प्रोसेस टूल को डिवाइस के मेक या बिल्ड फ़ाइल में भी शामिल किया जाना चाहिए:

# Tool used for debug Parameter Framework (only for eng and userdebug builds)
PRODUCT_PACKAGES_DEBUG += remote-process

सॉकेट की अनुमति देने के लिए, इससे जुड़ी SELinux नीति को भी शामिल करना होगा. यह सिर्फ़ डीबग मोड के लिए काम करता है, क्योंकि रिलीज़ मोड में सॉकेट की अनुमति नहीं होती:

BOARD_SEPOLICY_DIRS += frameworks/av/services/audiopolicy/engineconfigurable/sepolicy

Android 16 में CAP माइग्रेशन

AIDL ऑडियो HAL CAP इंजन और पिछले वर्शन में किए गए बड़े बदलावों को देखते हुए, डिवाइस के ट्रांज़िशन के कई ऐसे उदाहरण हैं जिन पर आपको ध्यान देना चाहिए. इस सेक्शन में, ट्रांज़िशन के सबसे अहम उदाहरणों के बारे में बताया गया है. साथ ही, CAP इंजन कॉन्फ़िगरेशन को चालू करने के लिए सुझाव दिए गए हैं.

पहला उदाहरण: Android 16 या इसके बाद के वर्शन का इस्तेमाल करने वाला नया डिवाइस. इस डिवाइस के लिए, CAP कॉन्फ़िगरेशन का कोई पिछला सोर्स नहीं है

नए डिवाइस को vendor पार्टीशन पर Android 16 या इसके बाद के वर्शन के कोड के साथ लॉन्च किया जाना चाहिए. इसका मतलब है कि इसे AIDL ऑडियो HAL इंटरफ़ेस के ज़रिए, कॉन्फ़िगर किए जा सकने वाले ऑडियो पॉलिसी इंजन कॉन्फ़िगरेशन को दिखाना होगा. डिवाइस के सीएपी इंजन कॉन्फ़िगरेशन को उदाहरणों से कॉपी किया जाना चाहिए. vendor पार्टिशन पर, PfW CAP डोमेन की कोई परिभाषा नहीं होनी चाहिए.

डिवाइस के लिए इस्तेमाल की गई सिस्टम इमेज, Android 16 या इसके बाद के वर्शन की हो. ऑडियो सेवा फ़्रेमवर्क, AIDL ऑडियो HAL इंटरफ़ेस के ज़रिए CAP कॉन्फ़िगरेशन का पता लगाता है. इसलिए, यह सिस्टम इमेज से PfW CAP डोमेन की परिभाषा का इस्तेमाल करके PfW को शुरू करता है. साथ ही, AIDL के ज़रिए मिले डिवाइस के CAP कॉन्फ़िगरेशन को लोड करता है.

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

दूसरा तरीका: Android 16 या इसके बाद के वर्शन वाले नए डिवाइस पर, CAP का इस्तेमाल करने वाले पुराने डिवाइस से डेटा ट्रांसफ़र करना

नए डिवाइस को vendor पार्टीशन पर Android 16 या इसके बाद के वर्शन के कोड के साथ लॉन्च किया जाना चाहिए. हालांकि, ओईएम के पास इस्तेमाल किया जा सकने वाला डिवाइस सीएपी इंजन कॉन्फ़िगरेशन है. इसलिए, ओईएम इसे शुरुआती बिंदु के तौर पर इस्तेमाल करना चाहेगा या इसे पूरी तरह से फिर से इस्तेमाल करना चाहेगा. CAP कॉन्फ़िगरेशन के AIDL वर्शन में, Android 15 और इससे पहले के वर्शन की तुलना में कुछ बदलाव किए गए हैं. इसलिए, वेंडर को मौजूदा कॉन्फ़िगरेशन को AIDL में बदलना होगा. Android 16 और इससे पहले के वर्शन में ज़रूरी बदलावों के बारे में जानने के लिए, प्रॉडक्ट की रणनीतियां में दी गई जानकारी देखें. आम तौर पर, ऑडियो फ़्रेमवर्क, CAP कॉन्फ़िगरेशन को उसी तरह से ढूंढता और लोड करता है जिस तरह से पहले उदाहरण में किया गया था.

तीसरा उदाहरण: मौजूदा डिवाइस में, सिर्फ़ सिस्टम पार्टीशन को Android 16 पर अपडेट किया जा रहा है

इस उदाहरण में, vendor पार्टीशन में डिवाइस के सीएपी कॉन्फ़िगरेशन का Android 15 और इससे पहले का वर्शन शामिल है. साथ ही, इसमें PfW सीएपी डोमेन की डेफ़िनिशन भी शामिल है. vendor पार्टीशन में कोई बदलाव नहीं किया गया है. इसलिए, यह अब भी एचआईडीएल एचएएल का इस्तेमाल करता है. यह फ़्रेमवर्क, Android 15 और इससे पहले के वर्शन के लिए उपलब्ध सुविधा के हिसाब से काम करता है. साथ ही, CAP से जुड़े सभी कॉन्फ़िगरेशन को vendor पार्टीशन से लोड करता है.

चौथा उदाहरण: Android 15 पर रिलीज़ किया गया मौजूदा डिवाइस, जिसमें CAP की सुविधा है

Android 15 पर AIDL में CAP काम नहीं करता था. इसलिए, कुछ वेंडर ने AIDL Audio HAL और CAP वाले नए डिवाइस लॉन्च किए. इन्हें ऑडियो फ़्रेमवर्क ने लोड किया था. यह हाइब्रिड मोड, आधिकारिक तौर पर उपलब्ध नहीं था. हालांकि, इसे Android 16 में शामिल किया गया है. ध्यान दें कि इस मोड का इस्तेमाल, Android 16 पर नए डिवाइसों को रिलीज़ करने के लिए नहीं किया जाना चाहिए. इसके बजाय, इसका इस्तेमाल Android 15 वाले मौजूदा डिवाइसों को Android 16 (system पार्टीशन अपडेट) पर अपडेट करने के लिए किया जाना चाहिए.

ऑडियो फ़्रेमवर्क, CAP कॉन्फ़िगरेशन के बिना AIDL ऑडियो HAL ऑडियो कॉन्फ़िगरेशन का पता लगाता है. CAP कॉन्फ़िगरेशन के लिए, ऑडियो पॉलिसी सेवा (ऑडियो फ़्रेमवर्क), vendor पार्टीशन से CAP कॉन्फ़िगरेशन लोड करने के लिए फ़ॉलबैक करती है. इस मामले में, PfW CAP डोमेन की परिभाषा और डिवाइस CAP कॉन्फ़िगरेशन, दोनों को vendor पार्टिशन से लोड किया जाना चाहिए.

CAP माइग्रेशन की खास जानकारी

यहां दी गई टेबल में, CAP कॉन्फ़िगरेशन के लिए ज़रूरी शर्तें और साथ काम करने वाले सिस्टम और वेंडर कॉन्फ़िगरेशन की खास जानकारी दी गई है:

सिस्टम पार्टिशन स्थिति वेंडर पार्टीशन कोड का वर्शन कोर ऑडियो एचएएल टाइप PfW CAP डोमेन की डेफ़िनिशन की जगह डिवाइस के लिए सीएपी कॉन्फ़िगरेशन
Android 15 4 Android 14 या इससे पहले का वर्शन HIDL vendor HIDL वर्शन
Android 16 3 Android 14 या इससे पहले का वर्शन HIDL vendor HIDL वर्शन
Android 16 4 Android 15 एआईडीएल vendor HIDL वर्शन
Android 16 2 Android 16 एआईडीएल system एचआईडीएल से एआईडीएल में बदला गया वर्शन
Android 16 1 Android 16 एआईडीएल system उदाहरण से लिया गया AIDL वर्शन