kwave  18.07.70
FilterPlugin.cpp
Go to the documentation of this file.
1 /***************************************************************************
2  FilterPlugin.cpp - generic class for filter plugins with setup
3  -------------------
4  begin : Sat Jun 07 2003
5  copyright : (C) 2003 by Thomas Eschenbacher
6  email : Thomas.Eschenbacher@gmx.de
7  ***************************************************************************/
8 
9 /***************************************************************************
10  * *
11  * This program is free software; you can redistribute it and/or modify *
12  * it under the terms of the GNU General Public License as published by *
13  * the Free Software Foundation; either version 2 of the License, or *
14  * (at your option) any later version. *
15  * *
16  ***************************************************************************/
17 
18 #include "config.h"
19 
20 #include <errno.h>
21 #include <new>
22 #include <unistd.h>
23 
24 #include <QApplication>
25 #include <QDialog>
26 #include <QStringList>
27 
28 #include <KLocalizedString>
29 
30 #include "libkwave/Connect.h"
33 #include "libkwave/PluginManager.h"
34 #include "libkwave/SampleSink.h"
37 
38 #include "libgui/FilterPlugin.h"
39 
40 //***************************************************************************
41 Kwave::FilterPlugin::FilterPlugin(QObject *parent, const QVariantList &args)
42  :Kwave::Plugin(parent, args),
43  m_params(), m_listen(false), m_pause(false), m_sink(Q_NULLPTR)
44 {
45 }
46 
47 //***************************************************************************
49 {
50 }
51 
52 //***************************************************************************
53 QStringList *Kwave::FilterPlugin::setup(QStringList &previous_params)
54 {
55  // try to interpret and use the previous parameters
56  if (!interpreteParameters(previous_params))
57  m_params = previous_params;
58 
59  // create the setup dialog
61  Q_ASSERT(setup_dialog);
62  if (!setup_dialog) return Q_NULLPTR;
63 
64  // connect the signals for the pre-listen handling
65  QDialog *dlg = setup_dialog->dialog();
66  connect(dlg, SIGNAL(startPreListen()),
67  this, SLOT(startPreListen()));
68  connect(dlg, SIGNAL(stopPreListen()),
69  this, SLOT(stopPreListen()));
70  connect(this, SIGNAL(sigDone(Kwave::Plugin*)),
71  dlg, SLOT(listenStopped()));
72 
73  if (!m_params.isEmpty()) setup_dialog->setParams(m_params);
74 
75  QStringList *list = new QStringList();
76  Q_ASSERT(list);
77  if (list && dlg->exec()) {
78  // user has pressed "OK"
79  *list = setup_dialog->params();
80  } else {
81  // user pressed "Cancel"
82  if (list) delete list;
83  list = Q_NULLPTR;
84  }
85 
86  if (setup_dialog) delete setup_dialog;
87  return list;
88 }
89 
90 //***************************************************************************
91 void Kwave::FilterPlugin::run(QStringList params)
92 {
93  Kwave::UndoTransactionGuard *undo_guard = Q_NULLPTR;
94  m_pause = false;
95 
96  if (!interpreteParameters(params)) m_params = params;
97 
98  sample_index_t first, last;
99  QList<unsigned int> tracks;
100  selection(&tracks, &first, &last, true);
101 
102  // switch to interactive mode in pre-listen mode
104 
105  // create all objects
108  signalManager(), tracks, first, last);
109 
110  Kwave::SampleSource *filter = createFilter(tracks.count());
111  Q_ASSERT(filter);
112 
113  if (m_listen) {
114  // pre-listen mode
115  Q_ASSERT(m_sink);
116  } else {
117  // normal mode, with undo
118  undo_guard = new(std::nothrow)
120  Q_ASSERT(undo_guard);
121  if (!undo_guard) {
122  if (filter) delete filter;
124  return;
125  }
126  m_sink = new(std::nothrow) MultiTrackWriter(signalManager(), tracks,
127  Kwave::Overwrite, first, last);
128  Q_ASSERT(m_sink);
129  }
130  if (!filter || !m_sink || m_sink->done()) {
131  if (filter) delete filter;
132  if (undo_guard) delete undo_guard;
133  if (m_sink) delete m_sink;
134  m_sink = Q_NULLPTR;
136  return;
137  }
138 
139  // set up the progress dialog when in processing (not pre-listen) mode
140  if (!m_listen) {
141  connect(&source, SIGNAL(progress(qreal)),
142  this, SLOT(updateProgress(qreal)),
143  Qt::BlockingQueuedConnection);
144  }
145 
146  // force initial update of the filter settings
147  updateFilter(filter, true);
148 
149  // connect them
150  Kwave::connect(source, SIGNAL(output(Kwave::SampleArray)),
151  *filter, SLOT(input(Kwave::SampleArray)));
152  Kwave::connect(*filter, SIGNAL(output(Kwave::SampleArray)),
153  *m_sink, SLOT(input(Kwave::SampleArray)));
154 
155  // transport the samples
156  while (!shouldStop() && (!source.done() || m_listen)) {
157  // process one step
158  source.goOn();
159  filter->goOn();
160 
161  // watch out for changed parameters when in
162  // pre-listen mode
163  if (m_listen && paramsChanged()) {
164  updateFilter(filter);
165  }
166 
167  if (m_listen && source.done()) {
168  // start the next loop
169  source.reset();
170  continue;
171  }
172 
173  // this lets the process wait if the user pressed cancel
174  // and the confirm_cancel dialog is active
175  while (m_pause && !shouldStop())
176  sleep(1);
177  }
178 
179  // cleanup
180  if (filter) delete filter;
181  if (m_sink) delete m_sink;
182  m_sink = Q_NULLPTR;
183  if (undo_guard) delete undo_guard;
184 
185  m_pause = false;
186  m_listen = false;
187 
189 }
190 
191 //***************************************************************************
193 {
194  return false;
195 }
196 
197 //***************************************************************************
199  bool /*force*/)
200 {
201  /* default implementation, does nothing */
202 }
203 
204 //***************************************************************************
206 {
207  Q_ASSERT(!m_sink);
208  if (m_sink) delete m_sink;
210 
211  if (m_sink) {
212  m_listen = true;
214  static QStringList empty_list;
215  execute(empty_list);
216  }
217 }
218 
219 //***************************************************************************
221 {
222  stop();
223  m_listen = false;
225 }
226 
227 //***************************************************************************
229 {
230  return i18n("Applying '%1'...", actionName());
231 }
232 
233 //***************************************************************************
234 //***************************************************************************
virtual void setParams(QStringList &params)=0
Definition: App.h:33
virtual bool done() const Q_DECL_OVERRIDE
Kwave::SampleSink * openMultiTrackPlayback(unsigned int tracks, const Kwave::PlayBackParam *playback_params=Q_NULLPTR)
QWidget * parentWidget() const
Definition: Plugin.cpp:450
virtual void goOn()=0
Kwave::SignalManager & signalManager()
Definition: Plugin.cpp:444
virtual int interpreteParameters(QStringList &)=0
static void setInteractive(bool interactive)
virtual void run(QStringList params) Q_DECL_OVERRIDE
quint64 sample_index_t
Definition: Sample.h:28
virtual QDialog * dialog()=0
Kwave::PluginManager & manager() const
Definition: Plugin.cpp:437
bool connect(Kwave::StreamObject &source, const char *output, Kwave::StreamObject &sink, const char *input)
Definition: Connect.cpp:48
virtual void goOn() Q_DECL_OVERRIDE
virtual int stop()
Definition: Plugin.cpp:214
virtual Kwave::SampleSource * createFilter(unsigned int tracks)=0
void sigDone(Kwave::Plugin *plugin)
virtual QStringList * setup(QStringList &previous_params) Q_DECL_OVERRIDE
virtual bool paramsChanged()
FilterPlugin(QObject *parent, const QVariantList &args)
virtual QString actionName()=0
virtual void setProgressDialogEnabled(bool enable)
Definition: Plugin.cpp:254
virtual Kwave::PluginSetupDialog * createDialog(QWidget *)=0
virtual void updateFilter(Kwave::SampleSource *filter, bool force=false)
virtual QStringList params()=0
int execute(QStringList &params)
Definition: Plugin.cpp:331
Kwave::SampleSink * m_sink
Definition: FilterPlugin.h:141
virtual bool done() const
Definition: SampleSink.h:52
virtual void updateProgress(qreal progress)
Definition: Plugin.cpp:260
virtual const QList< unsigned int > selectedTracks()
Definition: Plugin.cpp:474
virtual QString progressText() Q_DECL_OVERRIDE
virtual ~FilterPlugin() Q_DECL_OVERRIDE
bool shouldStop() const
Definition: Plugin.h:120
QStringList m_params
Definition: FilterPlugin.h:129
virtual sample_index_t selection(QList< unsigned int > *tracks=Q_NULLPTR, sample_index_t *left=Q_NULLPTR, sample_index_t *right=Q_NULLPTR, bool expand_if_empty=false)
Definition: Plugin.cpp:480