我已经建立了一个方便包装器,用于定义/创建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中报告。有什么明显的地方我做错了吗?