示例#1
0
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;
}