aboutsummaryrefslogtreecommitdiff
path: root/src/plugins/Input/wavpack/decoder_wavpack.cpp
diff options
context:
space:
mode:
authortrialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38>2014-10-06 14:41:05 +0000
committertrialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38>2014-10-06 14:41:05 +0000
commit1fa50a73bfa7f915076bf52d913c9a4851efc64c (patch)
treedb31f6baadea130f207e1fb38ec91bc31c176c76 /src/plugins/Input/wavpack/decoder_wavpack.cpp
parent84ccc6fd56fcc47705199c9fb198ece2bc9386b0 (diff)
downloadqmmp-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
Diffstat (limited to 'src/plugins/Input/wavpack/decoder_wavpack.cpp')
-rw-r--r--src/plugins/Input/wavpack/decoder_wavpack.cpp80
1 files changed, 76 insertions, 4 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;
+}