Lớp trừu tượng phần cứng (HAL) để điều khiển âm thanh

Lớp trừu tượng phần cứng (HAL) cho đ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ờ và cân bằng
  • Yêu cầu quyền phát âm thanh HAL
  • Tắt tiếng và giảm âm lượng của thiết bị
  • Thay đổi về mức tăng âm lượng của thiết bị âm thanh
  • Các thay đổi về cấu hình cổng âm thanh

Hình 1 thể hiện thông tin tổng quan cấp cao về kiến trúc dịch vụ âm thanh ô tô, trong mà dịch vụ âm thanh của ô tô giao tiếp với HAL (Lớp trừu tượng phần cứng) điều khiển âm thanh.

Định cấu hình âm thanh nhiều vùng

Hình 1. Định cấu hình âm thanh nhiều vùng.

Độ mờ và cân bằng âm thanh

HAL (Lớp trừu tượng phần cứng) cho hệ thống điều khiển âm thanh HIDL phiên bản 1 ra mắt trong Android 9 để hỗ trợ tính năng làm mờ và cân bằng âm thanh khi sử dụng trên ô tô trường hợp. Khác với các hiệu ứng âm thanh chung đã được cung cấp trong Android, tính năng này cơ chế cho phép các ứng dụng hệ thống đặt cân bằng âm thanh và làm mờ dần Các 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 điều khiển âm thanh tương ứng đượ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 này có trên tất cả các phiên bản của HAL kiểm soát âm thanh, bao gồm Giao diện AIDL HAL.

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 âm thanh lấy tiêu điểm để quản lý chế độ phát âm thanh trên ô tô. Thông tin về tiêu điểm được dùng để quản lý những 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 tập trung vào âm thanh và tích hợp tốt hơn các âm thanh dành riêng cho ô tô vào phiên bản Android, các thuộc tính âm thanh sau đây đã được giới thiệu trong Android 11:

  • EMERGENCY
  • SAFETY
  • VEHICLE_STATUS
  • ANNOUNCEMENT

Ngoài thay đổi này, chúng tôi cũng đã thêm một cơ chế đối với â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 đó, âm thanh HIDL ra mắt kiểm soát HAL phiên bản 2 để cho phép các yêu cầu lấy tiêu điểm 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);
}

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

API này cũng có thể dùng để theo dõi những thay đổi đối với yêu cầu quyền phát âm thanh bắt nguồn từ lớp trừu tượng phần cứng (HAL) giúp kiểm soát âm thanh. Nhìn chung, bất kỳ tiêu điểm âm thanh đứng nào yêu cầu của HAL được coi là đang hoạt động và khác với quyền phát âm thanh yêu cầu từ Android, trong đó chỉ phát bản âm thanh tương ứng đang hoạt động được coi là đang hoạt động.

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

Với sự ra đời của AIDL và quá trình di chuyển bắt buộc trong Android 12 (để tìm hiểu thêm, hãy xem bài viết AIDL cho HALs), HAL điều khiển âm thanh đã 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 bắt buộc phải cập nhật nhỏ cho các phương thức 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 ra mắt tính năng tắt tiếng nhóm âm lượng để cho phép khả năng kiểm soát tắt tiếng toàn diện hơn trong các hoạt động tương tác bằng âm thanh của người dùng. Chiến dịch này cho phép HAL điều khiển âm thanh nhận các sự kiện tắt tiếng khi bị ô tô chặn dịch vụ âm thanh.

Để bật tính năng này, OEM phải đặt cấu hình audioUseCarVolumeGroupMuting đến true bằng dịch vụ ô tô 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>

Trước Android 13, cấu hình này phải bị ghi đè với một 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 Tuỳ chỉnh bản dựng bằng tài nguyên ). Từ Android 13, bạn có thể sử dụng lớp phủ tài nguyên trong thời gian chạy để thay đổi giá trị cấu hình. Để tìm hiểu thêm, hãy xem phần Thay đổi giá trị của tài nguyên của ứng dụng trong thời gian chạy.

