forked from AudioKit/AudioKit
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathLoop.swift
52 lines (47 loc) · 1.66 KB
/
Loop.swift
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
//
// Loop.swift
// AudioKitParticles
//
// Created by Aurelius Prochazka, revision history on Githbub.
// Copyright © 2016 Simon Gladman. All rights reserved.
//
import QuartzCore
/// Class to handle updating via CADisplayLink
open class Loop {
fileprivate var internalHandler: () -> Void = {}
fileprivate var trigger = 60
fileprivate var counter = 0
/// Repeat this loop at a given period with a code block
///
/// - parameter every: Period, or interval between block executions
/// - parameter handle: Code block to execute
///
public init(every duration: Double, handler:@escaping () -> Void) {
trigger = Int(60 * duration)
internalHandler = handler
let displayLink = CADisplayLink(target: self, selector: #selector(update))
displayLink.preferredFramesPerSecond = 60
displayLink.add(to: RunLoop.current, forMode: RunLoopMode.commonModes)
}
/// Repeat this loop at a given frequency with a code block
///
/// - parameter frequency: Frequency of block executions in Hz
/// - parameter handle: Code block to execute
///
public init(frequency: Double, handler:@escaping () -> Void) {
trigger = Int(60 / frequency)
internalHandler = handler
let displayLink = CADisplayLink(target: self, selector: #selector(update))
displayLink.preferredFramesPerSecond = 60
displayLink.add(to: RunLoop.current, forMode: RunLoopMode.commonModes)
}
/// Callback function for CADisplayLink
@objc func update() {
if counter < trigger {
counter += 1
return
}
counter = 0
self.internalHandler()
}
}