ניהול נפח אחסון

ניהול עוצמת הקול כלול ב-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="4">
    </deviceConfigurations>
    <activationVolumeConfigs>
        <activationVolumeConfig name="activation_volume_on_boot_config">
            <activationVolumeConfigEntry minActivationVolumePercentage="10" maxActivationVolumePercentage="90"
            invocationType="onBoot" />
        </activationVolumeConfig>
        ...
    </activationVolumeConfigs>
    <zones>
        <zone name="primary zone" isPrimary="true">
          <zoneConfigs>
              <zoneConfig name="primary zone config 0" isDefault="true">
                <volumeGroups>
                    <group activationConfig="activation_volume_on_boot_config">
                        <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>
              </zoneConfig>
              ...
            </zoneConfigs>
        </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 APIs שמשויכים לקבוצות של נפחים. כל API שמקבל groupId בלי zoneId, כברירת מחדל, מוגדר לאזור האודיו הראשי.

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

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

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

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

ב-Android 15 נוספה שליטה במדדי קבוצות עוצמת הקול כדי לשפר את הבטיחות ואת הנוחות של המשתמשים במערכות שמע לרכב. ההגדרה הזו מתבצעת באמצעות עוצמת הקול המינימלית והמקסימלית להפעלה, שמוגדרות בהגדרות האודיו ברכב (ראו הגדרת קבוצות עוצמת קול). כדי להפעיל את התכונה הזו, צריך להגדיר את audioUseMinMaxActivationVolume ל-true ב-RRO של שירות הרכב.

אפשר להגדיר כמה רשומות של activationVolumeConfig ב-activationVolumeConfigs, כשכל אחת מהן מייצגת הגדרה שונה של הפעלה מינימלית ומקסימלית. כל activationVolumeConfig:

  • הערך של name צריך להיות ייחודי בקובץ התצורה של האודיו ברכב, כדי שאפשר יהיה להתייחס אליו בהמשך בקבוצת עוצמת הקול (group).
  • חייב להכיל רק רכיב activationVolumeConfigEntry אחד.

כל activationVolumeConfig מכיל את המאפיינים הבאים:

  • minActivationVolumePercentage (מספר שלם, 0-100, אופציונלי, ברירת מחדל: 0): מציין את נפח ההפעלה המינימלי באחוזים.
  • maxActivationVolumePercentage (מספר שלם, 0-100, אופציונלי, ברירת מחדל: 100): מציין את נפח ההפעלה המקסימלי באחוזים.
  • invocationType (מחרוזת, אופציונלי, ברירת מחדל: onPlaybackChanged): מגדיר את התנאים שבהם חלים נפח ההפעלה המינימלי והמקסימלי:

    • onBoot: מוחל רק על ההפעלה הראשונה של קבוצת עוצמת קול אחרי אתחול.
    • onSourceChanged: מוחל רק על הפעלה חדשה של תוכן עם שינוי באפליקציה או במקור של מזהה ייחודי (UID) בקבוצת עוצמת קול.
    • onPlaybackChanged: מוחל על כל הפעלה חדשה של תוכן בקבוצת עוצמת קול.

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

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

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

תמונה

איור 1. ניהול נפח ההפעלה המינימלי והמקסימלי של נתיבי נתוני אודיו פעילים.

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

  • סוג ההפעלה תואם: סוג ההפעלה של ההפעלה (שנגזר מ-Audio Manager,‏ Audio Control HAL או Telephony Manager) צריך להיות זהה לערך invocationType שצוין ב-activationVolumeConfigEntry שמשויך לקבוצת עוצמת הקול.
  • אינדקס עוצמת הקול מחוץ לטווח: אינדקס עוצמת הקול הנוכחי של קבוצת עוצמת הקול צריך להיות מחוץ לטווח המוגדר של אינדקס עוצמת הקול להפעלה. כלומר, אחד מהתנאים הבאים מתקיים:

    • האינדקס נמוך מהרווח המינימלי בנפח ההפעלה שחושב האינדקס.

      או

    • האינדקס גבוה מהאינדקס המקסימלי של נפח ההפעלה המחושב.

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

  • Minimum activation volume gain index if lower than minimum activation volume gain index

    או

  • Maximum activation volume gain index if higher than maximum activation volume gain index

בנוסף, אירוע של קבוצת עוצמת קול ברכב עם סוג האירוע EVENT_TYPE_VOLUME_GAIN_INDEX_CHANGED נשלח לכל פונקציות ה-callback הרשומות של אירועים של קבוצות עוצמת קול.

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

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

  • KEYCODE_VOLUME_UP
  • KEYCODE_VOLUME_DOWN
  • KEYCODE_VOLUME_MUTE

כברירת מחדל, מערכת Android מעבירה את האירועים של מקשי עוצמת הקול לאפליקציות. ביישומים של Automotive, צריך לאלץ את המערכת לעבד את האירועים המרכזיים האלה באמצעות 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 הם:

  • 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, אבל אנחנו ממליצים לפעול לפי ההנחיות הבאות.

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

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

אלה דוגמאות לאינטראקציות מקבילות שמומלץ להשתמש בהן בטכניקת Ducking.

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

שיקולים כשמנמיכים את עוצמת הקול

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

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

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

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

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

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

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

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

CarVolumeGroupInfo

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

EventTypes

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

בטבלה הבאה מוצג הקשר בין 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 המוצע. מידע נוסף זמין במאמר בנושא החזרת עוצמת שמע.

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

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

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

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

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

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

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

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

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

HAL API

AudioControl @2.0 AIDL

בגרסה 2.0 של AudioControl AIDL HAL נוסף ה-API הבא:

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

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

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

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

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

סוגי ההגבלות

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

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

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

✔ (לא חריגה מהמגבלה)
הנחתה

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

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

ההגבלות על השתקת המיקרופון הן:

  • Reasons.TCU_MUTE
  • Reasons.REMOTE_MUTE

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

כשההשתקה של HAL מושבתת וההשתקה של המשתמש מושבתת:

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

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

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

חסימה

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

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

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

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

מגבלה

הגבלות על מגבלות:

  • Reasons.THERMAL_LIMITATION
  • Reasons.SUSPEND_EXIT_VOL_LIMITATION

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

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

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

הנחתה

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

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

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

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

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

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

העדכון האסינכרוני של אינדקס עוצמת הקול מתבצע כך: Reasons.EXTERNAL_AMP_VOL_FEEDBACK.

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

דוגמאות

תרחיש שימוש: משתמש מעדכן את מדד עוצמת הקול ל-30

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

  • האינדקס הזה מומר לעלייה בעוצמת הקול ונשלח ל-Audio 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 */})
    
  • שירות האודיו ברכב צורך את האינדקס החדש מהקריאה החוזרת שמשמשת להתמדה, ואת הקריאות החוזרות שלו כדי לסנכרן את האינדקס עם אפליקציית עוצמת הקול. אינדקס הנפח לפני ההשעיה הוא 95. אבל אחרי ההפעלה מחדש, האינדקס הזה מוגדר לרמת עוצמת קול בטוחה של 30 על ידי AudioControl HAL המטמיע.

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

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

  1. הגדרת רכב בסוף הייצור (EOL).

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

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

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

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

עיצוב

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

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

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

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

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

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

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

    • CarVolumeGroupEvent כולל את CarVolumeGroupInfo המעודכן, Event-type (what changed) ו-Extra-info (why it changed).

תמונה

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

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

רצף

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

תמונה

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

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

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

  • ‫AudioPorts שמועברים כחלק מהקריאה החוזרת חייבים להתאים להגדרה של AutomotiveBUS:

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

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