การเปรียบเทียบ 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 เฟรมเวิร์กจะอ่าน พารามิเตอร์เหล่านี้จาก 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

  • AIDL Audio HAL จะมาแทนที่ IPrimaryDevice เฟรมเวิร์กจะส่งข้อมูลอัปเดต เกี่ยวกับโหมดเสียงปัจจุบันและการหมุนหน้าจอไปยังอินสแตนซ์ IModule ทุกรายการ อินเทอร์เฟซ IBluetooth เฉพาะจะจัดการพารามิเตอร์ที่เกี่ยวข้องกับการเชื่อมต่อแบบซิงโครนัสที่มุ่งเน้นบลูทูธ (BT SCO) และโปรไฟล์แฮนด์ฟรี (HFP) ITelephonyอินเทอร์เฟซเฉพาะมีตัวควบคุมเฉพาะการโทร คุณสามารถ เรียกข้อมูลอินสแตนซ์ของอินเทอร์เฟซทั้ง 2 นี้จากอินสแตนซ์หลักของ อินเทอร์เฟซ 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 เสียง

HAL หลัก

อินเทอร์เฟซ HIDL ทั้งหมดอยู่ในแพ็กเกจ android.hardware.audio@N.M โดยที่ N.M หมายถึงเวอร์ชัน 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
StreamDescriptor.Command.pause
.start
IStream.start
IStream.stop
(สตรีม MMAP)
StreamDescriptor.Command.start หรือ .burst
.pause (อินพุต) และ/หรือ .flush (เอาต์พุต)
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 พร้อมกับขนาดเฟรมในหน่วยไบต์ ขนาดบัฟเฟอร์เป็นไบต์สามารถคำนวณได้โดยการคูณตัวเลข 2 ตัวนี้

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

เมธอดอินเทอร์เฟซ 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 <ahref="#fnref1" rev="footnote"> </ahref="#fnref1">

ฟังก์ชันการทำงานที่เกี่ยวข้องกับฟีเจอร์

เมธอดอินเทอร์เฟซ 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

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

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

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

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

HAL ของเอฟเฟกต์

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

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

Effect Factory

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

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

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

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

อินเทอร์เฟซ HIDL API
(android.hardware.audio.effect@X.X)
อินเทอร์เฟซ AIDL API
(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 เลิกใช้งานใน 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@X.X)
คำจำกัดความของ AIDL
Types.hal Flags.aidl
Parameter.aidl

คำจำกัดความของเอฟเฟกต์ที่เฉพาะเจาะจง

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