diff options
| author | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2014-10-06 08:24:39 +0000 |
|---|---|---|
| committer | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2014-10-06 08:24:39 +0000 |
| commit | f3462df1e8eb8cc636112a5c8d61a397b61024c0 (patch) | |
| tree | 11bfa3a65431a2978db72652ee62189ff36fa14f /src/plugins | |
| parent | 54d001e35144317619ca07ec3b2484d633dd4c3b (diff) | |
| download | qmmp-f3462df1e8eb8cc636112a5c8d61a397b61024c0.tar.gz qmmp-f3462df1e8eb8cc636112a5c8d61a397b61024c0.tar.bz2 qmmp-f3462df1e8eb8cc636112a5c8d61a397b61024c0.zip | |
fixed vorbis plugin
git-svn-id: http://svn.code.sf.net/p/qmmp-dev/code/trunk/qmmp@4534 90c681e8-e032-0410-971d-27865f9a5e38
Diffstat (limited to 'src/plugins')
| -rw-r--r-- | src/plugins/Input/Input.pro | 2 | ||||
| -rw-r--r-- | src/plugins/Input/vorbis/decoder_vorbis.cpp | 73 | ||||
| -rw-r--r-- | src/plugins/Input/vorbis/decoder_vorbis.h | 1 |
3 files changed, 74 insertions, 2 deletions
diff --git a/src/plugins/Input/Input.pro b/src/plugins/Input/Input.pro index 0149aa949..e7436688a 100644 --- a/src/plugins/Input/Input.pro +++ b/src/plugins/Input/Input.pro @@ -1,7 +1,7 @@ include(../../../qmmp.pri) TEMPLATE = subdirs -SUBDIRS += mad #cue vorbis sndfile wavpack +SUBDIRS += mad vorbis #cue sndfile wavpack contains(CONFIG, FLAC_PLUGIN){ SUBDIRS += flac 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; |
