ניהול עוצמת הקול

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

נפחים קבועים

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

<resources>
    <!-- Car uses hardware amplifier for volume. -->
    <bool name="config_useFixedVolume">true</bool>
</resources>

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

קבוצות נפח אחסון

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

הגדרה של קבוצות נפח אחסון

CarAudioService משתמש בקבוצות של עוצמת הקול שהוגדרו ב-car_audio_configuration.xml:

<audioZoneConfiguration version="2.0">
    <zones>
        <zone name="primary zone" isPrimary="true">
            <volumeGroups>
                <group>
                    <device address="bus0_media_out">
                        <context context="music"/>
                    </device>
                </group>
                <group>
                    <device address="bus1_navigation_out">
                        <context context="navigation"/>
                    </device>
                    <device address="bus2_voice_command_out">
                        <context context="voice_command"/>
                    </device>
                </group>
                ...
            </volumeGroups>
        </zone>
     </zones>
</audioZoneConfiguration>

כל קבוצת עוצמת קול צריכה להכיל מכשיר פלט אחד או יותר עם כתובות. הכתובות צריכות להתאים למכשירי הפלט שמוגדרים ב- audio_policy_configuration.xml

הגדרת היתרונות של קבוצת נפח

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

<devicePort tagName="bus0_media_out" role="sink" type="AUDIO_DEVICE_OUT_BUS" address="bus0_media_out">
  <profile name="" format="AUDIO_FORMAT_PCM_16_BIT" samplingRates="48000" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/>
  <gains>
    <gain name="" mode="AUDIO_GAIN_MODE_JOINT"
      minValueMB="-3200" maxValueMB="600" defaultValueMB="0" stepValueMB="100"/>
  </gains>
</devicePort>

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

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

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

מזהים של קבוצות נפח אחסון

קבוצות נפח אחסון מזוהות בזמן ריצה לפי הסדר המוגדר בקובץ ה-XML. המזהים נעים בין 0 ל-N-1 בתוך אזור אודיו, כאשר N הוא מספר קבוצות נפח אחסון בתחום הזה. בשיטה הזו, המזהים של קבוצות נפח אחסון הם לא ייחודיים בתחומים שונים. המזהים האלה משמשים ל-CarAudioManager ממשקי API שמשויכים עם קבוצות נפח אחסון. כל API שמקבל groupId בלי zoneId ברירת המחדל של אזור האודיו הראשי היא אזור האודיו הראשי.

ניהול עוצמת הקול במספר אזורים

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

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

טיפול באירועים מרכזיים של עוצמת הקול

ב-Android מוגדרים כמה קודי מפתחות לבקרת עוצמת הקול, כולל:

  • KEYCODE_VOLUME_UP
  • KEYCODE_VOLUME_DOWN
  • KEYCODE_VOLUME_MUTE

כברירת מחדל, מערכת Android מפנה את האירועים המרכזיים של עוצמת הקול לאפליקציות. לכלי רכב צריכים לאלץ את האירועים המרכזיים האלה לעבד אותם CarAudioService, ואז קריאה ל-setGroupVolume או ל-setMasterMute, כמו המתאים. כדי לאלץ את ההתנהגות הזו, צריך להגדיר את סימון config_handleVolumeKeysInWindowManager ל-true:

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

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

עמעום ואיזון

שתי הגרסאות של AudioControl HAL כוללות ממשקי API להגדרת עמעום ואיזון ברכב. ממשקי ה-API של המערכת שתואמים לערכי הכרטיסים ב-CarAudioManager ל-AudioControl HAL. ממשקי ה-API האלה מחייבים android.car.permission.CAR_CONTROL_AUDIO_VOLUME ממשקי ה-API של AudioControl API הם:

  • setBalanceTowardRight(float value) מסיטה את עוצמת הקול של הרמקול לכיוון הצד הימני (+) או השמאלי (-) של הרכב.

    • הספרה 0.0 במרכז
    • +1.0 נכון לחלוטין
    • הערך 1.0- נשאר במלואו
    • ערך מחוץ לטווח של -1 עד 1 הוא שגיאה
  • setFadeTowardFront(float value) מסיטה את עוצמת הקול של הרמקול לכיוון החזית (+) או האחורית של הרכב.

    • הספרה 0.0 במרכז
    • +1.0 מועבר במלואו
    • 1.0- מוסתר במלואו אחורה
    • ערך מחוץ לטווח של -1 עד 1 הוא שגיאה

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

הנמכה של עוצמת השמע

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

