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

התכונה 'ניתוב אודיו משולב' מוסיפה תמיכה בסטרימינג של אודיו לכמה מכשירי אודיו בו-זמנית. באמצעות התכונה הזו, אפליקציות עם הרשאות יכולות לבחור כמה מכשירים מועדפים עבור אסטרטגיה מסוימת באמצעות ממשקי API של המערכת. אפליקציות יכולות לגלות את היכולות של מכשירי אודיו בצורה מדויקת יותר באמצעות ממשקי ה-API הציבוריים שזמינים במסגרת התכונה הזו. ב-Android בגרסה 11 ומטה, להטמעה של מסגרת האודיו יש תמיכה מוגבלת במספר מכשירי אודיו מאותו סוג (לדוגמה, 2 אוזניות Bluetooth A2DP) שמחוברים בו-זמנית. בנוסף, כללי ניתוב האודיו שמוגדרים כברירת מחדל לא מאפשרים למשתמשים לבחור כמה מכשירים מאותו סוג לתרחיש שימוש מסוים.

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

החל מ-Android 14, מסגרת ה-USB תומכת בהעברה למספר מכשירי USB, בתנאי שמכשירי ה-USB הם מסוגים שונים של מכשירי אודיו, ויש תמיכה בקרנל ובספק לחיבור של כמה מכשירי USB בו-זמנית.

בדף הזה מוסבר איך להטמיע תמיכה בהזרמת אודיו לכמה מכשירי אודיו, ואיך לאמת את ההטמעה של התכונה הזו.

תמיכה בהזרמת אודיו למספר מכשירי אודיו

יש שני סטים של ממשקי API ב-Android 12 שתומכים בתכונה הזו:

  • ממשקי ה-API של המערכת מטפלים בכמה מכשירים מועדפים עבור אסטרטגיה.
  • ממשק HIDL, שהספק מיישם כחלק מ-HAL של האודיו, מדווח על יכולות המכשיר.

בקטעים הבאים נדון בכל אחד מהממשקי ה-API האלה בפירוט רב יותר.

טיפול בכמה מכשירים מועדפים באסטרטגיה

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

ב-Audio Policy Manager מוצג המושג מכשירי מדיה פעילים כדי לתאר את המכשירים שהכי סביר שייבחרו להפעלת מדיה. כשמכשיר עם חלקים ניתנים להסרה מחובר, יכול להיות שיהיה צורך לפתוח את זרמי הפלט של HAL אודיו שאפשר לנתב למכשיר הזה ולבדוק אילו מאפיינים נתמכים.

צריך לציין מכשיר אודיו כשפותחים זרם פלט. מכשיר המדיה הפעיל הוא המכשיר שבו משתמשים כשפותחים זרמי פלט בהקשר הזה.

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

  1. אם כל המכשירים המועדפים להפעלת מדיה זמינים, כולם נבחרים כמכשירים פעילים.
  2. אחרת, המכשיר הנייד האחרון שהיה מחובר ייבחר.
  3. אם לא מחוברים מכשירים ניידים, יחולו כללי מדיניות ברירת המחדל של האודיו לבחירת מכשירי פלט פעילים.

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

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

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

מנהל מדיניות האודיו מציע את רשימת ממשקי ה-API הבאה של המערכת(כפי שמוגדרים ב-AudioManager.java):

  • setPreferredDeviceForStrategy

    הגדרה של המכשיר המועדף לניתוב אודיו עבור שיטה נתונה. הערה: יכול להיות שהמכשיר לא יהיה זמין בזמן הגדרת המכשיר המועדף, אבל המערכת תשתמש בו ברגע שהוא יהיה זמין.

  • removePreferredDeviceForStrategy

    מסיר את מכשירי האודיו המועדפים שהוגדרו קודם באמצעות setPreferredDeviceForStrategy או setPreferredDevicesForStrategy.

  • getPreferredDeviceForStrategy

    הפונקציה מחזירה את המכשיר המועדף לשיטת אודיו שהוגדרה בעבר באמצעות setPreferredDeviceForStrategy או setPreferredDevicesForStrategy.

  • setPreferredDevicesForStrategy

    הגדרה של המכשירים המועדפים לשיטת בידינג מסוימת.

  • getPreferredDevicesForStrategy

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

  • OnPreferredDevicesForStrategyChangedListener

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

  • addOnPreferredDevicesForStrategyChangedListener

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

  • removeOnPreferredDevicesForStrategyChangedListener

    מסיר מאזין שנוסף קודם לשינויים במכשיר האודיו המועדף על ידי האסטרטגיה.

דיווח על יכולות המכשיר

כחלק מההטמעה של Audio HAL, הספקים מטמיעים את ממשקי ה-API שתומכים בדיווח על יכולות המכשיר. בקטע הזה מוסבר על סוגי הנתונים והשיטות שמשמשים לדיווח על יכולות המכשיר, ומפורטים כמה שינויים שבוצעו ב-audio HIDL HAL V7 כדי לתמוך בכמה מכשירים.

סוגי הנתונים

ב-audio HIDL HAL V7, יכולות המכשיר מדווחות באמצעות המבנים AudioProfile ו-AudioTransport. המבנה של AudioTransport מתאר את היכולת של יציאת אודיו עם AudioProfile לפורמטים מוכרים של אודיו, או עם מתארי חומרה גולמיים לפורמטים שלא מוכרים לפלטפורמה. המבנה AudioProfile מכיל את פורמט האודיו, את תדירויות הדגימה הנתמכות בפרופיל ואת רשימת מסכות הערוצים, כמו שמוצג בקטע הקוד הבא מתוך types.hal:

