वेंडर, ऑडियो लेटेंसी को कम करने के लिए दो मुख्य सुविधाएं लागू कर सकते हैं:
- AudioFlinger में FAST मिक्सर: यह सुविधा Android 4.1 में पेश की गई थी. यह Java AudioTrack और AAudio का इस्तेमाल करने वाले ऐप्लिकेशन के साथ काम करती है. FAST Mixer में, पब्लिक क्लाइंट एपीआई या HAL API में बहुत कम बदलाव किए जाते हैं.
- AAudio MMAP: Android 8.1 में पेश की गई इस सुविधा की मदद से, नेटिव ऐप्लिकेशन AAudio के ज़रिए और भी कम समय में डेटा ट्रांसफ़र कर सकते हैं. ज़्यादा जानकारी के लिए, AAudio और MMAP देखें.
इस पेज पर, ऑडियो लेटेंसी के शुरुआती डिज़ाइन के बारे में बताया गया है. इसमें समय के साथ बदलाव होता रहा है. इस डिज़ाइन के बारे में अच्छी तरह से जानना, डिवाइस ओईएम और एसओसी वेंडर के लिए ज़रूरी है. इससे वे अपने डिवाइसों और चिपसेट पर इसे सही तरीके से लागू कर पाएंगे. यह पेज, ऐप्लिकेशन डेवलपर के लिए नहीं है.
ट्रैक बनाना
क्लाइंट, AudioTrack C++ कंस्ट्रक्टर या AudioTrack::set()
के audio_output_flags_t
पैरामीटर में बिट AUDIO_OUTPUT_FLAG_FAST
को सेट कर सकता है. फ़िलहाल, सिर्फ़ ये क्लाइंट ऐसा करते हैं:
- Android का नेटिव ऑडियो, जो OpenSL ES या AAudio पर आधारित है
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
के ज़रिए दी जाती है.
फ़ैसला लेने के लिए इन बातों का ध्यान रखा जाता है:
- इस आउटपुट के लिए फ़ास्ट मिक्सर थ्रेड मौजूद है (नीचे देखें)
- ट्रैक का सैंपल रेट
- इस ट्रैक के लिए कॉलबैक हैंडलर को लागू करने के लिए, क्लाइंट थ्रेड की मौजूदगी
- ट्रैक बफ़र का साइज़
- फ़ास्ट ट्रैक के लिए उपलब्ध स्लॉट (नीचे देखें)
अगर क्लाइंट का अनुरोध स्वीकार कर लिया जाता है, तो इसे फ़ास्ट ट्रैक कहा जाता है. इसके अलावा, इसे सामान्य ट्रैक कहा जाता है.
मिक्सर थ्रेड
जब AudioFlinger एक सामान्य मिक्सर थ्रेड बनाता है, तब वह यह तय करता है कि फ़ास्ट मिक्सर थ्रेड भी बनाना है या नहीं. नॉर्मल मिक्सर और फ़ास्ट मिक्सर, दोनों किसी खास ट्रैक से नहीं जुड़े होते हैं. इसके बजाय, ये ट्रैक के सेट से जुड़े होते हैं. हमेशा एक नॉर्मल मिक्सर थ्रेड होता है. अगर फ़ास्ट मिक्सर थ्रेड मौजूद है, तो वह नॉर्मल मिक्सर थ्रेड के अधीन काम करता है.
फ़ास्ट मिक्सर
सुविधाएं
फ़ास्ट मिक्सर थ्रेड में ये सुविधाएं मिलती हैं:
- इसमें सामान्य मिक्सर के सब-मिक्स और क्लाइंट के सात फ़ास्ट ट्रैक को मिक्स किया जाता है
- हर ट्रैक के हिसाब से आवाज़ कम करने की सुविधा
छोड़ी गई सुविधाएं:
- हर ट्रैक के लिए सैंपल रेट कन्वर्ज़न
- हर ट्रैक के लिए इफ़ेक्ट
- हर मिक्स इफ़ेक्ट के लिए
पीरियड का बटन
फ़ास्ट मिक्सर समय-समय पर चलता है. हमारा सुझाव है कि इसे दो से तीन मिलीसेकंड के लिए चलाएं. अगर शेड्यूल करने के लिए ज़्यादा समय की ज़रूरत हो, तो इसे पांच मिलीसेकंड के लिए भी चलाया जा सकता है. इस संख्या को इसलिए चुना गया है, ताकि पूरे बफ़र पाइपलाइन के लिए कुल इंतज़ार का समय 10 मि॰से॰ हो. छोटी वैल्यू का इस्तेमाल किया जा सकता है. हालांकि, इससे बिजली की खपत बढ़ सकती है और सीपीयू शेड्यूलिंग की अनुमानित क्षमता के आधार पर गड़बड़ियां हो सकती हैं. इसकी वैल्यू 20 मिलीसेकंड तक हो सकती है. हालांकि, इससे कुल इंतज़ार का समय बढ़ जाता है. इसलिए, इससे बचना चाहिए.
समय-निर्धारण
फ़ास्ट मिक्सर, SCHED_FIFO
की बढ़ी हुई प्राथमिकता पर काम करता है. इसके लिए, सीपीयू के बहुत कम समय की ज़रूरत होती है. हालांकि, इसे अक्सर और कम शेड्यूलिंग जिटर के साथ चलना चाहिए.
जिटर
साइकल के समय में होने वाले बदलाव को दिखाता है. यह
असल साइकल के समय और अनुमानित साइकल के समय के बीच का अंतर होता है.
बहुत देर से चलने की वजह से, अंडररन की समस्या होती है. बहुत जल्दी शुरू करने पर गड़बड़ियां होती हैं, क्योंकि ट्रैक के डेटा उपलब्ध कराने से पहले ही, फ़ास्ट ट्रैक से डेटा पुल किया जाता है.
ब्लॉकिंग
आदर्श रूप से, फ़ास्ट मिक्सर थ्रेड कभी ब्लॉक नहीं होता. हालांकि, HAL
write()
पर ऐसा हो सकता है. फ़ास्ट मिक्सर में ब्लॉक होने की अन्य स्थितियों को बग माना जाता है. खास तौर पर, म्यूटेक्स का इस्तेमाल नहीं किया जाता.
इसके बजाय, नॉन-ब्लॉकिंग एल्गोरिदम का इस्तेमाल किया जाता है. इन्हें लॉक-फ़्री एल्गोरिदम भी कहा जाता है.
इस विषय के बारे में ज़्यादा जानने के लिए, प्राथमिकता के उलट होने से बचें लेख पढ़ें.
अन्य कॉम्पोनेंट के साथ संबंध
फ़ास्ट मिक्सर का क्लाइंट से सीधा संपर्क नहीं होता. खास तौर पर, यह बाइंडर-लेवल के ऑपरेशन नहीं देखता है. हालांकि, यह क्लाइंट के शेयर किए गए मेमोरी कंट्रोल ब्लॉक को ऐक्सेस करता है.
फ़ास्ट मिक्सर को सामान्य मिक्सर से कमांड मिलती हैं. ये कमांड, स्टेट क्यू के ज़रिए मिलती हैं.
ट्रैक डेटा को पुल करने के अलावा, क्लाइंट के साथ इंटरैक्शन सामान्य मिक्सर के ज़रिए होता है.
फ़ास्ट मिक्सर का मुख्य सिंक, ऑडियो HAL होता है.
सामान्य मिक्सर
सुविधाएं
सभी सुविधाएं चालू हैं:
- ज़्यादा से ज़्यादा 32 ट्रैक
- हर ट्रैक के हिसाब से आवाज़ कम करने की सुविधा
- हर ट्रैक के लिए सैंपल रेट कन्वर्ज़न
- इफ़ेक्ट प्रोसेस करना
पीरियड का बटन
इस अवधि का हिसाब, फ़ास्ट मिक्सर की अवधि के पहले पूर्णांक गुणक के तौर पर लगाया जाता है. यह अवधि 20 मि॰से॰ से ज़्यादा या इसके बराबर होती है.
समय-निर्धारण
सामान्य मिक्सर, SCHED_OTHER
प्राथमिकता पर काम करता है.
ब्लॉकिंग
मिक्सर को ब्लॉक करने की अनुमति होती है. ऐसा अक्सर अलग-अलग म्यूटेक्स के साथ-साथ, सब-मिक्स लिखने के लिए ब्लॉकिंग पाइप पर भी किया जाता है.
अन्य कॉम्पोनेंट के साथ संबंध
सामान्य मिक्सर, बाहरी दुनिया के साथ बड़े पैमाने पर इंटरैक्ट करता है. इसमें बाइंडर थ्रेड, ऑडियो नीति मैनेजर, फ़ास्ट मिक्सर थ्रेड, और क्लाइंट ट्रैक शामिल हैं.
सामान्य मिक्सर का सिंक, फ़ास्ट मिक्सर के ट्रैक 0 के लिए ब्लॉकिंग पाइप होता है.
झंडे
AUDIO_OUTPUT_FLAG_FAST
बिट एक हिंट है. इस बात की कोई गारंटी नहीं है कि अनुरोध पूरा किया जाएगा.
AUDIO_OUTPUT_FLAG_FAST
क्लाइंट लेवल का कॉन्सेप्ट है. यह सर्वर में नहीं दिखता.
TRACK_FAST
, क्लाइंट -> सर्वर कॉन्सेप्ट है.