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

ניהול עוצמת הקול נמצא ב-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>

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

הדרגה ואיזון

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

  • 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 כדי לקבל החלטות לגבי השתקה הוא אם לשני מכשירי הפלט יש שידורים פעילים או לא.

מתי כדאי להתכופף

ה-HAL מטפל בהשתקה, אבל האופן שבו הוא מטפל בה תלוי ב-OEM. עם זאת, אנחנו ממליצים על ההנחיות הבאות.

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

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

צלילים קריטיים לבטיחות

ב-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. ממשק המשתמש של הגדרות עוצמת הקול משתמש ב-APIs הבאים של CarAudioManager שמבוססים על VolumeGroup:

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

אירוע קבוצתי של נפח תנועה ברכב

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

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

CarVolumeGroupInfo

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

EventTypes

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

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

EventType CarVolumeGroupInfo
EVENT_TYPE_VOLUME_GAIN_INDEX_CHANGED CarVolumeGroupInfo.getVolumeGainIndex()
EVENT_TYPE_VOLUME_MIN_INDEX_CHANGED CarVolumeGroupInfo.getMinVolumeGainIndex()
EVENT_TYPE_VOLUME_MAX_INDEX_CHANGED CarVolumeGroupInfo.getMaxVolumeGainIndex()
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()

ExtraInfos

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

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

מסגרת האודיו ברכב תלויה ב-AudioControl HAL‏ IAudioGainCallback כדי לספק את ההצעה ל-ExtraInfos. מידע נוסף זמין במאמר החזרה לשיחה (CallBack) של הגברה של אודיו.

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

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

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

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

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

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

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

קריאה חוזרת של קידום האודיו

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

HAL API

AudioControl @2.0 AIDL

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

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

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

  • מזהה אזור
  • כתובת היציאה של המכשיר
  • Volume index > index יכול להיות אינדקס מוגבל או אינדקס עדכונים.

הסיבות העיקריות לכך הן:

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

סוגי ההגבלות

נכון ל-AudioControl HAL AIDL V3, אלו סוגי ההגבלות שנתמכים:

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

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

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

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

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

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

  • Reasons.TCU_MUTE
  • Reasons.REMOTE_MUTE

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

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

  • השתקה של HAL מעבר בין המצבים מתבצע על סמך הגבלות ההשתקה שהתקבלו דרך AudioGain callback.

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

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

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

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

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

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

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

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

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

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

מקרה אינטראקציה: HAL Mute הופעל והושבת, בזמן שההשתקה של המשתמש לא השתנתה

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

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

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

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

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

דוגמאות

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

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

  • המדד הזה מומר לעוצמת קול ושולחים אותו ל-Audio HAL.

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

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

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

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

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

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

  1. הגדרה של רכב בסוף חיי הדגם (EOL).

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

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

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

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

עיצוב

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

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

    לאחר הזיהוי, המערכת תיצור שיחה חוזרת דרך AudioControl::IModuleChangeCallback.

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

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

  • Callback

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

    • השדה CarVolumeGroupEvent מכיל את CarVolumeGroupInfo המעודכן, את Event-type (מה השתנה) ואת Extra-info (למה השתנה).

תמונה

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

HAL API

AudioControl @ 3.0 AIDL

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

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

רצף

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

תמונה

איור 2. תרשים רצף להגדרת עוצמת קול דינמית.

היבטים עיקריים

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

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

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

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