aboutsummaryrefslogtreecommitdiff
path: root/src/plugins/Input/flac/decoder_flac.cpp
diff options
context:
space:
mode:
authortrialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38>2009-07-20 09:07:02 +0000
committertrialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38>2009-07-20 09:07:02 +0000
commit7cfd365a457fe6bf7e9981f521cc51a64bfee66d (patch)
tree15ff3d78c78086c142dd7e6562677e0b329a114f /src/plugins/Input/flac/decoder_flac.cpp
parent934373ccc87d3ca64206902528749fcf7ad01b4e (diff)
downloadqmmp-7cfd365a457fe6bf7e9981f521cc51a64bfee66d.tar.gz
qmmp-7cfd365a457fe6bf7e9981f521cc51a64bfee66d.tar.bz2
qmmp-7cfd365a457fe6bf7e9981f521cc51a64bfee66d.zip
flac plugin: fixed cue support
git-svn-id: http://svn.code.sf.net/p/qmmp-dev/code/trunk/qmmp@1049 90c681e8-e032-0410-971d-27865f9a5e38
Diffstat (limited to 'src/plugins/Input/flac/decoder_flac.cpp')
-rw-r--r--src/plugins/Input/flac/decoder_flac.cpp50
1 files changed, 44 insertions, 6 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);
+ }
}
+