实例化效果时,AudioKit内存泄漏

时间:2020-09-16 16:04:00

标签: swift audiokit

我已经建立了一个方便包装器,用于定义/创建AudioKit效果:

public struct SQEffect {
    public var type: EffectType = .delay
    public var node: AKNode!
    public var usesSync: Bool = false
    public var dryWetMixer: AKDryWetMixer? = nil
    public var parameters: [String] = []
    
    public init(input: AKNode, type: EffectType, useSync: Bool) {
        self.type = type
        switch type {
        case .autopan:
            node = AKOperationEffect(input) { input, parameters in
                let oscillator = AKOperation.sineWave(frequency: parameters[speedIndex], amplitude: parameters[depthIndex])
                return input.pan(oscillator)
            }
            parameters = ["speed", "depth"]
        case .delay:
            var delTime = 0.33
            if useSync == true {
                let tempo = SequencerController.sharedInstance.currentTempo
                let beatDur = (60000 / tempo) / 1000
                // we'll make the default a dotted-eighth
                delTime = 0.75 * beatDur
            }
            node = AKOperationEffect(input) { input, params in
                return input.smoothDelay(time: params[0], feedback: params[1], samples: 1_024, maximumDelayTime: 10.0)
            }
            (node as! AKOperationEffect).parameters = [delTime, 0.1]
            dryWetMixer = AKDryWetMixer(input, node)
            parameters = ["time", "feedback", "dryWet_balance"]
        case .notchPeak:
            node = AKEqualizerFilter(input, centerFrequency: 250, bandwidth: 200.0, gain: 5.0)
            parameters = ["centreFreq", "bandwidth", "gain"]
        case .lowPass:
            node = AKLowPassFilter(input, cutoffFrequency: 600.0, resonance: -20.0)
            parameters = ["cutoffFreq", "resonance"]
        case .chorus:
            node = AKChorus(input, frequency: 50.0, depth: 0.3, feedback: 0.0, dryWetMix: 0.0)
            parameters = ["freq", "depth", "feedback", "dryWetMix"]
        case .flanger:
            node = AKFlanger(input, frequency: 50.0, depth: 0.3, feedback: 0.2, dryWetMix: 0.0)
            parameters = ["freq", "depth", "feedback", "dryWetMix"]
        case .reverb:
            // NOTE: We could replace this with another reverb (AKReverb2) at some point, for greater control.
            node = AKReverb(input, dryWetMix: 0.0)
            (node as! AKReverb).loadFactoryPreset(.cathedral)
            parameters = ["factoryPreset", "dryWetMix"]
        }
        self.usesSync = useSync
    }
    
    // do other stuff...
}

自定义init()正在泄漏内存,具体由Instruments在AKOperationEffect和AKEqualizerFilter中报告。有什么明显的地方我做错了吗?

0 个答案:

没有答案