डिवाइस प्रकार की सीमा

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

ऑडियो डिवाइस प्रकारों की संख्या पर सीमा को हटाने के लिए, ऑडियो डिवाइस प्रकारों में अब बिट मास्क के बजाय मानों की गणना की जाती है।

सभी मौजूदा ऑडियो डिवाइस प्रकार वैसे ही रखे गए हैं। AUDIO_DEVICE_BIT_IN का उपयोग अभी भी इनपुट या आउटपुट डिवाइस में अंतर करने के लिए किया जाता है। नए ऑडियो डिवाइस प्रकार जोड़ते समय, वे मौजूदा मानों के बीच के अंतराल में मानों की गणना करते हैं।

ओईएम को audio_devices_t बिट मास्क के रूप में उपयोग नहीं करना चाहिए, क्योंकि जब नए एन्यूमरेटेड ऑडियो डिवाइस प्रकार जोड़े जाते हैं तो इससे अप्रत्याशित परिणाम हो सकते हैं।

उदाहरण और स्रोत

एंड्रॉइड 11 से पहले, बिट मास्क के रूप में ऑडियो डिवाइस प्रकारों के दो विशिष्ट उपयोग होते थे।

  • एकाधिक ऑडियो डिवाइस का प्रतिनिधित्व करने के लिए audio_devices_t मान का उपयोग करना।
  • जाँच कर रहा है कि क्या audio_devices_t मान में किसी निर्दिष्ट श्रेणी के ऑडियो डिवाइस प्रकार शामिल हैं।

एकाधिक ऑडियो डिवाइस प्रकारों का प्रतिनिधित्व करने के लिए, /libaudiofoundation/include/media/AudioContainers.h में DeviceTypeSet नामक क्लास का उपयोग किया जाता है, जो audio_devices_t का एक std::set कंटेनर है। क्लास को विक्रेता-उपलब्ध libaudiofoundation लाइब्रेरी में घोषित किया गया है। C कोड में एकाधिक ऑडियो डिवाइस प्रकारों का प्रतिनिधित्व करने के लिए, एक सरणी या audio_devices_t की सूची का उपयोग किया जा सकता है।

यह जांचने के लिए कि क्या कोई एकल डिवाइस प्रकार किसी निर्दिष्ट श्रेणी का है, /system/media/audio/include/system/audio.h में सहायक फ़ंक्शन audio_is_.*_device उपयोग करें। एकाधिक ऑडियो डिवाइस प्रकार के मामले के लिए, libaudiofoundation में सहायक फ़ंक्शन का उपयोग करें। उदाहरण के लिए, areAllOfSameDeviceType (DeviceTypeSet, std::function ) उपयोग करें areAllOfSameDeviceType (DeviceTypeSet, std::function ) AudioContainers.h में यह जांचने के लिए कि क्या दिए गए सभी ऑडियो डिवाइस प्रकार एक ही प्रकार के हैं।

कार्यान्वयन

