ניתוב אודיו

ב-Android 10, car_audio_configuration.xml מחליף את car_volumes_groups.xml וגם IAudioControl.getBusForContext בקובץ התצורה החדש מוגדרת רשימת אזורים. בכל תחום יש אזור אחד לפחות קבוצות עוצמת קול למכשירים הקשורים אליהם, ולכל מכשיר יש הקשרים צריך לנתב בתוך התחום הזה. אנחנו צריכים שכל ההקשרים יהיו מיוצגים בכל תחום.

הגדרת ניתוב אודיו

קובצי מדיניות האודיו, שבדרך כלל נמצאים במחיצת הספק, מייצגים התצורה של חומרת האודיו של הלוח. כל המכשירים שיש אליהם הפניה ב- חובה להגדיר את car_audio_configuration.xml במסגרת audio_policy_configuration.xml.

הפעלה של ניתוב AAOS

כדי להשתמש בניתוב מבוסס AAOS, צריך להגדיר את סימון audioUseDynamicRouting ל-true:

<resources>
    <bool name="audioUseDynamicRouting">true</bool>
</resources>

כאשר false, ניתוב וחלק גדול של CarAudioService יושבתו מערכת ההפעלה תחזור להתנהגות ברירת המחדל של AudioService.

אזור ראשי

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

הגדרה לדוגמה

לדוגמה, לרכב יכולים להיות שני אזורים – אזור ראשי ומושב אחורי במערכת בידורית. כך אפשר להגדיר car_audio_configuration.xml היא:

<audioZoneConfiguration version="2.0">
       <zone name="primary zone" isPrimary="true">
           <volumeGroups>
               <group>
                   <device address="bus0_media_out">
                       <context context="music"/>
                       <context context="announcement"/>
                   </device>
                   <device address="bus3_call_ring_out">
                       <context context="call_ring"/>
                   </device>
                   <device address="bus6_notification_out">
                       <context context="notification"/>
                   </device>
                   <device address="bus7_system_sound_out">
                       <context context="system_sound"/>
                       <context context="emergency"/>
                       <context context="safety"/>
                       <context context="vehicle_status"/>
                   </device>
               </group>
               <group>
                   <device address="bus1_navigation_out">
                       <context context="navigation"/>
                   </device>
                   <device address="bus2_voice_command_out">
                       <context context="voice_command"/>
                   </device>
               </group>
               <group>
                   <device address="bus4_call_out">
                       <context context="call"/>
                   </device>
               </group>
               <group>
                   <device address="bus5_alarm_out">
                       <context context="alarm"/>
                   </device>
               </group>
           </volumeGroups>
       </zone>
        <zone name="rear seat zone" audioZoneId="1">
           <volumeGroups>
               <group>
                   <device address="bus100_rear_seat">
                       <context context="music"/>
                       <context context="navigation"/>
                       <context context="voice_command"/>
                       <context context="call_ring"/>
                       <context context="call"/>
                       <context context="alarm"/>
                       <context context="notification"/>
                       <context context="system_sound"/>
                       <context context="emergency"/>
                       <context context="safety"/>
                       <context context="vehicle_status"/>
                       <context context="announcement"/>
                   </device>
               </group>
           </volumeGroups>
    </zones>
</audioZoneConfiguration>

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

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

הגדרת אודיו של אזור התפוסה

ב-Android 11, הממשק car_audio_configuration.xml הורחב עוד יותר ל- מוסיפים שני שדות חדשים, audioZoneId ו-occupantZoneId. הראשון, audioZoneId, יכול לשמש לניהול טוב יותר של התחומים. לעומת זאת, אפשר להשתמש ב-occupantZoneId כדי להגדיר על סמך מזהי משתמשים מסלול.

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

<audioZoneConfiguration version="2.0">
       <zone name="primary zone" isPrimary="true" occupantZoneId="0">
         ...
       </zone>
       <zone name="rear seat zone" audioZoneId="1" occupantZoneId="1">
         ...
       </zone>
    </zones>
</audioZoneConfiguration>

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

  • הערך audioZoneId של האזור הראשי הוא תמיד אפס
  • המספרים של audioZoneId ו-occupantZoneId לא יכולים לחזור על עצמם
  • אפשר להגדיר מיפוי של audioZoneId ו-occupantZoneId רק באמצעות מיפוי אחד

ניתוב דרך UID של אפליקציה

ב-CarAudioManager נוספו סדרה של ממשקי API מוסתרים כדי לאפשר שימוש באפליקציות כדי להריץ שאילתות ולהגדיר אזורי אודיו ולהתמקד.

int[] getAudioZoneIds();
int getZoneIdForUid(int uid);
boolean setZoneIdForUid(int zoneId, int uid);
boolean clearZoneIdForUid(int uid);

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

שינוי אזורים באפליקציה

כברירת מחדל, כל ניתוב האודיו לאזור הראשי. כדי לעדכן אפליקציה כך מנותב לאזור אחר, יש להשתמש ב-CarAudioManager#setZoneIdForUid:

// Find zone to play
int zoneId = ...

// Find application's uid
Int uid = mContext.getPackageManager()
        .getApplicationInfo(mContext.getPackageName(), 0)
        .uid;

if (mCarAudioManager.setZoneIdForUid(zoneId, info.uid)) {
    Log.d(TAG, "Zone successfully updated");
} else {
    Log.d(TAG, "Failed to change zone");
}

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

ניתוב לפי User ID

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

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

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

ניתוב עם setPreferredDevice

בנוסף לשינויים שלמעלה, ב-Android 11 יש גם ממשק API חדש לשליחת שאילתות לגבי מכשירי פלט שמשויך לכל תחום, CarAudioManager#getOutputDeviceForUsage(int zoneId, שימוש פנימי).

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

audioZoneId = ... ;
mediaDeviceInfo = mCarAudioManager
            .getOutputDeviceForUsage(audioZoneId, AudioAttributes.USAGE_MEDIA);
…
mPlayer.setPreferredDevice(mediaDeviceInfo);