typedef struct af_data_s { int format; } af_data_t; typedef struct af_info_s { const char *info; const char *name; const char *author; const char *comment; const int flags; int (*open) (struct af_instance_s * vf); } af_info_t; typedef struct af_instance_s { af_data_t *(*play) (struct af_instance_s * af, af_data_t * data); void *setup; af_data_t *data; } af_instance_t; typedef struct af_volume_s { int method; float mul; struct { float avg; int len; } mem[128]; float mid_s16; } af_volnorm_t; static void method2_int16(af_volnorm_t * s, af_data_t * c) { register int i = 0; float avg = 0.0; int totallen = 0; for (i = 0; i < 128; i++) { avg += s->mem[i].avg * (float)s->mem[i].len; totallen += s->mem[i].len; } if (totallen > 32000) if (avg >= (32767 * 0.01)) s->mul = s->mid_s16 / avg; } static af_data_t *play(struct af_instance_s *af, af_data_t * data) { af_volnorm_t *s = af->setup; if (af->data->format == (((0 << 2) | (0 << 1) | (1 << 3) | (0 << 0)))) if (s->method) method2_int16(s, data); } static int af_open(af_instance_t * af) { af->play = play; } af_info_t af_info_volnorm = { "Volume normalizer filter", "volnorm", "Alex Beregszaszi & Pierre Lombard", "", 0x00000001, af_open };