HAL של שליטה באודיו

טכנולוגיית HAL של השליטה באודיו הושקה ב-Android 9 עבור תמיכה בתרחישים לדוגמה של אודיו שרלוונטיים לכלי רכב. נכון ל-Android 14, בקרת אודיו עם HAL תומכת:

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

איור 1 מציג סקירה כללית ברמה גבוהה של ארכיטקטורת שירותי האודיו ברכב, ששירות האודיו ברכב מתקשר עם בקרת האודיו עם HAL.

הגדרת אודיו בכמה אזורים

איור 1. הגדרת אודיו במספר אזורים.

עמעום אודיו ואיזון

גרסת HAL של בקרת אודיו HIDL הושקה ב-Android 9 לתמיכה בעמעום השמע ובאיזון של כלי רכב במקרים שונים. בנפרד מאפקטים קוליים כלליים שכבר קיימים ב-Android, מנגנון שמאפשר לאפליקציות מערכת להגדיר את איזון האודיו ואת השמעה הדרגתית ממשקי API של CarAudioManager:

class CarAudioManager {
       /**
       *   Adjust the relative volume in the front vs back of the vehicle cabin.
       *
       *   @param value in the range -1.0 to 1.0 for fully toward the back through
       *   fully toward the front. 0.0 means evenly balanced.
       */
       @SystemApi
       @RequiresPermission(Car.PERMISSION_CAR_CONTROL_AUDIO_VOLUME)
       public void setFadeTowardFront(float value);

       /**
       *   Adjust the relative volume on the left vs right side of the vehicle cabin.
       *
       *   @param value in the range -1.0 to 1.0 for fully toward the left through
       *   fully toward the right. 0.0 means evenly balanced.
       */
       @SystemApi
       @RequiresPermission(Car.PERMISSION_CAR_CONTROL_AUDIO_VOLUME)
       public void setBalanceTowardRight(float value);
}

לאחר הקריאה לממשקי ה-API האלה, ממשקי ה-API התואמים לבקרת אודיו נקראים משירות האודיו ברכב:

interface IAudioControl {
       /**
       *   Control the right/left balance setting of the car speakers.
       */
       oneway setBalanceTowardRight(float value);

       /**
       *   Control the fore/aft fade setting of the car speakers.
       */
       oneway setFadeTowardFront(float value);
}

ה-API זמין בכל הגרסאות של פקד האודיו HAL, כולל ממשק AIDL HAL.

בקשה להתמקדות אודיו מ-HAL

AAOS, בדומה ל-Android, מסתמכת על ההשתתפות הפעילה של אפליקציות באודיו להתמקד בניהול הפעלת האודיו במכוניות. המידע הזה משמש לניהול שמשדרים כדי לשלוט בעוצמת הקול והנמכה. לכן, כדי להרחיב להתמקד באודיו ולספק שילוב טוב יותר של צלילים שספציפיים לרכב ב-Android, מאפייני האודיו הבאים הושקו Android 11:00

  • EMERGENCY
  • SAFETY
  • VEHICLE_STATUS
  • ANNOUNCEMENT

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

interface IAudioControl {
       /**
       *   Registers focus listener to be used by HAL for requesting and
       *   abandoning audio focus.
       *   @param listener the listener interface
       *   @return closeHandle A handle to unregister observer.
       */
       registerFocusListener(IFocusListener listener)
       generates (ICloseHandle closeHandle);

       /**
       *   Notifies HAL of changes in audio focus status for focuses requested
       *   or abandoned by the HAL.
       *
       *   @param usage The audio usage associated with the focus change
       *   @param zoneId The identifier for the audio zone that the HAL is
       *   playing the stream in
       *   @param focusChange the AudioFocusChange that has occurred
       */
       oneway onAudioFocusChange(bitfield<AudioUsage> usage, int32_t zoneId,
       bitfield<AudioFocusChange> focusChange);
}

כאשר IFocusListener מוגדר כך:

interface IFocusListener {
       /**
       *   Called whenever HAL is requesting focus as it is starting to play
       *   audio of a given usage in a specified zone.
       *
       *   @param usage The audio usage associated with the focus request
       *    {@code AttributeUsage}
       *   @param zoneId The identifier for the audio zone where the HAL is
       *    requesting focus
       *   @param focusGain The AudioFocusChange associated with this request.
       */
       oneway requestAudioFocus(bitfield<AudioUsage> usage,
       int32_t zoneId, bitfield<AudioFocusChange> focusGain);
       /**
       *   Called whenever HAL is abandoning focus as it is finished playing audio
       *   of a given usage in a specific zone.
       *
       *   @param usage The audio usage for which the HAL is abandoning focus
       *    {@code AttributeUsage}
       *   @param zoneId The identifier for the audio zone that the HAL
       *    abandoning focus
       */
       oneway abandonAudioFocus(bitfield<AudioUsage> usage, int32_t zoneId);
}

תוכלו להשתמש בממשקי ה-API שצוינו כדי לבקש מיקוד אודיו ולנטוש אותו מ-HAL, בהתאמה. בתגובה, שירות האודיו ברכב מתייחס למיקוד האודיו ומעבירה את התוצאות באופן אסינכרוני אמצעי תשלום אחד (IAudioControl#onAudioFocusChange).

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

העברה של HIDL ל-AIDL לבקרת אודיו עם HAL

בעקבות המצאה של AIDL וההעברה הנדרשת ב-Android 12 (למידע נוסף, ראו AIDL בנושא HALs), הערך של פקד האודיו היה הועברו ל-AIDL. עבור ממשקי API קיימים של בקרת אודיו HIDL בגרסה 2, ההעברה נדרשים עדכונים קלים בשיטות הקיימות:

interface IAudioControl {
       /**
       *   Notifies HAL of changes in audio focus status for focuses requested
       *   or abandoned by the HAL.
       *
       *   @param usage The audio usage associated with the focus change
       *        {@code AttributeUsage}. See {@code audioUsage} in
       *        audio_policy_configuration.xsd for the list of allowed values.
       *   @param zoneId The identifier for the audio zone that the HAL is
       *        playing the stream in
       *   @param focusChange the AudioFocusChange that has occurred.
       */
       oneway void onAudioFocusChange(in String usage, in int zoneId,
              in AudioFocusChange focusChange);
       /**
       *   Registers focus listener to be used by HAL for requesting and
       *   abandoning audio focus.
       *   @param listener the listener interface.
       */
       oneway void registerFocusListener(in IFocusListener listener);
       /**
       *   Control the right/left balance setting of the car speakers.
       */
       oneway void setBalanceTowardRight(in float value);
       /**
       *   Control the fore/aft fade setting of the car speakers.
       */
       oneway void setFadeTowardFront(in float value);
}

וגם IFocusListener התואמים:

       interface IFocusListener {
       /**
       *   Called whenever HAL is abandoning focus as it is finished playing audio
       *   of a given usage in a specific zone.
       *
       *   @param usage The audio usage for which the HAL is abandoning focus
       *        {@code AttributeUsage}. See {@code audioUsage} in
       *        audio_policy_configuration.xsd for the list of allowed values.
       *   @param zoneId The identifier for the audio zone that the HAL
       *        abandoning focus
       */
       oneway void abandonAudioFocus(in String usage, in int zoneId);
       /**
       *   Called whenever HAL is requesting focus as it is starting to play audio
       *        of a given usage in a specified zone.
       *
       *   @param usage The audio usage associated with the focus request
       *        {@code AttributeUsage}. See {@code audioUsage} in
       *        audio_policy_configuration.xsd for the list of allowed values.
       *   @param zoneId The identifier for the audio zone where the HAL is
       *        requesting focus
       *   @param focusGain The AudioFocusChange associated with this request.
       */
       oneway void requestAudioFocus(in String usage, in int zoneId,
              in AudioFocusChange focusGain);
}

השתקה של קבוצת עוצמת קול

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

כדי להפעיל את התכונה, יצרני ציוד מקורי צריכים להגדיר את audioUseCarVolumeGroupMuting אל true בשירות הרכב config.xml:

<!-- Configuration to enable muting of individual volume groups.
If this is set to false, muting of individual volume groups is disabled,
instead muting will toggle master mute. If this is set to true, car volume
group muting is enabled and each individual volume group can be muted separately. -->
<bool name="audioUseCarVolumeGroupMuting">true</bool>

לפני Android 13, היה צורך להחליף את ההגדרה בשכבת-על של משאבים בזמן ריצה packages/services/Car/service/res/values/config.xml (מידע נוסף זמין במאמר הבא: התאמה אישית של ה-build באמצעות משאב שכבות-על). מ-Android 13, אפשר להשתמש בשכבות-על של משאבים בזמן ריצה כדי לשנות הגדרה אישית. מידע נוסף זמין במאמר שינוי הערכים של משאבים של אפליקציה בזמן ריצה.

אפליקציות מערכת יכולות לקבוע אם התכונה מופעלת באמצעות API של CarAudioManager#isAudioFeatureEnabled. הפרמטר שמועבר חייב להיות קבוע של CarAudioManager.AUDIO_FEATURE_VOLUME_GROUP_MUTING. השיטה מחזירה true אם התכונה מופעלת במכשיר. אחרת, false.

בנוסף להפעלה של התכונה audioUseCarVolumeGroupMuting, AIDL HAL של בקרת אודיו חייב להטמיע את מנגנון ההשתקה של קבוצת עוצמת הקול:

interface IAudioControl {
       /**
       *   Notifies HAL of changes in output devices that the HAL should apply
       *   muting to.
       *
       *   This will be called in response to changes in audio mute state for each
       *   volume group and will include a {@link MutingInfo} object per audio
       *   zone that experienced a mute state event.
       *
       *   @param mutingInfos an array of {@link MutingInfo} objects for the audio
       *   zones where audio mute state has changed.
       */
       oneway void onDevicesToMuteChange(in MutingInfo[] mutingInfos);
}

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

parcelable MutingInfo {
       /**
       *   ID of the associated audio zone
       */
       int zoneId;
       /**
       *   List of addresses for audio output devices that should be muted.
       */
       String[] deviceAddressesToMute;
       /**
       *   List of addresses for audio output devices that were previously be
       *   muted and should now be unmuted.
       */
       String[] deviceAddressesToUnmute;
}

ל-AAOS יש שני מנגנונים שונים להשתקה, על סמך:

  • אירועים מרכזיים שמשתמשים באודיו KEYCODE_VOLUME_MUTE.

  • ביצוע שיחות ישירות לשירות האודיו ברכב באמצעות ממשק ה-API להשתקה של מנהל האודיו ברכב. CarAudioManager#setVolumeGroupMute

כשהאפשרות הזו מופעלת, שני המנגנונים מפעילים השתקת קריאה ל‐HAL של פקד האודיו.

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

ב-Android 12 נוספה התכונה 'הנמכה של עוצמת השמע' ברכב כדי לשפר את השליטה בו-זמנית הפעלה של שידורי אודיו. כך יצרני ציוד מקורי (OEM) יכולים להשתמש ב- ducking משלהם התנהגות על סמך הגדרות האודיו הפיזיות של הרכב וההפעלה הנוכחית. מצב, כפי שנקבע על ידי שירות האודיו ברכב.

מנגנון ההנמכה מבוסס על השינויים בסטאק מיקוד האודיו. בכל פעם שינוי פוקוס (בקשת מיקוד או נטישה של מיקוד), האודיו לשלוט ב-HAL. דומה לתמיכה בהשתקה של קבוצת עוצמת הקול ברכב, מכונית אפשר להפעיל את התכונה 'הנמכה של עוצמת השמע' באמצעות דגל ההגדרה audioUseHalDuckingSignals:

<!-- Configuration to enable IAudioControl#onDevicesToDuckChange API to
inform HAL when to duck. If this is set to true, the API will receive signals
indicating which output devices to duck as well as what usages are currently
holding focus. If set to false, the API will not be called. -->
<bool name="audioUseHalDuckingSignals">true</bool>

כדי להפעיל את התכונה, רכיב ה-HAL של פקד האודיו AIDL חייב להטמיע את לוגיקה עם האות שהתקבל משירות האודיו ברכב:

interface IAudioControl {
       /**
       *   Notifies HAL of changes in output devices that the HAL should apply
       *   ducking to.
       *
       *   This will be called in response to changes in audio focus, and will
       *   include a {@link DuckingInfo} object per audio zone that experienced
       *   a change in audo focus.
       *
       *   @param duckingInfos an array of {@link DuckingInfo} objects for the
       *   audio zones where audio focus has changed.
       */
       oneway void onDevicesToDuckChange(in DuckingInfo[] duckingInfos);
}

המידע הרלוונטי של מערכת האודיו נכלל בהנמכה של עוצמת השמע מידע:

parcelable DuckingInfo {
       /**
       *   ID of the associated audio zone
       */
       int zoneId;
       /**
       *   List of addresses for audio output devices that should be ducked.
       */
       String[] deviceAddressesToDuck;
       /**
       *   List of addresses for audio output devices that were previously be
       *   ducked and should now be unducked.
       */
       String[] deviceAddressesToUnduck;
       /**
       *   List of usages currently holding focus for this audio zone.
       */
       String[] usagesHoldingFocus;
}

מלבד מידע על תצורת האודיו של הרכב, שמצוין בכתובות המכשיר ל- (un)duck, המידע על 'הנמכה' מכיל גם מידע על על השימושים במאפיינים נשמרים המיקוד. המטרה של הנתונים האלה היא ליידע את מערכת אודיו אילו שימושים במאפייני האודיו פעילים.

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

בקרת אודיו AIDL HAL 2.0

כדי לעדכן את ממשקי API ולאפשר פונקציונליות חדשה, התכונה AIDL שולטת ב-HAL עודכן לגרסה 2.0 ב-Android 13:

  • פוקוס אודיו עם PlaybackTrackMetadata
  • האודיו מגביר את הקריאה החוזרת (callback)

מטא-נתונים של הפעלה מוגדרים ב-android.hardware.audio.common כך:

parcelable PlaybackTrackMetadata {
       AudioUsage usage = INVALID;
       AudioContentType contentType = UNKNOWN;
       float gain;
       AudioChannelLayout channelMask;
       AudioDevice sourceDevice;
       String[] tags;
}

כל שאר הפונקציונליות בגרסה 1.0 של בקרת האודיו AIDL נותרה, וניתן בשימוש. יוצא מן הכלל מתייחס לשיטת השינוי של מיקוד האודיו, כפי שמתואר ב בשיטה לשינוי מיקוד האודיו.

מיקוד בקרת האודיו עם מטא-נתונים של הטראק בהפעלה

כדי לחשוף מידע נוסף למערכת האודיו שמתחת ל-HAL, העדכונים חושפים עכשיו PlaybackTrackMetadata באופן ספציפי, תכונת ה-HAL של פקד האודיו הורחבה עם השיטה החדשה:

interface IAudioControl {
       /**
       *   Notifies HAL of changes in audio focus status for focuses requested
       *   or abandoned by the HAL.
       *
       *   The HAL is not required to wait for a callback of AUDIOFOCUS_GAIN
       *   before playing audio, nor is it required to stop playing audio in the
       *   event of a AUDIOFOCUS_LOSS callback is received.
       *
       *   @param playbackMetaData The output stream metadata associated with
       *    the focus request
       *   @param zoneId The identifier for the audio zone that the HAL is
       *    playing the stream in
       *   @param focusChange the AudioFocusChange that has occurred.
       */
       oneway void onAudioFocusChangeWithMetaData(
       in PlaybackTrackMetadata playbackMetaData, in int zoneId,
       in AudioFocusChange focusChange);
}

מתבצע שינוי דומה תואם ל-IFocusListener:

       /**
       *   Called to indicate that the audio output stream associated with
       *   {@link android.hardware.audio.common.PlaybackTrackMetadata} is
       *   abandoning focus as playback has stopped.
       *
       *   @param playbackMetaData The output stream metadata associated with
       *    the focus request
       *   @param zoneId The identifier for the audio zone that the HAL
       *    abandoning focus
       */
       oneway void abandonAudioFocusWithMetaData(
       in PlaybackTrackMetadata playbackMetaData, in int zoneId);
       /**
       *   Called to indicate that the audio output stream associated with
       *   {@link android.hardware.audio.common.PlaybackTrackMetadata} has taken
       *   the focus as playback is starting for the corresponding stream.
       *
       *   @param playbackMetaData The output stream metadata associated with
       *    the focus request
       *   @param zoneId The identifier for the audio zone that the HAL
       *    abandoning focus
       *   @param focusGain The focus type requested.
       */
       oneway void requestAudioFocusWithMetaData(
       in PlaybackTrackMetadata playbackMetaData, in int zoneId,
       in AudioFocusChange focusGain);
}