Các ứng dụng hệ thống có thể xác định xem tính năng này đã được bật hay chưa bằng cách sử dụng API CarAudioManager#isAudioFeatureEnabled. Thông số được truyền vào phải là Hằng số CarAudioManager.AUDIO_FEATURE_VOLUME_GROUP_MUTING. Phương thức này 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, AIDL HAL (Lớp trừu tượng phần cứng) điều khiển âm thanh 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);
}

Trong 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:

  • Sự kiện chính sử dụng âm thanh KEYCODE_VOLUME_MUTE.

  • Lệnh gọi trực tiếp đến dịch vụ âm thanh trên ô tô bằng API tắt tiếng trình quản lý âm thanh trên ô tô, CarAudioManager#setVolumeGroupMute.

Khi bật, cả hai cơ chế đều kích hoạt tính năng tắt tiếng cuộc gọi đối với HAL (Lớp trừu tượng phần cứng) điều khiển âm thanh.

Giảm âm thanh trên ô tô

Android 12 ra mắt tính năng giảm âm thanh trên ô tô để tối ưu hoá khả năng kiểm soát đồng thời phát lại luồng âm thanh. Điều này cho phép OEM triển khai tính năng giảm hiệu suất của riêng họ dựa trên cấu hình âm thanh thực của ô tô và chế độ phát hiện tại như được xác định bởi dịch vụ âm thanh ô tô.

Cơ chế giảm âm thanh 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 một thay đổi tiêu điểm xảy ra (cho dù là yêu cầu lấy tiêu điểm hay bỏ qua tiêu điểm), âm thanh kiểm soát HAL được thông báo. Tương tự như tính năng hỗ trợ tắt tiếng nhóm âm lượng trên ô tô, ô tô Bạn có thể bật tính năng giảm âm thanh 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, lớp trừu tượng phần cứng (HAL) cho chế độ điều khiển âm thanh AIDL phải triển khai thông tin logic với tín hiệu nhận được từ dịch vụ âm thanh của ô 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);
}

Tính năng giảm âm thanh có thông tin về hệ thống âm thanh có liên quan của bạn:

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 về cấu hình âm thanh của ô tô có trong địa chỉ thiết bị thành (un) vị trí, thông tin giảm vị trí cũng chứa thông tin về âm thanh nào đang giữ tiêu điểm. Mục đích của dữ liệu này là cung cấp thông tin hệ thống âm thanh đang sử dụng thuộc tính âm thanh.

Đây là yêu cầu bắt buộc vì trong cấu hình âm thanh của ô tô, nhiều âm thanh có thể được gán cho một thiết bị đơn lẻ mà không cần dữ liệu, không rõ trường hợp sử dụng nào đang hoạt động.

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

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

  • Quyền phát âm thanh bằng PlaybackTrackMetadata
  • Lệnh gọi lại tăng âm thanh

Siêu dữ liệu phát đượ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 của tính năng đ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. Một trường hợp ngoại lệ liên quan đến phương thức thay đổi quyền phát âm thanh, như mô tả trong Đối với phương pháp thay đổi quyền phát âm thanh.

Lấy tiêu điểm điều khiển âm thanh thông qua siêu dữ liệu của bản phát

Để 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 giờ đây sẽ hiển thị PlaybackTrackMetadata. Cụ thể, HAL để kiểm soát â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 cho 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 thức thay đổi quyền phát âm thanh

Các thao tác lấy tiêu điểm nêu trên thực hiện theo cách tương tự như các thao tác được mô tả trong phần Âm thanh yêu cầu lấy tiêu điểm từ HAL. Chỉ có siêu dữ liệu bản nhạc 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ừ phi thêm cần thông tin do siêu dữ liệu bản phát lại cung cấp, phiên bản Android cập nhật kiểm soát HAL 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 này sẽ trả về kết quả với lỗi UNKNOWN_TRANSACTION như được mô tả Sử dụng giao diện được lập phiên bản Phương thức.

Trước tiên, dịch vụ âm thanh gọi onAudioFocusChangeWithMetaData và sau đó thử lại bằng phương thức onAudioFocusChange nếu UNKNOWN_TRANSACTION kết quả lỗi.

