#pragma once
#include "sndbuffer.h"
struct SNDOUT;
const unsigned SNDR_DEFAULT_SYSTICK_RATE = 3500000; const unsigned SNDR_DEFAULT_SAMPLE_RATE = 44100;
class SNDRENDER
{
public:
SNDRENDER(SNDBUFFER& sndbuffer);
void set_timings(unsigned sys_clock_rate, unsigned sample_rate);
void render(SNDOUT *src, unsigned srclen, unsigned sys_ticks);
void start_frame();
void update(unsigned sys_tick, unsigned l, unsigned r);
void end_frame(unsigned endframe_sys_tick);
protected:
friend class SNDBUFFER; SNDBUFFER& sndbuffer;
unsigned mix_l, mix_r; bufptr_t dstpos; bufptr_t dst_start;
private:
SNDSAMPLE* buffer;
unsigned bufsize;
unsigned tick, base_tick;
unsigned s1_l, s1_r;
unsigned s2_l, s2_r;
unsigned sys_clock_rate, sample_rate;
unsigned passed_sys_ticks, passed_snd_ticks;
unsigned mult_const;
void flush(unsigned endtick);
};
struct SNDOUT
{
unsigned timestamp; SNDSAMPLE newvalue;
};