int main(int argc, char **argv) { struct holder holder = {}; if (argc < 2) errx(1, "bad arguments"); open_io(&holder, argv[1]); holder.samples_count = holder.ininfo.samplerate / 100; /* do we have enough data? no = clamp the graph */ if (holder.width > holder.samples_count / 2) holder.width = holder.samples_count / 2; prepare_fftw(&holder); decode(&holder); destroy_fftw(&holder); close_io(&holder); return 0; }
/* * Main loop continuously reads/writes from input/output, downsampleing as we go. * input: data inputinformation * output: data output information * downsample_factor how much to downsample by (usually 4) * overlap: how many samples to overlap between subsequent samples */ int main_loop(catalyzer_io * input, catalyzer_io * output, int downsample_factor, int sample_size, int overlap) { if (sample_size % downsample_factor) { fprintf(stderr,"downsample factor does not evenly divide sample size.\n"); return -1; } int input_overlap = overlap * downsample_factor * 2; int output_overlap = overlap * 2; int input_buffer_size = sample_size + input_overlap; int output_buffer_size = sample_size / downsample_factor + output_overlap; int * input_buffer = calloc(input_buffer_size, sizeof(int)); int * output_buffer = calloc(output_buffer_size, sizeof(int)); catalyzer_fftw_state * fftw_state = prepare_fftw(input_buffer_size, output_buffer_size); for (;;) { /* Copy some data from the tail of the input buffer to the begining, * as per overlap requirements */ memmove(input_buffer, input_buffer+ (input_buffer_size - input_overlap) * sizeof(int), input_overlap * sizeof(int)); /* Read input data */ cat_read(input, input_buffer + input_overlap, sample_size); /* Do the converting */ do_fftw(fftw_state, input_buffer, output_buffer, input_buffer_size, output_buffer_size, 0); /* Write output data */ cat_write(output, output_buffer + overlap, sample_size / downsample_factor); } return 0; }