#ifndef DECODER_H #define DECODER_H /** * @todo write docs */ #include #include #include "mad.h" #define GLUE_LENGTH 10240 class Decoder { public: Decoder(); ~Decoder(); void addFragment(intptr_t bufferPtr, uint32_t length); emscripten::val decode(uint32_t count = UINT32_MAX); bool hasMore() const; uint32_t framesLeft(uint32_t max = UINT32_MAX); private: enum State { empty, onBufferHalf, onBufferFull, onGlueHalf, onGlueFull }; struct RawBuffer { uint8_t* ptr; uint32_t length; uint32_t offset; uint32_t gueard; }; State state; uint32_t sampleRate; uint8_t channels; uint32_t cachedLength; uint16_t samplesPerFrame; uint8_t* glue; int32_t lastSync; bool cached; mad_synth synth; mad_stream stream; mad_frame frame; emscripten::val context; std::deque pending; private: void pullBuffer(); void changeBuffer(); void prepareNextBuffer(); void initializeProbe(mad_stream& probe); void switchToGlue(); }; #endif // DECODER_H