การเปรียบเทียบ AIDL และ HIDL Audio HAL

เริ่มตั้งแต่ Android 14 เป็นต้นไป พาร์ทเนอร์และผู้จำหน่าย SoC ได้รับการสนับสนุนให้แทนที่การใช้งาน HIDL HAL ในปัจจุบันด้วยการใช้งาน AIDL HAL

เพื่ออำนวยความสะดวกในการเปลี่ยนจาก HIDL Audio HAL ไปเป็น AIDL Audio HAL ได้อย่างราบรื่น จึงมีการเน้นความแตกต่างที่สำคัญบางประการในหน้านี้ หน้านี้ยังแสดงการแมประหว่างอินเทอร์เฟซ AIDL และ HIDL สำหรับ Audio HAL

ความแตกต่างระหว่างการใช้งาน AIDL และ HIDL Audio HAL

ความแตกต่างที่สำคัญระหว่างโครงสร้าง HIDL และโครงสร้าง AIDL มีดังนี้:

  • ใน AIDL Audio Core HAL อินเทอร์เฟซ IConfig ถูกนำมาใช้เพื่อแทนที่พารามิเตอร์ทั้งระบบในไฟล์ XML ใน HIDL HAL กรอบงานอ่านพารามิเตอร์เหล่านี้จาก Core HAL แทนไฟล์การกำหนดค่าของผู้จำหน่าย ตามตัวอย่าง รายการของรูปแบบเซอร์ราวด์ที่แสดงสำหรับการควบคุมของผู้ใช้นั้นจัดทำโดยเมธอด IConfig.getSurroundSoundConfig ใน Core HAL

    ใน AIDL Audio Effects HAL ตรรกะ effectProxy ที่กำหนดในไฟล์ XML ใน HIDL Effects HAL จะถูกย้ายไปยังเฟรมเวิร์กเสียง เฟรมเวิร์กเสียงจะสอบถามอินสแตนซ์เอฟเฟกต์ทั้งหมดในระบบโดยใช้ IFactory.queryEffects และการประมวลผลเอฟเฟกต์ทั้งหมดโดยใช้ IFactory.queryProcessing

  • เพื่อหลีกเลี่ยงความสับสนกับการใช้คำว่า อุปกรณ์ สำหรับประเภทอุปกรณ์เสียง IDevice ใน HIDL Audio HAL จะถูกเปลี่ยนชื่อเป็น IModule ใน AIDL Audio HAL

  • IPrimaryDevice ถูกแทนที่ด้วย AIDL Audio HAL การอัปเดตเกี่ยวกับโหมดเสียงปัจจุบันและการหมุนหน้าจอจะถูกส่งไปยังทุกอินสแตนซ์ IModule พารามิเตอร์ที่เกี่ยวข้องกับการเชื่อมต่อแบบซิงโครนัส Bluetooth (BT SCO) และโปรไฟล์แฮนด์ฟรี (HFP) ได้รับการจัดการโดยอินเทอร์เฟ IBluetooth เฉพาะ อินเทอร์เฟ ITelephony เฉพาะให้การควบคุมเฉพาะระบบโทรศัพท์ อินสแตนซ์ของอินเทอร์เฟซทั้งสองนี้สามารถดึงข้อมูลจากอินสแตนซ์หลักของอินเทอร์เฟซ IModule ดูตารางเปรียบเทียบเกี่ยวกับ Core HAL และ ฟังก์ชันที่เกี่ยวข้องกับฟีเจอร์ สำหรับข้อมูลเพิ่มเติม

  • IDevicesFactory จะถูกลบใน AIDL Audio HAL เพื่อหลีกเลี่ยงความซ้ำซ้อน โมดูล HAL (นั่นคือ อินสแตนซ์อินเทอร์เฟซ IModule ) ขณะนี้ได้รับการลงทะเบียนโดยตรงกับ Service Manager โดยใช้ชื่อสำหรับชื่ออินสแตนซ์ เช่น bluetooth หรือ r_submix ข้อยกเว้นเพียงอย่างเดียวคือโมดูล primary ที่ลงทะเบียนภายใต้ชื่ออินสแตนซ์ default

