הגדרת כללי מדיניות האודיו

גרסת Android 10 כוללת שינוי משמעותי במנהל מדיניות האודיו, כדי לספק גמישות רבה יותר לתמיכה בתרחישי שימוש מורכבים ברכב:

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

ב-Android 7.0 הוצג פורמט של קובץ הגדרות מדיניות אודיו (XML) לתיאור טופולוגיית האודיו.

בגרסאות קודמות של Android היה צריך להשתמש ב-device/<company>/<device>/audio/audio_policy.conf כדי להצהיר על מכשירי האודיו שקיימים במוצר (דוגמה לקובץ הזה עבור חומרת האודיו של Galaxy Nexus מופיעה ב-device/samsung/tuna/audio/audio_policy.conf). עם זאת, CONF הוא פורמט פשוט וקנייני, שמוגבל מדי כדי לתאר טופולוגיות מורכבות עבור תעשיות כמו טלוויזיות ומכוניות.

ב-Android 7.0 הוצא משימוש audio_policy.conf והוספה תמיכה בהגדרת טופולוגיה של אודיו באמצעות פורמט קובץ XML שקל יותר לקריאה, שיש לו מגוון רחב של כלים לעריכה ולניתוח, והוא גמיש מספיק כדי לתאר טופולוגיות מורכבות של אודיו. ב-Android 7.0 משתמשים בדגל USE_XML_AUDIO_POLICY_CONF build כדי לבחור את פורמט ה-XML של קובצי ההגדרות.

היתרונות של פורמט XML

בדומה לקובץ ה-CONF, קובץ ה-XML מאפשר להגדיר את המספר והסוגים של פרופילי פלט ופרופילי קלט של סטרימינג, מכשירים שאפשר להשתמש בהם להפעלה וללכידה, ומאפייני אודיו. בנוסף, פורמט ה-XML מציע את השיפורים הבאים:

  • ב-Android 10, אפשר להפעיל בו-זמנית יותר מאפליקציית הקלטה אחת.
    • התחלת ההקלטה אף פעם לא נדחית בגלל מצב של פעילות בו-זמנית.
    • registerAudioRecordingCallback(AudioManager.AudioRecordingCallback cb) הקריאה החוזרת מודיעה ללקוחות על שינויים בנתיב הלכידה.
  • במצבים הבאים, הלקוח מקבל דגימות אודיו שקטות:
    • תרחיש שימוש שקשור לפרטיות (לדוגמה, VOICE_COMMUNICATION) פעיל.
    • ללקוח אין שירות שפועל בחזית או ממשק משתמש שפועל בחזית.
    • התפקידים המיוחדים מוכרים במדיניות:
      • שירות נגישות: יכול להקליט גם אם תרחיש שימוש שקשור לפרטיות פעיל.
      • ‫Assistant: נחשב כרכיב שרגיש לפרטיות אם ממשק המשתמש מוצג בחלק העליון.
  • לפרופילי אודיו יש מבנה דומה לתיאורי אודיו פשוטים של HDMI, שמאפשר להגדיר קבוצה שונה של קצבי דגימה/מסכות ערוצים לכל פורמט אודיו.
  • יש הגדרות ברורות לכל החיבורים האפשריים בין מכשירים לבין מקורות נתונים. בעבר, כלל מרומז אפשר לחבר את כל המכשירים שמצורפים לאותו מודול HAL, ולמנוע ממדיניות האודיו לשלוט בחיבורים שמתבקשים באמצעות ממשקי API של תיקוני אודיו. בפורמט XML, תיאור הטופולוגיה מגדיר את מגבלות החיבור.
  • התמיכה ב-includes מונעת חזרה על הגדרות סטנדרטיות של A2DP,‏ USB או reroute submit.
  • אפשר להתאים אישית את עקומות עוצמת הקול. בעבר, טבלאות הנפח היו מקודדות. בפורמט XML, טבלאות הכמויות מתוארות ואפשר להתאים אותן אישית.

בתבנית בכתובת frameworks/av/services/audiopolicy/config/audio_policy_configuration.xml אפשר לראות שימוש ברבות מהתכונות האלה.

פורמט הקובץ והמיקום

קובץ התצורה החדש של מדיניות האודיו הוא audio_policy_configuration.xml והוא נמצא ב-/system/etc. בדוגמאות הבאות מוצגת הגדרת מדיניות פשוטה לגבי אודיו בפורמט קובץ XML ל-Android 12 ולגרסאות שמתחת ל-Android 12.

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

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

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

הכללות של קבצים

אפשר להשתמש בשיטת הכללות XML ‏ (XInclude) כדי לכלול מידע על הגדרות מדיניות אודיו שנמצא בקובצי XML אחרים. כל הקבצים הכלולים צריכים להיות מובנים בפורמט שמתואר למעלה, עם ההגבלות הבאות:

  • הקבצים יכולים להכיל רק רכיבים ברמה העליונה.
  • הקבצים לא יכולים להכיל רכיבי XInclude.

כדי להימנע מהעתקה של מידע על הגדרות של מודול HAL של אודיו בפרויקט קוד פתוח של Android‏ (AOSP) לכל קובצי ההגדרות של מדיניות האודיו (שעלולה לגרום לשגיאות), צריך להשתמש בהכללות. קובץ XML סטנדרטי להגדרת מדיניות אודיו מסופק עבור רכיבי ה-HAL הבאים של אודיו:

  • A2DP: a2dp_audio_policy_configuration.xml
  • Reroute submix: rsubmix_audio_policy_configuration.xml
  • USB: usb_audio_policy_configuration.xml

ארגון קוד מדיניות האודיו

