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

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

איור 1 מציג סקירה כללית של ארכיטקטורת שירות האודיו ברכב, שבה שירות האודיו ברכב קורא את קובץ ההגדרה של האודיו ברכב כדי להגדיר את האודיו במכשיר.

סקירה כללית על ארכיטקטורת האודיו ברכב

איור 1. סקירה כללית של ארכיטקטורת שמע ברכב.

ממקמים את קובץ ההגדרה של מערכת השמע ברכב ב-vendor/etc/ או ב-system/etc/ במכשיר, כאשר vendor/etc/ הוא המקום הראשון שבו שירות מערכת השמע ברכב מחפש את הקובץ. שירותי האודיו ברכב קוראים את car_audio_configuration.xml כדי לקבוע את הגדרות האודיו.

אזורי אודיו ברכב:

  • כל אזור שמע מכיל מזהה ייחודי של אזור שמע.
  • אפשר למפות כל אזור אודיו לאזור תפוסה.
  • הפעולות שקשורות לאודיו בכל אזור לא תלויות זו בזו:

    • מיקוד אודיו
    • ניתוב אודיו
    • הנמכה של עוצמת השמע
  • קבוצות עוצמת הקול ברכב:

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

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

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

הקשרים של אודיו

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

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

CarAudioContext מאפיינים משויכים
MUSIC UNKNOWN
GAME
MEDIA
NAVIGATION ASSISTANCE_NAVIGATION_GUIDANCE
VOICE_COMMAND ASSISTANT
ASSISTANCE_ACCESSIBILITY
CALL_RING NOTIFICATION_RINGTONE
CALL VOICE_COMMUNICATION
VOICE_COMMUNICATION_SIGNALING
ALARM ALARM
NOTIFICATION NOTIFICATION
NOTIFICATION_*
SYSTEM_SOUND ASSISTANCE_SONIFICATION
EMERGENCY EMERGENCY
SAFETY SAFETY
VEHICLE_STATUS VEHICLE_STATUS
ANNOUNCEMENT ANNOUNCEMENT

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

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

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

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

מנוע מדיניות אודיו שניתן להגדרה

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

אפשר להפעיל את מנוע המדיניות של אודיו שניתן להגדרה (CAP) באמצעות התגים useCoreAudioVolume ו-useCoreAudioRouting. פרטים נוספים זמינים במאמר מנוע המדיניות של אודיו שניתן להגדרה.

אזור ראשי

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

דוגמה להגדרה (גרסה 2)

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

<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>
               </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>
               <group>
                   <device address="bus7_system_sound_out">
                       <context context="system_sound"/>
                       <context context="emergency"/>
                       <context context="safety"/>
                       <context context="vehicle_status"/>
                   </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 כדי להחיל אותן על הפלט של המכשירים האלה.

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

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

הגדרת קבוצת נפחים למנוע CAP

כדי להשתמש בניהול עוצמת הקול דרך מנוע ה-CAP כמו שצוין במנוע מדיניות אודיו שניתן להגדרה, הגדרת קבוצת עוצמת הקול צריכה לכלול גם שם:


<group name="media">
  <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>
</group>
<group name="navigation">
  <device address="bus1_navigation_out">
    <context context="navigation"/>
  </device>
  <device address="bus2_voice_command_out">
    <context context="voice_command"/>
  </device>
</group>

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

הגדרת אודיו באזור הנוסעים

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

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

<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 של האזור הראשי הוא תמיד מזהה PRIMARY_AUDIO_ZONE. אם מוגדר isPrimary="true", לא צריך להגדיר את audioZoneId.

  • אי אפשר לחזור על המספרים audioZoneId ו-occupantZoneId.

  • audioZoneId ו-occupantZoneId יכולים להיות ממופים רק אחד לאחד.

הגדרת האודיו ברכב ב-Android 14

ב-Android 14, ‏ AAOS הציגה את שירות הפלאגין של יצרן הציוד המקורי (OEM), שמאפשר לכם לנהל את התנהגות האודיו בפיקוח של שירות האודיו ברכב. בנוסף לשירותי הפלאגין החדשים, השינויים הבאים נוספו לקובץ ההגדרה של האודיו ברכב:

  • הקשר של אודיו ברכב שמוגדר על ידי ה-OEM
  • הגדרות דינמיות של אזורים שאינם ראשיים

הקשר של אודיו ברכב שמוגדר על ידי ה-OEM

כדי להפעיל הגדרת אודיו גמישה, ב-Android 14, שירות האודיו לרכב מאפשר לקבץ את השימושים באודיו בצורה שונה מההקשרים הסטטיים של האודיו שמוגדרים. אפשר להגדיר את ההקשר הזה שמוגדר על ידי OEM בקובץ car_audio_configuration.xml גרסה 3.

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

