diff options
Diffstat (limited to 'src/plugins/Input/vorbis')
| -rw-r--r-- | src/plugins/Input/vorbis/decoder_vorbis.cpp | 73 | ||||
| -rw-r--r-- | src/plugins/Input/vorbis/decoder_vorbis.h | 1 |
2 files changed, 73 insertions, 1 deletions
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); diff --git a/src/plugins/Input/vorbis/decoder_vorbis.h b/src/plugins/Input/vorbis/decoder_vorbis.h index e29e5e728..83d95a4b0 100644 --- a/src/plugins/Input/vorbis/decoder_vorbis.h +++ b/src/plugins/Input/vorbis/decoder_vorbis.h @@ -31,6 +31,7 @@ private: // helper functions void deinit(); void updateTags(); + ChannelMap findChannelMap(int channels); // OggVorbis Decoder OggVorbis_File oggfile; |
