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

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

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

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

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

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

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

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

אימות

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

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