aboutsummaryrefslogtreecommitdiff
path: root/src/plugins/Input/vorbis
diff options
context:
space:
mode:
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;