I'm going to call this one fixed now, thanks for the help @Claude31. Here's the amended code for the CrossingBuffer class:
class CrossingBuffer {
private var array: [ZeroCrossing]
// NSLock Added
var lock = NSLock()
private let size: Int
private var nextWriteIndex = 0
private var full: Bool {
nextWriteIndex >= size
}
init(size: Int) {
self.size = size
array = [ZeroCrossing](repeating: ZeroCrossing(index: 0, previousPeak: 0, indexWithOffset: 0), count: size)
array.reserveCapacity(size)
}
public func write(_ val: ZeroCrossing) {
//Lock before write
lock.lock()
array[nextWriteIndex % size] = val
//Unlock
lock.unlock()
nextWriteIndex += 1
}
public func getAfterIndex(_ refIndex: Double) -> [ZeroCrossing]? {
if !full { return nil }
var subArray = [ZeroCrossing]()
let lastElementIndex = nextWriteIndex - 1
for i in 0...size - 1 {
// Was Crashing here, now wrapped in lock / unlock
lock.lock()
let thisCrossing = array[(lastElementIndex - i) % size]
lock.unlock()
if thisCrossing.indexWithOffset > refIndex {
subArray.append(thisCrossing)
} else {
break
}
}
return subArray.reversed()
}
public func reset() {
array = [ZeroCrossing](repeating: ZeroCrossing(index: 0, previousPeak: 0, indexWithOffset: 0), count: size)
nextWriteIndex = 0
}
}
Topic:
Programming Languages
SubTopic:
Swift
Tags: