 }
 
 /// An AKTiming implementation that uses a node for it's render time info.
-class AKNodeTiming: NSObject, AKTiming {
+open class AKNodeTiming: NSObject, AKTiming {
 
     /// An output node used for tming info.
-    weak var node: AKOutput?
+    open weak var node: AKOutput?
 
     // Used to hold current time when not playing.
     private var idleTime = Double()

        baseTime = audioTime?.offset(seconds: -idleTime).extrapolateTimeShimmed(fromAnchor: lastRenderTime)
        baseTime = baseTime ?? lastRenderTime.offset(seconds: AKSettings.ioBufferDuration)
    }
    var isPlaying: Bool {
        return baseTime != nil
    }

    /// Start playback immediately.
    func play() {
        play(at: nil)
    }

    /// Stops playback immediately.
    func stop() {
        guard let baseTime = baseTime else {
            return
        }

    private var baseTime: AVAudioTime?

    /// The current time in the timeline (seconds).
    open var currentTime: Double {
        get { return time(atAudioTime: nil) }
        set { setTime(newValue) }
    }

    /// Sets the current time in the timeline (seconds).
    open func setTime(_ time: Double) {
        stop()
        idleTime = time
    }
