מיקוד אודיו

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

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

ריכוז האינטראקציות

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

  • בלעדי
  • דחייה
  • בו-זמנית

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

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

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

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

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

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

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

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

טיפול בשידורים בו-זמנית

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

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

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

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

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

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

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

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

איור 1. מטריצת אינטראקציה עם התמקדות באודיו.

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

עיכוב בפוקוס האודיו

בגרסה Android 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. כשהבקשה מתעכבת, ה-Focus Listener מטפל בשינויים שנמצאים בפוקוס:

    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 בתוך Bundle:

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

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

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

AudioControl@2.0

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

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

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

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

שירות מיקוד אודיו לרכב של OEM (יצרן ציוד מקורי)

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

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

  • כל עוד מוקד המדיה פעיל:

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

    • אפליקציות שמבקשים להתמקד בשימוש בניווט צריכות לקבל גישה לניווט להתמקד בו-זמנית או רק בו-זמנית.

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

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

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