מיקוד אודיו

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

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

התמקד באינטראקציות

כדי לתמוך ב-AAOS, בקשות מיקוד אודיו מטופלות בהתבסס על אינטראקציות מוגדרות מראש בין CarAudioContext של הבקשה לזה של מחזיקי המיקוד הנוכחיים. ישנם שלושה סוגים של אינטראקציות:

  • בִּלעָדִי
  • לִדחוֹת
  • במקביל

אינטראקציה בלעדית

זהו מודל האינטראקציה הנפוץ ביותר עם אנדרואיד.

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

דחה אינטראקציה

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

אינטראקציה במקביל

ייחודיות ל-AAOS הן אינטראקציות במקביל . זה נותן לאפליקציות המבקשות מיקוד שמע במכונית את היכולת להחזיק פוקוס במקביל לאפליקציות אחרות. כדי שתתקיים אינטראקציה במקביל, יש לעמוד בתנאים הבאים. ה:

אם הקריטריונים הללו מתקיימים, בקשת המיקוד חוזרת עם AUDIOFOCUS_REQUEST_GRANTED בעוד שלבעל המיקוד הנוכחי אין שינוי בפוקוס. עם זאת, אם מחזיק הפוקוס הנוכחי בוחר לקבל אירועי ברווז או להשהות כשהוא נמחק, מחזיק הפוקוס הנוכחי מאבד את המיקוד, כפי שקורה עם אינטראקציה בלעדית.

טיפול בזרמים במקביל

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

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

לדוגמה, כאשר הניווט והמדיה מועברים בו-זמנית, הרווח עבור זרם המדיה יכול להיות מופחת באופן זמני (או לבטל) כך שניתן לשמוע את הוראות הניווט בצורה ברורה יותר. לחלופין, זרם הניווט יכול להיות מנותב לרמקולים בצד הנהג, בעוד שהמדיה ממשיכה להתנגן בכל שאר תא הנוסעים.

מטריצת אינטראקציה

הטבלה שלהלן מציגה את מטריצת האינטראקציה כפי שהוגדרה על ידי CarAudioService . כל שורה מייצגת את CarAudioContext של בעל המיקוד הנוכחי וכל עמודה מייצגת את זה של הבקשה הנכנסת.

לדוגמה, כאשר אפליקציית מדיה מוזיקה מחזיקה בפוקוס כשאפליקציית ניווט מבקשת מיקוד, המטריצה ​​מציינת ששתי האינטראקציות יכולות להתנגן במקביל, בהנחה שהקריטריונים האחרים לאינטראקציות במקביל מתקיימים.

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

מטריצת אינטראקציה של מיקוד אודיו

איור 1. מטריצת אינטראקציה של מיקוד שמע.

באנדרואיד 11, הוצגה הגדרת משתמש חדשה כדי לאפשר למשתמשים לשנות את התנהגות האינטראקציה בין ניווט לשיחות טלפון. כאשר מוגדר, android.car.KEY_AUDIO_FOCUS_NAVIGATION_REJECTED_DURING_CALL משנה את האינטראקציה בין בקשות מיקוד נכנסות NAVIGATION לבין בעלי מיקוד CALL נוכחיים ממקביל לדחייה . אם משתמש מעדיף שהוראות ניווט לא יפריעו לשיחה, הוא יכול להפעיל את ההגדרה. זה נמשך עבור המשתמש, וניתן להגדיר אותו באופן דינמי כך שבקשות המיקוד הבאות יכבדו את ההגדרה החדשה.

מיקוד שמע ניתן לדחייה

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

