فروشندگان می توانند دو ویژگی کلیدی را برای کاهش تأخیر صدا اعمال کنند:
- FAST Mixer در AudioFlinger: این ویژگی که در اندروید 4.1 معرفی شده است، از برنامه هایی با استفاده از Java AudioTrack و AAudio پشتیبانی می کند. FAST Mixer شامل حداقل تغییرات API عمومی مشتری یا HAL API است.
- AAudio MMAP: این ویژگی که در اندروید 8.1 معرفی شده است، برنامههای بومی را قادر میسازد تا از طریق AAaudio به تأخیر کمتری دست یابند. برای اطلاعات بیشتر به AAaudio و MMAP مراجعه کنید.
این صفحه طراحی اولیه تأخیر صوتی را شرح می دهد که در طول زمان به تکامل خود ادامه داده است. درک قوی از این طراحی برای سازندگان دستگاه های OEM و فروشندگان SoC برای اطمینان از اجرای صحیح در دستگاه ها و چیپ ست های خاص خود بسیار مهم است. این صفحه برای توسعه دهندگان برنامه در نظر گرفته نشده است.
ایجاد آهنگ
کلاینت می تواند به صورت اختیاری بیت AUDIO_OUTPUT_FLAG_FAST
در پارامتر audio_output_flags_t
سازنده AudioTrack C++ یا AudioTrack::set()
تنظیم کند. در حال حاضر تنها مشتریانی که این کار را انجام می دهند عبارتند از:
- صدای بومی اندروید مبتنی بر OpenSL ES یا AAudio
-
android.media.SoundPool
-
android.media.ToneGenerator
اجرای AudioTrack C++ درخواست AUDIO_OUTPUT_FLAG_FAST
را بررسی می کند و ممکن است به صورت اختیاری درخواست را در سطح مشتری رد کند. اگر تصمیم دارد درخواست را ارسال کند، این کار را با استفاده از بیت TRACK_FAST
از پارامتر track_flags_t
از روش کارخانه IAudioTrack
IAudioFlinger::createTrack()
انجام می دهد.
سرور صوتی AudioFlinger درخواست TRACK_FAST
را بررسی می کند و ممکن است به صورت اختیاری درخواست را در سطح سرور رد کند. از طریق بیت CBLK_FAST
بلوک کنترل حافظه مشترک به مشتری اطلاع می دهد که آیا درخواست پذیرفته شده است یا خیر.
عواملی که بر تصمیم تاثیر می گذارند عبارتند از:
- وجود یک رشته میکسر سریع برای این خروجی (به زیر مراجعه کنید)
- نرخ نمونه را پیگیری کنید
- وجود یک رشته کلاینت برای اجرای کنترل کننده های برگشت تماس برای این آهنگ
- اندازه بافر آهنگ
- اسلات های آهنگ سریع موجود (به زیر مراجعه کنید)
اگر درخواست مشتری پذیرفته شود، به آن مسیر سریع می گویند. در غیر این صورت به آن آهنگ عادی می گویند.
نخ های میکسر
در زمانی که AudioFlinger یک رشته میکسر معمولی ایجاد می کند، تصمیم می گیرد که آیا یک رشته میکسر سریع نیز ایجاد کند یا خیر. هر دو میکسر معمولی و میکسر سریع با یک آهنگ خاص مرتبط نیستند، بلکه با مجموعه ای از آهنگ ها مرتبط هستند. همیشه یک نخ میکسر معمولی وجود دارد. نخ میکسر سریع در صورت وجود تابع نخ میکسر معمولی بوده و تحت کنترل آن عمل می کند.
میکسر سریع
ویژگی ها
نخ میکسر سریع این ویژگی ها را ارائه می دهد:
- میکس زیر میکس معمولی و تا هفت آهنگ سریع مشتری
- تضعیف هر مسیر
ویژگی های حذف شده:
- تبدیل نرخ نمونه در هر مسیر
- جلوه های هر آهنگ
- اثرات هر مخلوط
دوره
میکسر سریع به صورت دوره ای کار می کند، با دوره توصیه شده دو تا سه میلی ثانیه، یا در صورت نیاز برای ثبات زمان بندی، یک دوره کمی بالاتر از 5 میلی ثانیه. این عدد به گونهای انتخاب شد که با احتساب خط لوله بافر کامل، تأخیر کل در حدود 10 میلیثانیه باشد. مقادیر کوچکتر ممکن است، اما ممکن است منجر به افزایش مصرف انرژی و احتمال بروز اشکال بسته به قابلیت پیشبینی زمانبندی CPU شود. مقادیر بزرگتر تا 20 میلی ثانیه امکان پذیر است، اما منجر به کاهش تاخیر کلی می شود و بنابراین باید از آنها اجتناب شود.
برنامه ریزی
میکسر سریع با اولویت SCHED_FIFO
بالا کار می کند. به زمان CPU بسیار کمی نیاز دارد، اما باید اغلب و با جیتر زمانبندی کم اجرا شود. Jitter تغییر در زمان چرخه را بیان می کند: این تفاوت بین زمان چرخه واقعی در مقابل زمان چرخه مورد انتظار است. دیر دویدن منجر به اشکالات ناشی از زیرآب می شود. اجرای خیلی زود به دلیل بیرون کشیدن از مسیر سریع قبل از اینکه مسیر داده ها را ارائه کند، منجر به اشکال می شود.
مسدود کردن
در حالت ایدهآل، رشته میکسر سریع هرگز مسدود نمیشود، به جز در HAL write()
. سایر موارد مسدود کردن در میکسر سریع باگ در نظر گرفته می شود. به ویژه، از mutexes اجتناب می شود. در عوض، الگوریتم های غیر مسدود کننده (همچنین به عنوان الگوریتم های بدون قفل شناخته می شوند) استفاده می شود. برای اطلاعات بیشتر در مورد این موضوع به اجتناب از وارونگی اولویت مراجعه کنید.
ارتباط با سایر اجزا
میکسر سریع تعامل مستقیم کمی با مشتریان دارد. به طور خاص، عملیات سطح کلاسور را نمی بیند، اما به بلوک کنترل حافظه مشترک مشتری دسترسی دارد.
میکسر سریع دستورات را از میکسر معمولی از طریق یک صف حالت دریافت می کند.
به غیر از کشیدن داده های آهنگ، تعامل با مشتریان از طریق میکسر معمولی است.
سینک اولیه میکسر سریع HAL صوتی است.
میکسر معمولی
ویژگی ها
همه ویژگی ها فعال هستند:
- حداکثر 32 آهنگ
- تضعیف هر مسیر
- تبدیل نرخ نمونه در هر مسیر
- پردازش افکت ها
دوره
دوره به عنوان اولین مضرب انتگرال دوره میکسر سریع محاسبه می شود که >= 20 میلی ثانیه است.
برنامه ریزی
میکسر معمولی با اولویت SCHED_OTHER
بالا کار می کند.
مسدود کردن
میکسر معمولی مجاز به مسدود کردن است، و اغلب این کار را در mutexes های مختلف و همچنین در یک لوله مسدود کننده برای نوشتن مخلوط فرعی خود انجام می دهد.
ارتباط با سایر اجزا
میکسر معمولی به طور گسترده با دنیای خارج تعامل دارد، از جمله رشته های بایندر، مدیر خط مشی صوتی، رشته میکسر سریع و تراک های مشتری.
سینک میکسر معمولی یک لوله مسدود کننده به مسیر 0 میکسر سریع است.
پرچم ها
بیت AUDIO_OUTPUT_FLAG_FAST
یک اشاره است. هیچ تضمینی وجود ندارد که درخواست انجام شود.
AUDIO_OUTPUT_FLAG_FAST
یک مفهوم در سطح مشتری است. در سرور ظاهر نمی شود.
TRACK_FAST
یک مفهوم مشتری -> سرور است.