ספקים יכולים להטמיע שתי תכונות מרכזיות כדי להפחית את זמן האחזור של האודיו:
- FAST Mixer ב-AudioFlinger: התכונה הזו, שהוצגה ב-Android 4.1, תומכת באפליקציות שמשתמשות ב-Java AudioTrack וב-AAudio. השינויים ב-FAST Mixer ב-API של לקוח ציבורי או ב-HAL API הם מינימליים.
- AAudio MMAP: התכונה הזו, שהוצגה ב-Android 8.1, מאפשרת לאפליקציות מקוריות להשיג השהיה נמוכה עוד יותר באמצעות AAudio. מידע נוסף זמין במאמר בנושא AAudio ו-MMAP.
בדף הזה מתואר העיצוב הראשוני של השהיית האודיו, שהמשיך להתפתח לאורך זמן. הבנה מעמיקה של העיצוב הזה היא קריטית ליצרני ציוד מקורי (OEM) של מכשירים ולספקי מערכת על שבב (SoC), כדי להבטיח הטמעה נכונה במכשירים ובערכות השבבים הספציפיות שלהם. הדף הזה לא מיועד למפתחי אפליקציות.
יצירת טראק
הלקוח יכול להגדיר את הביט AUDIO_OUTPUT_FLAG_FAST
בפרמטר audio_output_flags_t
של AudioTrack C++ constructor או AudioTrack::set()
. נכון לעכשיו, הלקוחות היחידים שעושים זאת הם:
- אודיו מקורי של Android שמבוסס על 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 יוצר שרשור מיקסר רגיל, הוא מחליט אם ליצור גם שרשור מיקסר מהיר. גם המיקסר הרגיל וגם המיקסר המהיר לא משויכים לטראק מסוים, אלא לקבוצת טראקים. תמיד יש שרשור רגיל של מיקסר. אם קיים שרשור מיקסר מהיר, הוא כפוף לשרשור המיקסר הרגיל ופועל תחת השליטה שלו.
מיקסר מהיר
תכונות
התכונות שזמינות ב-fast mixer thread:
- ערבוב של תת-המיקס של המיקסר הרגיל ועד שבעה טראקים מהירים של לקוחות
- הנחתה לכל טראק
תכונות שלא נכללות:
- המרה של תדירות הדגימה לכל רצועה
- אפקטים לכל טראק
- אפקטים לכל מיקס
נקודה
המיקסר המהיר פועל באופן מחזורי, עם מחזור מומלץ של שניים עד שלושה מילישניות, או מחזור קצת יותר ארוך של 5 מילישניות אם נדרשת יציבות בתזמון. המספר הזה נבחר כך שזמן האחזור הכולל יהיה בסדר גודל של 10 אלפיות השנייה, בהתחשב בצינור המאגר המלא. אפשר להשתמש בערכים קטנים יותר, אבל הם עלולים להגדיל את צריכת החשמל ואת הסיכוי לתקלות, בהתאם ליכולת החיזוי של תזמון המעבד. אפשר להשתמש בערכים גדולים יותר, עד 20 אלפיות השנייה, אבל זה יגרום להשהיה כוללת ארוכה יותר, ולכן מומלץ להימנע מכך.
תזמון
המיקסר המהיר פועל בעדיפות גבוהה יותר של SCHED_FIFO
. הוא צריך מעט מאוד זמן מעבד, אבל הוא חייב לפעול לעיתים קרובות עם תנודות נמוכות בתזמון.
Jitter (שינוי מחזורי) מבטא את השונות בזמן המחזור: זהו ההבדל בין זמן המחזור בפועל לבין זמן המחזור הצפוי.
הפעלה מאוחרת מדי גורמת לשיבושים בגלל חוסר נתונים. הפעלה מוקדמת מדי גורמת לבעיות בגלל שליפה ממסלול מהיר לפני שהמסלול סיפק נתונים.
חסימה
באופן אידיאלי, השרשור של המיקסר המהיר אף פעם לא נחסם, למעט ב-HAL
write()
. מקרים אחרים של חסימה במיקסר המהיר נחשבים באגים. בפרט, נמנעים משימוש ב-mutexes.
במקום זאת, נעשה שימוש באלגוריתמים לא חוסמים (שנקראים גם אלגוריתמים ללא נעילה).
מידע נוסף בנושא זמין במאמר איך להימנע מהיפוך סדר העדיפויות.
הקשר לרכיבים אחרים
המיקסר המהיר לא מקיים אינטראקציה ישירה עם הלקוחות. בפרט, הוא לא רואה פעולות ברמת ה-binder, אבל הוא ניגש לבלוק הבקרה של הזיכרון המשותף של הלקוח.
המיקסר המהיר מקבל פקודות מהמיקסר הרגיל דרך תור מצבים.
בנוסף לשליפת נתוני טראקים, האינטראקציה עם הלקוחות מתבצעת דרך המיקסר הרגיל.
היעד העיקרי של המיקסר המהיר הוא HAL האודיו.
מיקסר רגיל
תכונות
כל התכונות מופעלות:
- עד 32 טראקים
- הנחתה לכל טראק
- המרה של תדירות הדגימה לכל רצועה
- עיבוד אפקטים
נקודה
התקופה מחושבת כמכפלה השלמה הראשונה של תקופת המיקסר המהיר שהיא >= 20 ms.
תזמון
המיקסר הרגיל פועל בעדיפות גבוהה יותר SCHED_OTHER
.
חסימה
המיקסר הרגיל רשאי לחסום, ולעתים קרובות הוא עושה זאת בנקודות שונות של mutex, וגם בצינור חסימה כדי לכתוב את המיקס המשני שלו.
הקשר לרכיבים אחרים
המיקסר הרגיל מבצע אינטראקציה נרחבת עם העולם החיצוני, כולל שרשורי קשירה, מנהל מדיניות האודיו, שרשור המיקסר המהיר ורצועות הלקוח.
ה-sink של המיקסר הרגיל הוא צינור חוסם לטראק 0 של המיקסר המהיר.
דגלים
AUDIO_OUTPUT_FLAG_FAST
bit הוא רמז. אין ערובה לכך שהבקשה תאושר.
AUDIO_OUTPUT_FLAG_FAST
הוא מושג ברמת הלקוח. הוא לא מופיע בשרת.
TRACK_FAST
הוא מושג של לקוח -> שרת.