Điều khiển âm thanh HAL

HAL điều khiển âm thanh được giới thiệu trong Android 9 để hỗ trợ các trường hợp sử dụng âm thanh liên quan đến ô tô. Kể từ Android 14, HAL điều khiển âm thanh hỗ trợ:

  • Làm mờ dần và cân bằng
  • Yêu cầu tập trung âm thanh HAL
  • Tắt tiếng và tắt thiết bị
  • Thay đổi mức tăng của thiết bị âm thanh
  • Thay đổi cấu hình cổng âm thanh

Hình 1 thể hiện tổng quan cấp cao về kiến ​​trúc dịch vụ âm thanh ô tô, trong đó dịch vụ âm thanh ô tô giao tiếp với bộ điều khiển âm thanh HAL.

Định cấu hình âm thanh đa vùng

Hình 1. Cấu hình âm thanh đa vùng.

Âm thanh mờ dần và cân bằng

Điều khiển âm thanh HIDL HAL phiên bản 1 đã được giới thiệu trong Android 9 để hỗ trợ giảm dần và cân bằng âm thanh trong các trường hợp sử dụng ô tô. Tách biệt với các hiệu ứng âm thanh chung đã được cung cấp trong Android, cơ chế này cho phép các ứng dụng hệ thống đặt cân bằng âm thanh và giảm dần âm thanh thông qua 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);
}

Sau khi các API này được gọi, các API HAL kiểm soát âm thanh tương ứng sẽ được gọi từ dịch vụ âm thanh ô tô:

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 có sẵn trên tất cả các phiên bản HAL điều khiển âm thanh, bao gồm giao diện AIDL HAL mới.

Yêu cầu tập trung âm thanh từ HAL

AAOS, tương tự như Android, dựa vào sự tham gia tích cực của các ứng dụng vào tiêu điểm âm thanh để quản lý việc phát lại âm thanh trên ô tô. Thông tin tiêu điểm được sử dụng để quản lý luồng nào cần kiểm soát âm lượng và giảm âm lượng. Do đó, để mở rộng hơn nữa trọng tâm âm thanh và giúp tích hợp tốt hơn các âm thanh dành riêng cho ô tô vào trải nghiệm Android, các thuộc tính âm thanh sau đã được giới thiệu trong Android 11:

  • EMERGENCY
  • SAFETY
  • VEHICLE_STATUS
  • ANNOUNCEMENT

Ngoài thay đổi này, một cơ chế đã được thêm vào để âm thanh bắt nguồn từ bên ngoài Android tham gia vào các yêu cầu tập trung vào âm thanh. Do đó, HAL điều khiển âm thanh HIDL phiên bản 2 đã được giới thiệu để cho phép các yêu cầu lấy nét bắt nguồn từ bên ngoài 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);
}

Trong đó IFocusListener được định nghĩa là:

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

Các API ở trên có thể được sử dụng để yêu cầu và hủy bỏ tiêu điểm âm thanh tương ứng từ HAL. Để phản hồi, dịch vụ âm thanh ô tô sẽ xem xét yêu cầu tập trung âm thanh và chuyển tiếp kết quả một cách không đồng bộ đến phương thức IAudioControl#onAudioFocusChange .

API này cũng có thể được sử dụng để theo dõi các thay đổi đối với yêu cầu tập trung âm thanh bắt nguồn từ HAL điều khiển âm thanh. Nói chung, mọi yêu cầu tập trung âm thanh thường trực từ HAL đều được coi là đang hoạt động , khác với yêu cầu tập trung âm thanh từ Android, trong đó chỉ phát lại bản âm thanh đang hoạt động tương ứng mới được coi là đang hoạt động.

Di chuyển HIDL sang AIDL điều khiển âm thanh HAL