AudioPolicyManager.cpp מחולק לכמה מודולים כדי שיהיה קל לתחזק ולהגדיר אותו. הארגון של frameworks/av/services/audiopolicy כולל את המודולים הבאים.

מודול תיאור
/managerdefault כולל את הממשקים הגנריים וההטמעה של התנהגויות שמשותפים לכל האפליקציות. בדומה ל-AudioPolicyManager.cpp, עם פונקציונליות של מנוע ומושגים נפוצים שמוסתרים.
/common הגדרת מחלקות בסיס (לדוגמה, מבני נתונים לפרופילים של זרם אודיו של קלט ופלט, תיאורי מכשירי אודיו, תיקוני אודיו ויציאות אודיו). ההגדרה הזו הייתה קודם בתוך AudioPolicyManager.cpp.
/engine

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

התכונה זמינה בשתי גרסאות: ניתנת להגדרה וברירת מחדל. מידע על בחירת הגרסה זמין במאמר הגדרה באמצעות Parameter Framework.

/engineconfigurable הטמעה של מנוע מדיניות שמסתמכת על Parameter Framework (כפי שמתואר בהמשך). ההגדרה מבוססת על Parameter Framework, והמדיניות מוגדרת על ידי קובצי XML.
/enginedefault הטמעה של מנוע מדיניות שמבוססת על הטמעות קודמות של Android Audio Policy Manager. זוהי הגדרת ברירת המחדל, והיא כוללת כללים שמוטמעים בקוד ומתאימים להטמעות של Nexus ו-AOSP.
/service כולל ממשקי binder, שרשור ויישום נעילה עם הממשק לשאר המסגרת.

הגדרה באמצעות Parameter Framework

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

שימוש במדיניות אודיו שניתנת להגדרה מאפשר לספקי OEM:

  • תארו את המבנה של מערכת ואת הפרמטרים שלה ב-XML.
  • לכתוב (ב-C++) או להשתמש מחדש בקצה עורפי (פלאגין) כדי לגשת לפרמטרים המתוארים.
  • מגדירים (ב-XML או בשפה ספציפית לתחום) תנאים או כללים שלפיהם פרמטר מסוים צריך לקבל ערך מסוים.

‫AOSP כולל דוגמה לקובץ הגדרות מדיניות אודיו שמשתמש ב-Parameter Framework בכתובת Frameworks/av/services/audiopolicy/engineconfigurable/parameter-framework/example/Settings/PolicyConfigurableDomains.xml. פרטים נוספים מופיעים במסמכי התיעוד של Intel בנושא Parameter Framework.

ב-Android מגרסה 10 ומטה, מדיניות האודיו שניתנת להגדרה נבחרת באמצעות אפשרות ה-build‏ USE_CONFIGURABLE_AUDIO_POLICY. ב-Android מגרסה 11 ואילך, הגרסה של מנוע מדיניות האודיו נבחרת בקובץ audio_policy_configuration.xml. כדי לבחור את מנוע מדיניות האודיו שניתן להגדרה, מגדירים את הערך של המאפיין engine_library של רכיב globalConfiguration לערך configurable כמו בדוגמה הבאה:

<audioPolicyConfiguration>
    <globalConfiguration engine_library="configurable" />
...
</audioPolicyConfiguration>

ממשקי API לניתוב מדיניות אודיו

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

ב-Android 7.0, ה-API של Enumeration and Selection מאומת על ידי בדיקות CTS, והוא מורחב כך שיכלול ניתוב של זרמי אודיו מקוריים של C/C++‎ ‏ (OpenSL ES). הניתוב של סטרימינג מקורי ממשיך להתבצע ב-Java, עם הוספה של ממשק AudioRouting שמחליף את שיטות הניתוב המפורשות שהיו ספציפיות למחלקות AudioTrack ו-AudioRecord, משלב אותן ומוציא אותן משימוש.

פרטים על Enumeration and Selection API זמינים במאמרים ממשקי תצורה של Android ו-OpenSLES_AndroidConfiguration.h. לפרטים על ניתוב אודיו, אפשר לעיין במאמר בנושא AudioRouting.

תמיכה במגוון ערוצים

אם החומרה והדרייבר תומכים באודיו רב-ערוצי דרך HDMI, אפשר להוציא את זרם האודיו ישירות לחומרת האודיו (הפעולה הזו מדלגת על מיקסר AudioFlinger, כך שהאודיו לא עובר מיקס למטה לשני ערוצים). ה-HAL של האודיו צריך לחשוף אם פרופיל של זרם פלט תומך ביכולות של אודיו רב-ערוצי. אם ה-HAL חושף את היכולות שלו, מנהל המדיניות שמוגדר כברירת מחדל מאפשר הפעלה של כמה ערוצים דרך HDMI. פרטים על ההטמעה זמינים במאמר device/samsung/tuna/audio/audio_hw.c.

כדי לציין שהמוצר מכיל פלט אודיו רב-ערוצי, צריך לערוך את קובץ ההגדרות של מדיניות האודיו כדי לתאר את הפלט הרב-ערוצי של המוצר. בדוגמה הבאה מתוך frameworks/av/services/audiopolicy/config/primary_audio_policy_configuration_tv.xml מוצגת מסכת ערוצים דינמית, כלומר מנהל מדיניות האודיו שולח שאילתה למסכות הערוצים שנתמכות על ידי יעד ה-HDMI אחרי החיבור.

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

קודקים של מדיה

חשוב לוודא שרכיבי codec של אודיו שהחומרה והדרייברים תומכים בהם מוצהרים בצורה נכונה עבור המוצר. פרטים נוספים זמינים במאמר בנושא חשיפת קודקים ל-Framework.