67 lines
1.2 KiB
C++
67 lines
1.2 KiB
C++
#ifndef DECODER_H
|
|
#define DECODER_H
|
|
|
|
/**
|
|
* @todo write docs
|
|
*/
|
|
#include <deque>
|
|
|
|
#include <emscripten/val.h>
|
|
#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<RawBuffer> pending;
|
|
|
|
private:
|
|
void pullBuffer();
|
|
void changeBuffer();
|
|
void prepareNextBuffer();
|
|
void initializeProbe(mad_stream& probe);
|
|
void switchToGlue();
|
|
};
|
|
|
|
#endif // DECODER_H
|