diff options
| author | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2014-10-06 14:41:05 +0000 |
|---|---|---|
| committer | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2014-10-06 14:41:05 +0000 |
| commit | 1fa50a73bfa7f915076bf52d913c9a4851efc64c (patch) | |
| tree | db31f6baadea130f207e1fb38ec91bc31c176c76 | |
| parent | 84ccc6fd56fcc47705199c9fb198ece2bc9386b0 (diff) | |
| download | qmmp-1fa50a73bfa7f915076bf52d913c9a4851efc64c.tar.gz qmmp-1fa50a73bfa7f915076bf52d913c9a4851efc64c.tar.bz2 qmmp-1fa50a73bfa7f915076bf52d913c9a4851efc64c.zip | |
wavpack: added multichannel support
git-svn-id: http://svn.code.sf.net/p/qmmp-dev/code/trunk/qmmp@4543 90c681e8-e032-0410-971d-27865f9a5e38
| -rw-r--r-- | src/plugins/Input/wavpack/decoder_wavpack.cpp | 80 | ||||
| -rw-r--r-- | src/plugins/Input/wavpack/decoder_wavpack.h | 5 |
2 files changed, 79 insertions, 6 deletions
diff --git a/src/plugins/Input/wavpack/decoder_wavpack.cpp b/src/plugins/Input/wavpack/decoder_wavpack.cpp index 905cbbd3d..b96f8142b 100644 --- a/src/plugins/Input/wavpack/decoder_wavpack.cpp +++ b/src/plugins/Input/wavpack/decoder_wavpack.cpp @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2008-2013 by Ilya Kotov * + * Copyright (C) 2008-2014 by Ilya Kotov * * forkotov02@hotmail.ru * * * * This program is free software; you can redistribute it and/or modify * @@ -108,19 +108,27 @@ bool DecoderWavPack::initialize() m_chan = WavpackGetNumChannels(m_context); m_freq = WavpackGetSampleRate (m_context); m_bps = WavpackGetBitsPerSample (m_context); + + ChannelMap chmap = findChannelMap(m_chan); + if(chmap.isEmpty()) + { + qWarning("DecoderWavPack: unsupported number of channels: %d", m_chan); + return false; + } + if (!m_output_buf) m_output_buf = new int32_t[QMMP_BLOCK_FRAMES * m_chan]; switch(m_bps) { case 8: - configure(m_freq, m_chan, Qmmp::PCM_S8); + configure(m_freq, chmap, Qmmp::PCM_S8); break; case 16: - configure(m_freq, m_chan, Qmmp::PCM_S16LE); + configure(m_freq, chmap, Qmmp::PCM_S16LE); break; case 24: case 32: - configure(m_freq, m_chan, Qmmp::PCM_S32LE); + configure(m_freq, chmap, Qmmp::PCM_S32LE); } if(!m_parser) m_totalTime = (qint64) WavpackGetNumSamples(m_context) * 1000 / m_freq; @@ -281,3 +289,67 @@ qint64 DecoderWavPack::wavpack_decode(char *data, qint64 size) } return 0; } + +//http://www.wavpack.com/file_format.txt +ChannelMap DecoderWavPack::findChannelMap(int channels) +{ + ChannelMap map; + switch (channels) + { + case 1: + map << Qmmp::CHAN_FRONT_LEFT; + break; + case 2: + map << Qmmp::CHAN_FRONT_LEFT + << Qmmp::CHAN_FRONT_RIGHT; + break; + case 3: + map << Qmmp::CHAN_FRONT_LEFT + << Qmmp::CHAN_FRONT_RIGHT + << Qmmp::CHAN_FRONT_CENTER; + break; + case 4: + map << Qmmp::CHAN_FRONT_LEFT + << Qmmp::CHAN_FRONT_RIGHT + << Qmmp::CHAN_REAR_LEFT + << Qmmp::CHAN_REAR_RIGHT; + break; + case 5: + map << Qmmp::CHAN_FRONT_LEFT + << Qmmp::CHAN_FRONT_RIGHT + << Qmmp::CHAN_FRONT_CENTER + << Qmmp::CHAN_REAR_LEFT + << Qmmp::CHAN_REAR_RIGHT; + break; + case 6: + map << Qmmp::CHAN_FRONT_LEFT + << Qmmp::CHAN_FRONT_RIGHT + << Qmmp::CHAN_FRONT_CENTER + << Qmmp::CHAN_LFE + << Qmmp::CHAN_REAR_LEFT + << Qmmp::CHAN_REAR_RIGHT; + break; + case 7: + map << Qmmp::CHAN_FRONT_LEFT + << Qmmp::CHAN_FRONT_RIGHT + << Qmmp::CHAN_FRONT_CENTER + << Qmmp::CHAN_LFE + << Qmmp::CHAN_REAR_CENTER + << Qmmp::CHAN_SIDE_LEFT + << Qmmp::CHAN_SIDE_RIGHT; + break; + case 8: + map << Qmmp::CHAN_FRONT_LEFT + << Qmmp::CHAN_FRONT_RIGHT + << Qmmp::CHAN_FRONT_CENTER + << Qmmp::CHAN_LFE + << Qmmp::CHAN_REAR_LEFT + << Qmmp::CHAN_REAR_RIGHT + << Qmmp::CHAN_SIDE_LEFT + << Qmmp::CHAN_SIDE_RIGHT; + break; + default: + ; + } + return map; +} diff --git a/src/plugins/Input/wavpack/decoder_wavpack.h b/src/plugins/Input/wavpack/decoder_wavpack.h index c861ceee8..745af1374 100644 --- a/src/plugins/Input/wavpack/decoder_wavpack.h +++ b/src/plugins/Input/wavpack/decoder_wavpack.h @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2008-2012 by Ilya Kotov * + * Copyright (C) 2008-2014 by Ilya Kotov * * forkotov02@hotmail.ru * * * * This program is free software; you can redistribute it and/or modify * @@ -47,7 +47,8 @@ private: // helper functions void deinit(); qint64 wavpack_decode(char *data, qint64 size); - WavpackContext *m_context; + ChannelMap findChannelMap(int channels); + WavpackContext *m_context; int32_t *m_output_buf; // output buffer int m_chan; quint32 m_freq; |
