LMMS
Loading...
Searching...
No Matches
Carla.h
Go to the documentation of this file.
1/*
2 * carla.h - Carla for LMMS
3 *
4 * Copyright (C) 2014-2018 Filipe Coelho <falktx@falktx.com>
5 *
6 * This file is part of LMMS - https://lmms.io
7 *
8 * This program is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU General Public
10 * License as published by the Free Software Foundation; either
11 * version 2 of the License, or (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public
19 * License along with this program (see COPYING); if not, write to the
20 * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
21 * Boston, MA 02110-1301 USA.
22 *
23 */
24
25#ifndef CARLA_H
26#define CARLA_H
27
28#define CARLA_SETTING_PREFIX "PARAM_KNOB_"
29#define CARLA_MIN_PARAM_VERSION 0x020090
30#define CARLA_VERSION_HEX_3 0x30000
31
32#include <vector>
33
34// qt
35#include <QCloseEvent>
36#include <QDomElement>
37#include <QMutex>
38#include <QRegularExpression>
39
40// carla/source/includes
41#include "carlabase_export.h"
42#include <CarlaDefines.h>
43#if CARLA_VERSION_HEX >= 0x010911
44 #include <CarlaNativePlugin.h> // IWYU pragma: keep
45#else
46 #include <CarlaBackend.h>
47 #include <CarlaNative.h>
48 #include <CarlaUtils.h>
49 CARLA_EXPORT
51
52 CARLA_EXPORT
54#endif
55
56// lmms/include/
57#include "AutomatableModel.h"
58#include "Instrument.h"
59#include "InstrumentView.h"
60#include "SubWindow.h"
61
62class QPushButton;
63class QComboBox;
64class QCompleter;
65class QGridLayout;
66class QHBoxLayout;
67class QLineEdit;
68class QStringListModel; // IWYU pragma: keep
69class QScrollArea;
70
71
72namespace lmms
73{
74
75namespace gui
76{
77class CarlaParamsView;
78class CarlaInstrumentView;
79class Knob;
80}
81
83{
84public:
86 FloatModel(0.f, 0.f, 1.f, 0.001f, parent, "Unused"),
89 {
90 }
91
92 // From AutomatableModel.h, it's private there.
93 inline static bool mustQuoteName(const QString &name)
94 {
95 QRegularExpression reg("^[A-Za-z0-9._-]+$");
96 return !reg.match(name).hasMatch();
97 }
98
99 inline void loadSettings(const QDomElement& element, const QString& name = QString("value")) override
100 {
102 bool mustQuote = mustQuoteName(name);
103 QDomElement me = element.firstChildElement(mustQuote ? QString("automatablemodel") : name);
104 if (!me.isNull()) {
105 m_isOutput = (bool)me.attribute("output", "0").toInt();
106 m_groupName = QString(me.attribute("groupName", ""));
107 }
108 }
109
110 inline void saveSettings(QDomDocument& doc, QDomElement& element,
111 const QString& name = QString( "value" )) override
112 {
113 if (m_isEnabled)
114 {
116 bool mustQuote = mustQuoteName(name);
117 QDomElement me = element.firstChildElement(mustQuote ? QString("automatablemodel") : name);
118 if (!me.isNull())
119 {
120 me.setAttribute("output", m_isOutput);
121 me.setAttribute("groupName", m_groupName);
122 }
123 }
124 }
125
126 inline const bool enabled()
127 {
128 return m_isEnabled;
129 }
130
131 inline const bool isOutput()
132 {
133 return m_isOutput;
134 }
135
136 inline void setOutput(bool state = true)
137 {
138 m_isOutput = state;
139 }
140
141 inline void setEnabled(bool state = true)
142 {
143 m_isEnabled = state;
144 }
145
146 inline void setGroupName(QString groupName)
147 {
149 }
150
152 {
154 }
155
156 virtual QString groupName() const
157 {
158 return m_groupName;
159 }
160
161 virtual uint8_t groupId() const
162 {
163 return m_groupId;
164 }
165
166private:
170 QString m_groupName;
171};
172
173// -------------------------------------------------------------------
174
175class CARLABASE_EXPORT CarlaInstrument : public Instrument
176{
177 Q_OBJECT
178
179public:
180 static const uint32_t kMaxMidiEvents = 512;
181
182 CarlaInstrument(InstrumentTrack* const instrumentTrack, const Descriptor* const descriptor, const bool isPatchbay);
183 ~CarlaInstrument() override;
184
185 // Carla NativeHostDescriptor functions
187 double handleGetSampleRate() const;
188 bool handleIsOffline() const;
189 const NativeTimeInfo* handleGetTimeInfo() const;
190 void handleUiParameterChanged(const uint32_t index, const float value) const;
191 void handleUiClosed();
192 intptr_t handleDispatcher(const NativeHostDispatcherOpcode opcode, const int32_t index, const intptr_t value, void* const ptr, const float opt);
193
194 // LMMS functions
195 QString nodeName() const override;
196 void saveSettings(QDomDocument& doc, QDomElement& parent) override;
197 void loadSettings(const QDomElement& elem) override;
198 void play(SampleFrame* workingBuffer) override;
199 bool handleMidiEvent(const MidiEvent& event, const TimePos& time, f_cnt_t offset) override;
200 gui::PluginView* instantiateView(QWidget* parent) override;
201
202signals:
203 void uiClosed();
205
206private slots:
207 void sampleRateChanged();
208 void refreshParams(bool init = false);
209 void clearParamModels();
210 void paramModelChanged(uint32_t index);
211 void updateParamModel(uint32_t index);
212
213private:
214 const bool kIsPatchbay;
215
219
223
224 // this is only needed because note-offs are being sent during play
225 QMutex fMutex;
226
228 std::vector<CarlaParamFloatModel*> m_paramModels;
229 QDomElement m_settingsElem;
230
231 QCompleter* m_paramsCompleter;
232 QStringListModel* m_completerModel;
233
236};
237
238
239// -------------------------------------------------------------------
240
241namespace gui
242{
243
245{
246Q_OBJECT
247
248signals:
249 void uiClosed();
250 void resized();
251
252public:
253 CarlaParamsSubWindow(QWidget * _parent, Qt::WindowFlags windowFlags) :
254 SubWindow(_parent)
255 {
256 setAttribute(Qt::WA_DeleteOnClose, false);
257 setWindowFlags(windowFlags);
258 }
259
260 void resizeEvent(QResizeEvent * event) override
261 {
262 if (mousePress) {
263 resizing = true;
264 }
266 }
267
268 void mousePressEvent(QMouseEvent * event) override
269 {
270 mousePress = true;
271 SubWindow::mousePressEvent(event);
272 }
273
274 void mouseReleaseEvent(QMouseEvent * event) override
275 {
276 if (resizing) {
277 resizing = false;
278 mousePress = false;
279 emit resized();
280 }
281 SubWindow::mouseReleaseEvent(event);
282 }
283
284 void closeEvent(QCloseEvent * event) override
285 {
286 emit uiClosed();
287 event->accept();
288 }
289
290private:
291 bool resizing = false;
292 bool mousePress = false;
293};
294
295// -------------------------------------------------------------------
296
298{
299 Q_OBJECT
300
301public:
302 CarlaInstrumentView(CarlaInstrument* const instrument, QWidget* const parent);
303 ~CarlaInstrumentView() override;
304
305private slots:
306 void toggleUI(bool);
307 void uiClosed();
308 void toggleParamsWindow();
309 void paramsUiClosed();
310
311private:
312 void modelChanged() override;
313 void timerEvent(QTimerEvent*) override;
314
318
320 QWidget* const m_parent;
321
322 QMdiSubWindow* m_paramsSubWindow;
324
325 QPushButton* m_toggleUIButton;
327
328 friend class CarlaParamsView;
329};
330
331// -------------------------------------------------------------------
332
334{
335 Q_OBJECT
336public:
337 CarlaParamsView(CarlaInstrumentView* const instrumentView, QWidget* const parent);
338 ~CarlaParamsView() override;
339
340signals:
341 void uiClosed();
342
343private slots:
344 void refreshKnobs();
345 void filterKnobs();
346 void clearFilterText();
347 void windowResized();
348
349private:
351 void addKnob(uint32_t index);
352 void clearKnobs();
353
356 std::vector<Knob*> m_knobs;
357
358 // Keep track of the biggest knob width per group
359 QList<uint16_t> m_maxKnobWidthPerGroup;
360
366
367 QScrollArea* m_inputScrollArea;
370 QScrollArea* m_outputScrollArea;
373 QHBoxLayout* m_toolBarLayout;
378 QStringListModel* m_groupFilterModel;
379};
380
381
382} // namespace gui
383
384} // namespace lmms
385
386#endif
CARLA_EXPORT const NativePluginDescriptor * carla_get_native_rack_plugin()
Definition CarlaEngineNative.cpp:3048
CARLA_EXPORT const NativePluginDescriptor * carla_get_native_patchbay_plugin()
Definition CarlaEngineNative.cpp:3054
opcode
Definition Spc_Cpu.h:173
virtual void loadSettings(const QDomElement &element, const QString &name)
Loads settings (value, automation links and controller connections) of AutomatableModel from specifie...
Definition AutomatableModel.cpp:178
virtual void saveSettings(QDomDocument &doc, QDomElement &element, const QString &name)
Saves settings (value, automation links and controller connections) of AutomatableModel into specifie...
Definition AutomatableModel.cpp:103
Definition Carla.h:176
QString nodeName() const override
Definition Carla.cpp:346
double handleGetSampleRate() const
Definition Carla.cpp:260
void play(SampleFrame *workingBuffer) override
Definition Carla.cpp:498
NativeHostDescriptor fHost
Definition Carla.h:217
void paramModelChanged(uint32_t index)
Definition Carla.cpp:453
void handleUiParameterChanged(const uint32_t index, const float value) const
Definition Carla.cpp:275
QDomElement m_settingsElem
Definition Carla.h:229
void refreshParams(bool init=false)
Definition Carla.cpp:380
NativeTimeInfo fTimeInfo
Definition Carla.h:222
uint32_t fMidiEventCount
Definition Carla.h:220
NativeMidiEvent fMidiEvents[kMaxMidiEvents]
Definition Carla.h:221
QMutex fMutex
Definition Carla.h:225
void handleUiClosed()
Definition Carla.cpp:283
uint32_t handleGetBufferSize() const
Definition Carla.cpp:255
const bool kIsPatchbay
Definition Carla.h:214
void saveSettings(QDomDocument &doc, QDomElement &parent) override
Definition Carla.cpp:351
bool handleMidiEvent(const MidiEvent &event, const TimePos &time, f_cnt_t offset) override
Definition Carla.cpp:555
uint8_t m_paramGroupCount
Definition Carla.h:227
bool handleIsOffline() const
Definition Carla.cpp:265
QCompleter * m_paramsCompleter
Definition Carla.h:231
QStringListModel * m_completerModel
Definition Carla.h:232
const NativeTimeInfo * handleGetTimeInfo() const
Definition Carla.cpp:270
CarlaInstrument(InstrumentTrack *const instrumentTrack, const Descriptor *const descriptor, const bool isPatchbay)
Definition Carla.cpp:152
void updateParamModel(uint32_t index)
Definition Carla.cpp:471
gui::PluginView * instantiateView(QWidget *parent) override
Create a view for the model.
Definition Carla.cpp:574
NativePluginHandle fHandle
Definition Carla.h:216
void sampleRateChanged()
Definition Carla.cpp:594
static const uint32_t kMaxMidiEvents
Definition Carla.h:180
const NativePluginDescriptor * fDescriptor
Definition Carla.h:218
void clearParamModels()
Definition Carla.cpp:439
intptr_t handleDispatcher(const NativeHostDispatcherOpcode opcode, const int32_t index, const intptr_t value, void *const ptr, const float opt)
Definition Carla.cpp:288
std::vector< CarlaParamFloatModel * > m_paramModels
Definition Carla.h:228
void loadSettings(const QDomElement &elem) override
Definition Carla.cpp:481
QString m_groupName
Definition Carla.h:170
void setOutput(bool state=true)
Definition Carla.h:136
void setEnabled(bool state=true)
Definition Carla.h:141
void setGroupName(QString groupName)
Definition Carla.h:146
virtual QString groupName() const
Definition Carla.h:156
bool m_isEnabled
Definition Carla.h:168
static bool mustQuoteName(const QString &name)
Definition Carla.h:93
const bool enabled()
Definition Carla.h:126
void setGroupId(uint8_t groupId)
Definition Carla.h:151
CarlaParamFloatModel(Model *parent)
Definition Carla.h:85
bool m_isOutput
Definition Carla.h:167
void saveSettings(QDomDocument &doc, QDomElement &element, const QString &name=QString("value")) override
Saves settings (value, automation links and controller connections) of AutomatableModel into specifie...
Definition Carla.h:110
void loadSettings(const QDomElement &element, const QString &name=QString("value")) override
Loads settings (value, automation links and controller connections) of AutomatableModel from specifie...
Definition Carla.h:99
virtual uint8_t groupId() const
Definition Carla.h:161
const bool isOutput()
Definition Carla.h:131
uint8_t m_groupId
Definition Carla.h:169
FloatModel(float val=0, float min=0, float max=0, float step=0, Model *parent=nullptr, const QString &displayName=QString(), bool defaultConstructed=false)
Definition AutomatableModel.h:467
InstrumentTrack * instrumentTrack() const
Definition Instrument.h:156
Instrument(InstrumentTrack *_instrument_track, const Descriptor *_descriptor, const Descriptor::SubPluginFeatures::Key *key=nullptr, Flags flags=Flag::NoFlags)
Definition Instrument.cpp:38
Definition InstrumentTrack.h:62
Definition MidiEvent.h:37
Definition Model.h:37
const Descriptor * descriptor() const
Return plugin Descriptor.
Definition Plugin.h:257
Definition SampleFrame.h:41
Definition TimePos.h:68
Definition Carla.h:298
QWidget *const m_parent
Definition Carla.h:320
int fTimerId
Definition Carla.h:317
CarlaInstrument *const m_carlaInstrument
Definition Carla.h:319
CarlaParamsView * m_paramsView
Definition Carla.h:323
QPushButton * m_toggleUIButton
Definition Carla.h:325
~CarlaInstrumentView() override
Definition Carla.cpp:657
void paramsUiClosed()
Definition Carla.cpp:728
NativePluginHandle fHandle
Definition Carla.h:315
void toggleParamsWindow()
Definition Carla.cpp:708
void timerEvent(QTimerEvent *) override
Definition Carla.cpp:700
void toggleUI(bool)
Definition Carla.cpp:673
CarlaInstrumentView(CarlaInstrument *const instrument, QWidget *const parent)
Definition Carla.cpp:604
const NativePluginDescriptor * fDescriptor
Definition Carla.h:316
void modelChanged() override
Definition Carla.cpp:696
void uiClosed()
Definition Carla.cpp:691
QPushButton * m_toggleParamsWindowButton
Definition Carla.h:326
friend class CarlaParamsView
Definition Carla.h:328
QMdiSubWindow * m_paramsSubWindow
Definition Carla.h:322
void mouseReleaseEvent(QMouseEvent *event) override
Definition Carla.h:274
void mousePressEvent(QMouseEvent *event) override
Definition Carla.h:268
bool resizing
Definition Carla.h:291
void resizeEvent(QResizeEvent *event) override
Definition Carla.h:260
bool mousePress
Definition Carla.h:292
CarlaParamsSubWindow(QWidget *_parent, Qt::WindowFlags windowFlags)
Definition Carla.h:253
void closeEvent(QCloseEvent *event) override
Definition Carla.h:284
Definition Carla.h:334
QScrollArea * m_outputScrollArea
Definition Carla.h:370
uint32_t m_curRow
Definition Carla.h:363
QWidget * m_outputScrollAreaWidgetContent
Definition Carla.h:372
QWidget * m_inputScrollAreaWidgetContent
Definition Carla.h:369
QGridLayout * m_inputScrollAreaLayout
Definition Carla.h:368
~CarlaParamsView() override
Definition Carla.cpp:876
uint32_t m_curOutColumn
Definition Carla.h:364
CarlaParamsView(CarlaInstrumentView *const instrumentView, QWidget *const parent)
Definition Carla.cpp:735
QStringListModel * m_groupFilterModel
Definition Carla.h:378
QGridLayout * m_outputScrollAreaLayout
Definition Carla.h:371
void clearKnobs()
Definition Carla.cpp:1081
void filterKnobs()
Definition Carla.cpp:902
QHBoxLayout * m_toolBarLayout
Definition Carla.h:373
CarlaInstrument *const m_carlaInstrument
Definition Carla.h:354
QScrollArea * m_inputScrollArea
Definition Carla.h:367
std::vector< Knob * > m_knobs
Definition Carla.h:356
QPushButton * m_automatedOnlyButton
Definition Carla.h:376
void clearFilterText()
Definition Carla.cpp:897
QPushButton * m_clearFilterButton
Definition Carla.h:375
uint32_t m_curOutRow
Definition Carla.h:365
CarlaInstrumentView *const m_carlaInstrumentView
Definition Carla.h:355
QLineEdit * m_paramsFilterLineEdit
Definition Carla.h:374
void windowResized()
Definition Carla.cpp:1035
QList< uint16_t > m_maxKnobWidthPerGroup
Definition Carla.h:359
void addKnob(uint32_t index)
Definition Carla.cpp:1041
uint32_t m_curColumn
Definition Carla.h:362
void refreshKnobs()
Definition Carla.cpp:964
QComboBox * m_groupFilterCombo
Definition Carla.h:377
uint32_t m_maxColumns
Definition Carla.h:361
Instrument view with fixed LMMS-default size.
Definition InstrumentView.h:66
InstrumentView(Instrument *_instrument, QWidget *_parent)
Definition InstrumentView.cpp:34
Definition PluginView.h:36
void resizeEvent(QResizeEvent *event) override
SubWindow::resizeEvent.
Definition SubWindow.cpp:569
SubWindow(QWidget *parent=nullptr, Qt::WindowFlags windowFlags=QFlag(0))
Definition SubWindow.cpp:53
NativeHostDispatcherOpcode
Definition CarlaNative.h:115
struct _NativePluginDescriptor NativePluginDescriptor
void * NativePluginHandle
Definition CarlaNative.h:37
static PuglViewHint int value
Definition pugl.h:1708
static const char * name
Definition pugl.h:1582
static uintptr_t parent
Definition pugl.h:1644
int int32_t
Definition mid.cpp:97
unsigned int uint32_t
Definition mid.cpp:100
unsigned char uint8_t
Definition mid.cpp:98
Definition AudioPortAudio.cpp:223
Definition AudioAlsa.cpp:35
std::uint64_t f_cnt_t
Definition LmmsTypes.h:43
#define false
Definition ordinals.h:83
GUI::ui_handle_t gui
Definition main.cpp:50
Definition CarlaNative.h:218
Definition CarlaNative.h:169
Definition CarlaNative.h:197
Definition Plugin.h:92
ZCONST uch * init
Definition extract.c:2392