11 #include <CoreVideo/CoreVideo.h>
15 "title" :
"VuoDisplayRefresh",
17 "ApplicationServices.framework",
29 void (*requestedFrameTriggerWithContext)(
VuoReal,
void *context);
45 const CVTimeStamp *inNow,
const CVTimeStamp *inOutputTime,
46 CVOptionFlags flagsIn, CVOptionFlags *flagsOut,
49 int64_t plannedFrameTime = inOutputTime->videoTime;
62 return kCVReturnSuccess;
65 VuoReal timestamp = (double)(plannedFrameTime - displayRefresh->
initialTime)/(double)inOutputTime->videoTimeScale;
73 return kCVReturnSuccess;
107 void (*requestedFrameTrigger)(
VuoReal),
108 void (*requestedFrameTriggerWithContext)(
VuoReal,
void *context)
116 if (CVDisplayLinkCreateWithCGDisplay(kCGDirectMainDisplay, &displayRefresh->
displayLink) == kCVReturnSuccess)
123 CVTime nominal = CVDisplayLinkGetNominalOutputVideoRefreshPeriod(displayRefresh->
displayLink);
124 VDebugLog(
"Refresh: %g Hz (%d/%lld)", (
double)nominal.timeScale/nominal.timeValue, nominal.timeScale, nominal.timeValue);
126 CVTime latency = CVDisplayLinkGetOutputVideoLatency(displayRefresh->
displayLink);
127 if (latency.timeScale)
129 double latencyFrames = ((double)latency.timeValue/latency.timeScale)/((double)nominal.timeValue/nominal.timeScale);
130 VDebugLog(
"Latency: %g frame%s (%d/%lld)", latencyFrames, fabs(latencyFrames-1)<0.00001 ?
"" :
"s", latency.timeScale, latency.timeValue);
137 VUserLog(
"Failed to create CVDisplayLink.");