aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortrialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38>2010-03-11 09:05:36 +0000
committertrialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38>2010-03-11 09:05:36 +0000
commit64c0b96048210a5100232988811e46a53807b3b8 (patch)
tree43afd379cea4e2441e133fb7f2ae7f25532947d3
parent060dc05579e4addaadc43c8a273ca56e13b24a70 (diff)
downloadqmmp-64c0b96048210a5100232988811e46a53807b3b8.tar.gz
qmmp-64c0b96048210a5100232988811e46a53807b3b8.tar.bz2
qmmp-64c0b96048210a5100232988811e46a53807b3b8.zip
wavpack plugin: fixed 24-bit support (Closes issue 265)
git-svn-id: http://svn.code.sf.net/p/qmmp-dev/code/trunk/qmmp@1616 90c681e8-e032-0410-971d-27865f9a5e38
-rw-r--r--src/plugins/Input/wavpack/decoder_wavpack.cpp28
-rw-r--r--src/plugins/Input/wavpack/decoder_wavpack.h1
2 files changed, 22 insertions, 7 deletions
diff --git a/src/plugins/Input/wavpack/decoder_wavpack.cpp b/src/plugins/Input/wavpack/decoder_wavpack.cpp
index d9ea2b62d..c399619ab 100644
--- a/src/plugins/Input/wavpack/decoder_wavpack.cpp
+++ b/src/plugins/Input/wavpack/decoder_wavpack.cpp
@@ -51,6 +51,7 @@ DecoderWavPack::DecoderWavPack(const QString &path)
m_sz = 0;
m_buf = 0;
m_offset = 0;
+ m_bps = 0;
}
DecoderWavPack::~DecoderWavPack()
@@ -104,10 +105,10 @@ bool DecoderWavPack::initialize()
m_chan = WavpackGetNumChannels(m_context);
m_freq = WavpackGetSampleRate (m_context);
- int bps = WavpackGetBitsPerSample (m_context);
+ m_bps = WavpackGetBitsPerSample (m_context);
if (!m_output_buf)
m_output_buf = new int32_t[QMMP_BUFFER_SIZE/4];
- switch(bps)
+ switch(m_bps)
{
case 8:
configure(m_freq, m_chan, Qmmp::PCM_S8);
@@ -116,11 +117,11 @@ bool DecoderWavPack::initialize()
configure(m_freq, m_chan, Qmmp::PCM_S16LE);
break;
case 24:
- configure(m_freq, m_chan, Qmmp::PCM_S24LE);
- break;
case 32:
configure(m_freq, m_chan, Qmmp::PCM_S32LE);
}
+ if(m_bps == 24)
+ m_bps = 32;
if(!m_parser)
m_totalTime = (qint64) WavpackGetNumSamples(m_context) * 1000 / m_freq;
else
@@ -255,8 +256,21 @@ qint64 DecoderWavPack::wavpack_decode(char *data, qint64 size)
//convert 32 to 16
for (uint i = 0; i < len * m_chan; ++i)
{
- data[m++] = (m_output_buf[i] >> 0) & 0xff;
- data[m++] = (m_output_buf[i] >> 8) & 0xff;
+ switch (m_bps)
+ {
+ case 8:
+ data[m++] = m_output_buf[i] & 0xff;
+ break;
+ case 16:
+ data[m++] = (m_output_buf[i] >> 0) & 0xff;
+ data[m++] = (m_output_buf[i] >> 8) & 0xff;
+ break;
+ case 32:
+ data[m++] = 0;
+ data[m++] = (m_output_buf[i] >> 0) & 0xff;
+ data[m++] = (m_output_buf[i] >> 8) & 0xff;
+ data[m++] = (m_output_buf[i] >> 16) & 0xff;
+ }
}
- return len * m_chan * 2;
+ return len * m_chan * m_bps / 8;
}
diff --git a/src/plugins/Input/wavpack/decoder_wavpack.h b/src/plugins/Input/wavpack/decoder_wavpack.h
index dc8f6102b..1f2e034ea 100644
--- a/src/plugins/Input/wavpack/decoder_wavpack.h
+++ b/src/plugins/Input/wavpack/decoder_wavpack.h
@@ -59,6 +59,7 @@ private:
QString m_path;
CUEParser *m_parser;
int m_track;
+ int m_bps;
char *m_buf; //buffer for remainig data
qint64 m_buf_size;
qint64 m_sz; //sample size