ตั้งแต่ 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 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 เสียง
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ที่ส่งผ่านได้ เพื่อปรับปรุงความสามารถในการทดสอบของ HAL API ในเวอร์ชัน AIDL ตัวเลือกเหล่านี้จะสั่งให้ 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 | 
   เลิกใช้งานใน 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 |