Giảm âm thanh trên ô tô bằng siêu dữ liệu của bản nhạc

Phiên bản 2.0 của HAL bộ điều khiển âm thanh AIDL đã thêm siêu dữ liệu của bản phát thông tin về cách 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;
}

Ngừng sử dụng usagesHoldingFocus. Giờ đây, nhà phát triển sẽ sử dụng playbackMetaDataHoldingFocus để xác định việc sử dụng thuộc tính âm thanh và thông tin về âm thanh. Tuy nhiên, tham số usagesHoldingFocus vẫn chứa thông tin bắt buộc cho đến khi tuỳ chọn này chính thức bị xoá.

Lệnh gọi lại mức tăng âm thanh

Để các thay đổi về âm thanh bên dưới HAL (Lớp trừu tượng phần cứng) dễ thấy hơn đối với AAOS trong Android 13, chúng tôi đã thêm một cơ chế mà bạn có thể dùng để giao tiếp âm thanh nhận được những thay đổi từ hệ thống âm thanh của ô tô sang dịch vụ âm thanh của ô tô. Chiến lược phát hành đĩa đơn cơ chế hiển thị những thay đổi về chỉ mục âm lượng khuếch đại âm thanh kèm theo lý do tương ứng độ lợi đã thay đổi:

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

Những thay đổi này phơi bày những hạn chế này từ bên dưới HAL đến 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 sau, hiển thị một giao diện người dùng hệ thống khả thi, được mở rộng hơn nữa trong Android 14 giúp các ứng dụng giao diện người dùng hệ thống dễ dàng nhận được thông tin này thông qua cơ chế gọi lại thông tin về nhóm khoảng không quảng cáo.

API HAL API đ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 bật trong tài liệu API, lệnh gọi lại độ lợi được đăng ký bằng dịch vụ âm thanh ô tô sang HAL (Lớp trừu tượng phần cứng) điều khiển âm thanh. Khi API được gọi từ HAL điều khiển âm thanh, dịch vụ âm thanh trên ô tô sẽ phản hồi bằng một hành động tương ứng (chẳng hạn như chặn, giới hạn hoặc chỉ số mức tăng 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 đối với nhận được trạng thái lập chỉ mục. Theo các yêu cầu của quy định, hệ thống âm thanh của xe 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 xe ô tô để 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 (Lớp trừu tượng phần cứng) cho tính năng điều khiển âm thanh AIDL của Android 14 là cập nhật lên phiên bản 3.0 để cập nhật các API nhằm cung cấp mức tăng âm thanh mạnh mẽ hơn chức năng lập chỉ mục. API HAL để kiểm soát âm thanh cho phép dịch vụ âm thanh đặt và huỷ đặt mộ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 đăng ký bởi dịch vụ âm thanh ô tô khi dịch vụ bắt đầu hoặc khi khôi phục từ lỗi. Ví dụ: tính năng điều khiển âm thanh Dịch vụ âm thanh ô tô nhận được thông báo chết liên kết HAL. Âm thanh Việc triển khai HAL kiểm soát 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 phải xoá lệnh gọi lại hiện có hoặc không làm gì nếu không có lệnh gọi lại. Đây là một phương pháp hay để quá trình triển khai kiểm soát âm thanh để đăng ký đối tượng tiếp nhận dữ liệu bị buộc tắt cho lệnh gọi lại và sau đó xoá lệnh gọi lại nếu lệnh tắt liên kết đượ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, sẵn sàng nhận các thay đổi về cổng âm thanh thông qua API onAudioPortChanged. Chiến lược phát hành đĩa đơn Có thể sử dụng API để tăng mức tăng âm lượng cho hệ thống âm thanh ngay khi đã đăng ký. Đối với những thay đổi khác về mức tăng động, API có thể được gọi bất cứ lúc nào. Các thay đổi tương ứng sẽ được áp dụng và dịch vụ âm thanh trên ô tô sẽ được cập nhật cho phù hợp.