diff --git a/OSBindings/Mac/Clock Signal/Atari2600Document.swift b/OSBindings/Mac/Clock Signal/Atari2600Document.swift index 5136211ba..b42b2bfea 100644 --- a/OSBindings/Mac/Clock Signal/Atari2600Document.swift +++ b/OSBindings/Mac/Clock Signal/Atari2600Document.swift @@ -8,15 +8,17 @@ import Cocoa -class Atari2600Document: NSDocument { +class Atari2600Document: NSDocument, CSOpenGLViewDelegate { override init() { super.init() // Add your subclass-specific initialization here. } + @IBOutlet weak var openGLView: CSOpenGLView? override func windowControllerDidLoadNib(aController: NSWindowController) { super.windowControllerDidLoadNib(aController) + openGLView!.delegate = self // Add any code here that needs to be executed once the windowController has loaded the document's window. } @@ -45,5 +47,14 @@ class Atari2600Document: NSDocument { atari2600?.setROM(data) } + private var lastCycleCount: Int64? + func openGLView(view: CSOpenGLView!, didUpdateToTime time: CVTimeStamp) { + let cycleCount = (1194720 * time.videoTime) / Int64(time.videoTimeScale) + if let lastCycleCount = lastCycleCount { + let elapsedTime = cycleCount - lastCycleCount + atari2600!.runForNumberOfCycles(Int32(elapsedTime)) + } + lastCycleCount = cycleCount + } } \ No newline at end of file diff --git a/OSBindings/Mac/Clock Signal/Base.lproj/Atari2600Document.xib b/OSBindings/Mac/Clock Signal/Base.lproj/Atari2600Document.xib index 8effec6d7..c74f9d9f5 100644 --- a/OSBindings/Mac/Clock Signal/Base.lproj/Atari2600Document.xib +++ b/OSBindings/Mac/Clock Signal/Base.lproj/Atari2600Document.xib @@ -4,8 +4,9 @@ - + + diff --git a/OSBindings/Mac/Clock Signal/ClockSignal-Bridging-Header.h b/OSBindings/Mac/Clock Signal/ClockSignal-Bridging-Header.h index 80150678b..fde46822d 100644 --- a/OSBindings/Mac/Clock Signal/ClockSignal-Bridging-Header.h +++ b/OSBindings/Mac/Clock Signal/ClockSignal-Bridging-Header.h @@ -3,3 +3,4 @@ // #import "Atari2600.h" +#import "OpenGLView.h" diff --git a/OSBindings/Mac/Clock Signal/OpenGLView.h b/OSBindings/Mac/Clock Signal/OpenGLView.h index f7b2ea9ab..1c91803df 100644 --- a/OSBindings/Mac/Clock Signal/OpenGLView.h +++ b/OSBindings/Mac/Clock Signal/OpenGLView.h @@ -9,6 +9,14 @@ #import @import AppKit; +@class CSOpenGLView; + +@protocol CSOpenGLViewDelegate +- (void)openGLView:(CSOpenGLView *)view didUpdateToTime:(CVTimeStamp)time; +@end + @interface CSOpenGLView : NSOpenGLView +@property (nonatomic, weak) id delegate; + @end diff --git a/OSBindings/Mac/Clock Signal/OpenGLView.m b/OSBindings/Mac/Clock Signal/OpenGLView.m index 023353c6f..428032ac8 100644 --- a/OSBindings/Mac/Clock Signal/OpenGLView.m +++ b/OSBindings/Mac/Clock Signal/OpenGLView.m @@ -34,10 +34,10 @@ CVDisplayLinkStart(displayLink); } -// This is the renderer output callback function static CVReturn MyDisplayLinkCallback(CVDisplayLinkRef displayLink, const CVTimeStamp* now, const CVTimeStamp* outputTime, CVOptionFlags flagsIn, CVOptionFlags* flagsOut, void* displayLinkContext) { - [(__bridge CSOpenGLView *)displayLinkContext setNeedsDisplay:YES]; + CSOpenGLView *view = (__bridge CSOpenGLView *)displayLinkContext; + [view.delegate openGLView:view didUpdateToTime:*now]; return kCVReturnSuccess; }