22 #include <KLocalizedString> 24 #include <QFutureSynchronizer> 26 #include <QSharedPointer> 27 #include <QStringList> 29 #include <QtConcurrentRun> 48 const QVariantList &args)
63 QSharedPointer<Kwave::UndoTransactionGuard> undo_guard;
66 QList<unsigned int> tracks;
70 if (!length || tracks.isEmpty())
73 if ((params.count() != 1) || (params.first() !=
_(
"noundo"))) {
75 undo_guard = QSharedPointer<Kwave::UndoTransactionGuard>(
77 *
this, i18n(
"Reverse")));
78 if (!undo_guard)
return;
83 if (!undo_guard->registerUndoAction(undo))
85 undo->
store(signal_manager);
98 connect(&source_a, SIGNAL(progress(qreal)),
100 Qt::BlockingQueuedConnection);
103 const unsigned int block_size = 5 * source_a.
blockSize();
107 QFutureSynchronizer<void> synchronizer;
111 slice_params.
m_last = last;
115 for (
int i = 0; i < tracks.count(); i++) {
116 synchronizer.addFuture(QtConcurrent::run(
119 tracks[i], source_a[i], source_b[i],
126 last = (last > block_size) ? (last - block_size) : 0;
128 synchronizer.waitForFinished();
144 (last - block_size) : 0;
147 if (start_a + block_size < start_b) {
150 ok &= buffer_a.
resize(block_size);
156 ok &= buffer_b.
resize(block_size);
158 src_b->
seek(start_b);
168 start_a, start_a + block_size - 1);
178 start_b, start_b + block_size - 1);
181 *dst_b << buffer_a <<
flush;
199 (*dst) << buffer <<
flush;
207 unsigned int count = buffer.
size() >> 1;
208 if (count <= 1)
return;
212 for (; count; count--) {
226 #include "ReversePlugin.moc"
void reverse(Kwave::SampleArray &buffer)
virtual unsigned int tracks() const Q_DECL_OVERRIDE
Kwave::SignalManager & signalManager()
virtual void updateProgress(qreal progress) Q_DECL_OVERRIDE
Kwave::Writer * openWriter(Kwave::InsertMode mode, unsigned int track, sample_index_t left=0, sample_index_t right=0)
Kwave::PluginManager & manager() const
bool connect(Kwave::StreamObject &source, const char *output, Kwave::StreamObject &sink, const char *input)
void seek(sample_index_t pos)
virtual void run(QStringList params) Q_DECL_OVERRIDE
virtual ~ReversePlugin() Q_DECL_OVERRIDE
void reverseSlice(unsigned int track, Kwave::SampleReader *src_a, Kwave::SampleReader *src_b, const Kwave::ReversePlugin::SliceParams ¶ms)
virtual unsigned int blockSize() const
#define KWAVE_PLUGIN(name, class)
unsigned int size() const
Kwave::Writer & flush(Kwave::Writer &s)
virtual void updateProgress(qreal progress)
unsigned int m_block_size
bool resize(unsigned int size) Q_REQUIRED_RESULT
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)