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