שיטה לשינוי פוקוס אודיו

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

אם מפתחי HAL מחליטים לא לתמוך IAudioControl#onAudioFocusChangeWithMetaData, השיטה אמורה להחזיר תוצאות עם השגיאה UNKNOWN_TRANSACTION כפי שמתואר שימוש בממשק גרסאות שיטות.

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

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

גרסה 2.0 של פקד האודיו AIDL הוסיפה את המטא-נתונים של טראק ההפעלה אל הפרטים של הנמכת האודיו:

parcelable DuckingInfo {
       /**
       *   ID of the associated audio zone
       */
       int zoneId;
       /**
       *   List of addresses for audio output devices that should be ducked.
       */
       String[] deviceAddressesToDuck;
       /**
       *   List of addresses for audio output devices that were previously be
       *   ducked and should now be unducked.
       */
       String[] deviceAddressesToUnduck;
       /**
       *   List of usages currently holding focus for this audio zone.
       */
       String[] usagesHoldingFocus;
       /**
       *   List of output stream metadata associated with the current focus
       *   holder for this audio zone
       */
       @nullable PlaybackTrackMetadata[] playbackMetaDataHoldingFocus;
}

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

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

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

  • הגבלות חסומות או מושתקות
  • הגבלות
  • הגבלות הנחה

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

