iPlug2 - C++ Audio Plug-in Framework
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 
18 using namespace iplug;
19 
20 #if defined OS_MAC || defined OS_IOS
21 
22 Timer* Timer::Create(ITimerFunction func, uint32_t intervalMs)
23 {
24  return new Timer_impl(func, intervalMs);
25 }
26 
27 Timer_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 
43 Timer_impl::~Timer_impl()
44 {
45  Stop();
46 }
47 
48 void Timer_impl::Stop()
49 {
50  if (mOSTimer)
51  {
52  CFRunLoopTimerInvalidate(mOSTimer);
53  CFRelease(mOSTimer);
54  mOSTimer = nullptr;
55  }
56 }
57 
58 void 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 
66 Timer* Timer::Create(ITimerFunction func, uint32_t intervalMs)
67 {
68  return new Timer_impl(func, intervalMs);
69 }
70 
71 WDL_Mutex Timer_impl::sMutex;
72 WDL_PtrList<Timer_impl> Timer_impl::sTimers;
73 
74 Timer_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 
88 Timer_impl::~Timer_impl()
89 {
90  Stop();
91 }
92 
93 void 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 
104 void 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
120 Timer* Timer::Create(ITimerFunction func, uint32_t intervalMs)
121 {
122  return new Timer_impl(func, intervalMs);
123 }
124 
125 Timer_impl::Timer_impl(ITimerFunction func, uint32_t intervalMs)
126 : mTimerFunc(func)
127 {
128  ID = emscripten_set_interval(TimerProc, intervalMs, this);
129 }
130 
131 Timer_impl::~Timer_impl()
132 {
133  Stop();
134 }
135 
136 void Timer_impl::Stop()
137 {
138  emscripten_clear_interval(ID);
139 }
140 
141 void Timer_impl::TimerProc(void* userData)
142 {
143  Timer_impl* itimer = (Timer_impl*) userData;
144  itimer->mTimerFunc(*itimer);
145 }
146 #endif
Base class for timer.
Definition: IPlugTimer.h:39
This file includes classes for implementing timers - in order to get a regular callback on the main t...