diff options
Diffstat (limited to 'src/plugins/Input/flac/decoder_flac.cpp')
| -rw-r--r-- | src/plugins/Input/flac/decoder_flac.cpp | 77 |
1 files changed, 74 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; +} |
