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 को ऑडियो एचएएल लागू करने से, ऑडियो डिवाइस टाइप के बिट फ़ील्ड का रेप्रज़ेंटेशन हटाना होगा.
- बिट फ़ील्ड पर मौजूद डिवाइसों का सारा स्टोरेज हटाएं.
audio_devices_t
का इस्तेमाल, एक से ज़्यादा तरह के ऑडियो डिवाइसों को दिखाने के लिए नहीं किया जाना चाहिए. इसके बजाय, सूची या वेक्टर का इस्तेमाल करें. - डिवाइस टाइप की तुलना करने के लिए, बिट ऑपरेशन का इस्तेमाल बंद करें.
Android 11 से पहले, ऑडियो डिवाइस टाइप का इस्तेमाल बिटफ़ील्ड के तौर पर किया जा सकता था. ऐसे में, डिवाइस टाइप की तुलना करने के लिए, बिट ऑपरेशन का इस्तेमाल करना आम बात है. जब नए और अलग-अलग तरह के ऑडियो डिवाइस जोड़े जाते हैं, तो बिट ऑपरेशन की वजह से अनचाहे नतीजे मिल सकते हैं. इसके बजाय, हेल्पर फ़ंक्शन का इस्तेमाल करें. अगर ऑडियो डिवाइस का एक ही टाइप है, तो दोनों वैल्यू की तुलना करने के लिए, सीधे तुलना करने की सुविधा का इस्तेमाल करें. यह देखने के लिए कि ऑडियो डिवाइस का टाइप किसी खास कैटगरी का है या नहीं,
/system/media/audio/include/system/audio.h
में हेल्पर फ़ंक्शन का इस्तेमाल करें. उदाहरण के लिए,audio_is_output_device(audio_devices_t device)
. - ऑडियो डिवाइस के टाइप के ग्रुप के लिए, पहले से तय की गई वैल्यू का इस्तेमाल बंद करें.
system/media/audio/include/system/audio-base-utils.h
में, ऑडियो डिवाइस टाइप के ग्रुप के लिए, पहले से तय कुछ वैल्यू,AUDIO_DEVICE_OUT_ALL
मौजूद हैं. ये सभी वैल्यू रिज़र्व हैं, लेकिन हो सकता है कि इन्हें बंद कर दिया जाए. ऐसा इसलिए, क्योंकि सूची में शामिल किए गए नए ऑडियो डिवाइस टाइप जोड़े जाने पर, ये वैल्यू सही नहीं होंगी.audio-base-utils.h
में ऑडियो डिवाइस के टाइप के नए ग्रुप तय किए गए हैं. ये ऑडियो डिवाइस के टाइप के कलेक्शन होते हैं, जैसे किAUDIO_DEVICE_OUT_ALL_ARRAY
. set_parameters
के बजाय, रूटिंग के लिएcreate_audio_patch()
औरrelease_audio_patch()
के तरीकों को लागू करें.set_parameters
तरीका, ऑडियो डिवाइस के टाइप को बिटफ़ील्ड के तौर पर इस्तेमाल करता है. इसलिए, अगर ऑडियो डिवाइस के नए टाइप जोड़े जाते हैं, तो अनचाहे नतीजे मिल सकते हैं.फ़िलहाल, दो तरह के ऑडियो पैच ज़रूरी हैं:
- चलाने के लिए, डिवाइस के पैच में मिक्स करना
- रिकॉर्डिंग के लिए, पैच को मिक्स करने वाला डिवाइस
आने वाले अपडेट में, डिवाइस से डिवाइस के बीच फ़ाइलें शेयर करने के लिए, अतिरिक्त पैच की ज़रूरत पड़ सकती है.
ऑडियो पैच बनाते समय, अगर पैच हैंडल नहीं दिया गया है, तो ऑडियो एचएएल को एक यूनीक पैच हैंडल जनरेट करना होगा. इससे ऑडियो पैच की पहचान की जा सकेगी. ऐसा न होने पर, ऑडियो पैच को अपडेट करने के लिए, ऑडियो एचएएल को दिए गए ऑडियो पैच हैंडल का इस्तेमाल करना चाहिए.
अगर लेगसी ऑडियो एचएएल और AOSP HIDL रैपर का इस्तेमाल किया जा रहा है, तो लेगसी ऑडियो एचएएल को एचएएल के मुख्य वर्शन को 3.0 पर सेट करना चाहिए.
ऑडियो पैच की सुविधा चालू करने के लिए, ऑडियो एचएएल को एचएएल के मुख्य वर्शन को 3.0 या उससे बाद के वर्शन पर सेट करना चाहिए. ज़्यादा जानकारी के लिए, डिफ़ॉल्ट HIDL लागू करने में
Device::supportsAudioPatches()
देखें. यह जानकारी, Cuttlefish के लिए ऑडियो एचएएल पर भी मिल सकती है.
पसंद के मुताबिक बनाएं
इस सुविधा को बंद नहीं किया जा सकता. इसके अलावा, फ़्रेमवर्क में ऑडियो डिवाइस के रीफ़ैक्टरिंग को वापस नहीं लाया जा सकता. इससे ऑडियो डिवाइस के टाइप जोड़े जा सकते हैं.
जोड़े गए सभी ऑडियो डिवाइस टाइप, किसी डिवाइस टाइप को एक बिट सेट करके दिखाने की अनुमति देते हैं, इसलिए मौजूदा एचएएल लागू करना अब भी काम करता है.
अगर नए ऑडियो डिवाइस टाइप जोड़े जाते हैं और OEM उनका इस्तेमाल करना चाहते हैं, तो उन्हें अपने ऑडियो एचएएल को अपग्रेड करना होगा और HIDL के 6.0 या इसके बाद के वर्शन पर जाना होगा. एचएएल के मुख्य वर्शन को 3.0 पर अपग्रेड करना और create_audio_patch
और release_audio_patch
तरीकों को लागू करना ज़रूरी है. ऐसा इसलिए, क्योंकि स्ट्रीम को रूट करने के लिए set_parameters
का इस्तेमाल करने पर, नए ऑडियो डिवाइस टाइप जोड़ने पर अनचाहे नतीजे मिल सकते हैं.
पुष्टि करें
OEM को एचएएल लागू करने के तरीके को अपडेट करना होगा. ऑडियो एचएएल के लिए वीटीएस का इस्तेमाल करके, यह पुष्टि की जा सकती है कि लागू करने का तरीका सही है या नहीं. सभी जांचें, वीटीएस फ़ाइलों में देखी जा सकती हैं.