ओईएम को ऑडियो एचएएल कार्यान्वयन से ऑडियो डिवाइस प्रकार बिट फ़ील्ड प्रतिनिधित्व को हटाने की आवश्यकता है।

  1. बिट फ़ील्ड पर डिवाइस के सभी संग्रहण को हटा दें।

    audio_devices_t उपयोग एकाधिक ऑडियो डिवाइस प्रकारों को दर्शाने के लिए नहीं किया जाना चाहिए। इसके बजाय, किसी सूची या वेक्टर का उपयोग करें.

  2. डिवाइस प्रकार की तुलना के लिए बिट संचालन का उपयोग बंद करें।

    Android 11 से पहले, ऑडियो डिवाइस प्रकारों को बिटफ़ील्ड के रूप में उपयोग किया जा सकता था। उस स्थिति में, डिवाइस प्रकार की तुलना के लिए बिट संचालन का उपयोग करना आम बात है। जब नए, प्रगणित ऑडियो डिवाइस प्रकार जोड़े जाते हैं, तो बिट संचालन अप्रत्याशित परिणाम दे सकता है। इसके बजाय, विकल्प के रूप में सहायक कार्यों का उपयोग करें। यदि एक ही ऑडियो डिवाइस प्रकार है, तो दो मानों की तुलना करने के लिए प्रत्यक्ष तुलना का उपयोग करें। यह जांचने के लिए कि क्या ऑडियो डिवाइस प्रकार एक निर्दिष्ट श्रेणी का है, /system/media/audio/include/system/audio.h में सहायक फ़ंक्शन का उपयोग करें। उदाहरण के लिए, audio_is_output_device(audio_devices_t device)

  3. ऑडियो डिवाइस प्रकारों के समूहों के लिए पूर्वनिर्धारित मानों का उपयोग करना बंद करें।

    system/media/audio/include/system/audio-base-utils.h में ऑडियो डिवाइस प्रकारों के समूहों, AUDIO_DEVICE_OUT_ALL के लिए कुछ पूर्वनिर्धारित मान हैं। ये सभी मान आरक्षित हैं लेकिन इन्हें हटाया जा सकता है क्योंकि नए प्रगणित ऑडियो डिवाइस प्रकार जोड़े जाने पर ये सही नहीं होंगे। audio-base-utils.h में परिभाषित ऑडियो डिवाइस प्रकारों के नए समूह हैं, जो ऑडियो डिवाइस प्रकारों की सारणी हैं, जैसे AUDIO_DEVICE_OUT_ALL_ARRAY

  4. रूटिंग के लिए set_parameters के बजाय create_audio_patch() और release_audio_patch() तरीकों को लागू करें।

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

    वर्तमान में, दो प्रकार के ऑडियो पैच की आवश्यकता है:

    • प्लेबैक के लिए डिवाइस पैच में मिलाएं
    • रिकॉर्डिंग के लिए पैच मिश्रण करने के लिए उपकरण

    बाद के अपडेट में, डिवाइस से डिवाइस के लिए अतिरिक्त पैच की आवश्यकता हो सकती है।

    ऑडियो पैच बनाते समय, यदि पैच हैंडल निर्दिष्ट नहीं है, तो ऑडियो एचएएल को एक अद्वितीय पैच हैंडल उत्पन्न करने की आवश्यकता होती है जो ऑडियो पैच की पहचान कर सके। अन्यथा, ऑडियो एचएएल को ऑडियो पैच को अपडेट करने के लिए दिए गए ऑडियो पैच हैंडल का उपयोग करना चाहिए।

    यदि लीगेसी ऑडियो HAL और AOSP HIDL रैपर का उपयोग किया जा रहा है, तो लीगेसी ऑडियो HAL को प्रमुख HAL संस्करण को 3.0 पर सेट करना चाहिए।

    ऑडियो पैच सुविधा को सक्षम करने के लिए, ऑडियो एचएएल को प्रमुख एचएएल संस्करण को 3.0 या उच्चतर पर सेट करना चाहिए। अधिक जानकारी के लिए डिफ़ॉल्ट HIDL कार्यान्वयन में Device::supportsAudioPatches() का संदर्भ लें, जिसे कटलफिश के लिए ऑडियो HAL पर भी पाया जा सकता है।

अनुकूलन

सुविधा को बंद करना, या फ़्रेमवर्क में ऑडियो डिवाइस रीफैक्टरिंग को वापस लाना संभव नहीं है जो ऑडियो डिवाइस प्रकारों को जोड़ना संभव बनाता है।

जोड़े गए सभी ऑडियो डिवाइस प्रकार एक बिट सेट के साथ डिवाइस प्रकार का प्रतिनिधित्व करने की अनुमति देते हैं, इसलिए वर्तमान एचएएल कार्यान्वयन अभी भी काम करते हैं।

यदि नए ऑडियो डिवाइस प्रकार जोड़े जाते हैं और OEM उनका उपयोग करना चाहते हैं, तो उन्हें अपने ऑडियो HAL कार्यान्वयन को अपग्रेड करना होगा और HIDL संस्करण 6.0 या उच्चतर पर जाना होगा। प्रमुख HAL संस्करण को 3.0 में अपग्रेड करना और create_audio_patch और release_audio_patch विधियों को लागू करना अनिवार्य है, क्योंकि स्ट्रीम को रूट करने के लिए set_parameters का उपयोग करने से नए ऑडियो डिवाइस प्रकार जोड़े जाने पर अप्रत्याशित परिणाम हो सकते हैं।

मान्यकरण

ओईएम के लिए आवश्यक कार्य अपने एचएएल कार्यान्वयन को अद्यतन करना है। ऑडियो एचएएल के लिए वीटीएस का उपयोग यह सत्यापित करने के लिए किया जा सकता है कि कार्यान्वयन उद्देश्य के अनुसार काम करता है या नहीं। सभी परीक्षण वीटीएस फाइलों में पाए जा सकते हैं।