From: Mikko Rasa Date: Sun, 24 Jun 2018 14:45:13 +0000 (+0300) Subject: Refactor Mp3Decoder a bit X-Git-Url: http://git.tdb.fi/?a=commitdiff_plain;h=85914b1843bd89ca94a722cc26e572089dbd0774;p=libs%2Fal.git Refactor Mp3Decoder a bit It's now possible to decode only the header for a frame --- diff --git a/source/mp3decoder.cpp b/source/mp3decoder.cpp index 00fc918..ec08be7 100644 --- a/source/mp3decoder.cpp +++ b/source/mp3decoder.cpp @@ -54,7 +54,9 @@ Mp3Decoder::Mp3Decoder(IO::Seekable &io): try { - decode_frame(); + if(!fill_input() || !decode(false)) + throw runtime_error("no mp3 data"); + format = create_format(2, MAD_NCHANNELS(&priv->frame.header)); freq = priv->frame.header.samplerate; } @@ -98,11 +100,8 @@ unsigned Mp3Decoder::read(char *buf, unsigned len) unsigned pos = 0; while(pos+2*nchan<=len) { - if(read_pos>=pcm.length) - { - if(!decode_frame()) - break; - } + if(read_pos>=pcm.length && !decode(true)) + break; for(unsigned i=0; iframe, &priv->stream); + else + return !mad_header_decode(&priv->frame.header, &priv->stream); +} + +bool Mp3Decoder::decode(bool full) +{ + while(!try_decode(full)) { - if(!priv->stream.buffer || priv->stream.error==MAD_ERROR_BUFLEN) + if(priv->stream.error==MAD_ERROR_BUFLEN) + { if(!fill_input()) return false; - - if(!mad_frame_decode(&priv->frame, &priv->stream)) - { - mad_synth_frame(&priv->synth, &priv->frame); - read_pos = 0; - return true; } - - if(priv->stream.error==MAD_ERROR_BUFLEN) - continue; else if(!MAD_RECOVERABLE(priv->stream.error)) throw mp3_error("mad_frame_decode", priv->stream.error); } + + if(full) + { + read_pos = 0; + mad_synth_frame(&priv->synth, &priv->frame); + } + + return true; } } // namespace AL diff --git a/source/mp3decoder.h b/source/mp3decoder.h index 06060de..c026081 100644 --- a/source/mp3decoder.h +++ b/source/mp3decoder.h @@ -40,7 +40,8 @@ public: private: bool fill_input(); - bool decode_frame(); + bool try_decode(bool); + bool decode(bool); }; } // namespace AL