ניהול נפח

ניהול עוצמת הקול כלול ב- 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 . למידע נוסף, עיין בדוגמה לעיל בהגדרת קבוצות נפח .

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

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

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

  • KEYCODE_VOLUME_UP
  • KEYCODE_VOLUME_DOWN
  • KEYCODE_VOLUME_MUTE

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

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

אודיו דאקינג

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

מתי להתכופף

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

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

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

להלן אינטראקציות פוטנציאליות במקביל, מומלץ להתכונן.

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

שיקולים בעת ברווז

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

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

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

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

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

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 נוסף לאנדרואיד 14. כל אירוע נושא שלושה סוגים קריטיים של מידע:

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

CarVolumeGroupInfo

למקבל ההתקשרות חזרה לאירוע יש גישה מוכנה לרשימת מידע קבוצת נפח המכונית המושפעת. המשמעות היא שהאפליקציה לא צריכה לבצע שיחות נוספות למסגרת האודיו של המכונית כדי לקבל את המצב העדכני ביותר. זה יכול פשוט להשתמש במידע CarVolumeGroupInfos שהתקבל to update the UI or internal states. To make it easier for apps, the aspects that changed in a car volume group are also provided as part of EventTypes`, כפי שיוסבר להלן.

EventTypes

מגדיר איזה היבט של CarVolumeGroupInfo השתנה. אפליקציות יכולות להשתמש בזה כדי לזהות שינויים ולנקוט את הפעולות הנדרשות. לדוגמה, EVENT_TYPE_VOLUME_MAX_INDEX_CHANGED מציין שמדד CarVolumeGroups' maximum volume gain index has changed and can be queried by CarVolumeGroupInfo.getMaxVolumeGainIndex()`.

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

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

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

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

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

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

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

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

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

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

API של HAL

AudioControl @2.0 AIDL

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

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

ההתקשרות חזרה של 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 להשתקת כדי להפעיל:

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

דוגמאות

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

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

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

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

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

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

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

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

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

  • אנדרואיד נכנס להשעיה.

  • ברגע ש-Android קיים השעיה (לדוגמה, המשך):

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

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

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

תצורת נפח דינמית

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

  1. תצורת רכב קצה קו (EOL).

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

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

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

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

לְעַצֵב

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

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

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

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

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

  • התקשר חזרה.

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

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

תמונה

איור 1. תצורת נפח דינמית.

API של HAL

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
    • כתובת. מוגדר בהגדרת Audio HAL
    • מצב רווח. JOINT
  • על הספקים להגדיר מערך-על של הגדרות טווח נפח במדיניות Audio HAL ולהשתמש בהתקשרות חוזרת כדי להתאים אותה עבור גרסאות רכב. עיין בהגדרת IModuleChangeCallbac AIDL למידע נוסף.

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