prosperon/source/engine/sound/dsp.h

160 lines
3.7 KiB
C

#ifndef DSP_H
#define DSP_H
#define SAMPLERATE 48000
#define BUF_FRAMES 128 /* At 48k, 128 needed for 240fps consistency */
#define CHANNELS 2
#include "sound.h"
//#include "circbuf.h"
struct dsp_iir;
void dsp_rectify(soundbyte *in, soundbyte *out, int n);
struct dsp_filter {
void (*filter)(void *data, soundbyte *out, int samples);
void *data;
int inputs;
struct dsp_filter *in[6];
soundbyte cache[CHANNELS*BUF_FRAMES];
int dirty;
};
struct dsp_filter dsp_filter(void *data, void (*filter)(void *data, soundbyte *out, int samples));
struct dsp_fir {
float freq;
int n;
int head;
float *cof;
float *dx;
struct dsp_filter in;
};
void dsp_filter_addin(struct dsp_filter filter, struct dsp_filter *in);
struct dsp_filter lp_fir_make(float freq);
void dsp_iir_fillbuf(struct dsp_iir *iir, soundbyte *out, int n);
struct dsp_filter hpf_make(int poles, float freq);
struct dsp_filter lpf_make(int poles, float freq);
struct dsp_filter bpf_make(int poles, float freq1, float freq2);
struct dsp_filter npf_make(int poles, float freq1, float freq2);
/* atk, dec, sus, rls specify the time, in miliseconds, the phase begins */
struct dsp_adsr {
unsigned int atk;
double atk_t;
unsigned int dec;
double dec_t;
unsigned int sus;
float sus_pwr; // Between 0 and 1
unsigned int rls;
double rls_t;
double time; /* Current time of the filter */
float out;
};
void dsp_adsr_fillbuf(struct dsp_adsr *adsr, soundbyte *out, int n);
struct dsp_filter make_adsr(unsigned int atk, unsigned int dec, unsigned int sus, unsigned int rls);
struct dsp_delay {
unsigned int ms_delay;
// struct circbuf buf;
struct dsp_filter in;
};
struct dsp_delay dsp_delay_make(unsigned int ms_delay);
void dsp_delay_filbuf(struct dsp_delay *delay, soundbyte *buf, int n);
struct dsp_ammod {
struct dsp_filter ina;
struct dsp_filter inb;
soundbyte abuf[BUF_FRAMES*CHANNELS];
soundbyte bbuf[BUF_FRAMES*CHANNELS];
};
struct dsp_compressor {
double ratio;
double threshold;
float target;
unsigned int atk; /* Milliseconds */
double atk_tau;
unsigned int rls; /* MIlliseconds */
double rls_tau;
};
struct dsp_filter dsp_make_compressor();
void dsp_compressor_fillbuf(struct dsp_compressor *comp, soundbyte *out, int n);
struct dsp_limiter {
};
struct dsp_filter dsp_make_limiter();
void dsp_limiter_fillbuf(struct dsp_limiter *lim, soundbyte *out, int n);
struct phasor {
unsigned int sr;
float cur;
float freq;
unsigned int clen;
unsigned int cstep;
float *cache;
};
struct phasor phasor_make(unsigned int sr, float freq);
struct osc {
float (*f)(float p);
struct phasor p;
unsigned int frames;
unsigned int frame;
soundbyte *cache;
};
struct wav;
struct wav gen_sine(float amp, float freq, int sr, int ch);
struct wav gen_square(float amp, float freq, int sr, int ch);
struct wav gen_triangle(float amp, float freq, int sr, int ch);
struct wav gen_saw(float amp, float freq, int sr, int ch);
void gen_whitenoise(void *data, soundbyte *out, int n);
void gen_pinknoise(void *data, soundbyte *out, int n);
float sin_phasor(float p);
float square_phasor(float p);
float saw_phasor(float p);
float tri_phasor(float p);
void osc_fillbuf(struct osc *osc, soundbyte *buf, int n);
void am_mod(struct dsp_ammod *mod, soundbyte *c, int n);
struct dsp_reverb {
unsigned int time; /* Time in miliseconds for the sound to decay out */
};
struct dsp_filter make_reverb();
void dsp_reverb_fillbuf(struct dsp_reverb *r, soundbyte *out, int n);
void dsp_pan(float *deg, soundbyte *out, int n);
void dsp_mono(void *p, soundbyte *out, int n);
void dsp_bitcrush(void *p, soundbyte *out, int n);
void dsp_run(struct dsp_filter filter, soundbyte *out, int n);
#endif