מתי לוותר

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

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

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

בהמשך מפורטות המלצות אפשריות להנמכה של מספר האינטראקציות שמתרחשות בו-זמנית.

אינטראקציה פעולה
EMERGENCY סינון או השתקה של כל התוכן חוץ מ-SAFETY
SAFETY אפשר לשנות את הגודל של כל דבר חוץ מ-EMERGENCY
NAVIGATION אפשר לשנות את הגודל של כל דבר מלבד SAFETY ו-EMERGENCY
CALL אפשר לשנות את הגודל של כל דבר חוץ מ-SAFETY, EMERGENCY, ו-NAVIGATION
VOICE ברווזים CALL_RING
VEHICLE_SOUNDS אתם קובעים את החשיבות של הצליל הפעיל ואם הוא לא כזה שברווז צלילים אחרים.
MUSIC וגם ANNOUNCEMENT הכל נרתק. החריגים הם צלילי אינטראקציה במגע שמושמעים בתור SYSTEM_SOUND

שיקולים שצריך להביא בחשבון במהלך ההנמכה

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

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

צלילים קריטיים להגנה

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

קביעת ממשק המשתמש להגדרות עוצמת הקול

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

בממשק המשתמש של הגדרות הרכב, packages/apps/Car/Settings/res/xml/car_volume_items.xml מכיל את רכיבי ממשק המשתמש (משאבי כותרות וסמלים) המשויכים לכל מוגדר AudioAttributes.USAGE. הקובץ הזה מספק עיבוד סביר של VolumeGroups המוגדרים באמצעות משאבים שמשויכים השימוש המזוהה בכל VolumeGroup.

לדוגמה, הדוגמה הבאה מגדירה את הערך של VolumeGroup ככולל voice_communication וגם voice_communication_signalling ברירת המחדל של ממשק המשתמש של הגדרות הרכב מעבד את VolumeGroup באמצעות שמשויכים ל-voice_communication, כי זה המט"ק הראשון בקובץ.

<carVolumeItems xmlns:car="http://schemas.android.com/apk/res-auto">
    <item car:usage="voice_communication"
          car:title="@*android:string/volume_call"
          car:icon="@*android:drawable/ic_audio_ring_notif"/>
    <item car:usage="voice_communication_signalling"
          car:title="@*android:string/volume_call"
          car:icon="@*android:drawable/ic_audio_ring_notif"/>
    <item car:usage="media"
          car:title="@*android:string/volume_music"
          car:icon="@*android:drawable/ic_audio_media"/>
    <item car:usage="game"
          car:title="@*android:string/volume_music"
          car:icon="@*android:drawable/ic_audio_media"/>
    <item car:usage="alarm"
          car:title="@*android:string/volume_alarm"
          car:icon="@*android:drawable/ic_audio_alarm"/>
    <item car:usage="assistance_navigation_guidance"
          car:title="@string/navi_volume_title"
          car:icon="@drawable/ic_audio_navi"/>
    <item car:usage="notification_ringtone"
          car:title="@*android:string/volume_ringtone"
          car:icon="@*android:drawable/ic_audio_ring_notif"/>
    <item car:usage="assistant"
          car:title="@*android:string/volume_unknown"
          car:icon="@*android:drawable/ic_audio_vol"/>
    <item car:usage="notification"
          car:title="@*android:string/volume_notification"
          car:icon="@*android:drawable/ic_audio_ring_notif"/>
    <item car:usage="notification_communication_request"
          car:title="@*android:string/volume_notification"
          car:icon="@*android:drawable/ic_audio_ring_notif"/>
    <item car:usage="notification_communication_instant"
          car:title="@*android:string/volume_notification"
          car:icon="@*android:drawable/ic_audio_ring_notif"/>
    <item car:usage="notification_communication_delayed"
          car:title="@*android:string/volume_notification"
          car:icon="@*android:drawable/ic_audio_ring_notif"/>
    <item car:usage="notification_event"
          car:title="@*android:string/volume_notification"
          car:icon="@*android:drawable/ic_audio_ring_notif"/>
    <item car:usage="assistance_accessibility"
          car:title="@*android:string/volume_notification"
          car:icon="@*android:drawable/ic_audio_ring_notif"/>
    <item car:usage="assistance_sonification"
          car:title="@*android:string/volume_unknown"
          car:icon="@*android:drawable/ic_audio_vol"/>
    <item car:usage="unknown"
          car:title="@*android:string/volume_unknown"
          car:icon="@*android:drawable/ic_audio_vol"/>