ה-HAL API של בקרת האודיו רושם את הקריאה החוזרת (callback) של הקבל באופן הבא:

interface IAudioControl {
       /**
       *   Registers callback to be used by HAL for reporting unexpected gain(s)
       *    changed and the reason(s) why.
       *
       *   @param callback The {@link IAudioGainCallback}.
       */
       oneway void registerGainCallback(in IAudioGainCallback callback);
}

הערך של IAudioGainCallback מוגדר כך:

interface IAudioGainCallback {
       /**
       *   Used to indicate that one or more audio device port gains have changed,
       *   i.e. initiated by HAL, not by CarAudioService.
       *   This is the counter part of the
       *   {@link onDevicesToDuckChange}, {@link onDevicesToMuteChange} and,
       *   {@link setAudioDeviceGainsChanged} APIs.
       *
       *   @param reasons List of reasons that triggered the given gains changed.
       *   @param gains List of gains affected by the change.
       */
       void onAudioDeviceGainsChanged(in Reasons[] reasons,
       in AudioGainConfigInfo[] gains);
}

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

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

בקרת אודיו AIDL HAL 3.0

גרסת HAL של בקרת האודיו ב-Android 14 AIDL היא עודכנה לגרסה 3.0 כדי לעדכן את ממשקי ה-API כדי לספק עוצמת אודיו משופרת של האינדקס. ממשק ה-API של בקרת האודיו מאפשר לשירות האודיו הגדרה וביטול ההגדרה של IModuleChangeCallback:

interface IAudioControl {
       /**
       *   Sets callback with HAL for notifying changes to hardware module
       *   (that is: {@link android.hardware.audio.core.IModule}) configurations.
       *
       *   @param callback The {@link IModuleChangeCallback} interface to use
       *    use when new updates are available for
       */
       void setModuleChangeCallback(in IModuleChangeCallback callback);
       /**
       *   Clears module change callback
       */
       void clearModuleChangeCallback();
}

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

ב-API clearModuleChangeCallback, ההטמעה צריכה למחוק את קריאה חוזרת קיימת או לא לבצע שום פעולה אם לא קיים כזה. זו שיטה טובה הטמעת בקרת האודיו כדי לרשום צופה במוות להתקשרות חזרה ולאחר מכן לבטל את הקריאה החוזרת (callback) אם מופעל מוות ב-Binder.

IModuleChangeCallback מוגדר כך:

oneway interface IModuleChangeCallback {
       /**
       *   Used to indicate that one or more {@link AudioPort} configs have
       *   changed. Implementations MUST return at least one AudioPort.
       *
       *   @param audioPorts list of {@link AudioPort} that are updated
       */
       void onAudioPortsChanged(in AudioPort[] audioPorts);
}

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