diff options
| author | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2009-02-06 20:05:37 +0000 |
|---|---|---|
| committer | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2009-02-06 20:05:37 +0000 |
| commit | 37ec3ed3be7dbb33bb34a1dcd09758b6f537652f (patch) | |
| tree | 6f4ff266750c8d0a0d40e37f229f3e4477e0a41f /src/plugins/Input/wavpack/decoder_wavpack.cpp | |
| parent | 02ef6f2f2131d2e75846d937064f4e14ac3b27fd (diff) | |
| download | qmmp-37ec3ed3be7dbb33bb34a1dcd09758b6f537652f.tar.gz qmmp-37ec3ed3be7dbb33bb34a1dcd09758b6f537652f.tar.bz2 qmmp-37ec3ed3be7dbb33bb34a1dcd09758b6f537652f.zip | |
wavpack embeded cue support (thanks to Dmitry Kostin)
git-svn-id: http://svn.code.sf.net/p/qmmp-dev/code/trunk/qmmp@780 90c681e8-e032-0410-971d-27865f9a5e38
Diffstat (limited to 'src/plugins/Input/wavpack/decoder_wavpack.cpp')
| -rw-r--r-- | src/plugins/Input/wavpack/decoder_wavpack.cpp | 59 |
1 files changed, 47 insertions, 12 deletions
diff --git a/src/plugins/Input/wavpack/decoder_wavpack.cpp b/src/plugins/Input/wavpack/decoder_wavpack.cpp index d4b28c473..87892f9da 100644 --- a/src/plugins/Input/wavpack/decoder_wavpack.cpp +++ b/src/plugins/Input/wavpack/decoder_wavpack.cpp @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2008 by Ilya Kotov * + * Copyright (C) 2008-2009 by Ilya Kotov * * forkotov02@hotmail.ru * * * * This program is free software; you can redistribute it and/or modify * @@ -29,8 +29,10 @@ #include <qmmp/buffer.h> #include <qmmp/output.h> #include <qmmp/recycler.h> +#include "QtDebug" #include "decoder_wavpack.h" +#include "cueparser.h" // Decoder class @@ -53,6 +55,8 @@ DecoderWavPack::DecoderWavPack(QObject *parent, DecoderFactory *d, Output *o, co m_chan = 0; m_output_size = 0; m_context = 0; + m_length = 0; + m_offset = 0; } DecoderWavPack::~DecoderWavPack() @@ -123,19 +127,46 @@ bool DecoderWavPack::initialize() m_output_bytes = 0; char err [80]; - m_context = WavpackOpenFileInput (m_path.toLocal8Bit(), err, - OPEN_WVC | OPEN_TAGS, 0); - if(!m_context) + if (m_path.startsWith("wvpack://")) //embeded cue track + { + QString p = QUrl(m_path).path(); + m_context = WavpackOpenFileInput (p.toLocal8Bit(), err, OPEN_WVC | OPEN_TAGS, 0); + int cue_len = WavpackGetTagItem (m_context, "cuesheet", NULL, 0); + char *value; + if (cue_len) + { + value = (char*)malloc (cue_len * 2 + 1); + WavpackGetTagItem (m_context, "cuesheet", value, cue_len + 1); + CUEParser parser(value, p); + int track = m_path.section("#", -1).toInt(); + m_offset = parser.offset(track); + m_length = parser.length(track); + m_path = p; + } + } + else + { + m_context = WavpackOpenFileInput (m_path.toLocal8Bit(), err, OPEN_WVC | OPEN_TAGS, 0); + } + + if (!m_context) { qWarning("DecoderWavPack: error: %s", err); return FALSE; } + m_chan = WavpackGetNumChannels(m_context); m_freq = WavpackGetSampleRate (m_context); - m_bps = WavpackGetBitsPerSample (m_context); + m_bps = WavpackGetBitsPerSample (m_context); configure(m_freq, m_chan, m_bps); - m_totalTime = (int) WavpackGetNumSamples(m_context)/m_freq; m_inited = TRUE; + + if (m_offset) + m_seekTime = m_offset; + if (m_length) + m_totalTime = m_length; + else + m_totalTime = (qint64) WavpackGetNumSamples(m_context) / m_freq; qDebug("DecoderWavPack: initialize succes"); return TRUE; } @@ -151,7 +182,7 @@ qint64 DecoderWavPack::lengthInSeconds() void DecoderWavPack::seek(qint64 pos) { - m_seekTime = pos; + m_seekTime = pos + m_offset; } void DecoderWavPack::deinit() @@ -160,7 +191,9 @@ void DecoderWavPack::deinit() m_freq = m_bitrate = 0; m_chan = 0; m_output_size = 0; - if(m_context) + m_length = 0; + m_offset = 0; + if (m_context) { WavpackCloseFile (m_context); m_context = 0; @@ -188,23 +221,25 @@ void DecoderWavPack::run() mutex()->lock (); //seeking - if (m_seekTime >= 0.0) { WavpackSeekSample (m_context, m_seekTime * m_freq); m_seekTime = -1.0; } + //stop if track ended + if (WavpackGetSampleIndex(m_context)/m_freq-m_offset >= m_totalTime) + { + m_finish = TRUE; + } - // decode samples = (globalBufferSize-m_output_at)/m_chan/4; len = WavpackUnpackSamples (m_context, in, samples); - for(ulong i = 0; i < len * m_chan; ++i) + for (ulong i = 0; i < len * m_chan; ++i) out[i] = in[i]; len *= (m_chan * 2); //convert to number of bytes memcpy(m_output_buf + m_output_at, (char *) out, len); - if (len > 0) { m_bitrate =int( WavpackGetInstantBitrate(m_context)/1000); |
