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 isAwake() const
83 {
84 return m_awake;
85 }
86
87 inline bool isEnabled() const
88 {
89 return m_enabledModel.value();
90 }
91
92 inline f_cnt_t timeout() const
93 {
94 const float samples = Engine::audioEngine()->outputSampleRate() * m_autoQuitModel.value() / 1000.0f;
95 return 1 + ( static_cast<int>( samples ) / Engine::audioEngine()->framesPerPeriod() );
96 }
97
98 inline float wetLevel() const
99 {
100 return m_wetDryModel.value();
101 }
102
103 inline float dryLevel() const
104 {
105 return 1.0f - m_wetDryModel.value();
106 }
107
108 inline bool dontRun() const
109 {
110 return m_noRun;
111 }
112
113 inline void setDontRun( bool _state )
114 {
115 m_noRun = _state;
116 }
117
118 bool isProcessingAudio() const
119 {
120 return isEnabled() && isAwake() && isOkay() && !dontRun();
121 }
122
124 {
125 return &m_autoQuitModel;
126 }
127
128 bool autoQuitEnabled() const
129 {
130 return m_autoQuitEnabled;
131 }
132
134 {
135 return m_parent;
136 }
137
138 virtual EffectControls * controls() = 0;
139
140 static Effect * instantiate( const QString & _plugin_name,
141 Model * _parent,
142 Descriptor::SubPluginFeatures::Key * _key );
143
144
145protected:
146 enum class ProcessStatus
147 {
149 Continue,
150
152 ContinueIfNotQuiet,
153
156 };
157
161 virtual ProcessStatus processImpl(SampleFrame* buf, const f_cnt_t frames) = 0;
162
167 virtual void processBypassedImpl() {}
168
169
170 gui::PluginView* instantiateView( QWidget * ) override;
171
173 {
175 m_awake = false;
176 }
177
178 void wakeUp()
179 {
181 m_awake = true;
182 }
183
184 virtual void onEnabledChanged() {}
185
186private:
192 void handleAutoQuit(bool silentOutput);
193
194
196
197 bool m_okay;
200
203
207
208 bool m_autoQuitEnabled = false;
209
210 friend class gui::EffectView;
211 friend class EffectChain;
212
213} ;
214
215using EffectKey = Effect::Descriptor::SubPluginFeatures::Key;
216using EffectKeyList = Effect::Descriptor::SubPluginFeatures::KeyList;
217
218} // namespace lmms
219
220#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:211
virtual ProcessStatus processImpl(SampleFrame *buf, const f_cnt_t frames)=0
bool autoQuitEnabled() const
Definition Effect.h:128
bool m_noRun
Definition Effect.h:198
void setOkay(bool _state)
Definition Effect.h:76
virtual void processBypassedImpl()
Definition Effect.h:167
void goToSleep()
Definition Effect.h:172
Effect(const Plugin::Descriptor *_desc, Model *_parent, const Descriptor::SubPluginFeatures::Key *_key)
Definition Effect.cpp:41
float wetLevel() const
Definition Effect.h:98
bool isProcessingAudio() const
Definition Effect.h:118
bool m_awake
Definition Effect.h:199
bool dontRun() const
Definition Effect.h:108
TempoSyncKnobModel m_autoQuitModel
Definition Effect.h:206
bool isAwake() const
"Awake" means the effect has not been put to sleep by auto-quit
Definition Effect.h:82
FloatModel m_wetDryModel
Definition Effect.h:205
f_cnt_t m_quietBufferCount
The number of consecutive periods where output buffers remain below the silence threshold.
Definition Effect.h:202
void setDontRun(bool _state)
Definition Effect.h:113
EffectChain * m_parent
Definition Effect.h:195
virtual void onEnabledChanged()
Definition Effect.h:184
bool isEnabled() const
Definition Effect.h:87
QString nodeName() const override
Definition Effect.h:63
void wakeUp()
Definition Effect.h:178
EffectChain * effectChain() const
Definition Effect.h:133
f_cnt_t timeout() const
Definition Effect.h:92
void saveSettings(QDomDocument &_doc, QDomElement &_parent) override
Definition Effect.cpp:61
ProcessStatus
Definition Effect.h:147
float dryLevel() const
Definition Effect.h:103
bool m_okay
Definition Effect.h:197
BoolModel m_enabledModel
Definition Effect.h:204
bool m_autoQuitEnabled
Definition Effect.h:208
TempoSyncKnobModel * autoQuitModel()
Definition Effect.h:123
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:223
Definition AudioAlsa.cpp:35
Effect::Descriptor::SubPluginFeatures::KeyList EffectKeyList
Definition Effect.h:216
Effect::Descriptor::SubPluginFeatures::Key EffectKey
Definition Effect.h:215
std::uint64_t f_cnt_t
Definition LmmsTypes.h:43
Definition Plugin.h:92
void Sleep(int ms)
Definition swell.cpp:63