डिवाइस टाइप की सीमा

Android ऑडियो में, audio_devices_t का इस्तेमाल ऑडियो डिवाइस के टाइप को दिखाने के लिए किया जाता है. इसका इस्तेमाल ऑडियो सोर्स कोड में बिट फ़ील्ड के तौर पर किया जाता है. इससे एक या एक से ज़्यादा डिवाइसों को फ़िल्टर या चुना जा सकता है. Android 11 से पहले, ऑडियो इनपुट/आउटपुट डिवाइस टाइप की संख्या 30 तक सीमित थी. साथ ही, नए ऑडियो डिवाइस टाइप जोड़ने के लिए कोई अतिरिक्त स्लॉट नहीं था. हमने ऑडियो डिवाइसों की संख्या की सीमा हटा दी है, ताकि नए ऑडियो डिवाइसों को जोड़ा जा सके.

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

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

OEM को audio_devices_t का इस्तेमाल बिट मास्क के तौर पर नहीं करना चाहिए. ऐसा करने पर, गिने गए नए ऑडियो डिवाइस टाइप जोड़ने पर अनचाहे नतीजे मिल सकते हैं.

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

Android 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 में हेल्पर फ़ंक्शन का इस्तेमाल करें. उदाहरण के लिए, AudioContainers.h में areAllOfSameDeviceType (DeviceTypeSet, std::function) का इस्तेमाल करके यह पता लगाएं कि दिए गए सभी ऑडियो डिवाइस टाइप एक ही तरह के हैं या नहीं.

लागू करना

OEM को ऑडियो HAL लागू करने के लिए, ऑडियो डिवाइस टाइप बिट फ़ील्ड का प्रतिनिधित्व हटाना होगा.

  1. बिट फ़ील्ड पर मौजूद डिवाइसों के सभी स्टोरेज को हटाता है.

    audio_devices_t का इस्तेमाल, कई तरह के ऑडियो डिवाइसों को दिखाने के लिए नहीं किया जाना चाहिए. इसके बजाय, सूची या वेक्टर का इस्तेमाल करें.

  2. डिवाइस टाइप की तुलना करने के लिए, बिट ऑपरेशंस का इस्तेमाल बंद कर दिया गया है.

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

  3. ऑडियो डिवाइस टाइप के ग्रुप के लिए, पहले से तय की गई वैल्यू का इस्तेमाल करना बंद करें.

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

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

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

    फ़िलहाल, दो तरह के ऑडियो पैच ज़रूरी हैं:

    • डिवाइस पैच के साथ मिक्स करें, ताकि उन्हें चलाया जा सके
    • रिकॉर्डिंग के लिए, पैच मिक्स करने वाला डिवाइस

    इसके बाद के अपडेट में, डिवाइस के हिसाब से कुछ और पैच की ज़रूरत पड़ सकती है.

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

    अगर लेगसी ऑडियो एचएएल और एओएसपी एचआईडीएल रैपर का इस्तेमाल किया जा रहा है, तो लेगसी ऑडियो एचएएल को मुख्य एचएएल वर्शन को 3.0 पर सेट करना चाहिए.

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

पसंद के मुताबिक बनाएं

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

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

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

सत्यापन

ओईएम को अपने एचएएल लागू करने के तरीके को अपडेट करना होगा. ऑडियो HAL के लिए वीटीएस का इस्तेमाल करके, यह पुष्टि की जा सकती है कि लागू करने की प्रोसेस सही तरीके से काम कर रही है या नहीं. सभी टेस्ट, वीटीएस फ़ाइलों में देखे जा सकते हैं.