kwave  18.07.70
Kwave::ReversePlugin Class Reference

#include <ReversePlugin.h>

Inheritance diagram for Kwave::ReversePlugin:
Inheritance graph
Collaboration diagram for Kwave::ReversePlugin:
Collaboration graph

Classes

struct  SliceParams
 

Public Member Functions

 ReversePlugin (QObject *parent, const QVariantList &args)
 
virtual ~ReversePlugin () Q_DECL_OVERRIDE
 
virtual void run (QStringList params) Q_DECL_OVERRIDE
 
- Public Member Functions inherited from Kwave::Plugin
 Plugin (QObject *parent, const QVariantList &args)
 
virtual ~Plugin () Q_DECL_OVERRIDE
 
virtual QString name () const
 
virtual QString description () const
 
virtual QString progressText ()
 
virtual bool canClose () const
 
bool isRunning () const
 
bool shouldStop () const
 
virtual void load (QStringList &params)
 
virtual void unload ()
 
virtual QStringList * setup (QStringList &previous_params)
 
virtual int start (QStringList &params)
 
virtual int stop ()
 
Kwave::PluginManagermanager () const
 
Kwave::SignalManagersignalManager ()
 
QWidget * parentWidget () const
 
QString signalName ()
 
virtual sample_index_t signalLength ()
 
virtual double signalRate ()
 
virtual const QList< unsigned int > selectedTracks ()
 
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)
 
virtual void selectRange (sample_index_t offset, sample_index_t length)
 
virtual void migrateToActiveContext ()
 
- Public Member Functions inherited from Kwave::Runnable
virtual ~Runnable ()
 

Private Slots

virtual void updateProgress (qreal progress) Q_DECL_OVERRIDE
 

Private Member Functions

void reverseSlice (unsigned int track, Kwave::SampleReader *src_a, Kwave::SampleReader *src_b, const Kwave::ReversePlugin::SliceParams &params)
 
void reverse (Kwave::SampleArray &buffer)
 

Additional Inherited Members

- Public Slots inherited from Kwave::Plugin
virtual void setProgressDialogEnabled (bool enable)
 
virtual void updateProgress (qreal progress)
 
virtual void cancel ()
 
virtual void close ()
 
void release ()
 
- Signals inherited from Kwave::Plugin
void sigRunning (Kwave::Plugin *plugin)
 
void sigDone (Kwave::Plugin *plugin)
 
void sigClosed (Kwave::Plugin *p)
 
void sigCommand (const QString &command)
 
void setProgressText (const QString &text)
 
- Protected Member Functions inherited from Kwave::Plugin
int execute (QStringList &params)
 
void emitCommand (const QString &command)
 
void use ()
 
void setPluginManager (Kwave::PluginManager *new_plugin_manager)
 
virtual void run_wrapper (const QVariant &params) Q_DECL_OVERRIDE
 

Detailed Description

Reverses the current selection by exchanging blocks of samples from front and back and reversing their content

Definition at line 37 of file ReversePlugin.h.

Constructor & Destructor Documentation

◆ ReversePlugin()

Kwave::ReversePlugin::ReversePlugin ( QObject *  parent,
const QVariantList &  args 
)

Constructor

Parameters
parentreference to our plugin manager
argsargument list [unused]

Definition at line 47 of file ReversePlugin.cpp.

49  :Kwave::Plugin(parent, args)
50 {
51 }

◆ ~ReversePlugin()

Kwave::ReversePlugin::~ReversePlugin ( )
virtual

Destructor

Definition at line 54 of file ReversePlugin.cpp.

55 {
56 }

Member Function Documentation

◆ reverse()

void Kwave::ReversePlugin::reverse ( Kwave::SampleArray buffer)
private

reverses the content of an array of samples

Definition at line 205 of file ReversePlugin.cpp.

References Kwave::SampleArray::data(), and Kwave::SampleArray::size().

Referenced by reverseSlice().

206 {
207  unsigned int count = buffer.size() >> 1;
208  if (count <= 1) return;
209 
210  sample_t *a = buffer.data();
211  sample_t *b = buffer.data() + (buffer.size() - 1);
212  for (; count; count--) {
213  sample_t h = *a;
214  *a++ = *b;
215  *b-- = h;
216  }
217 }
unsigned int size() const
sample_t * data()
Definition: SampleArray.h:62
qint32 sample_t
Definition: Sample.h:37
Here is the call graph for this function:
Here is the caller graph for this function:

