aboutsummaryrefslogtreecommitdiff
path: root/src/plugins/Input
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/Input')
-rw-r--r--src/plugins/Input/flac/decoder_flac.cpp50
-rw-r--r--src/plugins/Input/flac/decoder_flac.h7
-rw-r--r--src/plugins/Input/mad/decoder_mad.cpp1
3 files changed, 51 insertions, 7 deletions
diff --git a/src/plugins/Input/flac/decoder_flac.cpp b/src/plugins/Input/flac/decoder_flac.cpp
index 3ec7b3c5c..a79e17b34 100644
--- a/src/plugins/Input/flac/decoder_flac.cpp
+++ b/src/plugins/Input/flac/decoder_flac.cpp
@@ -32,6 +32,7 @@
#include <qmmp/buffer.h>
#include <qmmp/output.h>
#include <qmmp/recycler.h>
+#include <qmmp/statehandler.h>
#include <QObject>
#include <QFile>
@@ -268,6 +269,7 @@ DecoderFLAC::DecoderFLAC(QObject *parent, DecoderFactory *d, QIODevice *i, Outpu
m_data = new flac_data;
m_data->decoder = NULL;
data()->input = i;
+ m_cue_parser = 0;
}
@@ -307,14 +309,21 @@ bool DecoderFLAC::initialize()
if (xiph_comment && xiph_comment->fieldListMap().contains("CUESHEET"))
{
qDebug("DecoderFLAC: using cuesheet xiph comment.");
- CUEParser parser(xiph_comment->fieldListMap()["CUESHEET"].toString().toCString(TRUE), p);
+ m_cue_parser = new CUEParser(xiph_comment->fieldListMap()["CUESHEET"].toString()
+ .toCString(TRUE), p);
int track = m_path.section("#", -1).toInt();
- m_offset = parser.offset(track);
- m_length = parser.length(track);
+ m_offset = m_cue_parser->offset(track);
+ m_length = m_cue_parser->length(track);
data()->input = new QFile(p);
//send metadata
- QMap<Qmmp::MetaData, QString> metaData = parser.info(track)->metaData();
+ QMap<Qmmp::MetaData, QString> metaData = m_cue_parser->info(track)->metaData();
StateHandler::instance()->dispatch(metaData);
+
+ connect(stateHandler(),SIGNAL(aboutToFinish()),SLOT(processFinish()));
+ //next url
+ m_nextUrl.clear();
+ if(track <= m_cue_parser->count() - 1)
+ m_nextUrl = m_cue_parser->info(track + 1)->path();
}
else
{
@@ -383,8 +392,7 @@ bool DecoderFLAC::initialize()
m_totalTime = data()->length;
inited = TRUE;
- /*if (m_offset)
- seekTime = m_offset;*/
+
if (m_length)
{
m_totalTime = m_length;
@@ -431,4 +439,34 @@ void DecoderFLAC::deinit()
delete data()->input;
data()->input = 0;
};
+ if(m_cue_parser)
+ delete m_cue_parser;
+ m_cue_parser = 0;
+}
+
+void DecoderFLAC::processFinish()
+{
+ if(m_cue_parser && nextUrlRequest(m_nextUrl))
+ {
+ qDebug("DecoderFLAC: going to next track");
+ int track = m_nextUrl.section("#", -1).toInt();
+ QString p = QUrl(m_nextUrl).path();
+ p.replace(QString(QUrl::toPercentEncoding("#")), "#");
+ p.replace(QString(QUrl::toPercentEncoding("%")), "%");
+ //update current fragment
+ mutex()->lock();
+ setFragment(m_cue_parser->offset(track), m_cue_parser->length(track));
+ output()->seek(0); //reset time counter
+ mutex()->unlock();
+ // find next track
+ m_nextUrl.clear();
+ if(track <= m_cue_parser->count() - 1)
+ m_nextUrl = m_cue_parser->info(track + 1)->path();
+ //change track
+ emit playbackFinished();
+ //send metadata
+ QMap<Qmmp::MetaData, QString> metaData = m_cue_parser->info(track)->metaData();
+ stateHandler()->dispatch(metaData);
+ }
}
+
diff --git a/src/plugins/Input/flac/decoder_flac.h b/src/plugins/Input/flac/decoder_flac.h
index 75f0d84cf..9d60860c2 100644
--- a/src/plugins/Input/flac/decoder_flac.h
+++ b/src/plugins/Input/flac/decoder_flac.h
@@ -30,6 +30,8 @@
#define SAMPLES_PER_WRITE 512
#define SAMPLE_BUFFER_SIZE ((FLAC__MAX_BLOCK_SIZE + SAMPLES_PER_WRITE) * MAX_SUPPORTED_CHANNELS * (32/8))
+class CUEParser;
+
struct flac_data
{
//FLAC__SeekableStreamDecoder *decoder;
@@ -58,6 +60,7 @@ struct flac_data
class DecoderFLAC : public Decoder
{
+Q_OBJECT
public:
DecoderFLAC(QObject *, DecoderFactory *, QIODevice *, Output *, const QString &path);
virtual ~DecoderFLAC();
@@ -72,6 +75,8 @@ public:
return m_data;
}
+private slots:
+ void processFinish();
private:
// Standard Decoder API
@@ -90,6 +95,8 @@ private:
qint64 m_offset;
qint64 m_length;
bool inited;
+ CUEParser *m_cue_parser;
+ QString m_nextUrl;
};
diff --git a/src/plugins/Input/mad/decoder_mad.cpp b/src/plugins/Input/mad/decoder_mad.cpp
index 5685da28a..766e8a678 100644
--- a/src/plugins/Input/mad/decoder_mad.cpp
+++ b/src/plugins/Input/mad/decoder_mad.cpp
@@ -355,7 +355,6 @@ qint64 DecoderMAD::readAudio(char *data, qint64 size)
continue;
}
mad_synth_frame(&synth, &frame);
- //stream.error = MAD_ERROR_NONE;
return madOutput(data, size);
}
}