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 | |
parent | 1d05994fe1d9488193f01b47e92dcf11920c8f02 (diff) |
Added mpg123 decoder.
-rw-r--r-- | SConstruct | 4 | ||||
-rw-r--r-- | decoder.h | 11 | ||||
-rw-r--r-- | decoders/mpg123_decoder.cpp | 52 | ||||
-rw-r--r-- | decoders/mpg123_decoder.h | 18 |
4 files changed, 84 insertions, 1 deletions
@@ -13,6 +13,8 @@ if GetOption('release'): else: env.Append(CCFLAGS = ['-Wall', '-g']) -env.Program('audistd', Glob('*.cpp')) +env.ParseConfig('pkg-config --cflags --libs libmpg123') + +env.Program('audistd', Glob('*.cpp') + Glob('decoders/*.cpp')) # vim: syn=python diff --git a/decoder.h b/decoder.h new file mode 100644 index 0000000..7e76088 --- /dev/null +++ b/decoder.h @@ -0,0 +1,11 @@ +#ifndef DECODER_H +#define DECODER_H + +#include <boost/cstdint.hpp> + +class DecoderBase { + public: + virtual size_t decode(const uint8_t *input, size_t input_size, uint8_t *output, size_t output_size) = 0; +}; + +#endif 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 |