LMMS
Loading...
Searching...
No Matches
DistrhoUIProM.cpp
Go to the documentation of this file.
1/*
2 * DISTRHO ProM Plugin
3 * Copyright (C) 2015 Filipe Coelho <falktx@falktx.com>
4 *
5 * This program is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Lesser General Public
7 * License as published by the Free Software Foundation.
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU Lesser General Public License for more details.
13 *
14 * For a full copy of the license see the LICENSE file.
15 */
16
17#include "DistrhoPluginProM.hpp"
18#include "DistrhoUIProM.hpp"
19
20#include "libprojectM/projectM.hpp"
21
23
24// -----------------------------------------------------------------------
25
26#if 0
27static const projectM::Settings kSettings = {
28 /* meshX */ 32,
29 /* meshY */ 24,
30 /* fps */ 35,
31 /* textureSize */ 1024,
32 /* windowWidth */ 512,
33 /* windowHeight */ 512,
34 /* presetURL */ "/usr/share/projectM/presets",
35 /* titleFontURL */ "/usr/share/fonts/truetype/ttf-dejavu/DejaVuSans.ttf",
36 /* menuFontURL */ "/usr/share/fonts/truetype/ttf-dejavu/DejaVuSansMono.ttf",
37 /* smoothPresetDuration */ 5,
38 /* presetDuration */ 30,
39 /* beatSensitivity */ 10.0f,
40 /* aspectCorrection */ true,
41 /* easterEgg */ 1.0f,
42 /* shuffleEnabled */ true,
43 /* softCutRatingsEnabled */ false
44};
45#endif
46
47// -----------------------------------------------------------------------
48
49DistrhoUIProM::DistrhoUIProM()
50 : UI(512, 512)
51{
52}
53
54DistrhoUIProM::~DistrhoUIProM()
55{
56 if (DistrhoPluginProM* const dspPtr = (DistrhoPluginProM*)getPluginInstancePointer())
57 {
58 const MutexLocker csm(dspPtr->fMutex);
59 dspPtr->fPM = nullptr;
60 }
61}
62
63// -----------------------------------------------------------------------
64// DSP Callbacks
65
66void DistrhoUIProM::parameterChanged(uint32_t, float)
67{
68}
69
70// -----------------------------------------------------------------------
71// UI Callbacks
72
73void DistrhoUIProM::uiIdle()
74{
75 if (fPM == nullptr)
76 return;
77
78 repaint();
79
80 if (DistrhoPluginProM* const dspPtr = (DistrhoPluginProM*)getPluginInstancePointer())
81 {
82 if (dspPtr->fPM != nullptr)
83 return;
84
85 const MutexLocker csm(dspPtr->fMutex);
86 dspPtr->fPM = fPM;
87 }
88}
89
90void DistrhoUIProM::uiReshape(uint width, uint height)
91{
92 glEnable(GL_BLEND);
93 glEnable(GL_LINE_SMOOTH);
94 glEnable(GL_POINT_SMOOTH);
95
96 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
97 glShadeModel(GL_SMOOTH);
98
99 glMatrixMode(GL_TEXTURE);
100 glLoadIdentity();
101
102 glMatrixMode(GL_PROJECTION);
103 glLoadIdentity();
104 glOrtho(0, width, height, 0, 0.0f, 1.0f);
105 glViewport(0, 0, width, height);
106
107 glMatrixMode(GL_MODELVIEW);
108 glLoadIdentity();
109
110 glDrawBuffer(GL_BACK);
111 glReadBuffer(GL_BACK);
112
113 glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
114 glLineStipple(2, 0xAAAA);
115
116 if (fPM == nullptr)
117 //fPM = new projectM(kSettings);
118 fPM = new projectM("/usr/share/projectM/config.inp");
119
120 fPM->projectM_resetGL(width, height);
121}
122
123// -----------------------------------------------------------------------
124// Widget Callbacks
125
126void DistrhoUIProM::onDisplay()
127{
128 if (fPM == nullptr)
129 return;
130
131 fPM->renderFrame();
132}
133
134bool DistrhoUIProM::onKeyboard(const KeyboardEvent& ev)
135{
136 if (fPM == nullptr)
137 return false;
138
139 if (ev.press && (ev.key == '1' || ev.key == '+' || ev.key == '-'))
140 {
141 if (ev.key == '1')
142 {
143 if (getWidth() != 512 || getHeight() != 512)
144 setSize(512, 512);
145 }
146 else if (ev.key == '+')
147 {
148 /**/ if (getWidth() < 1100 && getHeight() < 1100)
149 setSize(getWidth()+100, getHeight()+100);
150 else if (getWidth() != 1100 || getHeight() != 1100)
151 setSize(1100, 1100);
152 }
153 else if (ev.key == '-')
154 {
155 /**/ if (getWidth() >= 200 && getHeight() >= 200)
156 setSize(getWidth()-100, getHeight()-100);
157 else if (getWidth() != 100 || getHeight() != 100)
158 setSize(100, 100);
159 }
160
161 return true;
162 }
163
164 projectMKeycode pmKey = PROJECTM_K_NONE;
165 projectMModifier pmMod = PROJECTM_KMOD_LSHIFT;
166
167 if ((ev.key >= PROJECTM_K_0 && ev.key <= PROJECTM_K_9) ||
168 (ev.key >= PROJECTM_K_A && ev.key <= PROJECTM_K_Z) ||
169 (ev.key >= PROJECTM_K_a && ev.key <= PROJECTM_K_z))
170 {
171 pmKey = static_cast<projectMKeycode>(ev.key);
172 }
173 else
174 {
175 switch (ev.key)
176 {
177 case DGL_NAMESPACE::kCharBackspace:
178 pmKey = PROJECTM_K_BACKSPACE;
179 break;
180 case DGL_NAMESPACE::kCharEscape:
181 pmKey = PROJECTM_K_ESCAPE;
182 break;
183 case DGL_NAMESPACE::kCharDelete:
184 pmKey = PROJECTM_K_DELETE;
185 break;
186 }
187 }
188
189 if (pmKey == PROJECTM_K_NONE)
190 return false;
191
192 if (ev.mod & DGL_NAMESPACE::kModifierControl)
193 pmMod = PROJECTM_KMOD_LCTRL;
194
195 fPM->key_handler(ev.press ? PROJECTM_KEYUP : PROJECTM_KEYDOWN, pmKey, pmMod);
196
197 return true;
198}
199
200bool DistrhoUIProM::onSpecial(const SpecialEvent& ev)
201{
202 if (fPM == nullptr)
203 return false;
204
205 projectMKeycode pmKey = PROJECTM_K_NONE;
206 projectMModifier pmMod = PROJECTM_KMOD_LSHIFT;
207
208 switch (ev.key)
209 {
210 case DGL_NAMESPACE::kKeyF1:
211 pmKey = PROJECTM_K_F1;
212 break;
213 case DGL_NAMESPACE::kKeyF2:
214 pmKey = PROJECTM_K_F2;
215 break;
216 case DGL_NAMESPACE::kKeyF3:
217 pmKey = PROJECTM_K_F3;
218 break;
219 case DGL_NAMESPACE::kKeyF4:
220 pmKey = PROJECTM_K_F4;
221 break;
222 case DGL_NAMESPACE::kKeyF5:
223 pmKey = PROJECTM_K_F5;
224 break;
225 case DGL_NAMESPACE::kKeyF6:
226 pmKey = PROJECTM_K_F6;
227 break;
228 case DGL_NAMESPACE::kKeyF7:
229 pmKey = PROJECTM_K_F7;
230 break;
231 case DGL_NAMESPACE::kKeyF8:
232 pmKey = PROJECTM_K_F8;
233 break;
234 case DGL_NAMESPACE::kKeyF9:
235 pmKey = PROJECTM_K_F9;
236 break;
237 case DGL_NAMESPACE::kKeyF10:
238 pmKey = PROJECTM_K_F10;
239 break;
240 case DGL_NAMESPACE::kKeyF11:
241 pmKey = PROJECTM_K_F11;
242 break;
243 case DGL_NAMESPACE::kKeyF12:
244 pmKey = PROJECTM_K_F12;
245 break;
246 case DGL_NAMESPACE::kKeyLeft:
247 pmKey = PROJECTM_K_LEFT;
248 break;
249 case DGL_NAMESPACE::kKeyUp:
250 pmKey = PROJECTM_K_UP;
251 break;
252 case DGL_NAMESPACE::kKeyRight:
253 pmKey = PROJECTM_K_RIGHT;
254 break;
255 case DGL_NAMESPACE::kKeyDown:
256 pmKey = PROJECTM_K_DOWN;
257 break;
258 case DGL_NAMESPACE::kKeyPageUp:
259 pmKey = PROJECTM_K_PAGEUP;
260 break;
261 case DGL_NAMESPACE::kKeyPageDown:
262 pmKey = PROJECTM_K_PAGEDOWN;
263 break;
264 case DGL_NAMESPACE::kKeyHome:
265 pmKey = PROJECTM_K_HOME;
266 break;
267 case DGL_NAMESPACE::kKeyEnd:
268 pmKey = PROJECTM_K_END;
269 break;
270 case DGL_NAMESPACE::kKeyInsert:
271 pmKey = PROJECTM_K_INSERT;
272 break;
273 case DGL_NAMESPACE::kKeyShift:
274 pmKey = PROJECTM_K_LSHIFT;
275 break;
276 case DGL_NAMESPACE::kKeyControl:
277 pmKey = PROJECTM_K_LCTRL;
278 break;
279 case DGL_NAMESPACE::kKeyAlt:
280 case DGL_NAMESPACE::kKeySuper:
281 break;
282 }
283
284 if (pmKey == PROJECTM_K_NONE)
285 return false;
286
287 if (ev.mod & DGL_NAMESPACE::kModifierControl)
288 pmMod = PROJECTM_KMOD_LCTRL;
289
290 fPM->key_handler(ev.press ? PROJECTM_KEYUP : PROJECTM_KEYDOWN, pmKey, pmMod);
291
292 return true;
293}
294
295// -----------------------------------------------------------------------
296
298{
299 return new DistrhoUIProM();
300}
301
302// -----------------------------------------------------------------------
303
unsigned int uint
Definition CarlaDefines.h:327
#define END_NAMESPACE_DISTRHO
Definition DistrhoDefines.h:191
#define START_NAMESPACE_DISTRHO
Definition DistrhoDefines.h:190
UI * createUI()
Definition DistrhoUIProM.cpp:297
static int int height
Definition pugl.h:1594
static int width
Definition pugl.h:1593
unsigned int uint32_t
Definition mid.cpp:100