کنترل صوتی HAL

کنترل صوتی HAL در اندروید 9 برای پشتیبانی از موارد استفاده صوتی مرتبط با خودرو معرفی شد. از اندروید 14، کنترل صوتی HAL از موارد زیر پشتیبانی می کند:

  • محو شدن و تعادل
  • درخواست فوکوس صوتی HAL
  • قطع و وصل دستگاه
  • تغییر بهره دستگاه صوتی
  • پیکربندی پورت صدا تغییر می کند

شکل 1 نمای کلی سطح بالایی از معماری سرویس صوتی خودرو را نشان می دهد که در آن سرویس صوتی خودرو با کنترل کننده صوتی HAL ارتباط برقرار می کند.

صدای چند منطقه ای را پیکربندی کنید

شکل 1. صدای چند منطقه ای را پیکربندی کنید.

محو شدن و تعادل صدا

کنترل صوتی HIDL نسخه 1 HAL در اندروید 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های 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، مشابه اندروید، به مشارکت فعال برنامه‌ها بر روی تمرکز صوتی برای مدیریت پخش صدا در خودروها متکی است. اطلاعات فوکوس برای مدیریت جریان‌ها برای کنترل حجم و دویدن استفاده می‌شود. به این ترتیب، برای گسترش بیشتر فوکوس صوتی و ارائه ادغام بهتر صداهای خاص خودرو در تجربه اندروید، ویژگی های صوتی زیر در اندروید 11 معرفی شد:

  • EMERGENCY
  • SAFETY
  • VEHICLE_STATUS
  • ANNOUNCEMENT

علاوه بر این تغییر، مکانیزمی برای صداهایی که از خارج از اندروید نشات می‌گیرند اضافه شد تا در درخواست‌های فوکوس صوتی شرکت کنند. بنابراین، کنترل صوتی HIDL HAL نسخه 2 برای اجازه دادن به درخواست‌های فوکوس که از خارج از اندروید سرچشمه می‌گیرند، معرفی شد:

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 و مهاجرت مورد نیاز در اندروید 12 (برای اطلاعات بیشتر به AIDL برای HAL ها مراجعه کنید)، کنترل صوتی HAL به 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);
}

بی صدا شدن گروه حجم

اندروید 12 بی‌صدا کردن گروه صدا را معرفی کرد تا امکان کنترل کامل‌تر بی‌صدا را در طول تعاملات صوتی کاربر فراهم کند. این به کنترل صوتی HAL اجازه می‌دهد تا رویدادهای نادیده گرفته شده توسط سرویس صوتی خودرو را دریافت کند.

برای فعال کردن این ویژگی، OEM ها باید پیکربندی audioUseCarVolumeGroupMuting را در سرویس car config.xml روی true تنظیم کنند:

<!-- 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 بازنویسی می‌شد (برای اطلاعات بیشتر، به سفارشی‌سازی ساخت با پوشش‌های منابع مراجعه کنید). از Android 13، می‌توانید از پوشش‌های منابع زمان اجرا برای تغییر مقدار پیکربندی استفاده کنید. برای کسب اطلاعات بیشتر، به تغییر مقدار منابع برنامه در زمان اجرا مراجعه کنید.

برنامه‌های سیستم می‌توانند با استفاده از CarAudioManager#isAudioFeatureEnabled API تعیین کنند که آیا این ویژگی فعال است یا خیر. پارامتر ارسال شده باید ثابت 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 کنترل صوتی راه‌اندازی می‌کنند.

اردک صوتی ماشین

اندروید 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>

برای فعال کردن این ویژگی، کنترل صوتی AIDL HAL باید منطق مربوطه را با سیگنال دریافتی از سرویس صوتی خودرو پیاده سازی کند:

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);
}

اطلاعات مربوط به سیستم صوتی در اطلاعات ducking صوتی موجود است:

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، اطلاعات ducking همچنین حاوی اطلاعاتی در مورد استفاده از ویژگی‌های صوتی است که تمرکز را حفظ می‌کند. هدف از این داده ها اطلاع رسانی به سیستم صوتی است که از کدام ویژگی های صوتی استفاده می شود.

این مورد نیاز است زیرا در پیکربندی صدای خودرو، چندین ویژگی صوتی را می توان به یک دستگاه اختصاص داد و بدون اطلاعات اضافی، مشخص نیست که کدام کاربردها فعال هستند.

کنترل صوتی AIDL HAL 2.0