</carVolumeItems>

המאפיינים והערכים שנעשה בהם שימוש בהגדרה שלמעלה מוצהרים ב- packages/apps/Car/Settings/res/values/attrs.xml ממשק המשתמש של הגדרות עוצמת הקול משתמש ממשקי ה-API הבאים של CarAudioManager מבוססים על VolumeGroup:

  • getVolumeGroupCount() כדי ללמוד כמה פקדים יש לצייר.
  • getGroupMinVolume() ו-getGroupMaxVolume() כדי להגיע לגבול התחתון ולגבול העליון.
  • getGroupVolume() כדי לקבל את עוצמת הקול הנוכחית.
  • registerVolumeChangeObserver() כדי לקבל התראות על שינויים בעוצמת הקול.

אירוע של קבוצת עוצמת קול של רכב

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

  • רשימה של CarVolumeGroupInfo
  • EventTypes (ממופה ביט)
  • רשימה של ExtraInfos

CarVolumeGroupInfo

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

סוגי אירועים

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

בטבלה הבאה מוצג הקשר בין EventType לבין CarVolumeGroupInfo.

סוג האירוע CarVolumeGroupInfo
EVENT_TYPE_VOLUME_GAIN_INDEX_CHANGED CarVolumeGroupInfo.getVolumeInfoIndex()
EVENT_TYPE_VOLUME_MIN_INDEX_CHANGED CarVolumeGroupInfo.getMinVolumeInsightsIndex()
EVENT_TYPE_VOLUME_MAX_INDEX_CHANGED CarVolumeGroupInfo.getMaxVolumeInsightsIndex()
EVENT_TYPE_MUTE_CHANGED CarVolumeGroupInfo.ismuted()
EVENT_TYPE_VOLUME_BLOCKED_CHANGED CarVolumeGroupInfo.isBlocked()
EVENT_TYPE_ATTENUATION_CHANGED CarVolumeGroupInfo.isAttenuated()
EVENT_TYPE_ZONE_CONFIGURATION_CHANGED CarVolumeGroupInfo.getAudioAttributes()

מידע נוסף

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

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

ה-framework של האודיו ברכב תלוי ב-AudioControl HAL IAudioGainCallback כדי מספקים את הערך המוצע ExtraInfos. מידע נוסף זמין במאמר הבא: קבלת קריאה חוזרת (callback) באודיו.

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

קריאה חוזרת (callback) של אירוע של קבוצת עוצמת קול של רכב

Android 14, מספק קריאה חוזרת (callback) חדשה לבעלי הרשאות אפליקציות פלטפורמה לרישום CarVolumeGroupEvents וקבלת הודעה על כך.

  • כדי להירשם להתקשרות חזרה, צריך להשתמש CarAudioManager#registerCarVolumeGroupEventCallback()

  • כדי לבטל את הרישום של הקריאה החוזרת, צריך להשתמש CarAudioManager#unregisterCarVolumeGroupEventCallback()

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

מומלץ מאוד להשתמש ב-CarVolumeGroupEventCallback כדי לנהל שינויים בעוצמת הקול ובהשתקה של הקבוצה.

קריאה חוזרת (callback) של אודיו

החל מ-Android 13, AudioControl HAL יכול להפעיל קריאה חוזרת (callback) אסינכרונית לניהול עדכונים ברמת עוצמת הקול עקב שינויים מערכת האודיו ברכב.

HAL API

AudioControl @2.0 AIDL

גרסה 2.0 של AudioControl AIDL HAL מוסיפה את ממשק ה-API הבא:

API המטרה
IAudioControl#registerGainCallback רושם מופע של IAudioGainCallback באמצעות AudioControl HAL.
IAudioGainCallback#onAudioDeviceGainsChanged קריאה חוזרת (callback) אסינכרונית כדי להודיע על שינויים בהגדרות של שיפור האודיו.

הקריאה החוזרת (callback) של AudioControl HAL כוללת רשימות של סיבות AudioGainConfigInfo, שכולל:

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

אפשר לסווג את הסיבות באופן כללי לפי הקטגוריות הבאות:

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

סוגי ההגבלות

נכון לתאריך AudioControl HAL AIDL V3, אלה סוגי המודעות הנתמכים הגבלות:

  • השתקה
  • חסימה
  • הגבלה
  • הפחתה
הגבלה פעילה שינוי עוצמת הקול שהופעל על ידי המשתמש מתג השתקה שהופעל על ידי המשתמש
השתקה ❌ (ביטול ההשתקה)

