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

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

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

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

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

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

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

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

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

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

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

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

  • setPreferredDeviceForStrategy

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

  • removePreferredDeviceForStrategy

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

  • getPreferredDeviceForStrategy

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

  • setPreferredDevicesForStrategy

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

  • getPreferredDevicesForStrategy

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

  • OnPreferredDevicesForStrategyChangedListener

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

  • addOnPreferredDevicesForStrategyChangedListener

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

  • 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 של ה-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);

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