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