ตั้งแต่ Android 14 เป็นต้นไป เราขอแนะนำให้พาร์ทเนอร์และผู้ให้บริการ SoC แทนที่การใช้งาน HAL ของ HIDL ปัจจุบันด้วยการใช้งาน HAL ของ AIDL
เราได้ไฮไลต์ความแตกต่างที่สำคัญบางประการในหน้านี้เพื่อช่วยให้การเปลี่ยนจาก 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 HALAIDL 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 เสียง
Core 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.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><call_screen_mode_supported>
<engine_library> |
โดยแบ่งออกเป็น 2 วิธีที่แตกต่างกัน ดังนี้
ITelephony.getSupportedAudioModes
IConfig.getEngineConfig |
<volumes> หรือ
<volumeGroups>, <ProductStrategies>
|
IConfig.getEngineConfig |
<surroundSound> |
IConfig.getSurroundSoundConfig |
-
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.setGainIStreamIn.setMicrophoneDirectionIStreamIn.setMicrophoneFieldDimension |
IStreamIn.setHwGainIStreamIn.setMicrophoneDirectionIStreamIn.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.initCheckIDevice.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ที่ส่งผ่านได้ในเวอร์ชัน AIDL เพื่อปรับปรุงความสามารถในการทดสอบของ HAL API ตัวเลือกเหล่านี้จะสั่งให้ HAL จำลองฟังก์ชันการทำงานบางอย่าง (เช่น การเชื่อมต่ออุปกรณ์ภายนอก) ซึ่งปกติแล้วจะต้องมีการแทรกแซงด้วยตนเองและใช้อุปกรณ์ทดสอบภายนอกเมื่อเฟรมเวิร์กหรือชุดการทดสอบ VTS ตั้งค่า
sys.audio.restart.halsystem 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 |
เลิกใช้งานแล้วใน Effects AIDL HAL |
EFFECT_CMD_SET_PARAM_COMMIT |
เลิกใช้งานแล้วใน Effects 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 |