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

ניהול עוצמת הקול כלול ב-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 הוא מספר הקבוצות של עוצמת הקול בתחום הזה. באופן הזה, המזהים של קבוצות נפח אחסון לא ייחודיים בכל התחומים. המזהים האלה משמשים לממשקי API של CarAudioManager שמשויכים לקבוצות נפח אחסון. כל 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>

לאירועים מרכזיים של עוצמת קול כרגע אין דרך להבחין לאיזה תחום (zone) הם מיועדים, וסביר להניח שכולם משויכים לאזור האודיו הראשי. כשמתקבל אירוע מרכזי של עוצמת קול, 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 עושים זאת לפני שמזינים רווחים. לכן, כל שידור (ducking) שצריך להגדיר בו-זמנית כשמפעילים אותו בו-זמנית עם מכשיר אחר צריך לנתב כל שידור בנפרד, כדי שה-HAL יוכל להחיל את ההנמכה (ducking) לפני השילוב ביניהם.

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

אינטראקציה פעולה
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, כי זה ה-matc הראשון בקובץ.

<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 הבאים מבוססי-VolumeGroup של CarAudioManager:

  • 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.getMinVolumeValueIndex()
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.

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

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

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

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

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

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

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, אלו הם סוגי ההגבלות הנתמכות:

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

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

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

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

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

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

  • Reasons.TCU_MUTE
  • Reasons.REMOTE_MUTE

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • מצב ההשתקה הכולל של קבוצת עוצמת הקול השתנה ל-true.
  • בקשות מהמשתמש לשינוי עוצמת הקול יעובדו ב-NOT כאשר השתקה עם HAL מופעלת.

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

    • הסיבה: אפליקציות עוצמת הקול יכולות להירשם לשיחות חוזרות ולהפעיל ביטול השתקה (CarAudioManager.setVolumeGroupTimeout(...,/* 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 יכול לעדכן את האינדקס הנוכחי של קבוצת עוצמת הקול לאינדקס שצוין. הוא משמש בעיקר כמשוב ממערכת האודיו לבקשת שינוי עוצמת הקול מ-framework של האודיו ברכב. עדכון האינדקס מופיע גם עם Google Apps כקריאה חוזרת (callback) של CarVolumeGroupEvent כדי לסנכרן את האינדקס.

דוגמאות

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

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

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

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

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

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

    IAudioGainCallback.onAudioDeviceGainsChanged(EXTERNAL_AMP_VOL_FEEDBACK, {...,  15 /* New index */})
    
  • שירות האודיו ברכב משתמש באינדקס החדש מקריאה חוזרת (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) שמשמש להתמדה וקריאות חוזרות (callback) שלו לאפליקציית עוצמת הקול שמסנכרנת את האינדקס. מדד נפח האחסון לפני ההשעיה הוא 95. עם זאת, אחרי שממשיכים, האינדקס הזה מוגדר לנפח אחסון בטוח של 30 על ידי המטמיע AudioControl HAL.

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

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

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

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

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

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

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

עיצוב

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

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

    אחרי הזיהוי, נוצרת קריאה חוזרת דרך AudioControl::IModuleChangeCallback.

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

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

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

    • אחרי עדכון הטווח של קבוצת עוצמת הקול, מקבץ האודיו ברכב מפעיל קריאה חוזרת לאפליקציות שנרשמו דרך 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. תרשים רצף לתצורת נפח דינמי.

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

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

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

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

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