diff options
Diffstat (limited to 'src/plugins/Input')
| -rw-r--r-- | src/plugins/Input/Input.pro | 28 | ||||
| -rw-r--r-- | src/plugins/Input/flac/decoder_flac.cpp | 77 | ||||
| -rw-r--r-- | src/plugins/Input/flac/decoder_flac.h | 1 | ||||
| -rw-r--r-- | src/plugins/Input/mad/decoder_mad.cpp | 7 |
4 files changed, 95 insertions, 18 deletions
diff --git a/src/plugins/Input/Input.pro b/src/plugins/Input/Input.pro index 9b00864e6..0149aa949 100644 --- a/src/plugins/Input/Input.pro +++ b/src/plugins/Input/Input.pro @@ -1,53 +1,53 @@ include(../../../qmmp.pri) -SUBDIRS += mad cue vorbis sndfile wavpack TEMPLATE = subdirs +SUBDIRS += mad #cue vorbis sndfile wavpack contains(CONFIG, FLAC_PLUGIN){ SUBDIRS += flac } contains(CONFIG, MUSEPACK_PLUGIN){ - SUBDIRS += mpc +# SUBDIRS += mpc } contains(CONFIG, MODPLUG_PLUGIN){ - SUBDIRS += modplug +# SUBDIRS += modplug } contains(CONFIG, FFMPEG_PLUGIN){ - contains(CONFIG, FFMPEG_LEGACY){ - SUBDIRS += ffmpeg_legacy - }else{ - SUBDIRS += ffmpeg - } +# contains(CONFIG, FFMPEG_LEGACY){ +# SUBDIRS += ffmpeg_legacy +# }else{ +# SUBDIRS += ffmpeg +# } } contains(CONFIG, GME_PLUGIN){ - SUBDIRS += gme +# SUBDIRS += gme } contains(CONFIG, OPUS_PLUGIN){ - SUBDIRS += opus +# SUBDIRS += opus } contains(CONFIG, CDAUDIO_PLUGIN){ - SUBDIRS += cdaudio +# SUBDIRS += cdaudio } contains(CONFIG, SID_PLUGIN){ - SUBDIRS += sid +# SUBDIRS += sid } unix{ contains(CONFIG, AAC_PLUGIN){ - SUBDIRS += aac +# SUBDIRS += aac } contains(CONFIG, WILDMIDI_PLUGIN){ - SUBDIRS += wildmidi +# SUBDIRS += wildmidi } 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; diff --git a/src/plugins/Input/mad/decoder_mad.cpp b/src/plugins/Input/mad/decoder_mad.cpp index b4087c06b..08b2486fb 100644 --- a/src/plugins/Input/mad/decoder_mad.cpp +++ b/src/plugins/Input/mad/decoder_mad.cpp @@ -120,7 +120,12 @@ bool DecoderMAD::initialize() mad_frame_mute (&m_frame); m_stream.next_frame = 0; m_stream.sync = 0; - configure(m_freq, m_channels, Qmmp::PCM_S16LE); + ChannelMap map; + if(m_channels == 1) + map << Qmmp::CHAN_FRONT_LEFT; + else + map << Qmmp::CHAN_FRONT_LEFT << Qmmp::CHAN_FRONT_RIGHT; + configure(m_freq, map, Qmmp::PCM_S16LE); m_inited = true; return true; } |
