Memory Management of 3D Audio Using the PHASE Framework

I am using 3D audio in space using the phase framework. Therefore, I am using sound echoes, etc.

So I am using the following code to play the audio.

final class PhaseManager {
  private var engine: PHASEEngine!
  private var listener: PHASEListener!
   
  init() {
    engine = PHASEEngine(updateMode: .automatic)
    engine.outputSpatializationMode = .alwaysUseChannelBased
    engine.defaultReverbPreset = .mediumRoom
     
    listener = PHASEListener(engine: engine)
    listener.transform = matrix_identity_float4x4
    try? engine.rootObject.addChild(listener)
    try? engine.start()
  }
   
  func play() {
    let spatialPipelineFlags: PHASESpatialPipeline.Flags = [.directPathTransmission, .lateReverb]
    let spatialPipeline = PHASESpatialPipeline(flags: spatialPipelineFlags)!
     
    let spatialMixerDefinition = PHASESpatialMixerDefinition(spatialPipeline: spatialPipeline)
     
    let joinSoundId = "\(Int.random(in: 0..<Int.max))"
     
    let audioFileUrl = Bundle.main.url(forResource: "sound", withExtension: "mp3")!
     
    let soundAsset = try! engine.assetRegistry.registerSoundAsset(
      url: audioFileUrl,
      identifier: joinSoundId,
      assetType: .resident,
      channelLayout: nil,
      normalizationMode: .dynamic)
     
    let samplerNodeDefinition = PHASESamplerNodeDefinition(
      soundAssetIdentifier: soundAsset.identifier,
      mixerDefinition: spatialMixerDefinition
    )
    samplerNodeDefinition.playbackMode = .oneShot
     
    let soundEventAsset = try! engine.assetRegistry.registerSoundEventAsset(rootNode: samplerNodeDefinition, identifier: nil)
     
    let source = PHASESource(engine: engine)
    source.gain = 0.02
    source.transform = matrix_identity_float4x4
     
    try! engine.rootObject.addChild(source)
     
    let mixerParameters = PHASEMixerParameters()
    mixerParameters.addSpatialMixerParameters(identifier: spatialMixerDefinition.identifier, source: source, listener: listener)
     
    let soundEvent = try! PHASESoundEvent(engine: engine, assetIdentifier: soundEventAsset.identifier, mixerParameters: mixerParameters)
     
    soundEvent.start { [weak self] _ in
      self?.engine.assetRegistry.unregisterAsset(identifier: joinSoundId) { _ in }
    }
  }
}

let manager = PhaseManager()
manager.play()

After playback is complete, memory is not released even though unregisterAsset is executed. manager.play() is performed repeatedly and t the memory is increasing proportionally.

Is there any way to free the memory?

I have already confirmed that removing the .lateReverb flag or setting source.gain = 1 will free memory, but that does not do what I want to achieve.

Memory Management of 3D Audio Using the PHASE Framework
 
 
Q