Với sự ra đời của AIDL và yêu cầu di chuyển trong Android 12 (để tìm hiểu thêm, hãy xem AIDL cho HAL ), HAL điều khiển âm thanh đã được di chuyển sang AIDL. Đối với các API điều khiển âm thanh HIDL phiên bản 2 hiện có, quá trình di chuyển yêu cầu cập nhật nhỏ cho các phương pháp hiện có:

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 tương ứng:

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

Tắt tiếng nhóm âm lượng

Android 12 đã giới thiệu tính năng tắt tiếng nhóm âm lượng để cho phép kiểm soát tắt tiếng toàn diện hơn trong quá trình tương tác âm thanh của người dùng. Điều này cho phép HAL điều khiển âm thanh nhận các sự kiện tắt tiếng do dịch vụ âm thanh ô tô chặn lại.

Để bật tính năng này, các OEM phải đặt cấu hình audioUseCarVolumeGroupMuting thành true trong config.xml dịch vụ ô tô:

<!-- 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>

Trước Android 13, cấu hình phải được ghi đè bằng lớp phủ tài nguyên thời gian chạy cho packages/services/Car/service/res/values/config.xml (để tìm hiểu thêm, hãy xem Tùy chỉnh bản dựng với lớp phủ tài nguyên ). Từ Android 13, bạn có thể sử dụng lớp phủ tài nguyên thời gian chạy để thay đổi giá trị cấu hình. Để tìm hiểu thêm, hãy xem Thay đổi giá trị tài nguyên của ứng dụng khi chạy .

Các ứng dụng hệ thống có thể xác định xem tính năng này có được bật hay không bằng cách sử dụng API CarAudioManager#isAudioFeatureEnabled . Tham số được truyền vào phải là hằng số CarAudioManager.AUDIO_FEATURE_VOLUME_GROUP_MUTING . Phương thức trả về true nếu tính năng này được bật trên thiết bị, nếu không thì false .

Ngoài việc bật tính năng audioUseCarVolumeGroupMuting , HAL điều khiển âm thanh AIDL phải triển khai cơ chế tắt tiếng nhóm âm lượng:

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

Trường hợp thông tin tắt tiếng chứa thông tin tắt tiếng thích hợp cho hệ thống âm thanh:

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 có hai cơ chế tắt tiếng khác nhau, dựa trên:

  • Các sự kiện chính sử dụng âm thanh KEYCODE_VOLUME_MUTE {:.external}.

  • Cuộc gọi trực tiếp đến dịch vụ âm thanh ô tô bằng cách sử dụng API tắt tiếng của trình quản lý âm thanh ô tô, CarAudioManager#setVolumeGroupMute .

Khi được bật, cả hai cơ chế sẽ kích hoạt tắt tiếng cuộc gọi đối với HAL điều khiển âm thanh.

Giảm âm thanh ô tô

Android 12 đã giới thiệu tính năng giảm âm thanh trên ô tô để tối ưu hóa khả năng kiểm soát việc phát đồng thời các luồng âm thanh. Điều này cho phép các OEM thực hiện hành vi giảm âm thanh của riêng họ dựa trên cấu hình âm thanh vật lý của ô tô và trạng thái phát lại hiện tại, do dịch vụ âm thanh ô tô xác định.

Cơ chế giảm bớt dựa trên những thay đổi về ngăn xếp tiêu điểm âm thanh. Bất cứ khi nào xảy ra thay đổi tiêu điểm (dù là yêu cầu tiêu điểm hay từ bỏ tiêu điểm), HAL điều khiển âm thanh sẽ được thông báo. Tương tự như hỗ trợ tắt tiếng nhóm âm lượng ô tô, bạn có thể bật tính năng giảm âm thanh ô tô bằng cờ cấu hình 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>

Để bật tính năng này, HAL điều khiển âm thanh AIDL phải triển khai logic liên quan với tín hiệu nhận được từ dịch vụ âm thanh ô tô:

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

Thông tin hệ thống âm thanh liên quan có trong thông tin giảm âm thanh:

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