בכל הקשר OEM נדרש name ורשימה של מאפייני אודיו שימוש שמוקצים להקשר. בדוגמה שצוינה קודם, מוגדרים שני הקשרים:

<carAudioConfiguration version="3">
    <oemContexts>
        <oemContext name="media">
            <audioAttributes>
                <usage value="AUDIO_USAGE_MEDIA" />
    <usage value="AUDIO_USAGE_UNKNOWN"/>
            </audioAttributes>
        </oemContext>
        <oemContext name="game">
            <audioAttributes>
                <usage value="AUDIO_USAGE_GAME" />
            </audioAttributes>
        </oemContext>
...
  • ההקשר media מכיל את AUDIO_USAGE_MEDIA ואת AUDIO_USAGE_UNKNOWN
  • ההקשר game מכיל רק AUDIO_USAGE_GAME

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

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

  • לא לחזור על שמות של הקשרים.

  • אל תקצו את השימוש במאפיין האודיו לכמה הקשרים.

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

למעשה, צריך להשתמש בייצוג המחרוזת של השימוש באודיו להגדרת הקשר האודיו של ה-OEM.android.audio.policy.configuration.V7_0.AudioUsage בעתיד, שימושים חדשים במאפייני אודיו יוקצו להקשר המתאים ביותר כדי לצמצם את השגיאות במהלך המעבר מגרסה אחת של Android לגרסה אחרת.

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

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

  • מאפיין האודיו של בקרת עוצמת הקול משמש לקביעת ההתאמה הטובה ביותר:

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

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

    • המאפיין Audio משמש למיפוי ההקשר הסטטי המתאים להנמכת עוצמת הקול, על סמך מטריצת הנמכת עוצמת הקול הסטטית.

אסטרטגיות של מוצרים במנוע CAP

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

מידע נוסף זמין באסטרטגיית המוצר של מנוע CAP ב-AAOS.

הגדרות של אזורי אודיו דינמיים

ב-Android 14, כדי להתאים להגדרה של אזורי שמע דינמיים, סכמת ההגדרה של מערכת השמע ברכב להגדרת אזורי שמע עודכנה גם היא לגרסה 3. בסכימה החדשה צריך להגדיר הגדרה לכל אזור.

<carAudioConfiguration version="3">
    <!-- optional OEM context -->
    <oemContexts>
      <oemContext name="media">
        <audioAttributes>
          <usage value="AUDIO_USAGE_MEDIA" />
          <usage value="AUDIO_USAGE_UNKNOWN"/>
        </audioAttributes>
      </oemContext>
      <oemContext name="game">
        <audioAttributes>
          <usage value="AUDIO_USAGE_GAME" />
        </audioAttributes>
      </oemContext>
...
    </oemContexts>
  <zones>
    <zone name="primary zone" isPrimary="true" occupantZoneId="0">
      <zoneConfigs>
        <zoneConfig name="primary zone config 0" isDefault="true">
          <volumeGroups>
            <group>
              <device address="bus0_media_out">
                <context context="media"/>
            <context context="game"/>
                <context context="announcement"/>
              </device>
              <device address="bus6_notification_out">
                <context context="notification"/>
              </device>
            </group>
  ...
      </zoneConfigs>
    </zone
  </zones>

מידע נוסף זמין בקובץ גרסה 3 שמוגדר בdevice/generic/car/emulator/audio/car_audio_configuration.xml. החל מ-Android 14, לאזור הראשי יכולה להיות רק הגדרה אחת. באזורים שאינם ראשיים יכולות להיות כמה הגדרות. הכללים הבאים חלים על הגדרות של אודיו ברכב:

  • לאזור השמע הראשי יכולה להיות רק הגדרה אחת.

  • לאזורי אודיו לא ראשיים יכולות להיות כמה הגדרות.

  • השם חייב להיות ייחודי לכל אזור שמע ולכל הגדרה של אזור שמע.

  • בתוך אזור אודיו, יכול להיות שיהיו הבדלים בהגדרות האודיו:

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

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

  • צריך להקצות את כל ההקשרים של האודיו (OEM או סטטי) לכל הגדרת אודיו.

תאימות קדימה

למרות שבגרסאות החדשות של car_audio_configuration.xml נוספים תכונות חדשות בכל עדכון, עדיין אפשר להשתמש בקבצים ישנים בגרסאות חדשות יותר של AAOS. יצרני ציוד מקורי (OEM) שמעדכנים לגרסאות חדשות של Android יכולים לעשות שימוש חוזר בקובץ car_audio_configuration.xml.

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