ניהול נפח

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

שימוש בנפחים קבועים

יישומי 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>

דוגמה למימוש car_audio_configuration.xml .

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

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

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

אודיו דאקינג

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

מתי להתכופף

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

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

התנהגות ברווז מומלצת

להלן אינטראקציות פוטנציאליות במקביל שבהן אנו ממליצים ליישם את ה-Ducking:

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

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

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

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

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

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

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

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

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

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