shithub: neindaw

ref: a85496cea4c5c62a2038b1b488f541e9030ff379
dir: /fs.h/

View raw version
typedef struct Aux Aux;
typedef struct Auxdsp Auxdsp;
typedef struct Fs Fs;
typedef struct State State;

typedef enum {
	Xclone,
	Xctl,
	Xmetadata,

	Xdsp,
	Xdspctl,
	Xdspdata,

	Xui,
	Xuictl,
	Xuimeta,
}Auxtype;

struct UI;

struct Aux {
	Auxtype type;
	int id;
	int ctl;
	int data;
	int metadata;

	int numin;
	int numout;

	struct UI *ui;
	State *state;
};

struct Fs {
	Srv srv;
	char *metadata;

	struct {
		Auxdsp *(*new)(int *numin, int *numout);
		void (*free)(Auxdsp *dsp);
		void (*reset)(Auxdsp *dsp);

		/* optional, atm this one is needed only for autovoicing to work */
		Auxdsp *(*clone)(Auxdsp *dsp);
		/* optional, for autovoicing. this is ugly */
		void *(*state)(Auxdsp *dsp, int *sz);

		/* optional, n is always modulo number of channels */
		int (*read)(Auxdsp *dsp, float *b, int n);

		/* optional, n is always modulo number of channels */
		int (*write)(Auxdsp *dsp, float *b, int n);
	}dsp;
};

struct State {
	float *mixer;
	int mixersz;

	Auxdsp **voice;
	int nvoice;

	int crossvoice; /* copied from metadata on ctl write (gate) */
	int silent; /* that's about the first voice only */
};

void fsinit(void *fs);