kwave  18.07.70
Kwave::SampleRatePlugin Class Reference

#include <SampleRatePlugin.h>

Inheritance diagram for Kwave::SampleRatePlugin:
Inheritance graph
Collaboration diagram for Kwave::SampleRatePlugin:
Collaboration graph

Public Member Functions

 SampleRatePlugin (QObject *parent, const QVariantList &args)
 
virtual ~SampleRatePlugin () 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 ()
 

Protected Member Functions

int interpreteParameters (QStringList &params)
 
- 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
 

Private Attributes

QStringList m_params
 
double m_new_rate
 
bool m_whole_signal
 

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)
 

Detailed Description

Change the sample rate of a signal

Definition at line 36 of file SampleRatePlugin.h.

Constructor & Destructor Documentation

◆ SampleRatePlugin()

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

Constructor

Parameters
parentreference to our plugin manager
argsargument list [unused]

Definition at line 44 of file SampleRatePlugin.cpp.

46  :Kwave::Plugin(parent, args), m_params(), m_new_rate(0.0),
47  m_whole_signal(false)
48 {
49 }

◆ ~SampleRatePlugin()

Kwave::SampleRatePlugin::~SampleRatePlugin ( )
virtual

Destructor

Definition at line 52 of file SampleRatePlugin.cpp.

53 {
54 }

Member Function Documentation

◆ interpreteParameters()

int Kwave::SampleRatePlugin::interpreteParameters ( QStringList &  params)
protected

reads values from the parameter list

Parameters
paramslist of strings with parameters
Returns
0 if succeeded or negative error code if failed

Definition at line 57 of file SampleRatePlugin.cpp.

References _, m_new_rate, m_params, and m_whole_signal.

Referenced by run().

58 {
59  bool ok = false;
60  QString param;
61 
62  // set defaults
63  m_new_rate = 44100.0;
64  m_whole_signal = false;
65 
66  // evaluate the parameter list
67  if (params.count() < 1) return -EINVAL;
68 
69  param = params[0];
70  m_new_rate = param.toDouble(&ok);
71  Q_ASSERT(ok);
72  if (!ok) return -EINVAL;
73 
74  // check whether we should change the whole signal (optional)
75  if (params.count() == 2) {
76  if (params[1] != _("all"))
77  return -EINVAL;
78  m_whole_signal = true;
79  }
80 
81  // all parameters accepted
82  m_params = params;
83 
84  return 0;
85 }
#define _(m)
Definition: memcpy.c:66
Here is the caller graph for this function:

◆ run()

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

changes the sample rate

Parameters
paramslist of strings with parameters

Reimplemented from Kwave::Plugin.

Definition at line 88 of file SampleRatePlugin.cpp.

References Kwave::SignalManager::allTracks(), Kwave::connect(), Kwave::MetaDataList::copy(), Kwave::SignalManager::deleteRange(), Kwave::MetaDataList::deleteRange(), Kwave::MultiTrackReader::eof(), Kwave::MultiWriter::flush(), Kwave::MultiTrackSource< SOURCE, INITIALIZE >::goOn(), Kwave::MetaData::hasProperty(), Kwave::SignalManager::insertSpace(), interpreteParameters(), m_new_rate, m_whole_signal, Kwave::MetaDataList::merge(), Kwave::SignalManager::metaData(), Kwave::Overwrite, Kwave::MetaData::positionBoundPropertyNames(), Kwave::FileInfo::rate(), Kwave::Plugin::selection(), Kwave::SignalManager::selectRange(), Kwave::StreamObject::setAttribute(), Kwave::SignalManager::setFileInfo(), Kwave::Plugin::setProgressText(), Kwave::FileInfo::setRate(), Kwave::Plugin::shouldStop(), Kwave::Plugin::signalLength(), Kwave::Plugin::signalManager(), Kwave::SinglePassForward, Kwave::toInt(), Kwave::SignalManager::tracks(), and Kwave::Plugin::updateProgress().

