#include "mpg123_decoder.h" #include #include #include DecoderMpg123::DecoderMpg123(const std::string& filename) { int error; handle = mpg123_new("generic", &error); if(error) { throw std::runtime_error(mpg123_plain_strerror(error)); } error = mpg123_open(handle, filename.c_str()); if(error) { throw std::runtime_error(mpg123_plain_strerror(error)); } long rate; int channels, enc; mpg123_getformat(handle, &rate, &channels, &enc); std::cout << boost::format("mpg123: %li Hz, %i channels, encoding value %i") % rate % channels % enc << std::endl; this->samplerate = rate; this->channels = channels; mpg123_format_none(handle); mpg123_format(handle, rate, channels, MPG123_ENC_SIGNED_16); } DecoderMpg123::~DecoderMpg123() { mpg123_close(handle); mpg123_delete(handle); } std::size_t DecoderMpg123::read(char* buf, std::size_t buf_size) { char src_data[0x2000]; int error = MPG123_NEED_MORE; size_t output_written; error = mpg123_read(handle, (unsigned char*)buf, buf_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, (unsigned char*)buf, buf_size, &output_written); } if(error != MPG123_OK && error != MPG123_DONE) { throw std::runtime_error(mpg123_plain_strerror(error)); } return output_written; }