✔ (השתקה)
חסימה
הגבלה ❌ (חריגה מהמגבלה)

✔ (מתחת למגבלה)
הפחתה

העדיפות בין ההגבלות היא 'השתקה' > חסימה > הגבלה > הפחתה.

השתקת ההגבלות

ההגבלות על השתקה הן:

  • Reasons.TCU_MUTE
  • Reasons.REMOTE_MUTE

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

  • השתקת המשתמש. המצב הוחלף על סמך בקשה מהמשתמש, דרך CarAudioManager או אירועים מרכזיים.

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

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

כשהשתקה עם HAL מופעלת, עוצמת הקול הנכנסת משתנה והשתקה של הקבוצה תבוטל המערכת מתעלמת מבקשות במשך כל תקופת ההגבלה.

פנייה לאינטראקציה: התכונה 'השתקה עם HAL' פעילה והתכונה 'בקשות משתמשים' להחלפת המצב של 'השתקה'

כאשר השתקת HAL מופעלת והשתקת המשתמש מושבתת:

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

כאשר השתקת HAL מופעלת והשתקת משתמש מופעלת:

  • מצב ההשתקה הכולל של קבוצת עוצמת הקול השתנה ל-true.

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

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

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

תרחיש אינטראקציה: התכונה 'השתקה עם HAL' מופעלת ומושבתת בזמן שהתכונה 'השתקת המשתמש' לא משתנה

החלפת המצב של השתקה עם HAL תשנה את מצב ההשתקה הכולל בקבוצת עוצמת הקול. עם זאת, לא לעדכן ישירות את מצב ההשתקה של המשתמש. כאשר השתקת המשתמש מושבתת והשתקת משתמש עם HAL מתקבלת קריאה חוזרת (callback) להפעלה:

  • מצב ההשתקה הכולל של קבוצת עוצמת הקול השתנה ל-true.
  • בקשות מהמשתמש לשינוי עוצמת הקול יטופלו NOT בזמן השתקה עם HAL מופעלת.

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

    • הסיבה: אפליקציות עוצמת הקול יכולות להירשם להתקשרות חזרה ולהפעיל ביטול השתקה (CarAudioManager.setVolumeGroupmute(...,/* mute=*/ true,.)) באופן אוטומטי ללא התערבות המשתמש, אם זו ההתנהגות הצפויה על ידי ה-OEM.

כאשר השתקה עם HAL מושבתת, האפשרות 'השתקת המשתמש' מושבתת:

  • מצב ההשתקה של קבוצת עוצמת הקול השתנה לfalse.

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

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

חסימה

הגבלות החסימה הן:

  • Reasons.FORCED_MASTER_MUTE
  • Reasons.REMOTE_MUTE
  • Reasons.TCU_MUTE.

כשהגבלות חסימה פעילות, המשתמשים מבקשים:

  • לא מתבצע עיבוד של עוצמת הקול של השינויים.
  • מתבצע עיבוד של ההשתקה/ביטול ההשתקה.

הגבלה

הגבלות ההגבלה הן:

  • Reasons.THERMAL_LIMITATION
  • Reasons.SUSPEND_EXIT_VOL_LIMITATION

כשהגבלות ההגבלה פעילות, המשתמשים שולחים בקשות אל:

  • שינוי עוצמת הקול:

    • בתוך ההגבלה מתבצע עיבוד
    • מעל להגבלה לא מתבצעות עיבוד
  • מתבצע עיבוד של ההשתקה/ביטול ההשתקה.

הפחתה

אלו הן ההגבלות על הניכוי:

  • Reasons.ADAS_DUCKING
  • Reasons.NAV_DUCKING
  • Reasons.PROJECTION_DUCKING

כשהגבלות הכוונה פעילות, המשתמשים מבקשים:

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

  • מתבצע עיבוד של ההשתקה/ביטול ההשתקה.

עדכון לאינדקס

העדכון הזה נחשב כעדכון של אינדקס הנפח האסינכרוני: Reasons.EXTERNAL_AMP_VOL_FEEDBACK

לכן, AudioControl HAL יכול לעדכן את האינדקס הנוכחי של קבוצת עוצמת הקול. לאינדקס שצוין. הוא משמש בעיקר כמשוב ממערכת האודיו לבקשה לשינוי עוצמת הקול מהמסגרת של האודיו ברכב. עדכון האינדקס הוא תקשורת גם עם Google Apps כקריאה חוזרת של CarVolumeGroupEvent לסנכרון לאינדקס.

דוגמאות

