diff options
author | Jon Bergli Heier <snakebite@jvnv.net> | 2010-12-28 02:20:11 +0100 |
---|---|---|
committer | Jon Bergli Heier <snakebite@jvnv.net> | 2010-12-28 02:20:11 +0100 |
commit | 6b7c665baaf6023ee1cd935a953711fe65fff73b (patch) | |
tree | 910aebb83d20ddc203441b62d495a4d5552277b4 /decoders | |
parent | 1d05994fe1d9488193f01b47e92dcf11920c8f02 (diff) |
Added mpg123 decoder.
Diffstat (limited to 'decoders')
-rw-r--r-- | decoders/mpg123_decoder.cpp | 52 | ||||
-rw-r--r-- | decoders/mpg123_decoder.h | 18 |
2 files changed, 70 insertions, 0 deletions
diff --git a/decoders/mpg123_decoder.cpp b/decoders/mpg123_decoder.cpp new file mode 100644 index 0000000..41aef40 --- /dev/null +++ b/decoders/mpg123_decoder.cpp @@ -0,0 +1,52 @@ +#include "mpg123_decoder.h" + +#include <boost/format.hpp> + +#include <iostream> +#include <stdexcept> + +DecoderMpg123::DecoderMpg123() { + mpg123_init(); + + int error; + handle = mpg123_new("generic", &error); + if(error) { + throw std::runtime_error(mpg123_plain_strerror(error)); + } + + error = mpg123_open_feed(handle); + if(error) { + throw std::runtime_error(mpg123_plain_strerror(error)); + } + + mpg123_format_none(handle); + mpg123_format(handle, 44100, 2, MPG123_ENC_SIGNED_16); +} + +DecoderMpg123::~DecoderMpg123() { + mpg123_close(handle); + mpg123_delete(handle); +} + +size_t DecoderMpg123::decode(const uint8_t *input, size_t input_size, uint8_t *output, size_t output_size) { + if(mpg123_feed(handle, input, input_size) != MPG123_OK) { + throw std::runtime_error(mpg123_strerror(handle)); + } + + size_t output_written; + int error = mpg123_read(handle, output, output_size, &output_written); + + if(error == MPG123_NEW_FORMAT) { + long rate; + int channels, enc; + mpg123_getformat(handle, &rate, &channels, &enc); + std::cout << boost::format("mpg123: New format: %li Hz, %i channels, encoding value %i") % rate % channels % enc << std::endl; + error = mpg123_read(handle, output, output_size, &output_written); + } + + if(error != MPG123_OK && error != MPG123_DONE && error != MPG123_NEED_MORE) { + throw std::runtime_error(mpg123_plain_strerror(error)); + } + + return output_written; +} diff --git a/decoders/mpg123_decoder.h b/decoders/mpg123_decoder.h new file mode 100644 index 0000000..46f9e4c --- /dev/null +++ b/decoders/mpg123_decoder.h @@ -0,0 +1,18 @@ +#ifndef DECODER_MPG123_H +#define DECODER_MPG123_H + +#include "decoder.h" + +#include <mpg123.h> + +class DecoderMpg123 : public DecoderBase { + private: + mpg123_handle *handle; + + public: + DecoderMpg123(); + ~DecoderMpg123(); + size_t decode(const uint8_t *input, size_t input_size, uint8_t *output, size_t output_size); +}; + +#endif |