การทำแผนที่ AIDL และ HIDL Audio HAL

ตารางในส่วนต่อไปนี้แสดงการจับคู่ระหว่างอินเทอร์เฟซ HIDL และ AIDL Audio HAL ดู ไฟล์เสียง HAL README สำหรับข้อมูลเพิ่มเติมเกี่ยวกับโครงสร้างไดเร็กทอรี

คอร์ ฮาล

อินเทอร์เฟซ HIDL ทั้งหมดอยู่ภายในแพ็คเกจ android.hardware.audio@NM โดยที่ NM หมายถึงเวอร์ชัน Major.Minor อินเทอร์เฟซ AIDL ทั้งหมดอยู่ในแพ็คเกจ android.hardware.audio.core

อินเทอร์เฟซ HIDL API และไฟล์การกำหนดค่า อินเทอร์เฟซ AIDL API
IDevicesFactory การลงทะเบียน IModule กับ ServiceManager
IDevice IModule
IPrimaryDevice ITelephony
IBluetooth
IStream
IStreamIn
IStreamOut
StreamDescriptor
IStreamIn
IStreamCommon
IStreamOut
audio_policy_configuration.xml
audio_policy_engine_configuration.xml
IConfig
IModule
ไฟล์นโยบายเสียงที่กำหนดค่าได้ ใช้การใช้งาน HIDL สำหรับ Android 14

พอร์ตเสียง โปรไฟล์ไดนามิก เส้นทาง และแพตช์

ในตารางนี้ องค์ประกอบของไฟล์ XML ถูกกำหนดโดยใช้วงเล็บมุม

วิธีการอินเทอร์เฟซ HIDL API และองค์ประกอบไฟล์การกำหนดค่า วิธีการอินเทอร์เฟซ AIDL API
<attachedDevices>
<defaultOutputDevice>
<mixPorts>
<devicePorts>
IModule.getAudioPorts
IDevice.getAudioPort
IDevice.setConnectedState
IModule.getAudioPort
IModule.connectExternalDevice
IModule.disconnectExternalDevice
IStream.getSupportedProfiles IModule.connectExternalDevice
< routes > IModule.getAudioRoutes
IDevice.createAudioPatch
IDevice.updateAudioPatch
IDevice.releaseAudioPatch
IStream.getDevices
IStream.setDevices
ข้อมูลจำเพาะของอุปกรณ์ใน IDevice.openInputStream
IDevice.openOutputStream
IModule.setAudioPatch
IModule.setAudioPortConfig
IModule.resetAudioPatch

การกำหนดค่าพอร์ตเสียงและสตรีม

วิธีการอินเทอร์เฟซ HIDL API วิธีการอินเทอร์เฟซ AIDL API
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
IStream.start
IStream.stop
StreamDescriptor.Command.pause
.start
.start
.drain
IStreamOut.drain
IStreamOut.flush
StreamDescriptor.Command.drain
.flush
IStreamOut.setCallback
IStreamOut.clearCallback
IModule.openOutputStream
IStreamCommon.close
IStreamOut.getPresentationPosition และ 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 เวลาแฝงที่กำหนด และขนาดบัฟเฟอร์ขั้นต่ำเป็นส่วนหนึ่งของโครงสร้าง AudioPatch ที่ส่งคืนโดย HAL ขนาดบัฟเฟอร์จริงในเฟรมเป็นส่วนหนึ่งของโครงสร้าง StreamDescriptor พร้อมด้วยขนาดเฟรมเป็นไบต์ ขนาดบัฟเฟอร์เป็นไบต์สามารถคำนวณได้โดยการคูณตัวเลขทั้งสองนี้

การเชื่อมต่อเอฟเฟกต์เสียง

วิธีการอินเทอร์เฟซ HIDL API วิธีการอินเทอร์เฟซ AIDL API
IDevice.addDeviceEffect
IDevice.removeDeviceEffect
IModule.addDeviceEffect
IModule.removeDeviceEffect
IStream.addEffect
IStream.removeEffect
IStreamCommon.addEffect
IStreamCommon.removeEffect

