עיצוב להפחתת זמן השהייה

מהדורת אנדרואיד 4.1 הציגה שינויי מסגרת פנימיים עבור נתיב פלט אודיו עם חביון נמוך יותר . היו שינויים מינימליים ב-API של לקוח ציבורי או ב-HAL API. מסמך זה מתאר את העיצוב הראשוני, שהמשיך להתפתח עם הזמן. הבנה טובה של עיצוב זה אמורה לעזור לספקי OEM ו-SoC של מכשירים ליישם את העיצוב בצורה נכונה במכשירים ובערכות השבבים הספציפיות שלהם. מאמר זה אינו מיועד למפתחי אפליקציות.

יצירת מסלול

הלקוח יכול אופציונלי להגדיר ביט AUDIO_OUTPUT_FLAG_FAST בפרמטר audio_output_flags_t של הבנאי AudioTrack C++ או AudioTrack::set() . כרגע הלקוחות היחידים שעושים זאת הם:

ההטמעה של AudioTrack C++ סוקרת את הבקשה AUDIO_OUTPUT_FLAG_FAST ועשוי לדחות את הבקשה באופן אופציונלי ברמת הלקוח. אם הוא מחליט להעביר את הבקשה הלאה, הוא עושה זאת באמצעות סיביות TRACK_FAST של הפרמטר track_flags_t של שיטת המפעל IAudioTrack IAudioFlinger::createTrack() .

שרת האודיו של AudioFlinger סוקר את הבקשה TRACK_FAST ועשוי לדחות את הבקשה באופן אופציונלי ברמת השרת. זה מודיע ללקוח אם הבקשה התקבלה או לא, באמצעות סיביות CBLK_FAST של בלוק בקרת הזיכרון המשותף.

הגורמים המשפיעים על ההחלטה כוללים:

  • נוכחות של חוט מיקסר מהיר עבור פלט זה (ראה להלן)
  • עקוב אחר קצב הדגימה
  • נוכחות של שרשור לקוח לביצוע מטפלי התקשרות חוזרים עבור מסלול זה
  • עקוב אחר גודל המאגר
  • חריצי מסלול מהיר זמינים (ראה להלן)

אם בקשת הלקוח התקבלה, היא נקראת "מסלול מהיר". אחרת זה נקרא "מסלול רגיל".

חוטי מיקסר

בזמן ש-AudioFlinger יוצר חוט מיקסר רגיל, הוא מחליט אם ליצור או לא ליצור גם חוט מיקסר מהיר. גם המיקסר הרגיל וגם המיקסר המהיר אינם משויכים לרצועה מסוימת, אלא לסט של רצועות. תמיד יש חוט מיקסר רגיל. חוט המיקסר המהיר, אם קיים, כפוף לחוט המיקסר הרגיל ופועל בשליטתו.

מיקסר מהיר

מאפיינים

חוט המיקסר המהיר מספק את התכונות הבאות:

  • מיקס של תת-מיקס של המיקסר הרגיל ועד 7 רצועות מהירים של לקוח
  • הנחתה לכל מסלול

תכונות שהושמטו:

  • המרת שיעור דגימה לכל מסלול
  • אפקטים לכל רצועה
  • אפקטים לכל מיקס

פרק זמן

המיקסר המהיר פועל מעת לעת, עם פרק זמן מומלץ של שתיים עד שלוש מילישניות (מילישניות), או תקופה מעט גבוהה יותר של חמש מילישניות במידת הצורך ליציבות התזמון. מספר זה נבחר כך שבהתחשב בצינור המאגר המלא, ההשהיה הכוללת היא בסדר גודל של 10 אלפיות השנייה. ערכים קטנים יותר אפשריים אך עלולים לגרום לצריכת חשמל מוגברת ולסיכוי לתקלות בהתאם לחיזוי תזמון המעבד. ערכים גדולים יותר אפשריים, עד 20 אלפיות השנייה, אך גורמים להפחתה של השהיה הכוללת ולכן יש להימנע.

תזמון

המיקסר המהיר פועל בעדיפות מוגברת SCHED_FIFO . זה צריך מעט מאוד זמן CPU, אבל חייב לפעול לעתים קרובות ועם ריצוד תזמון נמוך. ריצוד מבטא את השונות בזמן המחזור: זהו ההבדל בין זמן המחזור בפועל לעומת זמן המחזור הצפוי. ריצה מאוחרת מדי תגרום לתקלות עקב תת-ריצה. ריצה מוקדמת מדי תגרום לתקלות עקב משיכה ממסלול מהיר לפני שהמסלול סיפק נתונים.

חסימה

באופן אידיאלי, חוט המיקסר המהיר לעולם אינו חוסם, מלבד ב-HAL write() . מופעים אחרים של חסימה בתוך המיקסר המהיר נחשבים לבאגים. בפרט, נמנעים מוטקסים. במקום זאת, נעשה שימוש באלגוריתמים שאינם חוסמים (הידועים גם כאלגוריתמים ללא נעילה). ראה הימנעות מהפיכת עדיפות למידע נוסף בנושא זה.

קשר למרכיבים אחרים

למיקסר המהיר יש מעט אינטראקציה ישירה עם לקוחות. בפרט, הוא אינו רואה פעולות ברמת ה-binder, אך הוא כן ניגש לבלוק בקרת הזיכרון המשותף של הלקוח.

המיקסר המהיר מקבל פקודות מהמיקסר הרגיל דרך תור מצב.

מלבד משיכת נתוני מסלול, האינטראקציה עם לקוחות היא באמצעות המיקסר הרגיל.

הכיור העיקרי של המיקסר המהיר הוא השמע HAL.

מיקסר רגיל

מאפיינים

כל התכונות מופעלות:

  • עד 32 רצועות
  • הנחתה לכל מסלול
  • המרת שיעור דגימה לכל מסלול
  • עיבוד אפקטים

פרק זמן

התקופה מחושבת ככפולה האינטגרלית הראשונה של תקופת המיקסר המהיר שהיא >= 20 אלפיות השנייה.

תזמון

המיקסר הרגיל פועל בעדיפות מוגבהת SCHED_OTHER .

חסימה

למיקסר הרגיל מותר לחסום, ולעיתים קרובות עושה זאת במוטקסים שונים וכן בצינור חוסם כדי לכתוב את תת-המיקס שלו.

קשר למרכיבים אחרים

המיקסר הרגיל מקיים אינטראקציה נרחבת עם העולם החיצון, כולל שרשורי בינדר, מנהל מדיניות שמע, חוט מיקסר מהיר ורצועות לקוח.

כיור המיקסר הרגיל הוא צינור חוסם למסלול 0 של המיקסר המהיר.

דגלים

ביט AUDIO_OUTPUT_FLAG_FAST הוא רמז. אין ערובה שהבקשה תתמלא.

AUDIO_OUTPUT_FLAG_FAST הוא מושג ברמת הלקוח. זה לא מופיע בשרת.

TRACK_FAST הוא לקוח -> מושג שרת.