Kể từ Android 14, các đối tác và nhà cung cấp SoC nên thay thế việc triển khai HIDL HAL hiện tại bằng việc triển khai AIDL HAL.
Để tạo điều kiện chuyển đổi suôn sẻ từ HIDL Audio HAL sang AIDL Audio HAL, một số điểm khác biệt chính được nêu bật trên trang này. Trang này cũng cho thấy mối liên kết giữa các giao diện AIDL và HIDL cho HAL âm thanh.
Sự khác biệt giữa việc triển khai AIDL và HIDL Audio HAL
Dưới đây là những điểm khác biệt chính giữa cấu trúc HIDL và cấu trúc AIDL:
Trong AIDL Audio Core HAL, giao diện
IConfig
được giới thiệu để thay thế cho các tham số trên toàn hệ thống trong tệp XML trong HIDL HAL. Khung này đọc các tham số này từ Core HAL thay vì tệp cấu hình của nhà cung cấp. Ví dụ: danh sách các định dạng âm thanh vòm xuất hiện trong chế độ kiểm soát của người dùng do phương thứcIConfig.getSurroundSoundConfig
trong Core HAL cung cấp.Trong AIDL Audio Effects HAL, logic
effectProxy
được xác định trong các tệp XML trong HIDL Effects HAL sẽ được chuyển sang khung âm thanh. Khung âm thanh truy vấn tất cả các thực thể hiệu ứng trong hệ thống bằng cách sử dụngIFactory.queryEffects
và tất cả các quy trình xử lý hiệu ứng bằng cách sử dụngIFactory.queryProcessing
.Để tránh nhầm lẫn khi sử dụng thuật ngữ thiết bị cho các loại thiết bị âm thanh,
IDevice
trong HIDL Audio HAL được đổi tên thànhIModule
trong AIDL Audio HAL.AIDL Audio HAL sẽ thay thế
IPrimaryDevice
. Khung này gửi thông tin cập nhật về chế độ âm thanh hiện tại và hướng xoay màn hình đến mọi thực thểIModule
. Giao diệnIBluetooth
chuyên dụng xử lý các thông số liên quan đến kết nối đồng bộ Bluetooth (BT SCO) và Cấu hình rảnh tay (HFP). Giao diệnITelephony
chuyên dụng cung cấp các chế độ kiểm soát dành riêng cho điện thoại. Bạn có thể truy xuất các thực thể của cả hai giao diện này từ thực thể chính của giao diệnIModule
. Hãy xem bảng so sánh về HAL cốt lõi và Chức năng liên quan đến tính năng để biết thêm thông tin.IDevicesFactory
sẽ bị xoá trong AIDL Audio HAL để tránh dư thừa. Các mô-đun HAL (tức là các thực thể giao diệnIModule
) hiện được đăng ký trực tiếp với Trình quản lý dịch vụ bằng cách sử dụng tên của các thực thể mô-đun, chẳng hạn nhưbluetooth
hoặcr_submix
. Ngoại lệ duy nhất là mô-đunprimary
đăng ký theo tên thực thểdefault
.
Ánh xạ HAL âm thanh AIDL và HIDL
Các bảng trong các phần sau đây cho thấy mối liên kết giữa các giao diện HIDL và AIDL Audio HAL. Hãy xem Audio HAL để biết thêm thông tin về cấu trúc thư mục.
HAL cốt lõi
Tất cả giao diện HIDL đều nằm trong gói android.hardware.audio@N.M
, trong đó N.M
biểu thị phiên bản Major.Minor. Tất cả giao diện AIDL đều nằm trong gói android.hardware.audio.core
.
Giao diện API HIDL và tệp cấu hình | Giao diện API AIDL |
---|---|
IDevicesFactory |
Đăng ký IModule bằng tài khoản ServiceManager . |
IDevice |
IModule |
IPrimaryDevice |
ITelephony IBluetooth |
IStream IStreamIn
IStreamOut |
StreamDescriptor IStreamIn
IStreamCommon
IStreamOut |
audio_policy_configuration.xml
audio_policy_engine_configuration.xml |
IConfig IModule |
Tệp Chính sách âm thanh có thể định cấu hình | Sử dụng chế độ triển khai HIDL cho Android 14. |
Cổng âm thanh, hồ sơ động, tuyến đường và bản vá
Trong bảng này, các phần tử của tệp XML được chỉ định bằng dấu ngoặc nhọn.
Các phương thức giao diện API HIDL và các phần tử tệp cấu hình | Các phương thức giao diện API AIDL |
---|---|
<attachedDevices>
<defaultOutputDevice>
<mixPorts>
<devicePorts> |
IModule.getAudioPorts |
IDevice.getAudioPort
IDevice.setConnectedState |
IModule.connectExternalDevice
IModule.disconnectExternalDevice |
IStream.getSupportedProfiles |
IModule.connectExternalDevice |
<routes > |
IModule.getAudioRoutes |
IDevice.createAudioPatch
IDevice.updateAudioPatch
IDevice.releaseAudioPatch
IStream.getDevices
IStream.setDevices
Quy cách kỹ thuật của thiết bị trong IDevice.openInputStream
IDevice.openOutputStream |
IModule.setAudioPatch
IModule.setAudioPortConfig
IModule.resetAudioPatch |
Cấu hình và luồng cổng âm thanh
Các phương thức giao diện HIDL API | Các phương thức giao diện API AIDL |
---|---|
IStream.getAudioProperties
IStream.setAudioProperties
IStreamIn.getAudioSource |
IModule.getAudioPortConfigs
IModule.setAudioPortConfig |
IDevice.openInputStream
IDevice.openOutputStream
IStreamIn.prepareForReading
IStreamOut.prepareForWriting
IStream.createMmapBuffer |
IModule.openInputStream
IModule.openOutputStream |
IStream.close |
IStreamCommon.close |
IStreamIn.updateSinkMetadata
IStreamOut.updateSourceMetadata |
IStreamIn.updateMetadata
IStreamOut.updateMetadata |
IStream.standby |
StreamDescriptor.Command.standby |
IStream.pause IStream.resume |
StreamDescriptor.Command.pause .start |
IStream.start IStream.stop (Dòng MMAP) |
StreamDescriptor.Command.start hoặc .burst
.pause (đầu vào) và/hoặc .flush (đầu ra) |
IStreamOut.drain IStreamOut.flush |
StreamDescriptor.Command.drain .flush |
IStreamOut.setCallback
IStreamOut.clearCallback |
IModule.openOutputStream
IStreamCommon.close |
IStreamOut.getPresentationPosition và IStreamIn.getCapturePosition
IStreamOut.getLatency
IStream.getMmapPosition
IStreamIn.getInputFramesLost |
StreamDescriptor.Reply.observable
StreamDescriptor.Reply.latencyMs
StreamDescriptor.Reply.hardware
StreamDescriptor.Reply.xrunFrames |
IDevice.getInputBufferSize
IStreamOut.getLatency
IStream.getBufferSize
IStream.getFrameSize
IStream.getFrameCount |
IModule.setAudioPatch , độ trễ danh nghĩa và kích thước vùng đệm tối thiểu là một phần của cấu trúc AudioPatch do HAL trả về.
Kích thước vùng đệm thực tế theo khung hình là một phần của cấu trúc StreamDescriptor , cùng với kích thước khung hình tính bằng byte. Bạn có thể tính kích thước bộ nhớ đệm theo byte bằng cách nhân hai số này. |
Kết nối Hiệu ứng âm thanh
Các phương thức giao diện HIDL API | Các phương thức giao diện API AIDL |
---|---|
IDevice.addDeviceEffect
IDevice.removeDeviceEffect |
IModule.addDeviceEffect
IModule.removeDeviceEffect |
IStream.addEffect
IStream.removeEffect |
IStreamCommon.addEffect
IStreamCommon.removeEffect |
Cấu hình trên toàn hệ thống
Cấu hình trên toàn hệ thống được xác định trước đó trong các tệp cấu hình XML chính sách âm thanh (cụ thể là audio_policy_configuration.xml
và audio_policy_engine_configuration.xml
) phải được cung cấp thông qua IConfig
.
Tuy nhiên, để dễ dàng chuyển đổi sang AIDL, các nhà cung cấp vẫn có thể sử dụng cùng một tệp XML mà họ đã dùng trước đây để đặt cấu hình trên toàn hệ thống. Phương thức triển khai tham chiếu cho IConfig
chứa mã cần thiết để biểu thị thông tin từ tệp XML bằng các loại dữ liệu AIDL, giúp chuyển đổi từ XML sang AIDL.
Các phần tử trong tệp cấu hình HIDL | Các phương thức giao diện API AIDL |
---|---|
<globalConfiguration>
<speaker_drc_enabled> <call_screen_mode_supported>
<engine_library> |
Được chia thành 2 phương thức riêng biệt:
ITelephony.getSupportedAudioModes
IConfig.getEngineConfig |
<volumes> , HOẶC
<volumeGroups> , <ProductStrategies>
|
IConfig.getEngineConfig |
<surroundSound> |
IConfig.getSurroundSoundConfig |
-
speaker_drc_enabled
sẽ bị xoá khỏi tệp cấu hình vì mục cấu hình này không được dùng trong hệ thống. Tất cả thiết bị đều phải bật DRC. <ahref="#fnref1" rev="footnote"> </ahref="#fnref1">
Chức năng liên quan đến tính năng
Các phương thức giao diện HIDL API | Giao diện API AIDL |
---|---|
IDevice.setMasterVolume
IDevice.getMasterVolume
IDevice.setMicMute
IDevice.getMicMute
IDevice.setMasterMute
IDevice.getMasterMute |
IModule.\* |
IPrimaryDevice.getTtyMode
IPrimaryDevice.setTtyMode
IPrimaryDevice.getHacEnabled
IPrimaryDevice.setHacEnabled
IPrimaryDevice.setVoiceVolume |
ITelephony.TelecomConfig.\* |
IPrimaryDevice.setBtScoHeadsetDebugName
IPrimaryDevice.getBtScoNrecEnabled
IPrimaryDevice.setBtScoNrecEnabled
IPrimaryDevice.getBtScoWidebandEnabled
IPrimaryDevice.setBtScoWidebandEnabled,
IPrimaryDevice.getBtHfpEnabled
IPrimaryDevice.setBtHfpEnabled
IPrimaryDevice.setBtHfpSampleRate
IPrimaryDevice.setBtHfpVolume |
IBluetooth.ScoConfig.\*
IBluetooth.HfpConfig.\* |
IPrimaryDevice.setMode
IPrimaryDevice.updateRotation |
ITelephony.switchAudioMode
IModule.updateAudioMode
IModule.updateScreenRotation |
IDevice.setScreenState
IDevice.getMicrophones |
IModule.updateScreenState
IModule.getMicrophones |
IDevice.getHwAvSync
IStream.setHwAvSync |
IModule.generateHwAvSyncId
IStreamCommon.updateHwAvSyncId |
IStreamIn.setGain IStreamIn.setMicrophoneDirection IStreamIn.setMicrophoneFieldDimension |
IStreamIn.setHwGain IStreamIn.setMicrophoneDirection IStreamIn.setMicrophoneFieldDimension |
IStreamOut.getDualMonoMode
IStreamOut.setDualMonoMode
IStreamOut.getPlaybackRateParameters
IStreamOut.setPlaybackRateParameters
IStreamOut.selectPresentation
IStreamOut.getAudioDescriptionMixLevel
IStreamOut.setAudioDescriptionMixLevel
IStreamOut.setLatencyMode
IStreamOut.getRecommendedLatencyModes |
IStreamOut.\* |
IStreamOut.setEventCallback
IStreamOut.setLatencyModeCallback |
IModule.openOutputStream (các lệnh gọi lại được kết hợp thành IStreamOutEventCallback ) |
IDevice.get/setParameters
IStream.get/setParameters |
IModule.get/setVendorParameters
IStreamCommon.get/setVendorParameters |
Các phương thức không còn dùng nữa
Các phương thức giao diện HIDL API | Bình luận |
---|---|
IDevice.initCheck IDevice.close |
Mô-đun HAL tự xuất bản bằng ServiceManager chỉ khi khởi tạo thành công. Tại thời điểm đó, yêu cầu sẽ được coi là vĩnh viễn và không thể đóng. |
IDevice.supportsAudioPatches
IStreamOut.supportsPauseAndResume
IStreamOut.supportsDrain |
Bạn bắt buộc phải hỗ trợ các bản vá, tính năng tạm dừng, tiếp tục và xả. |
IStreamOut.getRenderPosition
IStreamOut.getNextWriteTimestamp |
Không dùng nữa. |
Phần mở rộng của nhà cung cấp
Trong HIDL API, các tiện ích của nhà cung cấp được triển khai bằng cách sử dụng phương thức getParameters
hoặc setParameters
từ các giao diện IDevice
và IStream
. Các phương thức này chấp nhận các chuỗi tuỳ ý.
Trong AIDL API, có các phương thức tương ứng, chẳng hạn như getVendorParameters
hoặc setVendorParameters
, lấy các thực thể Parcelable
tuỳ ý bằng cách sử dụng tính năng đóng gói trong ParcelableHolders
.
Các thay đổi khác
Sau đây là những thay đổi chung khác:
Để cải thiện khả năng kiểm thử của các API HAL, trong phiên bản AIDL, chúng tôi giới thiệu các lựa chọn gỡ lỗi mà các kiểm thử VTS sử dụng và có sẵn thông qua
ModuleDebug
có thể phân chia. Các lựa chọn này hướng dẫn HAL mô phỏng một số chức năng nhất định (ví dụ: kết nối thiết bị bên ngoài), nếu không thì sẽ yêu cầu can thiệp thủ công và sử dụng thiết bị kiểm thử bên ngoài.Khi khung hoặc bộ kiểm thử VTS đặt thuộc tính hệ thống
sys.audio.restart.hal
thành1
, các dịch vụ HAL phải khởi động lại. Tệpaudioserver.rc
xử lý việc khởi động lại. Trong khi triển khai HAL, hãy sử dụng tên dịch vụ HAL thích hợp được liệt kê trong tệpaudioserver.rc
. Trong Android 14, tênvendor.audio-hal-aidl
được thêm riêng cho phiên bản AIDL của HAL.
HAL hiệu ứng
Tất cả các giao diện HIDL đều nằm trong gói android.hardware.audio.effect@N.M*
, trong đó N.M
là phiên bản Major.Minor. Tất cả các giao diện AIDL đều nằm trong gói android.hardware.audio.effect
.
Giao diện API HIDL và tệp cấu hình | Giao diện API AIDL |
---|---|
IEffectsFactory |
IFactory |
IEffect |
IEffect |
audio_effects.xml |
IEffect |
Effect Factory
Các giao diện HIDL API (android.hardware.audio.effect@X.X) |
Các giao diện API AIDL (android.hardware.audio.effect) |
---|---|
IEffectsFactory.getAllDescriptors |
IFactory.queryEffects có tham số UUID rỗng |
IEffectsFactory.getDescriptor |
IFactory.queryEffects có tham số UUID |
IEffectsFactory.createEffect |
IFactory.createEffect |
audio_effects.xml |
IFactory.queryProcessing
IFactory.queryEffects |
Giao diện hiệu ứng
Các giao diện HIDL API (android.hardware.audio.effect@X.X) |
Các giao diện API AIDL (android.hardware.audio.effect) |
---|---|
IEffect.init |
IEffect.open |
IEffect.setConfig |
IEffect.setParameter |
IEffect.enable |
IEffect.command(CommandId::START) |
IEffect.disable |
IEffect.command(CommandId::STOP) |
IEffect.reset |
IEffect.command(CommandId::RESET) |
IEffect.getDescriptor |
IEffect.getDescriptor |
IEffect.command |
Ánh xạ đến IEffect.command , IEffect.setParameter hoặc IEffect.getParameter dựa trên loại lệnh HIDL cũ
|
Không áp dụng | IEffect.getState |
IEffect.setParameter |
IEffect.setParameter |
IEffect.getParameter |
IEffect.getParameter |
Lệnh hiệu ứng
Các giao diện HIDL API (android.hardware.audio.effect@X.X) |
Các giao diện API AIDL (android.hardware.audio.effect) |
---|---|
EFFECT_CMD_INIT |
IEffect.open |
EFFECT_CMD_RESET |
CommandId.RESET |
EFFECT_CMD_ENABLE |
IEffect.command(CommandId::START) |
EFFECT_CMD_DISABLE |
IEffect.command(CommandId::STOP) |
EFFECT_CMD_SET_PARAM_DEFERRED |
Ngừng sử dụng trong HAL AIDL về hiệu ứng |
EFFECT_CMD_SET_PARAM_COMMIT |
Ngừng sử dụng trong HAL AIDL về hiệu ứng |
EFFECT_CMD_SET_CONFIG
EFFECT_CMD_SET_PARAM
EFFECT_CMD_SET_DEVICE
EFFECT_CMD_SET_VOLUME
EFFECT_CMD_SET_AUDIO_MODE
EFFECT_CMD_SET_CONFIG_REVERSE
EFFECT_CMD_SET_INPUT_DEVICE
EFFECT_CMD_SET_FEATURE_CONFIG
EFFECT_CMD_SET_AUDIO_SOURCE |
IEffect.setParameter |
EFFECT_CMD_GET_PARAM
EFFECT_CMD_GET_CONFIG
EFFECT_CMD_GET_CONFIG_REVERSE
EFFECT_CMD_GET_FEATURE_SUPPORTED_CONFIGS
EFFECT_CMD_GET_FEATURE_CONFIG
VISUALIZER_CMD_MEASURE
EFFECT_CMD_FIRST_PROPRIETARY
(tương tự như VISUALIZER_CMD_CAPTURE ) |
IEffect.getParameter |
EFFECT_CMD_OFFLOAD |
Không được dùng nữa.
Trong AIDL, các chế độ chuyển đổi tải và không tải được xử lý trong khung. |
EFFECT_CMD_DUMP |
Được xử lý bằng giao dịch liên kết tích hợp AIBinder_dump . |
Định nghĩa thông số hiệu ứng chung
Định nghĩa HIDL (android.hardware.audio.effect@X.X) |
Định nghĩa AIDL |
---|---|
Types.hal |
Flags.aidl
Parameter.aidl
|
Định nghĩa về hiệu ứng cụ thể
Các giao diện HIDL API (android.hardware.audio.effect@X.X) |
Các giao diện API AIDL (android.hardware.audio.effect) |
---|---|
I$EffectType$.hal |
$EffectType$.aidl |