diff options
| author | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2009-07-20 09:07:02 +0000 |
|---|---|---|
| committer | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2009-07-20 09:07:02 +0000 |
| commit | 7cfd365a457fe6bf7e9981f521cc51a64bfee66d (patch) | |
| tree | 15ff3d78c78086c142dd7e6562677e0b329a114f /src/plugins/Input/flac | |
| parent | 934373ccc87d3ca64206902528749fcf7ad01b4e (diff) | |
| download | qmmp-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')
| -rw-r--r-- | src/plugins/Input/flac/decoder_flac.cpp | 50 | ||||
| -rw-r--r-- | src/plugins/Input/flac/decoder_flac.h | 7 |
2 files changed, 51 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); + } } + 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; }; |
