aboutsummaryrefslogtreecommitdiff
path: root/src/plugins/Input/vorbis
diff options
context:
space:
mode:
authortrialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38>2014-10-06 08:24:39 +0000
committertrialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38>2014-10-06 08:24:39 +0000
commitf3462df1e8eb8cc636112a5c8d61a397b61024c0 (patch)
tree11bfa3a65431a2978db72652ee62189ff36fa14f /src/plugins/Input/vorbis
parent54d001e35144317619ca07ec3b2484d633dd4c3b (diff)
downloadqmmp-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/Input/vorbis')
-rw-r--r--src/plugins/Input/vorbis/decoder_vorbis.cpp73
-rw-r--r--src/plugins/Input/vorbis/decoder_vorbis.h1
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;