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