การกำหนดค่าทั้งระบบ

การกำหนดค่าทั้งระบบที่กำหนดไว้ก่อนหน้านี้ในไฟล์การกำหนดค่า XML นโยบายเสียง (กล่าวคือ audio_policy_configuration.xml และ audio_policy_engine_configuration.xml ) จะต้องจัดเตรียมผ่าน IConfig อย่างไรก็ตาม เพื่อให้การเปลี่ยนไปใช้ AIDL ง่ายขึ้น ผู้จำหน่ายยังคงมีตัวเลือกในการใช้ไฟล์ XML เดียวกันกับที่เคยใช้ในการตั้งค่าการกำหนดค่าทั้งระบบ การใช้งานอ้างอิงสำหรับ IConfig มีโค้ดที่จำเป็นสำหรับการแสดงข้อมูลจากไฟล์ XML โดยใช้ประเภทข้อมูล AIDL ซึ่งอำนวยความสะดวกในการแปลงจาก XML เป็น AIDL

องค์ประกอบไฟล์การกำหนดค่า HIDL วิธีการอินเทอร์เฟซ AIDL API
<globalConfiguration>
<speaker_drc_enabled> 1

<call_screen_mode_supported>
<engine_library>
แยกออกเป็น 2 วิธี คือ
ITelephony.getSupportedAudioModes
IConfig.getEngineConfig
<volumes> , หรือ
<volumeGroups> , <ProductStrategies>
IConfig.getEngineConfig
<surroundSound> IConfig.getSurroundSoundConfig

  1. speaker_drc_enabled ถูกลบออกจากไฟล์การกำหนดค่าเนื่องจากไม่ได้ใช้รายการการกำหนดค่านี้ภายในระบบ อุปกรณ์ทั้งหมดต้องเปิดใช้งาน DRC

ฟังก์ชั่นที่เกี่ยวข้องกับคุณสมบัติ

วิธีการอินเทอร์เฟซ HIDL API อินเทอร์เฟซ AIDL API
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 (การเรียกกลับจะรวมกันเป็น IStreamOutEventCallback )
IDevice.get/setParameters
IStream.get/setParameters
IModule.get/setVendorParameters
IStreamCommon.get/setVendorParameters

วิธีการล้าสมัย

วิธีการอินเทอร์เฟซ HIDL API ความคิดเห็น
IDevice.initCheck
IDevice.close
โมดูล HAL จะเผยแพร่ตัวเองด้วย ServiceManager เมื่อเริ่มต้นได้สำเร็จเท่านั้น เมื่อถึงจุดนั้นถือว่าถาวรและไม่สามารถปิดได้
IDevice.supportsAudioPatches
IStreamOut.supportsPauseAndResume
IStreamOut.supportsDrain
จำเป็นต้องรองรับแพตช์ หยุดชั่วคราว ดำเนินการต่อ และระบาย
IStreamOut.getRenderPosition
IStreamOut.getNextWriteTimestamp
ล้าสมัย.

ส่วนขยายของผู้ขาย

ใน HIDL API ส่วนขยายของผู้จำหน่ายจะถูกนำไปใช้โดยใช้ getParameters หรือ setParameters จากอินเทอร์เฟซ IDevice และ IStream วิธีการเหล่านี้ยอมรับสตริงที่กำหนดเอง ใน AIDL API มีวิธีการที่เกี่ยวข้อง เช่น getVendorParameters หรือ setVendorParameters ซึ่งรับอินสแตนซ์ Parcelable ที่กำหนดเองโดยใช้การห่อหุ้มภายใน ParcelableHolders

การเปลี่ยนแปลงอื่นๆ

