From 7cfd365a457fe6bf7e9981f521cc51a64bfee66d Mon Sep 17 00:00:00 2001 From: trialuser02 Date: Mon, 20 Jul 2009 09:07:02 +0000 Subject: 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 --- src/plugins/Input/flac/decoder_flac.cpp | 50 +++++++++++++++++++++++++++++---- 1 file changed, 44 insertions(+), 6 deletions(-) (limited to 'src/plugins/Input/flac/decoder_flac.cpp') 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 #include #include +#include #include #include @@ -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 metaData = parser.info(track)->metaData(); + QMap 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 metaData = m_cue_parser->info(track)->metaData(); + stateHandler()->dispatch(metaData); + } } + -- cgit v1.2.3-13-gbd6f