ניתוב משולב של מכשיר אודיו

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

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

סוגי הנתונים

באודיו 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;
};

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

שיטות HAL של אודיו

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

  • 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 מציג את ההגדרה של ה-API של get_audio_port_v7:

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

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

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

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

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

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

אימות

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

בדיקות CTS

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

זוהי רשימת הבדיקות הזמינות של Audio Manager:

  • AudioManagerTest#testGetDevices

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

  • AudioManagerTest#testPreferredDevicesForStrategy וגםAudioManagerTest#testPreferredDeviceForCapturePreset

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

בדיקות GTS

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

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