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

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

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

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

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