--- /dev/null
+#ifndef MSP_AL_MP3DECODER_H_
+#define MSP_AL_MP3DECODER_H_
+
+#include <stdexcept>
+#include <msp/al/sounddecoder.h>
+
+namespace Msp {
+namespace AL {
+
+class mp3_error: public std::runtime_error
+{
+public:
+ mp3_error(const std::string &, int);
+ virtual ~mp3_error() throw() { }
+
+private:
+ static std::string get_message(int);
+};
+
+
+/**
+Decoder for MPEG-2 audio files, a.k.a. MP2 and MP3 files. Normally you should
+use one of the SoundDecoder::open_* functions to create a decoder.
+*/
+class Mp3Decoder: public SoundDecoder
+{
+private:
+ struct Private;
+
+ Private *priv;
+ IO::Seekable ∈
+ unsigned in_buf_size;
+ char *in_buffer;
+ unsigned read_pos;
+
+public:
+ Mp3Decoder(IO::Seekable &);
+ virtual ~Mp3Decoder();
+
+ static bool detect(const std::string &);
+
+ virtual void seek(unsigned);
+ virtual unsigned read(char *, unsigned);
+
+private:
+ bool fill_input();
+ bool try_decode(bool);
+ bool decode(bool);
+};
+
+} // namespace AL
+} // namespace Msp
+
+#endif