فروشندگان میتوانند دو ویژگی کلیدی را برای کاهش تأخیر صوتی پیادهسازی کنند:
- FAST Mixer در AudioFlinger: این ویژگی که در Android 4.1 معرفی شده است، از برنامههایی که از Java AudioTrack و AAudio استفاده میکنند پشتیبانی میکند. «ترکیبکننده FAST» شامل حداقل تغییرات در میانای برنامه کاربردی سمت کارخواه عمومی یا میانای برنامه کاربردی HAL است.
- AAudio MMAP: این ویژگی که در Android 8.1 معرفی شد، به برنامههای بومی امکان میدهد ازطریق AAudio به تأخیر حتی کمتری دست یابند. برای اطلاعات بیشتر، AAudio و MMAP را ببینید.
این صفحه طراحی اولیه تأخیر صوتی را شرح میدهد که درطول زمان به تکامل خود ادامه داده است. درک قوی از این طراحی برای سازندگان اصلی محصول (OEM) دستگاه و فروشندگان «سیستم روی تراشه» (SoC) بسیار مهم است تا از پیادهسازی صحیح در دستگاهها و مجموعه تراشههای خاص خود اطمینان حاصل کنند. این صفحه برای توسعهدهندگان نرمافزار درنظر گرفته نشده است.
ایجاد قطعه
کارخواه میتواند بهصورت اختیاری بیت AUDIO_OUTPUT_FLAG_FAST را در
پارامتر audio_output_flags_t سازنده AudioTrack C++ یا
AudioTrack::set() تنظیم کند. درحالحاضر تنها کارخواههایی که این کار را انجام میدهند عبارتند از:
- صدای بومی Android براساس OpenSL ES یا AAudio
android.media.SoundPoolandroid.media.ToneGenerator
پیادهسازی C++ مربوط به AudioTrack AUDIO_OUTPUT_FLAG_FAST
درخواست را بررسی میکند و میتواند بهصورت اختیاری درخواست را در سطح مشتری رد کند. اگر تصمیم بگیرد درخواست را منتقل کند، این کار را بااستفاده از بیت TRACK_FAST پارامتر track_flags_t از روش کارخانه IAudioTrack IAudioFlinger::createTrack() انجام میدهد.
سرور صوتی AudioFlinger درخواست TRACK_FAST را بررسی میکند و ممکن است
بهصورت اختیاری درخواست را در سطح سرور رد کند. این کد ازطریق بیت CBLK_FAST بلوک کنترل حافظه مشترک به کلاینت اطلاع میدهد که درخواست پذیرفته شده است یا نه.
عوامل مؤثر بر تصمیم عبارتاند از:
- وجود رشته میکسر سریع برای این خروجی (به زیر مراجعه کنید)
- بسامد نمونه قطعه
- وجود رشته کارخواه برای اجرای رسیدگیکنندههای بازخوانی برای این قطعه
- اندازه میانگیری قطعه
- وقتهای آزاد مسیر سریع (در زیر ببینید)
اگر درخواست مشتری پذیرفته شود، به آن مسیر سریع گفته میشود. درغیراینصورت، به آن قطعه عادی میگویند.
رشتههای میکسر
در زمانی که AudioFlinger یک رشته ترکیبکننده معمولی ایجاد میکند، تصمیم میگیرد که آیا یک رشته ترکیبکننده سریع نیز ایجاد کند یا نه. هر دو میکسر معمولی و میکسر سریع با یک قطعه خاص مرتبط نیستند، بلکه با مجموعهای از قطعهها مرتبط هستند. همیشه یک رشته میکسر عادی وجود دارد. رشته ترکیبکننده سریع، درصورت وجود، تابع رشته ترکیبکننده معمولی است و تحت کنترل آن عمل میکند.
مخلوطکن سریع
ویژگیها
رشته میکسر سریع این ویژگیها را ارائه میدهد:
- ترکیب زیرمیکس میکسر معمولی و حداکثر هفت قطعه سریع مشتری
- تضعیف هر قطعه
ویژگیهای حذفشده:
- تبدیل نرخ نمونه براساس قطعه
- جلوههای هر قطعه
- جلوههای هر ترکیب
نقطه
میکسر سریع بهصورت دورهای اجرا میشود، با دوره توصیهشده دو تا سه میلیثانیه، یا دوره کمی بالاتر از ۵ میلیثانیه درصورت نیاز برای پایداری زمانبندی. این عدد بهگونهای انتخاب شده است که با درنظر گرفتن خط لوله بافر کامل، تأخیر کل در حدود ۱۰ میلیثانیه باشد. مقادیر کوچکتر امکانپذیر است اما ممکن است منجر به افزایش مصرف برق و احتمال بروز اشکال شود، که این امر به پیشبینیپذیری زمانبندی CPU بستگی دارد. مقادیر بزرگتر تا ۲۰ میلیثانیه امکانپذیر است، اما منجر به کاهش کیفیت تأخیر کلی میشود و بنابراین باید از آنها اجتناب شود.
برنامهریزی کردن
مخلوطکن سریع با اولویت SCHED_FIFO بالا اجرا میشود. به زمان CPU بسیار کمی نیاز دارد، اما باید اغلب و با لرزش زمانبندی کم اجرا شود.
لرزش
تغییرات در زمان چرخه را نشان میدهد: این تفاوت بین زمان چرخه
واقعی و زمان چرخه موردانتظار است.
اگر خیلی دیر شروع کنید، بهدلیل کمبود زمان، با اشکالاتی مواجه خواهید شد. اجرای خیلی زود منجر به اشکالاتی میشود زیرا از یک مسیر سریع قبلاز اینکه مسیر دادهها را ارائه دهد، دادهها را میکشد.
مسدودسازی
در حالت ایدهآل، رشته ترکیبکننده سریع هرگز مسدود نمیشود، بهجز در HAL
write(). موارد دیگر مسدودسازی در میکسر سریع بهعنوان اشکال درنظر گرفته میشوند. بهطور خاص، از mutexها اجتناب میشود.
درعوض، از الگوریتمهای غیرمسدودکننده
(که بهعنوان الگوریتمهای بدون قفل نیز شناخته میشوند) استفاده میشود.
برای اطلاعات بیشتر درباره این موضوع، جلوگیری از وارونگی اولویت را ببینید.
ارتباط با دیگر عناصر
میکسر سریع تعامل مستقیم کمی با مشتریان دارد. بهویژه، عملیات سطح binder را نمیبیند، اما به بلوک کنترل حافظه مشترک کارخواه دسترسی دارد.
مخلوطکننده سریع ازطریق صف وضعیت، فرمانهایی را از مخلوطکننده معمولی دریافت میکند.
بهجز کشیدن دادههای قطعه، تعامل با مشتریان ازطریق میکسر معمولی انجام میشود.
منبع اصلی میکسر سریع، لایه انتزاعی سختافزار صدا است.
مخلوطکن معمولی
ویژگیها
همه ویژگیها فعال است:
- تا ۳۲ قطعه
- تضعیف هر قطعه
- تبدیل بسامد نمونه برای هر قطعه
- درحال پردازش جلوهها
نقطه
این دوره بهعنوان اولین مضرب صحیح دوره مخلوطکن سریع که بزرگتر یا مساوی با ۲۰ میلیثانیه است محاسبه میشود.
برنامهریزی کردن
میکسر معمولی با اولویت SCHED_OTHER اجرا میشود.
مسدودسازی
میکسر معمولی مجاز به مسدود کردن است و اغلب این کار را در چندین متقابل و همچنین در یک لوله مسدودکننده برای نوشتن زیرمیکس خود انجام میدهد.
ارتباط با مؤلفههای دیگر
میکسر عادی بهطور گسترده با دنیای خارج تعامل دارد، ازجمله رشتههای اتصالدهنده، مدیر خطمشی صوتی، رشته میکسر سریع، و قطعههای مشتری.
سینک میکسر معمولی یک لوله مسدودکننده به قطعه ۰ میکسر سریع است.
پرچمها
بیت AUDIO_OUTPUT_FLAG_FAST یک راهنمایی است. هیچ تضمینی وجود ندارد که درخواست برآورده شود.
AUDIO_OUTPUT_FLAG_FAST مفهومی در سطح مشتری است. در سرور نشان داده نمیشود.
TRACK_FAST مفهومی کارخواه -> سرور است.