aboutsummaryrefslogtreecommitdiff
path: root/src/plugins/Input/flac
diff options
context:
space:
mode:
authortrialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38>2014-10-06 07:50:56 +0000
committertrialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38>2014-10-06 07:50:56 +0000
commit76f436c36cdec74e73c12cea8d81051a7d75ec96 (patch)
tree03fe155b5311f6dccbf0dfb2a9cb0954484a138c /src/plugins/Input/flac
parent67e825df80708f31daf7a4f4cd6045ecf010efa6 (diff)
downloadqmmp-76f436c36cdec74e73c12cea8d81051a7d75ec96.tar.gz
qmmp-76f436c36cdec74e73c12cea8d81051a7d75ec96.tar.bz2
qmmp-76f436c36cdec74e73c12cea8d81051a7d75ec96.zip
added multichannel support
git-svn-id: http://svn.code.sf.net/p/qmmp-dev/code/trunk/qmmp@4530 90c681e8-e032-0410-971d-27865f9a5e38
Diffstat (limited to 'src/plugins/Input/flac')
-rw-r--r--src/plugins/Input/flac/decoder_flac.cpp77
-rw-r--r--src/plugins/Input/flac/decoder_flac.h1
2 files changed, 75 insertions, 3 deletions
diff --git a/src/plugins/Input/flac/decoder_flac.cpp b/src/plugins/Input/flac/decoder_flac.cpp
index acd76f159..4dfca6839 100644
--- a/src/plugins/Input/flac/decoder_flac.cpp
+++ b/src/plugins/Input/flac/decoder_flac.cpp
@@ -393,17 +393,25 @@ bool DecoderFLAC::initialize()
data()->ok = 0;
return false;
}
+ ChannelMap channel_map = findChannelMap(data()->channels);
+
+ if(channel_map.isEmpty())
+ {
+ qWarning("DecoderFLAC: unsupported number of channels: %d", data()->channels);
+ return false;
+ }
+
switch(data()->bits_per_sample)
{
case 8:
- configure(data()->sample_rate, data()->channels, Qmmp::PCM_S8);
+ configure(data()->sample_rate, channel_map, Qmmp::PCM_S8);
break;
case 16:
- configure(data()->sample_rate, data()->channels, Qmmp::PCM_S16LE);
+ configure(data()->sample_rate, channel_map, Qmmp::PCM_S16LE);
break;
case 24:
case 32:
- configure(data()->sample_rate, data()->channels, Qmmp::PCM_S32LE);
+ configure(data()->sample_rate, channel_map, Qmmp::PCM_S32LE);
break;
default:
return false;
@@ -555,3 +563,66 @@ uint DecoderFLAC::findID3v2(char *data, ulong size) //retuns ID3v2 tag size
}
return 0;
}
+
+ChannelMap DecoderFLAC::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/flac/decoder_flac.h b/src/plugins/Input/flac/decoder_flac.h
index e64e376eb..4b4a2f668 100644
--- a/src/plugins/Input/flac/decoder_flac.h
+++ b/src/plugins/Input/flac/decoder_flac.h
@@ -82,6 +82,7 @@ private:
// helper functions
void deinit();
uint findID3v2(char *data, ulong size); //retuns ID3v2 tag size
+ ChannelMap findChannelMap(int channels);
struct flac_data *m_data;
qint64 length_in_bytes;