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

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

סוגי הנתונים

ב-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 כדי לתאר את היכולות של המכשיר.

שיטות 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

בקטע הזה מתוארות כמה חבילות בדיקות שמכילות שיטות שמשתמשות בממשקי ה-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) של מנהל האודיו.

בדיקות 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.