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

גרסת 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 הוא פורמט קנייני פשוט שמוגבל מדי לתיאור טופולוגיות מורכבות לענפים, כמו טלוויזיות ומכוניות.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • A2DP: a2dp_audio_policy_configuration.xml
  • ניתוב מחדש של רמיקס משני: rsubmix_audio_policy_configuration.xml
  • USB: usb_audio_policy_configuration.xml

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

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

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

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

זמין בשתי גרסאות: ניתנת להתאמה אישית וברירת מחדל. מידע על בחירת הגרסה זמין במאמר הגדרה באמצעות מסגרת הפרמטרים.

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

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

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

שימוש במדיניות האודיו הניתנת להתאמה מאפשר ליצרני ציוד מקורי (OEM) לבצע את הפעולות הבאות:

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

ב-AOSP יש דוגמה לקובץ תצורה של מדיניות אודיו שמשתמש במסגרת הפרמטרים בכתובת 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 ציבורי של Enumeration and Selection, שנמצא מעל התשתית של תיקון האודיו או יציאת האודיו, ומאפשר למפתחי אפליקציות לציין העדפה לקלט או פלט ספציפיים של מכשיר עבור רשומות או טראקים של אודיו מחוברים.

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

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

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

אם החומרה והמנהל שלכם תומכים באודיו מרובה-ערוצים דרך 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 מבצע דאונמיקס של התוכן לסטריאו באופן אוטומטי כשהתוכן נשלח למכשיר אודיו שלא תומך באודיו בכמה ערוצים.

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

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