delete priv;
}
+bool OggDecoder::detect(const std::string &sig)
+{
+ static const char ogg_sig[] = { 'O', 'g', 'g', 'S' };
+ if(sig.size()<sizeof(ogg_sig))
+ return false;
+ return !sig.compare(0, sizeof(ogg_sig), ogg_sig);
+}
+
void OggDecoder::rewind()
{
ov_pcm_seek(&priv->ovfile, 0);
OggDecoder(IO::Seekable &);
~OggDecoder();
+ static bool detect(const std::string &);
+
virtual void rewind();
virtual unsigned read(char *, unsigned);
};
#include <msp/core/refptr.h>
#include <msp/io/file.h>
+#include <msp/strings/format.h>
#include "oggdecoder.h"
#include "sounddecoder.h"
SoundDecoder *SoundDecoder::open_file(const string &fn)
{
RefPtr<IO::BufferedFile> file = new IO::BufferedFile(fn);
- SoundDecoder *decoder = new OggDecoder(*file);
+ SoundDecoder *decoder = open_io(*file);
decoder->source = file.release();
return decoder;
}
SoundDecoder *SoundDecoder::open_io(IO::Seekable &io)
{
- return new OggDecoder(io);
+ char sig_buf[8];
+ io.read(sig_buf, sizeof(sig_buf));
+ string signature(sig_buf, sizeof(sig_buf));
+ if(OggDecoder::detect(signature))
+ return new OggDecoder(io);
+ else
+ {
+ string sig_hex;
+ for(unsigned i=0; i<sizeof(sig_buf); ++i)
+ {
+ if(i)
+ sig_hex += ' ';
+ sig_hex += Msp::format("%02X", static_cast<unsigned char>(sig_buf[i]));
+ }
+ throw unsupported_sound(sig_hex);
+ }
}
} // namespace AL