/**
* Configurations supported for a certain audio format.
*/
struct AudioProfile {
   AudioFormat format;
   /** List of the sample rates (in Hz) supported by the profile. */
   vec<uint32_t> sampleRates;
   /** List of channel masks supported by the profile. */
   vec<AudioChannelMask> channelMasks;
};

ב-audio HIDL HAL V7, סוג הנתונים AudioPort מוגדר באמצעות המבנים AudioTransport ו-AudioProfile כדי לתאר את היכולות של המכשיר.

‫methods של HAL אודיו

הכלי Audio Policy Manager משתמש בשיטות הבאות כדי לשלוח שאילתות לגבי היכולות של המכשיר:

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

הקוד הבא מתוך IDevice.hal מציג את הממשק של המתודה getAudioPort:

   /**
    * Returns the list of supported attributes for a given audio port.
    *
    * As input, 'port' contains the information (type, role, address etc...)
    * needed by the HAL to identify the port.
    *
    * As output, 'resultPort' contains possible attributes (sampling rates,
    * formats, channel masks, gain controllers...) for this port.
    *
    * @param port port identifier.
    * @return retval operation completion status.
    * @return resultPort port descriptor with all parameters filled up.
    */
   getAudioPort(AudioPort port)
           generates (Result retval, AudioPort resultPort);

שינויים ב-API מדור קודם

כדי לתמוך בכמה פרופילי אודיו, בגרסה 3.2 של Legacy API נוספה מבנה חדש שנקרא audio_port_v7. פרטים נוספים זמינים בקוד המקור.

בגלל התוספת של audio_port_v7, בגרסה 3.2 של API מדור קודם נוסף API חדש בשם get_audio_port_v7, שמאפשר לשלוח שאילתות לגבי היכולות של המכשירים באמצעות המבנה audio_port_v7.

הקוד הבא מתוך audio.h מציג את ההגדרה של get_audio_port_v7 API:

/**
 * Fills the list of supported attributes for a given audio port.
 * As input, "port" contains the information (type, role, address etc...)
 * needed by the HAL to identify the port.
 * As output, "port" contains possible attributes (sampling rates,
 * formats, channel masks, gain controllers...) for this port. The
 * possible attributes are saved as audio profiles, which contains audio
 * format and the supported sampling rates and channel masks.
 */
 int (*get_audio_port_v7)(struct audio_hw_device *dev,
                          struct audio_port_v7 *port);

אם גרסת ה-API מהדור הקודם היא מתחת ל-3.2 וגרסת ה-HIDL HAL היא 7 ומעלה, צריך לאכלס את הנתונים מ-get_audio_port API מהדור הקודם בפורמט החדש של AudioPort. במקרה כזה, נניח שכל קצבי הדגימה ומסכות הערוצים שדווחו מ-get_audio_port נתמכים בכל הפורמטים שמוחזרים, וכך אפשר לבצע מיפוי פשוט מהערכים של get_audio_port למבנה החדש של AudioPort.

הטמעות לדוגמה של API

בקטע הזה מתוארים כמה חבילות בדיקה שמכילות שיטות שמשתמשות בממשקי ה-API שמוסברים בקטעים הקודמים. בדוגמאות הבאות מוסבר איך מטמיעים ומשתמשים בממשקי ה-API האלה.

דוגמה לשימוש בממשקי המערכת setPreferredDevicesForStrategy,‏ getPreferredDevicesForStrategy, ‏ removePreferredDeviceForStrategy ו-OnPreferredDevicesForStrategyChangedListener מופיעה ב-method ‏PreferredDeviceRoutingTest, שנמצאת ב-GTS.

כדי לראות דוגמה של המבנה החדש של AudioDeviceInfo בשימוש, אפשר לעיין בשיטה AudioManagerTest#testGetDevices שנמצאת ב-CTS.

דוגמה להטמעה של get_audio_port_v7 נמצאת ב-audio_hal.c, והיא מראה איך מתבצעת שאילתה לגבי יכולות של מספר מכשירים.

אימות

בקטע הזה מפורט מידע על אימות של מנהל האודיו באמצעות CTS ו-GTS (חבילת בדיקות של שירותי Google לנייד).

בדיקות CTS

בדיקות CTS נמצאות ב-android.media.cts.AudioManagerTest.

זו רשימת הבדיקות הזמינות בכלי לניהול אודיו:

  • AudioManagerTest#testGetDevices

    מאמת את היכולות המדויקות של מכשיר השמע. בנוסף, המערכת מוודאת שפרופילי האודיו שמוחזרים במבנה AudioDeviceInfo שומרים על התוכן מהפורמט הישן של מערך שטוח, אבל הם בפורמט החדש של AudioProfile.

  • AudioManagerTest#testPreferredDevicesForStrategy וגם AudioManagerTest#testPreferredDeviceForCapturePreset

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

בדיקות GTS

בדיקות GTS נמצאות ב-com.google.android.gts.audioservice.AudioServiceHostTest.

כדי לוודא שממשקי ה-API למכשירים מועדפים עבור אסטרטגיה וקביעה מראש של לכידה פועלים בצורה תקינה, מריצים את הבדיקות AudioServiceHostTest#testPreferredDeviceRouting ו-AudioServiceHostTest#testPreferredDeviceRoutingForCapturePreset.