LMMS
Loading...
Searching...
No Matches
Effect.h
Go to the documentation of this file.
1/*
2 * Effect.h - base class for effects
3 *
4 * Copyright (c) 2006-2007 Danny McRae <khjklujn/at/users.sourceforge.net>
5 * Copyright (c) 2006-2014 Tobias Doerffel <tobydox/at/users.sourceforge.net>
6 *
7 * This file is part of LMMS - https://lmms.io
8 *
9 * This program is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU General Public
11 * License as published by the Free Software Foundation; either
12 * version 2 of the License, or (at your option) any later version.
13 *
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 * General Public License for more details.
18 *
19 * You should have received a copy of the GNU General Public
20 * License along with this program (see COPYING); if not, write to the
21 * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
22 * Boston, MA 02110-1301 USA.
23 *
24 */
25
26#ifndef LMMS_EFFECT_H
27#define LMMS_EFFECT_H
28
29#include <span>
30
31#include "AudioEngine.h"
32#include "AutomatableModel.h"
33#include "Engine.h"
34#include "Plugin.h"
35#include "TempoSyncKnobModel.h"
36
37namespace lmms
38{
39
40class AudioBuffer;
41class EffectChain;
42class EffectControls;
43
44namespace gui
45{
46
47class EffectView;
48
49} // namespace gui
50
51
52class LMMS_EXPORT Effect : public Plugin
53{
54 Q_OBJECT
55public:
56 Effect( const Plugin::Descriptor * _desc,
57 Model * _parent,
58 const Descriptor::SubPluginFeatures::Key * _key );
59
60 void saveSettings( QDomDocument & _doc, QDomElement & _parent ) override;
61 void loadSettings( const QDomElement & _this ) override;
62
63 inline QString nodeName() const override
64 {
65 return "effect";
66 }
67
69 bool processAudioBuffer(AudioBuffer& inOut);
70
71 inline bool isOkay() const
72 {
73 return m_okay;
74 }
75
76 inline void setOkay( bool _state )
77 {
78 m_okay = _state;
79 }
80
82 bool isCorrupted() const { return m_corrupted.load(std::memory_order_relaxed); }
83
85 bool isAwake() const
86 {
87 return m_awake;
88 }
89
90 inline bool isEnabled() const
91 {
92 return m_enabledModel.value();
93 }
94
95 inline f_cnt_t timeout() const
96 {
97 const float samples = Engine::audioEngine()->outputSampleRate() * m_autoQuitModel.value() / 1000.0f;
98 return 1 + ( static_cast<int>( samples ) / Engine::audioEngine()->framesPerPeriod() );
99 }
100
101 inline float wetLevel() const
102 {
103 return m_wetDryModel.value();
104 }
105
106 inline float dryLevel() const
107 {
108 return 1.0f - m_wetDryModel.value();
109 }
110
111 inline bool dontRun() const
112 {
113 return m_noRun;
114 }
115
116 inline void setDontRun( bool _state )
117 {
118 m_noRun = _state;
119 }
120
121 bool isProcessingAudio() const
122 {
123 return isEnabled() && isAwake() && isOkay() && !dontRun();
124 }
125
127 {
128 return &m_autoQuitModel;
129 }
130
131 bool autoQuitEnabled() const
132 {
133 return m_autoQuitEnabled;
134 }
135
137 {
138 return m_parent;
139 }
140
141 virtual EffectControls * controls() = 0;
142
143 static Effect * instantiate( const QString & _plugin_name,
144 Model * _parent,
145 Descriptor::SubPluginFeatures::Key * _key );
146
147
148protected:
149 enum class ProcessStatus
150 {
152 Continue,
153
155 ContinueIfNotQuiet,
156
159 };
160
164 virtual ProcessStatus processImpl(SampleFrame* buf, const f_cnt_t frames) = 0;
165
170 virtual void processBypassedImpl() {}
171
172
173 gui::PluginView* instantiateView( QWidget * ) override;
174
176 {
178 m_awake = false;
179 }
180
181 void wakeUp()
182 {
184 m_awake = true;
185 }
186
187 virtual void onEnabledChanged() {}
188
189private:
195 void handleAutoQuit(bool silentOutput);
196
197
199
200 bool m_okay;
203 std::atomic<bool> m_corrupted = false;
204
207
211
212 bool m_autoQuitEnabled = false;
213
214 friend class gui::EffectView;
215 friend class EffectChain;
216
217} ;
218
219using EffectKey = Effect::Descriptor::SubPluginFeatures::Key;
220using EffectKeyList = Effect::Descriptor::SubPluginFeatures::KeyList;
221
222} // namespace lmms
223
224#endif // LMMS_EFFECT_H
static LV2_Handle instantiate(const LV2_Descriptor *descriptor, double rate, const char *path, const LV2_Feature *const *features)
Definition bad_syntax.c:57
Definition AudioBuffer.h:79
Definition AutomatableModel.h:497
Definition EffectChain.h:48
Definition EffectControls.h:44
virtual EffectControls * controls()=0
void loadSettings(const QDomElement &_this) override
Definition Effect.cpp:72
bool isOkay() const
Definition Effect.h:71
friend class EffectChain
Definition Effect.h:215
virtual ProcessStatus processImpl(SampleFrame *buf, const f_cnt_t frames)=0
bool autoQuitEnabled() const
Definition Effect.h:131
bool m_noRun
Definition Effect.h:201
void setOkay(bool _state)
Definition Effect.h:76
virtual void processBypassedImpl()
Definition Effect.h:170
void goToSleep()
Definition Effect.h:175
Effect(const Plugin::Descriptor *_desc, Model *_parent, const Descriptor::SubPluginFeatures::Key *_key)
Definition Effect.cpp:41
bool isCorrupted() const
Definition Effect.h:82
std::atomic< bool > m_corrupted
Definition Effect.h:203
float wetLevel() const
Definition Effect.h:101
bool isProcessingAudio() const
Definition Effect.h:121
bool m_awake
Definition Effect.h:202
bool dontRun() const
Definition Effect.h:111
TempoSyncKnobModel m_autoQuitModel
Definition Effect.h:210
bool isAwake() const
"Awake" means the effect has not been put to sleep by auto-quit
Definition Effect.h:85
FloatModel m_wetDryModel
Definition Effect.h:209
f_cnt_t m_quietBufferCount
The number of consecutive periods where output buffers remain below the silence threshold.
Definition Effect.h:206
void setDontRun(bool _state)
Definition Effect.h:116
EffectChain * m_parent
Definition Effect.h:198
virtual void onEnabledChanged()
Definition Effect.h:187
bool isEnabled() const
Definition Effect.h:90
QString nodeName() const override
Definition Effect.h:63
void wakeUp()
Definition Effect.h:181
EffectChain * effectChain() const
Definition Effect.h:136
f_cnt_t timeout() const
Definition Effect.h:95
void saveSettings(QDomDocument &_doc, QDomElement &_parent) override
Definition Effect.cpp:61
ProcessStatus
Definition Effect.h:150
float dryLevel() const
Definition Effect.h:106
bool m_okay
Definition Effect.h:200
BoolModel m_enabledModel
Definition Effect.h:208
bool m_autoQuitEnabled
Definition Effect.h:212
TempoSyncKnobModel * autoQuitModel()
Definition Effect.h:126
static AudioEngine * audioEngine()
Definition Engine.h:59
Definition AutomatableModel.h:463
Definition Model.h:37
Plugin(const Descriptor *descriptor, Model *parent, const Descriptor::SubPluginFeatures::Key *key=nullptr)
Definition Plugin.cpp:60
Definition SampleFrame.h:41
Definition TempoSyncKnobModel.h:45
Definition EffectView.h:49
Definition PluginView.h:36
Definition AudioPortAudio.cpp:209
Definition AudioAlsa.cpp:35
Effect::Descriptor::SubPluginFeatures::KeyList EffectKeyList
Definition Effect.h:220
Effect::Descriptor::SubPluginFeatures::Key EffectKey
Definition Effect.h:219
std::uint64_t f_cnt_t
Definition LmmsTypes.h:43
Definition Plugin.h:92
void Sleep(int ms)
Definition swell.cpp:63