Ngoài thông tin cấu hình âm thanh ô tô có trong địa chỉ của thiết bị tới (un)duck, thông tin giảm bớt còn chứa thông tin về việc sử dụng thuộc tính âm thanh nào đang được chú trọng. Mục đích của dữ liệu này là thông báo cho hệ thống âm thanh biết cách sử dụng thuộc tính âm thanh nào đang hoạt động.

Điều này là bắt buộc vì trong cấu hình âm thanh ô tô, nhiều thuộc tính âm thanh có thể được gán cho một thiết bị và nếu không có thông tin bổ sung thì sẽ không rõ mục đích sử dụng nào đang hoạt động.

Điều khiển âm thanh AIDL HAL 2.0

Để cập nhật API và hỗ trợ chức năng mới, HAL kiểm soát âm thanh AIDL đã được cập nhật lên phiên bản 2.0 trong Android 13:

  • Tập trung âm thanh với PlaybackTrackMetadata
  • Âm thanh đạt được cuộc gọi lại

Siêu dữ liệu phát lại được xác định trong android.hardware.audio.common như sau:

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

Tất cả chức năng khác từ điều khiển âm thanh AIDL phiên bản 1.0 vẫn được giữ nguyên và có thể sử dụng được. Một ngoại lệ liên quan đến phương pháp thay đổi tiêu điểm âm thanh, như được mô tả trong Phương pháp thay đổi tiêu điểm âm thanh .

Tập trung điều khiển âm thanh với siêu dữ liệu bản nhạc phát lại

Để hiển thị thêm thông tin cho hệ thống âm thanh bên dưới HAL, các bản cập nhật hiện hiển thị PlaybackTrackMetadata . Cụ thể, HAL điều khiển âm thanh được mở rộng bằng phương pháp mới:

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

Một thay đổi tương tự, tương ứng được thực hiện đối với 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);
}

Về phương pháp thay đổi tiêu điểm âm thanh

Các thao tác lấy nét ở trên thực hiện theo cách tương tự như các thao tác được mô tả trong Yêu cầu lấy nét âm thanh từ HAL . Chỉ siêu dữ liệu của bản nhạc phát lại mới có nhiều thông tin hơn cùng với cách sử dụng thuộc tính âm thanh. Nói chung, trừ khi cần thêm thông tin do siêu dữ liệu bản nhạc phát lại cung cấp, HAL điều khiển Android được cập nhật có thể tiếp tục sử dụng các phương pháp trước đó.

Nếu nhà phát triển HAL quyết định không hỗ trợ IAudioControl#onAudioFocusChangeWithMetaData , phương thức sẽ trả về kết quả có lỗi UNKNOWN_TRANSACTION như được mô tả Sử dụng Phương thức giao diện được phiên bản .

Dịch vụ âm thanh trước tiên gọi onAudioFocusChangeWithMetaData rồi thử lại bằng phương thức onAudioFocusChange nếu xảy ra lỗi UNKNOWN_TRANSACTION .

Giảm âm thanh ô tô với siêu dữ liệu bản nhạc phát lại

Phiên bản 2.0 của HAL điều khiển âm thanh AIDL đã thêm siêu dữ liệu của bản nhạc phát lại vào thông tin giảm âm thanh:

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 không còn được dùng nữa. Giờ đây, các nhà phát triển nên sử dụng playbackMetaDataHoldingFocus để xác định mức sử dụng thuộc tính âm thanh và thông tin âm thanh khác. Điều đó có nghĩa là tham số usagesHoldingFocus vẫn chứa thông tin cần thiết cho đến khi tùy chọn này chính thức bị xóa.

Gọi lại âm thanh

