ניהול עוצמת הקול כלול ב-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 הוא מספר קבוצות עוצמת הקול באותו אזור. בדרך הזו, מזהי קבוצות הנפחים לא ייחודיים בין אזורים. המזהים האלה משמשים ל-API של CarAudioManager שמשויכים לקבוצות של נפחים. כל 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שמשויך לקבוצת עוצמת הקול. אינדקס עוצמת הקול מחוץ לטווח: אינדקס עוצמת הקול הנוכחי של קבוצת עוצמת הקול צריך להיות מחוץ לטווח המוגדר של אינדקס עוצמת הקול להפעלה. כלומר, אחד מהתנאים הבאים מתקיים:
האינדקס נמוך מהנפח המינימלי של ההפעלה שחושב index.
או
האינדקס גבוה מהאינדקס המקסימלי של נפח ההפעלה המחושב.
אם יש התאמה להפעלה, מדד העלייה בעוצמת הקול של קבוצת עוצמת הקול ישתנה לאחת מהאפשרויות הבאות:
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_UPKEYCODE_VOLUME_DOWNKEYCODE_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 כדי לקבל החלטות לגבי הנמכה הוא אם לשני מכשירי פלט יש זרמים פעילים.
מתי להתכופף
יצרן ציוד מקורי (OEM) הוא זה שקובע איך שכפול מטופל על ידי HAL, אבל אנחנו ממליצים לפעול לפי ההנחיות הבאות.
הפעלת כמה זרמים ב-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.
|
שיקולים כשמתכופפים
אפליקציות ושירותים מסוימים, כמו ניווט או עוזר דיגיטלי, עשויים להשתמש בכמה נגנים כדי לבצע פעולות. כדי לוודא שהמדיה לא תחזור לעוצמת הקול המלאה לפני שהיא תונמך לפני תחילת ההפעלה הבאה מהניווט או מאפליקציית העוזר הדיגיטלי, מומלץ להימנע מהנמכה אגרסיבית של עוצמת הקול כשזרם הנתונים מפסיק לזרום דרך מכשירי הפלט.
ברכבים עם כמה במות סאונד עם בידוד טוב מספיק, אפשר לנתב את האודיו לאזורים שונים ברכב במקום להנמיך אותו. לדוגמה, אפשר להעביר את הוראות הניווט לרמקולים במשענת הראש של הנהג, ולהמשיך להשמיע מוזיקה בכל תא הנוסעים בעוצמת קול רגילה.
צלילים שקשורים לבטיחות
ב-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. ממשק המשתמש של הגדרות עוצמת הקול משתמש בממשקי ה-API הבאים של CarAudioManager שמבוססים על VolumeGroup:
-
getVolumeGroupCount()כדי לדעת כמה אמצעי בקרה צריך לצייר. -
getGroupMinVolume()ו-getGroupMaxVolume()כדי לקבל את הגבולות התחתון והעליון. -
getGroupVolume()כדי לקבל את עוצמת הקול הנוכחית. registerVolumeChangeObserver()כדי לקבל הודעה על שינויים בעוצמת הקול.
אירוע של קבוצת עוצמת הקול במכונית
תרחישי שימוש ברכב של עדכון עוצמת הקול וההחלפה בין השתקה לביטול השתקה מבוססים על הקשר, שיכול להגדיר את הפעולות של אפליקציות מסוימות, כמו הגדרות עוצמת הקול. ההחזרה (callback) של עוצמת הקול הנוכחית וההשתקה ממערך האודיו של הרכב מספקת מידע הקשרי מוגבל. כדי לתת מענה טוב יותר לתרחישי שימוש ברכב ולשפר את יכולת ההתאמה לשינויים בעתיד, נוסף ל-Android 14 CarVolumeGroupEvent. כל אירוע כולל שלושה סוגים קריטיים של מידע:
- רשימה של
CarVolumeGroupInfo -
EventTypes(bit-mapped) - רשימה של
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, אפשר גם להחליש את עוצמת הקול בהדרגה בממשק המשתמש כדי למנוע מהמשתמש לשנות את עוצמת הקול.
אחרים יכולים לבחור להציג הודעה קופצת שבה מוצג שההנמכה פעילה, ולאפשר למשתמש לשנות את עוצמת הקול.
מסגרת האודיו ברכב תלויה ב-HAL של AudioControl 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_MUTEReasons.REMOTE_MUTE
במסגרת האודיו של הרכב יש שני מצבי השתקה:
השתקת משתמשים ההגדרה מופעלת או מושבתת לפי בקשה מהמשתמש, דרך
CarAudioManagerאו אירועים מרכזיים.השתקה של HAL. ההגדרה משתנה בהתאם להגבלות ההשתקה שמתקבלות דרך
AudioGaincallback.
עבור מאזינים כמו אפליקציית ההגדרות, מצב ההשתקה הכולל של קבוצת עוצמת הקול (CarVolumeGroupInfo.isMuted()) יתבסס על ההגדרה של אחת מההשתקות שלמעלה.
כשההשתקה של HAL מופעלת, כל הבקשות לשינוי עוצמת הקול ולביטול ההשתקה של הקבוצה מושבתות למשך ההגבלה.
מקרה אינטראקציה: ההשתקה של HAL פעילה והמשתמש מבקש להפעיל או להשבית את ההשתקה
כשההשתקה של HAL מופעלת וההשתקה של המשתמש מושבתת:
- מצב ההשתקה הכולל של קבוצת עוצמת הקול השתנה ל-
true. - בקשות של משתמשים להפעלת השתקה יטופלו.
- הסיבה: כדי לשמור על פרטיות המשתמשים, צריך לכבד תמיד את בקשות ההשתקה של המשתמשים.
כשההשתקה של HAL מופעלת וההשתקה של המשתמש מופעלת:
מצב ההשתקה הכולל של קבוצת עוצמת הקול השתנה ל-
true.בקשות של משתמשים להשבית את ההשתקה יטופלו.
NOTמצב ההשתקה של המשתמש ששמור במטמון נשאר מופעל.הסיבה: בקשות לביטול ההשתקה של משתמש יאושרו רק אם אין הגבלות פעילות.
הסיבה: ביטול ההשתקה של משתמשים שמושתקים במטמון עלול לגרום לפיצוץ קול לא מכוון ולסכן את בטיחות המשתמשים. זה נכון במיוחד אם מצב ההשתקה מופעל במהלך מחזורי ההפעלה, כי המשתמשים פחות מודעים לרמת הצליל.
תרחיש אינטראקציה: השתקת HAL מופעלת ומושבתת בזמן שההשתקה של המשתמש לא משתנה
החלפת מצב ההשתקה ב-HAL תשנה את מצב ההשתקה הכולל של קבוצת עוצמת הקול. עם זאת, הוא לא מעדכן ישירות את מצב ההשתקה של המשתמש. כשמשביתים את השתקת המשתמש ומתקבלת קריאה חוזרת (callback) להשתקה של HAL כדי להפעיל אותה:
- מצב ההשתקה הכולל של קבוצת עוצמת הקול השתנה ל-
true. בקשות של משתמשים לשינוי עוצמת הקול
NOTיעובדו בזמן שההשתקה של HAL מופעלת.הסיבה: המשתמש לא יכול לשמוע את הצליל כשההשתקה מופעלת. אם מאפשרים שינוי עוצמת הקול, עלול להתרחש פיצוץ של צליל ולסכן את בטיחות המשתמש.
הסיבה: אפליקציות של עוצמת הקול יכולות להירשם לקריאות חוזרות ולהפעיל ביטול השתקה (CarAudioManager.setVolumeGroupMute(...,/* mute=*/ true,..)) באופן אוטומטי ללא התערבות המשתמש, אם זהו ההתנהגות הצפויה על ידי יצרן הציוד המקורי.
כשההשתקה ב-HAL מושבתת וההשתקה של המשתמש מושבתת:
מצב ההשתקה של קבוצת עוצמת הקול השתנה ל
false.הסיבה: הפיכת מצב ההשתקה לדביק ובקשה מהמשתמש לבטל את ההשתקה עלולים להפריע למשתמש שלא לצורך אם מצבי ההשתקה מתחלפים לעיתים קרובות.
בקשות של משתמשים לשינוי עוצמת הקול יטופלו כרגיל.
חסימה
הגבלות החסימה הן:
Reasons.FORCED_MASTER_MUTEReasons.REMOTE_MUTEReasons.TCU_MUTE.
כשהגבלות החסימה פעילות, בקשות של משתמשים:
- השינויים בעוצמת הקול לא יעובדו.
- ההשתקה מופעלת או מושבתת.
הגבלה
הגבלות על מגבלות:
Reasons.THERMAL_LIMITATIONReasons.SUSPEND_EXIT_VOL_LIMITATION
כשהגבלות מסוג Limitation פעילות, בקשות של משתמשים ל:
שינוי עוצמת הקול:
- הנתונים שמעובדים במסגרת המגבלה
- הנתונים שחורגים מהמגבלה שצוינה למעלה לא מעובדים
ההשתקה מופעלת או מושבתת.
הנחתה
הגבלות ההנחתה הן:
Reasons.ADAS_DUCKINGReasons.NAV_DUCKINGReasons.PROJECTION_DUCKING
כשההגבלות על הנחתה פעילות, בקשות של משתמשים:
שינוי עוצמת הקול. עוצמת הקול הנוכחית החדשה מוגדרת לעוצמת הקול המונמכת (במקום לעוצמת הקול הקודמת). שינויים עתידיים בעוצמת הקול מתבצעים ברמה הזו.
ההשתקה מופעלת או מושבתת.
עדכון האינדקס
הפעולות הבאות נחשבות לעדכון אסינכרוני של אינדקס הכרכים:
Reasons.EXTERNAL_AMP_VOL_FEEDBACK.
במקרה כזה, AudioControl HAL יכול לעדכן את האינדקס הנוכחי של קבוצת עוצמת הקול לאינדקס שצוין. הוא משמש בעיקר כמשוב ממערכת האודיו לבקשה לשינוי עוצמת הקול מתוך מסגרת האודיו של הרכב. העדכון של האינדקס מועבר גם לאפליקציות כקריאה חוזרת (callback) של CarVolumeGroupEvent כדי לסנכרן את האינדקס.
דוגמאות
תרחיש שימוש: משתמש מעדכן את מדד עוצמת הקול ל-30
המשתמש משתמש באפליקציית עוצמת הקול כדי לשנות את אינדקס עוצמת הקול ל-30.
האינדקס הזה מומר לעוצמת השמע ונשלח ל-HAL של האודיו.
הטמעות של ספקים ב-
Audio HALמקבלות את הגברת עוצמת הקול החדשה ומעדכנות את מערכת האודיו (כמו מגבר חיצוני).מערכת האודיו מגיבה שרמת עוצמת הקול עודכנה רק לאינדקס 15 (מסיבות לא ידועות ל-Android).
הטמעות של טריגרים של ספקים:
AudioControl HALIAudioGainCallback.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.
הגדרה דינמית של עוצמת הקול
התכונה הזו מתאימה בעיקר לתרחישי השימוש הבאים:
הגדרה של רכב בסוף פס הייצור (EOL).
יצרני רכב מעדיפים לעדכן את הגדרות עוצמת הקול בסוף חיי המוצר (EOL) על סמך הגדרת מערכת השמע ברכב. בדרך כלל מדובר בהעברה צדדית בלי לעדכן את תמונת התוכנה של Android.
יצרני רכב עשויים להצטרך לעדכן את הגדרות עוצמת הקול במהלך תחזוקה.
הגדרה של זמן הריצה. מערכות אודיו לרכב תומכות בהגדרות של מגבר חיצוני, ויחידות הבקרה האלקטרוניות האלה עשויות לארח את הגדרות טווח עוצמת הקול שנשלפות במהלך האתחול.
הגדרה על פי דרישה. התכונה הזו נועדה לתת מענה לצורך הגובר בתכונות אודיו מבוססות-ביקוש, שבהן המשתמשים נרשמים לעיבוד משופר של אותות למשך תקופה מסוימת. ההגדרות החדשות של טווח עוצמת הקול תקפות למשך המינוי.
עיצוב
הגדרת עוצמת קול דינמית מתבצעת בשלושה שלבים:
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 שמועברים כחלק מהקריאה החוזרת חייבים להתאים להגדרה של Automotive BUS:
- יציאת המכשיר.
IN_DEVICE,OUT_DEVICE - חיבור.
BUS - כתובת. מוגדר בהגדרה של Audio HAL
- מצב הגברה.
JOINT
- יציאת המכשיר.
ספקים חייבים להגדיר קבוצת-על של הגדרות טווח עוצמת הקול במדיניות של Audio HAL ולהשתמש בפונקציית הקריאה החוזרת כדי להתאים אותה אישית לגרסאות שונות של כלי רכב. מידע נוסף זמין בהגדרה של
IModuleChangeCallbacAIDL.אם יותר מאוטובוס אודיו אחד שייך לאותה קבוצת עוצמת קול, חובה להגדיר לכל אחד מהם טווח עוצמת קול זהה. אם לא תעשו זאת, מסגרת האודיו של הרכב תדחה את ההגדרה החדשה של טווח עוצמת הקול.