diff options
| author | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2010-03-11 09:05:36 +0000 |
|---|---|---|
| committer | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2010-03-11 09:05:36 +0000 |
| commit | 64c0b96048210a5100232988811e46a53807b3b8 (patch) | |
| tree | 43afd379cea4e2441e133fb7f2ae7f25532947d3 | |
| parent | 060dc05579e4addaadc43c8a273ca56e13b24a70 (diff) | |
| download | qmmp-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.cpp | 28 | ||||
| -rw-r--r-- | src/plugins/Input/wavpack/decoder_wavpack.h | 1 |
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 |