Để giúp các thay đổi về âm thanh bên dưới HAL hiển thị rõ ràng hơn với AAOS trong Android 13, chúng tôi đã thêm một cơ chế mà bạn có thể sử dụng để thông báo những thay đổi về mức tăng âm thanh từ hệ thống âm thanh của ô tô đến dịch vụ âm thanh trên ô tô. Cơ chế này cho thấy các thay đổi về chỉ số âm lượng tăng âm với lý do tương ứng khiến mức tăng bị thay đổi:

  • Hạn chế bị chặn hoặc bị tắt tiếng
  • Hạn chế hạn chế
  • Hạn chế suy giảm

Những thay đổi này thể hiện những hạn chế này từ bên dưới HAL đối với dịch vụ âm thanh ô tô và cuối cùng là ứng dụng giao diện người dùng hệ thống để thông báo cho người dùng. Phần thứ hai, khả năng tiếp xúc với giao diện người dùng hệ thống có thể có, đã được mở rộng hơn nữa trong Android 14 để cho phép các ứng dụng giao diện người dùng hệ thống dễ dàng lấy thông tin này hơn thông qua cơ chế gọi lại thông tin nhóm khối lượng.

API HAL điều khiển âm thanh đăng ký lệnh gọi lại khuếch đại như sau:

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 được định nghĩa như sau:

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

Như đã nêu rõ trong tài liệu API, lệnh gọi lại khuếch đại được dịch vụ âm thanh ô tô đăng ký với HAL điều khiển âm thanh. Khi API được gọi từ bộ điều khiển âm thanh HAL, dịch vụ âm thanh ô tô sẽ phản hồi bằng hành động tương ứng (chẳng hạn như chặn, giới hạn hoặc chỉ số khuếch đại suy giảm).

HAL xác định thời điểm API được gọi, chủ yếu để báo cáo các thay đổi về trạng thái chỉ số khuếch đại. Cụ thể theo yêu cầu quy định, hệ thống âm thanh của ô tô phải thực hiện hành động cần thiết và sử dụng lệnh gọi lại để báo cáo thông tin cho dịch vụ âm thanh ô tô nhằm cho phép người dùng sử dụng. Ví dụ: để hiển thị giao diện người dùng cho người dùng.

Điều khiển âm thanh AIDL HAL 3.0

Phiên bản HAL điều khiển âm thanh Android 14 AIDL được cập nhật lên phiên bản 3.0 để cập nhật các API nhằm cung cấp chức năng chỉ số tăng âm thanh mạnh mẽ hơn. API HAL kiểm soát âm thanh cho phép dịch vụ âm thanh đặt và hủy đặt 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 được dịch vụ âm thanh ô tô đăng ký khi dịch vụ khởi động hoặc khi khôi phục sau lỗi. Ví dụ: dịch vụ âm thanh ô tô nhận được thông báo về việc ngừng sử dụng chất kết dính HAL điều khiển âm thanh. Việc triển khai HAL kiểm soát âm thanh sẽ thay thế mọi lệnh gọi lại thay đổi mô-đun hiện có khi API được gọi.

Đối với API clearModuleChangeCallback , quá trình triển khai sẽ xóa lệnh gọi lại hiện có hoặc không làm gì nếu lệnh gọi lại không tồn tại. Cách tốt nhất để triển khai điều khiển âm thanh là đăng ký người quan sát cái chết cho lệnh gọi lại và sau đó xóa lệnh gọi lại nếu cái chết trên chất kết dính được kích hoạt.

IModuleChangeCallback được định nghĩa như sau:

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

Khi dịch vụ âm thanh ô tô đăng ký lệnh gọi lại thay đổi mô-đun, dịch vụ này sẵn sàng nhận các thay đổi về cổng âm thanh thông qua API onAudioPortChanged . API có thể được sử dụng để khởi tạo mức tăng âm lượng cho hệ thống âm thanh ngay khi đăng ký lệnh gọi lại. Đối với các thay đổi mức tăng động khác, API có thể được gọi bất cứ lúc nào. Những thay đổi tương ứng được áp dụng và dịch vụ âm thanh xe hơi cũng được cập nhật tương ứng.