From 40ee4f96d507067c453c1a790857107ad0c83924 Mon Sep 17 00:00:00 2001 From: trialuser02 Date: Tue, 14 Jul 2009 19:15:32 +0000 Subject: improved cue support (very unstable) git-svn-id: http://svn.code.sf.net/p/qmmp-dev/code/trunk/qmmp@1033 90c681e8-e032-0410-971d-27865f9a5e38 --- src/plugins/Input/cue/decoder_cue.cpp | 54 +++++++++++++++++++++++++++++++++-- 1 file changed, 52 insertions(+), 2 deletions(-) (limited to 'src/plugins/Input/cue/decoder_cue.cpp') diff --git a/src/plugins/Input/cue/decoder_cue.cpp b/src/plugins/Input/cue/decoder_cue.cpp index ff2761549..f65e17f79 100644 --- a/src/plugins/Input/cue/decoder_cue.cpp +++ b/src/plugins/Input/cue/decoder_cue.cpp @@ -23,6 +23,7 @@ #include #include #include +#include #include #include @@ -62,6 +63,12 @@ bool DecoderCUE::initialize() } int track = path.section("#", -1).toInt(); path = parser.filePath(track); + // find next track + if(track <= parser.count() - 1) + m_nextUrl = parser.info(track + 1)->path(); + //is it track of another file? + if(QUrl(m_nextUrl).path() != p) + m_nextUrl.clear(); if (!QFile::exists(path)) { @@ -112,6 +119,7 @@ bool DecoderCUE::initialize() //replace default state handler to ignore metadata m_decoder->setStateHandler(new CUEStateHandler(m_decoder)); m_output2->setStateHandler(m_decoder->stateHandler()); + connect(stateHandler(), SIGNAL(aboutToFinish()), SLOT(proccessFinish())); //prepare decoder and ouput objects m_decoder->initialize(); m_decoder->setFragment(m_offset, m_length); @@ -247,19 +255,61 @@ void DecoderCUE::run() m_output2->start(); } +void DecoderCUE::proccessFinish() +{ + qDebug("==>%s", qPrintable(SoundCore::instance()->nextUrl())); + qDebug("==>%s", qPrintable(m_nextUrl)); + if(!SoundCore::instance()->nextUrl().isEmpty() + && !m_nextUrl.isEmpty() + && SoundCore::instance()->nextUrl() == m_nextUrl) + { + qDebug("prefinish"); + qDebug("next url: %s", qPrintable(m_nextUrl)); + int track = m_nextUrl.section("#", -1).toInt(); + QString p = QUrl(m_nextUrl).path(); + p.replace(QString(QUrl::toPercentEncoding("#")), "#"); + p.replace(QString(QUrl::toPercentEncoding("%")), "%"); + + CUEParser parser(p); + m_length = parser.length(track); + m_offset = parser.offset(track); + m_decoder->mutex()->lock(); + m_decoder->setFragment(m_offset, m_length); + m_output2->seek(0); + m_decoder->mutex()->unlock(); + + //stateHandler()->dispatch(Qmmp::Stopped); + //stateHandler()->dispatch(Qmmp::Buffering); + //stateHandler()->dispatch(Qmmp::Playing); + //m_decoder->mutex()->lock(); + //m_output2->seek(0); + //m_decoder->mutex()->unlock(); + + // find next track + if(track <= parser.count() - 1) + m_nextUrl = parser.info(track + 1)->path(); + else + m_nextUrl.clear(); + //is it track of another file? + if(QUrl(m_nextUrl).path() != p) + m_nextUrl.clear(); + emit playbackFinished(); + } + else + Decoder::stop(); +} CUEStateHandler::CUEStateHandler(QObject *parent): StateHandler(parent){} CUEStateHandler::~CUEStateHandler(){} void CUEStateHandler::dispatch(qint64 elapsed, - qint64 totalTime, int bitrate, quint32 frequency, int precision, int channels) { - StateHandler::instance()->dispatch(elapsed, totalTime, bitrate, + StateHandler::instance()->dispatch(elapsed, bitrate, frequency, precision, channels); } -- cgit v1.2.3-13-gbd6f