תרחיש לדוגמה: משתמש מעדכן את אינדקס הנפח ל-30

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

  • האינדקס הזה מומר לעוצמת קול ונשלח לאודיו HAL.

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

  • מגיבה מערכת האודיו שרמת עוצמת הקול מעודכנת רק לאינדקס 15 (מסיבות שאינן ידועות ל-Android).

  • ספקי הטמעות של AudioControl HAL טריגרים:

    IAudioGainCallback.onAudioDeviceGainsChanged(EXTERNAL_AMP_VOL_FEEDBACK, {...,  15 /* New index */})
    
  • שירות האודיו של הרכב משתמש באינדקס החדש מקריאה חוזרת (callback) שמשמשת עבור עקביות וקריאות חוזרות (callback) לאפליקציית עוצמת הקול. האינדקס המבוקש על ידי המשתמש הוא 30. עם זאת, המשוב האסינכרוני של מערכת האודיו מעדכן את האינדקס ל-15.

תרחיש לדוגמה: הפעלת אודיו ראשונה אחרי יציאה מההשעיה

  • אינדקס עוצמת הקול לפני ההשעיה מוגדר לרמה גבוהה של 95 (טווח: [0-99]).

  • מערכת Android נכנסת להשעיה.

  • לאחר השעיה של Android (לדוגמה, המשך):

    • הספק Audio HAL/AudioControl HAL מחיל מדד בטוח של 30 על במערכת האודיו באופן מקומי.

    • הספק AudioControl HAL גם מפעיל את הקריאה החוזרת עבור האינדקס הבטוח:

    IAudioGainCallback.onAudioDeviceGainsChanged(SUSPEND_EXIT_VOL_LIMITATION, {...,  30 /* safe index */})
    
  • שירות האודיו של הרכב משתמש באינדקס החדש מקריאה חוזרת (callback) שמשמשת עבור עקביות והקריאות החוזרות שלה לאפליקציית הנפח שמסנכרנת את האינדקס. מדד נפח האחסון לפני ההשעיה הוא 95. אבל אחרי להמשיך, האינדקס הזה הוגדרה רמת נפח בטוחה של 30 על ידי ההטמעה של AudioControl HAL.

הגדרת עוצמת קול דינמית

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

  1. הגדרת קצה קו (EOL) של הרכב.

    • יצרני הרכב מעדיפים לעדכן את הגדרות עוצמת הקול ב-EOL על סמך הרכב הגדרת מערכת האודיו. בדרך כלל, מדובר בהתקנה ממקור לא ידוע בלי לעדכן את תמונת Android SW.

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

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

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

עיצוב

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

  • גילוי. טכנולוגיית AudioControl HAL של הספק מגלה נפח חדש מתעדכנת באמצעות מנגנון IPC מותאם אישית בבעלות הספק.

    אחרי שהתגלתה אותו, קריאה חוזרת (callback) נוצרת באמצעות AudioControl::IModuleChangeCallback

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

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

  • התקשרות חזרה.

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

    • CarVolumeGroupEvent כולל את CarVolumeGroupInfo, סוג האירוע המעודכן (מה השתנה) ומידע נוסף (למה הוא השתנה).

תמונה

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

HAL API

AudioControl @ 3.0 AIDL

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

API
IAudioControl#setModuleChangeCallback מגדירה מופע של IModuleChangeCallback עם AudioControl HAL.
IAudioControl#clearModuleChangeCallback מנקה את המופע של IModuleChangeCallback שהוגדר בעבר עם AudioControl HAL.
IModuleChangeCallback#onAudioPortsChanged התקשרות חזרה כדי להודיע על שינויים ב- AudioPorts

רצף

תרשים הרצף של תצורת הנפח הדינמי מוצג למטה.

תמונה

איור 2. תרשים רצף לתצורת נפח דינמי.

היבטים מרכזיים

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

  • יציאות האודיו שסופקו כחלק מהקריאה החוזרת חייבות להתאים ל-Automotive הגדרת BUS:

    • יציאת המכשיר. IN_DEVICE OUT_DEVICE
    • חיבור. BUS
    • כתובת. מוגדר בהגדרת אודיו HAL
    • מצב הוספה. JOINT
  • ספקים חייבים להגדיר קבוצת-על של הגדרות של טווח עוצמת קול בשדה האודיו מדיניות HAL ושימוש בקריאה חוזרת (callback) כדי להתאים אותה אישית לווריאציות של הרכב. לצפייה IModuleChangeCallbac הגדרת AIDL למידע נוסף.

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