การเปลี่ยนแปลงทั่วไปอื่นๆ มีดังนี้:

  1. เพื่อปรับปรุงความสามารถในการทดสอบของ HAL API ในเวอร์ชัน AIDL เราขอแนะนำตัวเลือกการดีบักที่ใช้โดยการทดสอบ VTS และพร้อมใช้งานผ่าน ModuleDebug แบบแยกส่วนได้ ตัวเลือกเหล่านี้สั่งให้ HAL จำลองการทำงานบางอย่าง (เช่น การเชื่อมต่ออุปกรณ์ภายนอก) ซึ่งจำเป็นต้องมีการแทรกแซงด้วยตนเองและใช้อุปกรณ์ทดสอบภายนอก

  2. บริการ HAL จำเป็นต้องรีสตาร์ทเมื่อค่าของคุณสมบัติระบบ sys.audio.restart.hal ถูกตั้งค่าเป็น 1 การรีสตาร์ททำได้ผ่าน audioserver.rc ขณะใช้งาน HAL ให้ใช้ชื่อบริการ HAL ที่เหมาะสมซึ่งแสดงอยู่ในไฟล์ audioserver.rc ใน Android 14 ชื่อ vendor.audio-hal-aidl จะถูกเพิ่มสำหรับ HAL เวอร์ชัน AIDL โดยเฉพาะ

เอฟเฟ็กต์ HAL

อินเทอร์เฟซ HIDL ทั้งหมดอยู่ภายในแพ็คเกจ android.hardware.audio.effect@NM* โดยที่ NM คือเวอร์ชัน Major.Minor อินเทอร์เฟซ AIDL ทั้งหมดอยู่ภายในแพ็คเกจ android.hardware.audio.effect

อินเทอร์เฟซ HIDL API และไฟล์การกำหนดค่า อินเทอร์เฟซ AIDL API
IEffectsFactory IFactory
IEffect IEffect
audio_effects.xml IEffect

โรงงานเอฟเฟกต์

อินเทอร์เฟซ HIDL API
(android.hardware.audio.effect@XX)
อินเทอร์เฟซ AIDL API
(android.hardware.audio.เอฟเฟกต์)
IEffectsFactory.getAllDescriptors IFactory.queryEffects พร้อมพารามิเตอร์ UUID ที่เป็นโมฆะ
IEffectsFactory.getDescriptor IFactory.queryEffects พร้อมพารามิเตอร์ UUID
IEffectsFactory.createEffect IFactory.createEffect
audio_effects.xml IFactory.queryProcessing
IFactory.queryEffects

อินเทอร์เฟซเอฟเฟกต์

อินเทอร์เฟซ HIDL API
(android.hardware.audio.effect@XX)
อินเทอร์เฟซ AIDL API
(android.hardware.audio.เอฟเฟกต์)
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 แผนที่ไปยัง IEffect.command
IEffect.setParameter หรือ
IEffect.getParameter ขึ้นอยู่กับประเภทของคำสั่ง HIDL เดิม
ไม่มี IEffect.getState
IEffect.setParameter IEffect.setParameter
IEffect.getParameter IEffect.getParameter

คำสั่งเอฟเฟกต์

อินเทอร์เฟซ HIDL API
(android.hardware.audio.effect@XX)
อินเทอร์เฟซ AIDL API
(android.hardware.audio.เอฟเฟกต์)
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 เลิกใช้แล้วในเอฟเฟกต์ AIDL HAL
EFFECT_CMD_SET_PARAM_COMMIT เลิกใช้แล้วในเอฟเฟกต์ AIDL HAL
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
(เหมือนกับ VISUALIZER_CMD_CAPTURE )
IEffect.getParameter
EFFECT_CMD_OFFLOAD เลิกใช้แล้ว
ใน AIDL สวิตช์โหมดออฟโหลดและโหมดไม่ออฟโหลดได้รับการจัดการในเฟรมเวิร์ก
EFFECT_CMD_DUMP จัดการโดยธุรกรรม Binder ใน AIBinder_dump

คำจำกัดความของพารามิเตอร์เอฟเฟกต์ทั่วไป

คำนิยาม HIDL
(android.hardware.audio.effect@XX)
คำจำกัดความของ AIDL
Types.hal Flags.aidl
Parameter.aidl

คำจำกัดความเอฟเฟกต์เฉพาะ

อินเทอร์เฟซ HIDL API
(android.hardware.audio.effect@XX)
อินเทอร์เฟซ AIDL API
(android.hardware.audio.เอฟเฟกต์)
I $EffectType$ .hal $EffectType$ .aidl