89 {
91 
92  // parse parameters
93  if (interpreteParameters(params) < 0)
94  return;
95 
96  double old_rate = Kwave::FileInfo(signalManager().metaData()).rate();
97  if ((old_rate <= 0) || qFuzzyCompare(old_rate, m_new_rate)) return;
98 
99  Kwave::UndoTransactionGuard undo_guard(*this, i18n("Change sample rate"));
100 
101  // get the current selection and the list of affected tracks
102  sample_index_t first = 0;
103  sample_index_t last = 0;
104  sample_index_t length;
105  QList<unsigned int> tracks;
106  if (m_whole_signal) {
107  length = signalLength();
108  last = (length) ? (length - 1) : 0;
109  tracks = mgr.allTracks();
110  } else {
111  length = selection(&tracks, &first, &last, true);
112  if ((length == signalLength()) &&
113  (tracks.count() == Kwave::toInt(mgr.tracks())))
114  {
115  // manually selected the whole signal
116  m_whole_signal = true;
117  }
118  }
119  qDebug("SampleRatePlugin: from %9lu - %9lu (%9lu)",
120  static_cast<unsigned long int>(first),
121  static_cast<unsigned long int>(last),
122  static_cast<unsigned long int>(length));
123  if (!length || tracks.isEmpty()) return;
124 
125  // calculate the new length
126  double ratio = m_new_rate / old_rate;
127  sample_index_t new_length = static_cast<sample_index_t>(length * ratio);
128  if ((new_length == length) || !new_length) return;
129 
130  // if the new length is bigger than the current length,
131  // insert some space at the end
132  if (new_length > length) {
133  qDebug("SampleRatePlugin: inserting %lu at %lu",
134  static_cast<unsigned long int>(new_length - length + 1),
135  static_cast<unsigned long int>(last + 1));
136  mgr.insertSpace(last + 1, new_length - length + 1, tracks);
137  }
138 
140  mgr, tracks, first, last);
141 
142  // connect the progress dialog
143  connect(&source, SIGNAL(progress(qreal)),
144  this, SLOT(updateProgress(qreal)),
145  Qt::BlockingQueuedConnection);
146  emit setProgressText(
147  i18n("Changing sample rate from %1 kHz to %2 kHz...",
148  (old_rate / 1E3), (m_new_rate / 1E3))
149  );
150 
151  // create the converter
153  tracks.count(), this);
154  converter.setAttribute(SLOT(setRatio(QVariant)), QVariant(ratio));
155 
156  // create the writer with the appropriate length
157  Kwave::MultiTrackWriter sink(mgr, tracks, Kwave::Overwrite,
158  first, first + new_length - 1);
159 
160  // connect the objects
161  bool ok = true;
162  if (ok) ok = Kwave::connect(
163  source, SIGNAL(output(Kwave::SampleArray)),
164  converter, SLOT(input(Kwave::SampleArray)));
165  if (ok) ok = Kwave::connect(
166  converter, SIGNAL(output(Kwave::SampleArray)),
167  sink, SLOT(input(Kwave::SampleArray)));
168  if (!ok) {
169  return;
170  }
171 
172  while (!shouldStop() && !source.eof()) {
173  source.goOn();
174  converter.goOn();
175  }
176 
177  sink.flush();
178 
179  // find out how many samples have been written and delete the leftovers
180  sample_index_t written = sink[0]->position() - first;
181 // qDebug("SampleRatePlugin: old=%u, expexted=%u, written=%u",
182 // length, new_length, written);
183  if (written < length) {
184  sample_index_t to_delete = length - written;
185  mgr.deleteRange(written, to_delete, tracks);
186  }
187 
188  // adjust meta data locations
189  Kwave::MetaDataList meta = mgr.metaData().copy(first, last, tracks);
190  if (!meta.isEmpty()) {
191  // adjust all positions in the originally selected range
192  // NOTE: if the ratio is > 1, work backwards, otherwise forward
193 
195  (ratio > 1) ? it.toBack() : it.toFront();
196  while ((ratio > 1) ? it.hasPrevious() : it.hasNext()) {
197  Kwave::MetaData &m = (ratio > 1) ?
198  it.previous().value() : it.next().value();
199 
200  QStringList properties =
202  foreach (const QString &property, properties) {
203  if (!m.hasProperty(property))
204  continue;
205 
206  sample_index_t pos = static_cast<sample_index_t>(
207  m[property].toULongLong());
208  if (pos < first) continue;
209  if (pos > last) continue;
210 
211  // is in our range -> calculate new position
212  pos -= first;
213  pos *= ratio;
214  pos += first;
215 
216  m[property] = pos;
217  }
218  }
219 
220  mgr.metaData().deleteRange(first, last, tracks);
221  mgr.metaData().merge(meta);
222  }
223 
224  // update the selection if it was not empty
225  length = selection(Q_NULLPTR, &first, &last, false);
226  if (length) {
227  if (m_whole_signal) {
228  // if whole signal selected -> adjust start and end
229  first *= ratio;
230  last *= ratio;
231  length = last - first + 1;
232  } else {
233  // only a portion selected -> adjust only length
234  length *= ratio;
235  }
236 
237  mgr.selectRange(first, length);
238  }
239 
240  // set the sample rate if we modified the whole signal
241  if (m_whole_signal) {
242  Kwave::FileInfo info(signalManager().metaData());
243  info.setRate(m_new_rate);
244  mgr.setFileInfo(info, false);
245  }
246 
247 }
virtual MetaDataList copy(sample_index_t offset, sample_index_t length, const QList< unsigned int > &tracks) const
static QStringList positionBoundPropertyNames()
Definition: MetaData.cpp:155
bool hasProperty(const QString &p) const
Definition: MetaData.cpp:104
void selectRange(sample_index_t offset, sample_index_t length)
double rate() const
Definition: FileInfo.cpp:415
bool insertSpace(sample_index_t offset, sample_index_t length, const QList< unsigned int > &track_list)
Kwave::MetaDataList & metaData()
Kwave::SignalManager & signalManager()
Definition: Plugin.cpp:444
unsigned int tracks()
quint64 sample_index_t
Definition: Sample.h:28
bool deleteRange(sample_index_t offset, sample_index_t length, const QList< unsigned int > &track_list)
void merge(const MetaDataList &meta_data)
int interpreteParameters(QStringList &params)
bool connect(Kwave::StreamObject &source, const char *output, Kwave::StreamObject &sink, const char *input)
Definition: Connect.cpp:48
void setFileInfo(const Kwave::FileInfo &new_info, bool with_undo)
int toInt(T x)
Definition: Utils.h:127
QMutableMapIterator< QString, MetaData > MutableIterator
Definition: MetaDataList.h:44
virtual sample_index_t signalLength()
Definition: Plugin.cpp:462
const QList< unsigned int > allTracks()
virtual void deleteRange(sample_index_t offset, sample_index_t length, const QList< unsigned int > &tracks)
virtual void updateProgress(qreal progress)
Definition: Plugin.cpp:260
void setProgressText(const QString &text)
bool shouldStop() const
Definition: Plugin.h:120
void setAttribute(const char *attribute, const QVariant &value)
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:

Member Data Documentation

◆ m_new_rate

double Kwave::SampleRatePlugin::m_new_rate
private

new sample rate

Definition at line 73 of file SampleRatePlugin.h.

Referenced by interpreteParameters(), and run().

◆ m_params

QStringList Kwave::SampleRatePlugin::m_params
private

list of parameters

Definition at line 70 of file SampleRatePlugin.h.

Referenced by interpreteParameters().

◆ m_whole_signal

bool Kwave::SampleRatePlugin::m_whole_signal
private

if true, ignore selection and change whole signal

Definition at line 76 of file SampleRatePlugin.h.

Referenced by interpreteParameters(), and run().


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