כללים לבקשות מיקוד אודיו מושהות

  • בקשות שאינן חולפות בלבד. בקשה מושהית יכולה להתבצע רק עבור מקורות שאינם חולפים על מנת למנוע השמעת צליל חולף זמן רב לאחר שהוא רלוונטי.

  • ניתן לדחות רק בקשה אחת בכל פעם. אם נשלחת בקשה ניתנת לדחיה בזמן שכבר יש בקשה מושהית, הבקשה המושהית המקורית מקבלת אירוע שינוי AUDIOFOCUS_LOSS והבקשה החדשה מקבלת תגובה סינכרונית של AUDIOFOCUS_REQUEST_DELAYED .

  • לבקשות הניתנות לדחיה חייבות להיות OnAudioFocusChangeListener ברגע שהבקשה מתעכבת, המאזין משמש כדי להודיע ​​למבקש כאשר הבקשה תתקבל בסופו של דבר ( AUDIOFOCUS_GAIN ), או אם היא נדחתה מאוחר יותר ( AUDIOFOCUS_LOSS ).

בקש מיקוד שניתן לדחייה

כדי לבנות בקשה שיכולה להתעכב:

  1. השתמש AudioFocusRequest.Builder#setAcceptsDelayedFocusGain .

    mMediaWithDelayedFocusListener = new MediaWithDelayedFocusListener();
    
    mDelayedFocusRequest = new AudioFocusRequest
         .Builder(AudioManager.AUDIOFOCUS_GAIN)
         .setAudioAttributes(mMusicAudioAttrib)
         .setOnAudioFocusChangeListener(mMediaWithDelayedFocusListener)
         .setForceDucking(false)
         .setWillPauseWhenDucked(false)
         .setAcceptsDelayedFocusGain(true)
         .build();
    
  2. בעת הגשת הבקשה, טפל בתגובה AUDIOFOCUS_REQUEST_DELAYED :

    int delayedFocusRequestResults = mAudioManager.requestAudioFocus(mDelayedFocusRequest);
    if (delayedFocusRequestResults == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {
        // start audio playback
        return;
    }
    if (delayedFocusRequestResults == AudioManager.AUDIOFOCUS_REQUEST_DELAYED) {
         // audio playback delayed to audio focus listener
         return;
    }
    
  3. כאשר הבקשה מתעכבת, מאזין המיקוד מטפל בשינויים במיקוד:

    private final class MediaWithDelayedFocusListener implements
    OnAudioFocusChangeListener {
           @Override
           public void onAudioFocusChange(int focusChange) {
               synchronized (mLock) {
                   switch (focusChange) {
                       case AudioManager.AUDIOFOCUS_GAIN:
                           … // Start focus playback
                       case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT:
                           … // Pause media transiently
                       case AudioManager.AUDIOFOCUS_LOSS:
                           … // Stop media
    

ניהול מיקוד רב אזורי

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

עבור כל האפליקציות, CarAudioService מנהל את המיקוד באופן אוטומטי. אזור השמע של בקשת מיקוד נקבע על ידי UserId או UID המשויכים לה (לפרטים, ראה ניתוב אודיו ).

בקש אודיו ממספר אזורים בו זמנית

אם אפליקציה רוצה להשמיע אודיו במספר אזורים במקביל, עליה לבקש מיקוד עבור כל אזור על ידי הכללת AUDIOFOCUS_EXTRA_REQUEST_ZONE_ID בחבילה:

//Create attribute with bundle and AUDIOFOCUS_EXTRA_REQUEST_ZONE_ID
Bundle bundle = new Bundle();
bundle.putInt(CarAudioManager.AUDIOFOCUS_EXTRA_REQUEST_ZONE_ID,
               zoneId);

AudioAttributes attributesWithZone = new AudioAttributes.Builder()
     .setUsage(AudioAttributes.USAGE_MEDIA)
     .addBundle(bundle)
     .build();

//Create focus request using built attributesWithZone

פרמטר חבילה זה מאפשר למבקש לעקוף את מיפוי אזורי האודיו האוטומטיים כדי להשתמש במקום זאת במזהה האזור שצוין. לכן, אפליקציה יכולה להוציא בקשות נפרדות עבור אזורי שמע שונים.

מיקוד שמע HAL

החל באנדרואיד 11, ה-HAL מאפשר לבקש התמקדות בשם זרמים חיצוניים. אמנם אופציונלי, השימוש בממשקי API אלה מומלץ מאוד כדי לאפשר לצלילים חיצוניים להיות משתתפים אופטימליים במערכת האקולוגית של אנדרואיד ולספק חווית משתמש חלקה.

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

ה-HAL צריך להשתיק באופן יזום זרמי אנדרואיד לפי הצורך בעת השמעת צלילים חירום או בטיחות קריטיים כדי להבטיח שהם נשמעים בבירור.

AudioControl@2.0

גרסה 2.0 של AudioControl HAL מציגה את ממשקי ה-API החדשים הבאים:

ממשק API מַטָרָה
IAudioControl#registerFocusListener רושם מופע של IFocusListener עם AudioControl HAL. מאזין זה מאפשר ל-HAL לבקש ולנטוש מיקוד שמע. ה- HAl מספק מופע ICloseHandle שישמש את אנדרואיד לביטול רישום המאזין.
IAudioControl#onAudioFocusChange מודיע ל-HAL על שינויים בסטטוס לבקשות המיקוד שבוצעו על-ידי ה-HAL דרך IFocusListener , כולל תגובות לבקשות מיקוד ראשוניות.
IFocusListener#requestAudioFocus מבקש התמקדות בשם ה-HAL עבור שימוש מוגדר, מזהה אזור וסוג רווח מיקוד.
IFocusListener#abandonAudioFocus נוטש בקשות מיקוד קיימות של HAL עבור השימוש שצוין ומזהה אזור.

ל-HAL יכולות להיות בקשות מיקוד מרובות בו-זמנית, אך היא מוגבלת לבקשה אחת לכל שימוש והתאמה של אזור מזהה. אנדרואיד מניח שה-HAL מתחיל מיד להשמיע צלילים לשימוש לאחר שהוגשה בקשה וממשיך לעשות זאת עד שהוא נוטש את המיקוד.

מלבד registerFocusListener , בקשות אלו הן oneway להבטיח ש-Android לא יעכב את ה-HAL בזמן שבקשת מיקוד מעובדת. ה-HAL לא צריך לחכות כדי להשיג מיקוד לפני השמעת צלילים קריטיים לבטיחות. זה אופציונלי עבור ה-HAL להקשיב ולהגיב לשינויים במיקוד האודיו באמצעות IAudioControl#onAudioFocusChange .

שירות מיקוד שמע לרכב OEM

באנדרואיד 14, AAOS הציגה את שירותי הפלאגין של OEM לרכב כדי לאפשר הגדרה עבור חלק ממרכיבי הרכב. עבור Car Audio Plugin Service , שירות הפלאגין מאפשר ליצרני ציוד מקורי לנהל בקשות מיקוד שיירטו על ידי שירות האודיו לרכב. זה נותן ליצרני ציוד מקורי גמישות רבה יותר במונחים של ניהול המיקוד כנדרש על פי כללים ותקנות. ככזה, אינטראקציה של מיקוד אודיו עשויה להיות שונה בין יצרנים, ומאזור לאזור. הנחת היסוד לפוקוס אודיו עדיין מתקיימת, שאפליקציות עדיין צריכות לבקש מיקוד לניהול טוב יותר של אודיו כדי לשפר את חווית המשתמש. באופן כללי, כללים מסוימים עדיין חלים על בקשת מיקוד אודיו על ידי אפליקציות:

  • ללא כל עמידה, מיקוד אודיו בעדיפות גבוהה (כולל שיחת טלפון, התראת חירום או הודעת בטיחות) אפליקציות אמורות להיות מסוגלות להשיג מיקוד אודיו באופן חולף או קבוע.

  • בעוד מיקוד תקשורתי פעיל:

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

    • אפליקציות המבקשות מיקוד שימוש בניווט צריכות להיות מסוגלות לקבל מיקוד ניווט במקביל או באופן בלעדי.

    • אפליקציות המבקשות מיקוד שימוש עוזר צריכות להיות מסוגלות לקבל מיקוד שימוש במקביל או באופן בלעדי.

  • בעוד שאפליקציות מיקוד אודיו עומדות בעדיפות גבוהה (כולל שיחת טלפון, התראת חירום או התראת בטיחות) פעילות, יש להיענות או לדחות כל בקשה נכנסת למיקוד אודיו מושהה לפי הצורך.

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