◆ reverseSlice()

void Kwave::ReversePlugin::reverseSlice ( unsigned int  track,
Kwave::SampleReader src_a,
Kwave::SampleReader src_b,
const Kwave::ReversePlugin::SliceParams params 
)
private

reverse a slice of samples

Parameters
trackindex of the track
src_areader for reading from the start (forward)
src_breader fro reading from the end (backwards)
paramscommon slice parameters (first/last/block size)

Definition at line 134 of file ReversePlugin.cpp.

References Kwave::Writer::flush(), flush(), Kwave::ReversePlugin::SliceParams::m_block_size, Kwave::ReversePlugin::SliceParams::m_first, Kwave::ReversePlugin::SliceParams::m_last, Kwave::SignalManager::openWriter(), Kwave::Overwrite, Kwave::SampleArray::resize(), reverse(), Kwave::SampleReader::seek(), Kwave::Plugin::signalManager(), and Kwave::toUint().

Referenced by run().

137 {
138  Kwave::SignalManager &signal_manager = signalManager();
139  const sample_index_t first = params.m_first;
140  const sample_index_t last = params.m_last;
141  const unsigned int block_size = params.m_block_size;
142  const sample_index_t start_a = first;
143  const sample_index_t start_b = (last >= block_size) ?
144  (last - block_size) : 0;
145  bool ok = true;
146 
147  if (start_a + block_size < start_b) {
148  // read from start
149  Kwave::SampleArray buffer_a;
150  ok &= buffer_a.resize(block_size);
151  Q_ASSERT(ok);
152  *src_a >> buffer_a;
153 
154  // read from end
155  Kwave::SampleArray buffer_b;
156  ok &= buffer_b.resize(block_size);
157  Q_ASSERT(ok);
158  src_b->seek(start_b);
159  *src_b >> buffer_b;
160 
161  // swap the contents
162  reverse(buffer_a);
163  reverse(buffer_b);
164 
165  // write back buffer from the end at the start
166  Kwave::Writer *dst_a = signal_manager.openWriter(
167  Kwave::Overwrite, track,
168  start_a, start_a + block_size - 1);
169  Q_ASSERT(dst_a);
170  if (!dst_a) return;
171  *dst_a << buffer_b;
172  dst_a->flush();
173  delete dst_a;
174 
175  // write back buffer from the start at the end
176  Kwave::Writer *dst_b = signal_manager.openWriter(
177  Kwave::Overwrite, track,
178  start_b, start_b + block_size - 1);
179  Q_ASSERT(dst_b);
180  if (!dst_b) return;
181  *dst_b << buffer_a << flush;
182  delete dst_b;
183  } else {
184  // single buffer with last block
185  Kwave::SampleArray buffer;
186  ok &= buffer.resize(Kwave::toUint(last - first + 1));
187  Q_ASSERT(ok);
188 
189  // read from start
190  *src_a >> buffer;
191 
192  // swap content
193  reverse(buffer);
194 
195  // write back
196  Kwave::Writer *dst = signal_manager.openWriter(
197  Kwave::Overwrite, track, first, last);
198  if (!dst) return;
199  (*dst) << buffer << flush;
200  delete dst;
201  }
202 }
void reverse(Kwave::SampleArray &buffer)
Kwave::SignalManager & signalManager()
Definition: Plugin.cpp:444
Kwave::Writer * openWriter(Kwave::InsertMode mode, unsigned int track, sample_index_t left=0, sample_index_t right=0)
bool flush()
Definition: Writer.h:94
quint64 sample_index_t
Definition: Sample.h:28
void seek(sample_index_t pos)
Kwave::Writer & flush(Kwave::Writer &s)
Definition: Writer.cpp:145
unsigned int toUint(T x)
Definition: Utils.h:109
bool resize(unsigned int size) Q_REQUIRED_RESULT
Here is the call graph for this function:
Here is the caller graph for this function:

◆ run()

void Kwave::ReversePlugin::run ( QStringList  params)
virtual

reverses the selection

Parameters
paramslist of strings with parameters

