HAL לבקרת אודיו

שכבת הפשטת החומרה (HAL) של בקרת האודיו הוצגה ב-Android 9 כדי לתמוך בתרחישי שימוש באודיו שרלוונטיים לתחום הרכב. החל מ-Android 14, ‏ Audio control HAL תומך ב:

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

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

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

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

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

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

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 המתאימים של HAL לבקרת אודיו משירות האודיו ברכב:

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 את מאפייני האודיו הבאים:

  • EMERGENCY
  • SAFETY
  • VEHICLE_STATUS
  • ANNOUNCEMENT

בנוסף לשינוי הזה, נוסף מנגנון לצלילים שמגיעים מחוץ לאנדרואיד כדי להשתתף בבקשות למיקוד אודיו. לכן, הוצגה גרסה 2 של HIDL audio control 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 ל-HAL של בקרת אודיו ב-AIDL

עם ההשקה של AIDL וההעברה הנדרשת ב-Android 12 (מידע נוסף זמין במאמר AIDL ל-HAL), הועבר ה-HAL של בקרת האודיו ל-AIDL. בממשקי HIDL API קיימים לניהול אודיו בגרסה 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);
}
בקטע הבא מפורטות תכונות חדשות יותר שהוצגו עם ההעברה ל-AIDL.

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

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

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

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

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

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

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

‫AIDL audio control HAL 2.0

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

  • מיקוד אודיו עם PlaybackTrackMetadata
  • התקשרות חוזרת של רווחי אודיו

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

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

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

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

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

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

שירות האודיו קורא קודם ל-onAudioFocusChangeWithMetaData ואז מנסה שוב באמצעות השיטה onAudioFocusChange אם מתקבלת שגיאה UNKNOWN_TRANSACTION.

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

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

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 עדיין מכיל את המידע הנדרש עד שהאפשרות הזו תוסר באופן רשמי.

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

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

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

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

ממשק 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 audio control HAL 3.0

גרסת ה-HAL של בקרת האודיו ב-AIDL ב-Android 14 עודכנה לגרסה 3.0 כדי לעדכן את ממשקי ה-API ולספק פונקציונליות חזקה יותר של אינדקס עוצמת האודיו. ממשק ה-API של Audio Control HAL מאפשר לשירות האודיו להגדיר ולבטל הגדרה של 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 binder של בקרת אודיו שהתקבלה על ידי שירות האודיו של הרכב. ההטמעה של HAL לבקרת אודיו צריכה להחליף כל קריאה חוזרת (callback) לשינוי מודול קיים כשמתבצעת קריאה ל-API.

ב-API‏ clearModuleChangeCallback, ההטמעה צריכה לנקות את הקריאה החוזרת הקיימת או לא לעשות כלום אם היא לא קיימת. מומלץ להטמיע את בקרת האודיו כך שיירשם observer של סיום הפעולה עבור הקריאה החוזרת, ואז לנקות את הקריאה החוזרת אם מופעלת הפונקציה on binder death.

הערך של 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);
}

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