diff options
| author | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2007-11-27 19:10:13 +0000 |
|---|---|---|
| committer | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2007-11-27 19:10:13 +0000 |
| commit | 2a9a78ddd34ac86dad084dc1102320645963df1c (patch) | |
| tree | e4d2250b04357ffd7b0c8f324c7ca09ea7014277 /lib/decoder.cpp | |
| parent | 10923b3e9f495e70a23d4dcbc3c891b7517e667f (diff) | |
| download | qmmp-2a9a78ddd34ac86dad084dc1102320645963df1c.tar.gz qmmp-2a9a78ddd34ac86dad084dc1102320645963df1c.tar.bz2 qmmp-2a9a78ddd34ac86dad084dc1102320645963df1c.zip | |
fixed seeking; added effect plugin support; added sample rate converter plugin
git-svn-id: http://svn.code.sf.net/p/qmmp-dev/code/trunk/qmmp@190 90c681e8-e032-0410-971d-27865f9a5e38
Diffstat (limited to 'lib/decoder.cpp')
| -rw-r--r-- | lib/decoder.cpp | 82 |
1 files changed, 65 insertions, 17 deletions
diff --git a/lib/decoder.cpp b/lib/decoder.cpp index d3beda1a1..4ae0637c7 100644 --- a/lib/decoder.cpp +++ b/lib/decoder.cpp @@ -8,35 +8,44 @@ #include <QStringList> #include <QApplication> #include <QSettings> +#include <math.h> +#include "effect.h" +#include "effectfactory.h" + #include "constants.h" #include "buffer.h" #include "output.h" #include "visual.h" #include "decoderfactory.h" #include "streamreader.h" -extern "C"{ -#include "equ/iir.h" +extern "C" +{ +#include "equ/iir.h" } #include "decoder.h" Decoder::Decoder(QObject *parent, DecoderFactory *d, QIODevice *i, Output *o) - : QThread(parent), fctry(d), in(i), out(o), blksize(0),m_eqInited(FALSE), + : QThread(parent), fctry(d), in(i), m_output(o),m_eqInited(FALSE), m_useEQ(FALSE) { - out->recycler()->clear(); + m_output->recycler()->clear(); int b[] = {0,0,0,0,0,0,0,0,0,0}; setEQ(b, 0); qRegisterMetaType<DecoderState>("DecoderState"); + + + blksize = Buffer::size(); + m_effects = Effect::create(this); } Decoder::~Decoder() { fctry = 0; in = 0; - out = 0; + m_output = 0; blksize = 0; } @@ -138,16 +147,16 @@ Decoder *Decoder::create(QObject *parent, const QString &source, qDebug(qPrintable(source)); DecoderFactory *fact = 0; - if(!input->open(QIODevice::ReadOnly)) + if (!input->open(QIODevice::ReadOnly)) { qDebug("Decoder: cannot open input"); return decoder; - } + } StreamReader* sreader = qobject_cast<StreamReader *>(input); - if(sreader) + if (sreader) { fact = Decoder::findByMime(sreader->contentType()); - if(!fact) + if (!fact) fact = Decoder::findByContent(sreader); } else @@ -157,7 +166,7 @@ Decoder *Decoder::create(QObject *parent, const QString &source, { decoder = fact->create(parent, input, output); } - if(!decoder) + if (!decoder) input->close(); return decoder; @@ -187,9 +196,9 @@ DecoderFactory *Decoder::findByMime(const QString& type) if (!blacklist.contains(files.at(i).section('/',-1))) { QStringList types = factories->at(i)->properties().contentType.split(";"); - for(int j=0; j<types.size(); ++j) + for (int j=0; j<types.size(); ++j) { - if(type == types[j] && !types[j].isEmpty()) + if (type == types[j] && !types[j].isEmpty()) return factories->at(i); } } @@ -290,7 +299,6 @@ void Decoder::error(const QString &e) ulong Decoder::produceSound(char *data, ulong output_bytes, ulong bitrate, int nch) { ulong sz = output_bytes < blksize ? output_bytes : blksize; - Buffer *b = output()->recycler()->get(); if (!m_eqInited) { @@ -301,12 +309,38 @@ ulong Decoder::produceSound(char *data, ulong output_bytes, ulong bitrate, int n { iir((void*) data,sz,nch); } - memcpy(b->data, data, sz); - if (sz != blksize) - memset(b->data + sz, 0, blksize - sz); + char *out_data = data; + char *prev_data = data; + ulong w = sz; + Effect* effect = 0; + foreach(effect, m_effects) + { + w = effect->process(prev_data, sz, &out_data); + + if(w <= 0) + { + // copy data if plugin can not procees it + w = sz; + out_data = new char[w]; + memcpy(out_data, prev_data, w); + } + if(data != prev_data) + delete prev_data; + prev_data = out_data; + } - b->nbytes = blksize; + Buffer *b = output()->recycler()->get(w); + + memcpy(b->data, out_data, w); + + if (data != out_data) + delete out_data; + + if (w < blksize + b->exceeding) + memset(b->data + w, 0, blksize + b->exceeding - w); + + b->nbytes = w;// blksize; b->rate = bitrate; output()->recycler()->add(); @@ -316,6 +350,20 @@ ulong Decoder::produceSound(char *data, ulong output_bytes, ulong bitrate, int n return sz; } +void Decoder::configure(long freq, int channels, int prec, int bitrate) +{ + Effect* effect = 0; + foreach(effect, m_effects) + { + effect->configure(freq, channels, prec); + freq = m_effects.at(0)->frequency(); + channels = effect->channels(); + prec = effect->resolution(); + } + if (m_output) + m_output->configure(freq, channels, prec, bitrate); +} + void Decoder::setEQ(int bands[10], int preamp) { set_preamp(0, 1.0 + 0.0932471 *preamp + 0.00279033 * preamp * preamp); |
