diff options
author | rachytski <siarhei.rachytski@gmail.com> | 2011-10-24 20:15:40 +0400 |
---|---|---|
committer | Alex Zolotarev <alex@maps.me> | 2015-09-23 01:26:38 +0300 |
commit | 943d893105e3e76839be98529994414c4b0b01a0 (patch) | |
tree | c9a0dd11971b9bd300323d8b01b6fd11f03ed473 /platform | |
parent | 9906d541f6b2279b550d05ec6e5a6422c5e7ccf6 (diff) |
using VideoTimer in Desktop and iOS version. stopping it, when the pause is longer than 60 cycles. refactored WindowHandle. implemented QtVideoTimer. closes #356
Diffstat (limited to 'platform')
-rw-r--r-- | platform/apple_video_timer.mm | 40 | ||||
-rw-r--r-- | platform/ios_video_timer.mm | 15 | ||||
-rw-r--r-- | platform/video_timer.cpp | 20 | ||||
-rw-r--r-- | platform/video_timer.hpp | 18 |
4 files changed, 78 insertions, 15 deletions
diff --git a/platform/apple_video_timer.mm b/platform/apple_video_timer.mm index 6092d33901..7d0dce0733 100644 --- a/platform/apple_video_timer.mm +++ b/platform/apple_video_timer.mm @@ -20,38 +20,52 @@ public: stop(); } + static CVReturn displayLinkCallback( + CVDisplayLinkRef /*displayLink*/, + const CVTimeStamp * /*inNow*/, + const CVTimeStamp * /*inOutputTime*/, + CVOptionFlags /*flagsIn*/, + CVOptionFlags * /*flagsOut*/, + void * displayLinkContext + ) + { + AppleVideoTimer * t = reinterpret_cast<AppleVideoTimer*>(displayLinkContext); + t->perform(); + + return kCVReturnSuccess; + } + void start() { if (m_displayLink == 0) { CVDisplayLinkCreateWithActiveCGDisplays(&m_displayLink); CVDisplayLinkSetOutputCallback(m_displayLink, &displayLinkCallback, (void*)this); - CVDisplayLinkStart(m_displayLink); + resume(); } } - static CVReturn displayLinkCallback( - CVDisplayLinkRef displayLink, - const CVTimeStamp *inNow, - const CVTimeStamp *inOutputTime, - CVOptionFlags flagsIn, - CVOptionFlags *flagsOut, - void *displayLinkContext - ) + void resume() { - AppleVideoTimer * t = reinterpret_cast<AppleVideoTimer*>(displayLinkContext); - t->perform(); + CVDisplayLinkStart(m_displayLink); + m_state = ERunning; + } - return kCVReturnSuccess; + void pause() + { + CVDisplayLinkStop(m_displayLink); + m_state = EPaused; } void stop() { if (m_displayLink) { - CVDisplayLinkStop(m_displayLink); + if (state() == ERunning) + pause(); CVDisplayLinkRelease(m_displayLink); m_displayLink = 0; + m_state = EStopped; } } diff --git a/platform/ios_video_timer.mm b/platform/ios_video_timer.mm index 4a80809ac5..0f2eb42db9 100644 --- a/platform/ios_video_timer.mm +++ b/platform/ios_video_timer.mm @@ -38,7 +38,9 @@ public: m_objCppWrapper = [[VideoTimerWrapper alloc] initWithTimer:this]; m_displayLink = [CADisplayLink displayLinkWithTarget:m_objCppWrapper selector:@selector(perform)]; m_displayLink.frameInterval = 1; + m_displayLink.paused = true; [m_displayLink addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode]; + resume(); } } @@ -49,9 +51,22 @@ public: [m_displayLink invalidate]; [m_objCppWrapper release]; m_displayLink = 0; + m_state = EStopped; } } + void pause() + { + m_displayLink.paused = true; + m_state = EPaused; + } + + void resume() + { + m_displayLink.paused = false; + m_state = ERunning; + } + void perform() { m_frameFn(); diff --git a/platform/video_timer.cpp b/platform/video_timer.cpp index 288534d04a..8f731f58a3 100644 --- a/platform/video_timer.cpp +++ b/platform/video_timer.cpp @@ -1,4 +1,22 @@ #include "video_timer.hpp" -VideoTimer::VideoTimer(TFrameFn fn) : m_frameFn(fn) +VideoTimer::VideoTimer(TFrameFn fn) : m_frameFn(fn), m_state(EStopped) {} + +VideoTimer::EState VideoTimer::state() const +{ + return m_state; +} + +VideoTimer::~VideoTimer() +{} + +VideoTimer::TFrameFn VideoTimer::frameFn() const +{ + return m_frameFn; +} + +void VideoTimer::setFrameFn(TFrameFn fn) +{ + m_frameFn = fn; +} diff --git a/platform/video_timer.hpp b/platform/video_timer.hpp index d19cf14d13..dc286df6f2 100644 --- a/platform/video_timer.hpp +++ b/platform/video_timer.hpp @@ -9,13 +9,29 @@ public: typedef function<void()> TFrameFn; + enum EState + { + EStopped, + EPaused, + ERunning + }; + protected: TFrameFn m_frameFn; + EState m_state; public: VideoTimer(TFrameFn fn); - virtual ~VideoTimer() {} + virtual ~VideoTimer(); + + TFrameFn frameFn() const; + void setFrameFn(TFrameFn fn); + + EState state() const; + + virtual void resume() = 0; + virtual void pause() = 0; virtual void start() = 0; virtual void stop() = 0; |