Android 4.1 रिलीज़ में, ऑडियो आउटपुट पाथ के लिए देरी को कम करने के मकसद से, फ़्रेमवर्क में बदलाव किए गए थे. सार्वजनिक क्लाइंट एपीआई या HAL एपीआई में बहुत कम बदलाव हुए हैं. इस दस्तावेज़ में शुरुआती डिज़ाइन के बारे में बताया गया है, जो समय के साथ बेहतर होता रहा है. इस डिज़ाइन को अच्छी तरह समझने से, डिवाइस के OEM और एसओसी वेंडर को अपने डिवाइसों और चिपसेट पर डिज़ाइन को सही तरीके से लागू करने में मदद मिलेगी. यह लेख, ऐप्लिकेशन डेवलपर के लिए नहीं है.
ट्रैक बनाना
क्लाइंट, AudioTrack C++ कंस्ट्रक्टर के audio_output_flags_t
पैरामीटर या AudioTrack::set()
में बिट AUDIO_OUTPUT_FLAG_FAST
को वैकल्पिक तौर पर सेट कर सकता है. फ़िलहाल, सिर्फ़ ये क्लाइंट ऐसा करते हैं:
- OpenSL ES या AAudio पर आधारित Android नेटिव ऑडियो
- android.media.SoundPool
- android.media.ToneGenerator
AudioTrack C++ लागू करने की प्रोसेस में, AUDIO_OUTPUT_FLAG_FAST
अनुरोध की समीक्षा की जाती है. साथ ही, क्लाइंट लेवल पर अनुरोध को अस्वीकार किया जा सकता है. अगर यह अनुरोध को पास करने का फ़ैसला करता है, तो यह IAudioTrack
फ़ैक्ट्री मेथडIAudioFlinger::createTrack()
के track_flags_t
पैरामीटर के TRACK_FAST
बिट का इस्तेमाल करके ऐसा करता है.
AudioFlinger ऑडियो सर्वर, TRACK_FAST
अनुरोध की समीक्षा करता है और सर्वर लेवल पर अनुरोध को अस्वीकार कर सकता है. यह क्लाइंट को बताता है कि अनुरोध स्वीकार किया गया है या नहीं. यह जानकारी, शेयर की गई मेमोरी कंट्रोल ब्लॉक के बिट CBLK_FAST
के ज़रिए दी जाती है.
इन बातों से फ़ैसला लिया जाता है:
- इस आउटपुट के लिए फ़ास्ट मिक्सर थ्रेड की मौजूदगी (यहां देखें)
- ट्रैक का सैंपल रेट
- इस ट्रैक के लिए कॉलबैक हैंडलर को लागू करने के लिए, क्लाइंट थ्रेड की मौजूदगी
- ट्रैक बफ़र का साइज़
- फ़ास्ट ट्रैक के लिए उपलब्ध स्लॉट (नीचे देखें)
अगर क्लाइंट का अनुरोध स्वीकार कर लिया जाता है, तो उसे "फ़ास्ट ट्रैक" कहा जाता है. ऐसा न होने पर, इसे "सामान्य ट्रैक" कहा जाता है.
Mixer के थ्रेड
AudioFlinger, सामान्य मिक्सर थ्रेड बनाते समय यह तय करता है कि फ़ास्ट मिक्सर थ्रेड भी बनाई जाए या नहीं. सामान्य मिक्सर और फ़ास्ट मिक्सर, दोनों किसी खास ट्रैक से नहीं जुड़े होते, बल्कि ट्रैक के सेट से जुड़े होते हैं. हमेशा एक सामान्य मिक्सर धागा होता है. अगर फ़ास्ट मिक्सर थ्रेड मौजूद है, तो वह सामान्य मिक्सर थ्रेड के अधीन काम करती है.
फ़ास्ट मिक्सर
सुविधाएं
फ़ास्ट मिक्सर थ्रेड में ये सुविधाएं मिलती हैं:
- सामान्य मिक्सर के सब-मिक्स और ज़्यादा से ज़्यादा सात क्लाइंट फ़ास्ट ट्रैक को मिक्स करना
- हर ट्रैक के हिसाब से, शोर कम करने की सुविधा
हटाई गई सुविधाएं:
- हर ट्रैक के सैंपल रेट का कन्वर्ज़न
- हर ट्रैक के लिए इफ़ेक्ट
- हर मिक्स इफ़ेक्ट के लिए
पीरियड का बटन
फ़ास्ट मिक्सर समय-समय पर चलता रहता है. इसके लिए, दो से तीन मिलीसेकंड (एमएस) का सुझाव दिया जाता है. अगर शेड्यूल को स्थिर रखने के लिए ज़रूरी हो, तो पांच मिलीसेकंड का इस्तेमाल किया जा सकता है. यह संख्या इसलिए चुनी गई थी, ताकि पूरी बफ़र पाइपलाइन के हिसाब से, कुल इंतज़ार का समय 10 मिलीसेकंड हो. इससे कम वैल्यू भी हो सकती हैं, लेकिन इससे बिजली की खपत बढ़ सकती है और सीपीयू शेड्यूलिंग की अनुमानितता के आधार पर गड़बड़ियों की संभावना बढ़ सकती है. ज़्यादा वैल्यू भी दी जा सकती हैं, जैसे कि 20 मिलीसेकंड. हालांकि, इससे कुल इंतज़ार का समय बढ़ जाता है. इसलिए, इससे बचना चाहिए.
समय-निर्धारण
फ़ास्ट मिक्सर, SCHED_FIFO
प्राथमिकता पर चलता है. इसके लिए, सीपीयू का बहुत कम समय चाहिए. हालांकि, इसे अक्सर और कम शेड्यूलिंग जटर के साथ चलाना चाहिए.
जटर से, साइकल के समय में होने वाले बदलाव के बारे में पता चलता है: यह असल साइकल के समय और अनुमानित साइकल के समय के बीच का अंतर होता है.
विज्ञापन बहुत देर से चलने पर, विज्ञापन के खत्म होने से पहले ही वीडियो चलने लगेगा. ट्रैक के डेटा उपलब्ध होने से पहले, तेज़ ट्रैक से डेटा खींचने की वजह से, ट्रैक को बहुत जल्दी चलाने पर गड़बड़ियां हो सकती हैं.
ब्लॉकिंग
आम तौर पर, फ़ास्ट मिक्सर थ्रेड कभी भी ब्लॉक नहीं होता. हालांकि, HAL
write()
के अलावा, यह थ्रेड ब्लॉक हो सकता है. फ़ास्ट मिक्सर में ब्लॉक होने की अन्य घटनाओं को बग माना जाता है. खास तौर पर, म्यूटेक्स से बचा जाता है.
इसके बजाय, नॉन-ब्लॉकिंग एल्गोरिदम का इस्तेमाल किया जाता है. इन्हें लॉक-फ़्री एल्गोरिदम भी कहा जाता है.
इस विषय के बारे में ज़्यादा जानने के लिए, प्राथमिकता के उलट होने से बचना लेख पढ़ें.
अन्य कॉम्पोनेंट से संबंध
फ़ास्ट मिक्सर का क्लाइंट के साथ सीधे तौर पर बहुत कम इंटरैक्शन होता है. खास तौर पर, यह बाइंडर-लेवल के ऑपरेशन नहीं देखता, लेकिन यह क्लाइंट की शेयर की गई मेमोरी कंट्रोल ब्लॉक को ऐक्सेस करता है.
फ़ास्ट मिक्सर को स्टेटस क्यू के ज़रिए, सामान्य मिक्सर से निर्देश मिलते हैं.
ट्रैक डेटा खींचने के अलावा, क्लाइंट के साथ इंटरैक्शन सामान्य मिक्सर के ज़रिए होता है.
फ़ास्ट मिक्सर का मुख्य सिंक, ऑडियो एचएएल है.
सामान्य मिक्सर
सुविधाएं
सभी सुविधाएं चालू हैं:
- ज़्यादा से ज़्यादा 32 ट्रैक
- हर ट्रैक के हिसाब से, शोर कम करने की सुविधा
- हर ट्रैक के सैंपल रेट का कन्वर्ज़न
- इफ़ेक्ट प्रोसेस करना
पीरियड का बटन
अवधि का हिसाब, फास्ट मिक्सर अवधि के पहले इंटिग्रल मल्टीपल के तौर पर लगाया जाता है, जो 20 मिलीसेकंड से ज़्यादा होनी चाहिए.
समय-निर्धारण
सामान्य मिक्सर, SCHED_OTHER
प्राथमिकता पर चलता है.
ब्लॉकिंग
सामान्य मिक्सर को ब्लॉक करने की अनुमति होती है. आम तौर पर, यह कई तरह के म्यूटेक्स के साथ-साथ, ब्लॉकिंग पाइप पर भी ऐसा करता है, ताकि उसका सब-मिक्स लिखा जा सके.
अन्य कॉम्पोनेंट से संबंध
सामान्य मिक्सर, बाहरी दुनिया के साथ काफ़ी इंटरैक्ट करता है. इसमें बाइंडर थ्रेड, ऑडियो नीति मैनेजर, फ़ास्ट मिक्सर थ्रेड, और क्लाइंट ट्रैक शामिल हैं.
सामान्य मिक्सर का सिंक, फ़ास्ट मिक्सर के ट्रैक 0 के लिए ब्लॉकिंग पाइप है.
झंडे
AUDIO_OUTPUT_FLAG_FAST
बिट एक हिंट है. इस बात की कोई गारंटी नहीं है कि अनुरोध पूरा किया जाएगा.
AUDIO_OUTPUT_FLAG_FAST
, क्लाइंट-लेवल का कॉन्सेप्ट है. यह सर्वर में नहीं दिखता.
TRACK_FAST
, क्लाइंट -> सर्वर कॉन्सेप्ट है.