diff options
Diffstat (limited to 'src/plugins/Input')
| -rw-r--r-- | src/plugins/Input/flac/decoder_flac.cpp | 50 | ||||
| -rw-r--r-- | src/plugins/Input/flac/decoder_flac.h | 7 | ||||
| -rw-r--r-- | src/plugins/Input/mad/decoder_mad.cpp | 1 |
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); } } |
