نسخه اندروید 4.1 تغییرات چارچوب داخلی را برای مسیر خروجی صوتی با تأخیر کمتر معرفی کرد. حداقل تغییرات API مشتری عمومی یا HAL API وجود داشت. این سند طرح اولیه را توصیف می کند که در طول زمان به تکامل خود ادامه داده است. داشتن درک خوب از این طراحی باید به فروشندگان 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 یک رشته میکسر معمولی ایجاد می کند، تصمیم می گیرد که آیا یک رشته میکسر سریع نیز ایجاد کند یا خیر. هر دو میکسر معمولی و میکسر سریع با یک آهنگ خاص مرتبط نیستند، بلکه با مجموعه ای از آهنگ ها مرتبط هستند. همیشه یک نخ میکسر معمولی وجود دارد. نخ میکسر سریع در صورت وجود تابع نخ میکسر معمولی بوده و تحت کنترل آن عمل می کند.
میکسر سریع
امکانات
نخ مخلوط کن سریع این ویژگی ها را ارائه می دهد:
- میکس زیر میکس معمولی و تا 7 آهنگ سریع مشتری
- تضعیف هر مسیر
ویژگی های حذف شده:
- تبدیل نرخ نمونه در هر مسیر
- جلوه های هر آهنگ
- اثرات هر مخلوط
دوره زمانی
میکسر سریع به صورت دورهای کار میکند، با دوره توصیهشده دو تا سه میلیثانیه (میلیثانیه)، یا در صورت نیاز برای پایداری زمانبندی، دوره کمی بالاتر از پنج میلی ثانیه. این عدد به گونهای انتخاب شد که با احتساب خط لوله بافر کامل، تأخیر کل در حدود 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
یک مفهوم مشتری -> سرور است.