Post not yet marked as solved
Post marked as unsolved with 0 replies, 162 views
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.