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