From f3462df1e8eb8cc636112a5c8d61a397b61024c0 Mon Sep 17 00:00:00 2001 From: trialuser02 Date: Mon, 6 Oct 2014 08:24:39 +0000 Subject: fixed vorbis plugin git-svn-id: http://svn.code.sf.net/p/qmmp-dev/code/trunk/qmmp@4534 90c681e8-e032-0410-971d-27865f9a5e38 --- src/plugins/Input/vorbis/decoder_vorbis.cpp | 73 ++++++++++++++++++++++++++++- 1 file changed, 72 insertions(+), 1 deletion(-) (limited to 'src/plugins/Input/vorbis/decoder_vorbis.cpp') diff --git a/src/plugins/Input/vorbis/decoder_vorbis.cpp b/src/plugins/Input/vorbis/decoder_vorbis.cpp index ce3f2d28c..db9f8c8f8 100644 --- a/src/plugins/Input/vorbis/decoder_vorbis.cpp +++ b/src/plugins/Input/vorbis/decoder_vorbis.cpp @@ -133,7 +133,14 @@ bool DecoderVorbis::initialize() freq = ogginfo->rate; chan = ogginfo->channels; } - configure(freq, chan, Qmmp::PCM_S16LE); + + ChannelMap chmap = findChannelMap(chan); + if(chmap.isEmpty()) + { + qWarning("DecoderVorbis: unsupported number of channels: %d", chan); + return false; + } + configure(freq, chmap, Qmmp::PCM_S16LE); inited = true; return true; } @@ -217,6 +224,70 @@ void DecoderVorbis::updateTags() addMetaData(metaData); } +//http://xiph.org/vorbis/doc/Vorbis_I_spec.html#x1-800004.3.9 +ChannelMap DecoderVorbis::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_CENTER + << Qmmp::CHAN_FRONT_RIGHT; + 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_CENTER + << Qmmp::CHAN_FRONT_RIGHT + << Qmmp::CHAN_REAR_LEFT + << Qmmp::CHAN_REAR_RIGHT; + break; + case 6: + map << Qmmp::CHAN_FRONT_LEFT + << Qmmp::CHAN_FRONT_CENTER + << Qmmp::CHAN_FRONT_RIGHT + << Qmmp::CHAN_REAR_LEFT + << Qmmp::CHAN_REAR_RIGHT + << Qmmp::CHAN_LFE; + break; + case 7: + map << Qmmp::CHAN_FRONT_LEFT + << Qmmp::CHAN_FRONT_CENTER + << Qmmp::CHAN_FRONT_RIGHT + << Qmmp::CHAN_SIDE_LEFT + << Qmmp::CHAN_SIDE_RIGHT + << Qmmp::CHAN_REAR_CENTER + << Qmmp::CHAN_LFE; + break; + case 8: + map << Qmmp::CHAN_FRONT_LEFT + << Qmmp::CHAN_FRONT_CENTER + << Qmmp::CHAN_FRONT_RIGHT + << Qmmp::CHAN_SIDE_LEFT + << Qmmp::CHAN_SIDE_RIGHT + << Qmmp::CHAN_REAR_LEFT + << Qmmp::CHAN_REAR_RIGHT + << Qmmp::CHAN_LFE; + break; + default: + ; + } + return map; +} + void DecoderVorbis::seek(qint64 time) { ov_time_seek(&oggfile, (double) time/1000); -- cgit v1.2.3-13-gbd6f