برای به‌روزرسانی APIها و تسهیل عملکردهای جدید، کنترل صوتی AIDL HAL به نسخه 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;
}

همه عملکردهای دیگر از AIDL کنترل صوتی نسخه 1.0 باقی مانده و می توان از آنها استفاده کرد. یک استثنا مربوط به روش تغییر فوکوس صوتی است، همانطور که در روش تغییر فوکوس صوتی توضیح داده شده است.

فوکوس کنترل صوتی با فراداده آهنگ پخش

برای نمایش اطلاعات بیشتر در سیستم صوتی زیر 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 کنترل اندروید به روز شده می تواند به استفاده از روش های قبلی ادامه دهد.

اگر توسعه‌دهندگان HAL تصمیم بگیرند از IAudioControl#onAudioFocusChangeWithMetaData پشتیبانی نکنند، روش باید نتایجی را با خطای UNKNOWN_TRANSACTION همانطور که با استفاده از روش‌های رابط نسخه‌شده توضیح داده شده است، برگرداند.

سرویس صوتی ابتدا onAudioFocusChangeWithMetaData فراخوانی می کند و سپس در صورت بروز خطای UNKNOWN_TRANSACTION با روش onAudioFocusChange دوباره تلاش می کند.

پخش صدای ماشین با فراداده آهنگ پخش

نسخه 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 در اندروید 13 بیشتر قابل مشاهده باشد، مکانیزمی را اضافه کرده‌ایم که می‌توانید از آن برای انتقال تغییرات سود صوتی از سیستم صوتی خودرو به سرویس صوتی خودرو استفاده کنید. این مکانیسم تغییرات شاخص حجم افزایش صوتی را با دلیلی که چرا افزایش را تغییر داده است، نشان می دهد:

  • محدودیت‌های مسدود یا بی‌صدا
  • محدودیت های محدودیت
  • محدودیت های میرایی

این تغییرات این محدودیت‌ها را از زیر HAL برای سرویس صوتی خودرو و در نهایت به یک برنامه UI سیستم برای اطلاع کاربر نشان می‌دهد. بخش دوم، قرار گرفتن در معرض یک رابط کاربری احتمالی سیستم، در اندروید 14 بیشتر گسترش یافت تا به برنامه‌های رابط کاربری سیستم اجازه دهد تا این اطلاعات را از طریق مکانیسم برگشت تماس اطلاعات گروه حجمی آسان‌تر دریافت کنند.

کنترل صوتی HAL API بازگشت تماس حاصل را به صورت زیر ثبت می کند:

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 مشخص شده است، بازخوانی افزایش توسط سرویس صوتی خودرو در کنترل صوتی HAL ثبت می شود. هنگامی که API از HAL کنترل صوتی فراخوانی می‌شود، سرویس صوتی خودرو با یک عمل مربوطه (مانند بلوک، محدود کردن یا کاهش شاخص بهره) پاسخ می‌دهد.

HAL تعیین می کند که چه زمانی API فراخوانی شود، در درجه اول برای گزارش تغییرات در وضعیت شاخص افزایش. مخصوصاً به الزامات مقررات، سیستم صوتی خودرو باید اقدامات لازم را انجام دهد و از تماس برگشتی برای گزارش اطلاعات به سرویس صوتی خودرو استفاده کند تا امکان مصرف کاربر فراهم شود. به عنوان مثال، برای نشان دادن یک UI به کاربر.

کنترل صوتی AIDL HAL 3.0

نسخه HAL کنترل صوتی AIDL Android 14 به نسخه 3.0 به‌روزرسانی شده است تا APIها را به‌روزرسانی کند تا عملکرد شاخص افزایش صوتی قوی‌تری ارائه کند. کنترل صوتی HAL 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 دریافت شده توسط سرویس صوتی خودرو. هنگام فراخوانی API، پیاده‌سازی HAL کنترل صوتی باید جایگزین تماس‌های تغییر ماژول موجود شود.

برای clearModuleChangeCallback API، پیاده سازی باید callback موجود را پاک کند یا اگر وجود نداشت هیچ کاری انجام ندهد. برای اجرای کنترل صوتی، ثبت ناظر مرگ برای تماس برگشتی و سپس پاک کردن تماس برگشتی در صورت فعال شدن مرگ در بایندر، یک تمرین خوب است.

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 را می توان در هر زمان فراخوانی کرد. تغییرات مربوطه اعمال شده و سرویس صوتی خودرو بر این اساس به روز می شود.