iPlug2 - C++ Audio Plug-in Framework
Loading...
Searching...
No Matches
IPlugTimer.cpp
Go to the documentation of this file.
1/*
2 ==============================================================================
3
4 This file is part of the iPlug 2 library. Copyright (C) the iPlug 2 developers.
5
6 See LICENSE.txt for more info.
7
8 ==============================================================================
9*/
10
16#include "IPlugTimer.h"
17
18using namespace iplug;
19
20#if defined OS_MAC || defined OS_IOS
21
22Timer* Timer::Create(ITimerFunction func, uint32_t intervalMs)
23{
24 return new Timer_impl(func, intervalMs);
25}
26
27Timer_impl::Timer_impl(ITimerFunction func, uint32_t intervalMs)
28: mTimerFunc(func)
29, mIntervalMs(intervalMs)
30{
31 CFRunLoopTimerContext context;
32 context.version = 0;
33 context.info = this;
34 context.retain = nullptr;
35 context.release = nullptr;
36 context.copyDescription = nullptr;
37 CFTimeInterval interval = intervalMs / 1000.0;
38 CFRunLoopRef runLoop = CFRunLoopGetMain();
39 mOSTimer = CFRunLoopTimerCreate(kCFAllocatorDefault, CFAbsoluteTimeGetCurrent(), interval, 0, 0, TimerProc, &context);
40 CFRunLoopAddTimer(runLoop, mOSTimer, kCFRunLoopCommonModes);
41}
42
43Timer_impl::~Timer_impl()
44{
45 Stop();
46}
47
48void Timer_impl::Stop()
49{
50 if (mOSTimer)
51 {
52 CFRunLoopTimerInvalidate(mOSTimer);
53 CFRelease(mOSTimer);
54 mOSTimer = nullptr;
55 }
56}
57
58void Timer_impl::TimerProc(CFRunLoopTimerRef timer, void *info)
59{
60 Timer_impl* itimer = (Timer_impl*) info;
61 itimer->mTimerFunc(*itimer);
62}
63
64#elif defined OS_WIN
65
66Timer* Timer::Create(ITimerFunction func, uint32_t intervalMs)
67{
68 return new Timer_impl(func, intervalMs);
69}
70
71WDL_Mutex Timer_impl::sMutex;
72WDL_PtrList<Timer_impl> Timer_impl::sTimers;
73
74Timer_impl::Timer_impl(ITimerFunction func, uint32_t intervalMs)
75: mTimerFunc(func)
76, mIntervalMs(intervalMs)
77
78{
79 ID = SetTimer(0, 0, intervalMs, TimerProc); //TODO: timer ID correct?
80
81 if (ID)
82 {
83 WDL_MutexLock lock(&sMutex);
84 sTimers.Add(this);
85 }
86}
87
88Timer_impl::~Timer_impl()
89{
90 Stop();
91}
92
93void Timer_impl::Stop()
94{
95 if (ID)
96 {
97 KillTimer(0, ID);
98 WDL_MutexLock lock(&sMutex);
99 sTimers.DeletePtr(this);
100 ID = 0;
101 }
102}
103
104void CALLBACK Timer_impl::TimerProc(HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime)
105{
106 WDL_MutexLock lock(&sMutex);
107
108 for (auto i = 0; i < sTimers.GetSize(); i++)
109 {
110 Timer_impl* pTimer = sTimers.Get(i);
111
112 if (pTimer->ID == idEvent)
113 {
114 pTimer->mTimerFunc(*pTimer);
115 return;
116 }
117 }
118}
119#elif defined OS_WEB
120Timer* Timer::Create(ITimerFunction func, uint32_t intervalMs)
121{
122 return new Timer_impl(func, intervalMs);
123}
124
125Timer_impl::Timer_impl(ITimerFunction func, uint32_t intervalMs)
126: mTimerFunc(func)
127{
128 ID = emscripten_set_interval(TimerProc, intervalMs, this);
129}
130
131Timer_impl::~Timer_impl()
132{
133 Stop();
134}
135
136void Timer_impl::Stop()
137{
138 emscripten_clear_interval(ID);
139}
140
141void Timer_impl::TimerProc(void* userData)
142{
143 Timer_impl* itimer = (Timer_impl*) userData;
144 itimer->mTimerFunc(*itimer);
145}
146#endif
This file includes classes for implementing timers - in order to get a regular callback on the main t...
Base class for timer.
Definition: IPlugTimer.h:40