Reimplemented from Kwave::Plugin.

Definition at line 59 of file ReversePlugin.cpp.

References _, Kwave::StreamObject::blockSize(), Kwave::connect(), Kwave::ReversePlugin::SliceParams::m_block_size, Kwave::ReversePlugin::SliceParams::m_first, Kwave::ReversePlugin::SliceParams::m_last, Kwave::Plugin::manager(), reverseSlice(), Kwave::Plugin::selection(), Kwave::Plugin::shouldStop(), Kwave::Plugin::signalManager(), Kwave::SinglePassForward, Kwave::SinglePassReverse, Kwave::UndoAction::store(), Kwave::MultiTrackSource< SOURCE, INITIALIZE >::tracks(), and updateProgress().

60 {
61  Kwave::SignalManager &signal_manager = signalManager();
62 
63  QSharedPointer<Kwave::UndoTransactionGuard> undo_guard;
64 
65  // get the current selection and the list of affected tracks
66  QList<unsigned int> tracks;
67  sample_index_t first = 0;
68  sample_index_t last = 0;
69  sample_index_t length = selection(&tracks, &first, &last, true);
70  if (!length || tracks.isEmpty())
71  return;
72 
73  if ((params.count() != 1) || (params.first() != _("noundo"))) {
74  // undo is enabled, create a undo guard
75  undo_guard = QSharedPointer<Kwave::UndoTransactionGuard>(
76  new(std::nothrow) Kwave::UndoTransactionGuard(
77  *this, i18n("Reverse")));
78  if (!undo_guard) return;
79 
80  // try to save undo information
81  Kwave::UndoAction *undo =
82  new(std::nothrow) Kwave::UndoReverseAction(manager());
83  if (!undo_guard->registerUndoAction(undo))
84  return;
85  undo->store(signal_manager);
86  }
87 
89  signalManager(), tracks, first, last);
91  signalManager(), tracks, first, last);
92 
93  // break if aborted
94  if (!source_a.tracks() || !source_b.tracks())
95  return;
96 
97  // connect the progress dialog
98  connect(&source_a, SIGNAL(progress(qreal)),
99  this, SLOT(updateProgress(qreal)),
100  Qt::BlockingQueuedConnection);
101 
102  // use a reasonably big buffer size
103  const unsigned int block_size = 5 * source_a.blockSize();
104 
105  // loop over the sample range
106  while ((first < last) && !shouldStop()) {
107  QFutureSynchronizer<void> synchronizer;
108 
110  slice_params.m_first = first;
111  slice_params.m_last = last;
112  slice_params.m_block_size = block_size;
113 
114  // loop over all tracks
115  for (int i = 0; i < tracks.count(); i++) {
116  synchronizer.addFuture(QtConcurrent::run(
117  this,
119  tracks[i], source_a[i], source_b[i],
120  slice_params)
121  );
122  }
123 
124  // next positions
125  first += block_size;
126  last = (last > block_size) ? (last - block_size) : 0;
127 
128  synchronizer.waitForFinished();
129  }
130 
131 }
Kwave::SignalManager & signalManager()
Definition: Plugin.cpp:444
virtual void updateProgress(qreal progress) Q_DECL_OVERRIDE
quint64 sample_index_t
Definition: Sample.h:28
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
void reverseSlice(unsigned int track, Kwave::SampleReader *src_a, Kwave::SampleReader *src_b, const Kwave::ReversePlugin::SliceParams &params)
#define _(m)
Definition: memcpy.c:66
bool shouldStop() const
Definition: Plugin.h:120
virtual bool store(Kwave::SignalManager &manager)=0
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
Here is the call graph for this function:

◆ updateProgress

void Kwave::ReversePlugin::updateProgress ( qreal  progress)
privatevirtualslot

multiplies the progress by factor two and calls Kwave::Plugin::updateProgress

Definition at line 220 of file ReversePlugin.cpp.

References Kwave::Plugin::updateProgress().

Referenced by run().

221 {
222  Kwave::Plugin::updateProgress(progress + progress);
223 }
virtual void updateProgress(qreal progress)
Definition: Plugin.cpp:260
Here is the call graph for this function:
Here is the caller graph for this function:

The documentation for this class was generated from the following files: