aboutsummaryrefslogtreecommitdiff
path: root/lib/decoder.cpp
diff options
context:
space:
mode:
authortrialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38>2007-11-27 19:10:13 +0000
committertrialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38>2007-11-27 19:10:13 +0000
commit2a9a78ddd34ac86dad084dc1102320645963df1c (patch)
treee4d2250b04357ffd7b0c8f324c7ca09ea7014277 /lib/decoder.cpp
parent10923b3e9f495e70a23d4dcbc3c891b7517e667f (diff)
downloadqmmp-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.cpp82
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);