/* Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#include "dsp_test_util.h"
#include "dsp_util.h"
#include "drc.h"
#include "raw.h"

#ifndef min
#define min(a, b)                                                              \
	({                                                                     \
		__typeof__(a) _a = (a);                                        \
		__typeof__(b) _b = (b);                                        \
		_a < _b ? _a : _b;                                             \
	})
#endif

static double tp_diff(struct timespec *tp2, struct timespec *tp1)
{
	return (tp2->tv_sec - tp1->tv_sec) +
	       (tp2->tv_nsec - tp1->tv_nsec) * 1e-9;
}

static void process(struct drc *drc, float *buf, size_t frames)
{
	struct timespec tp1, tp2;
	int start;
	float *data[2];
	int chunk;
	clock_gettime(CLOCK_THREAD_CPUTIME_ID, &tp1);
	for (start = 0; start < frames;) {
		data[0] = buf + start;
		data[1] = buf + start + frames;
		chunk = min(DRC_PROCESS_MAX_FRAMES, frames - start);
		drc_process(drc, data, chunk);
		start += chunk;
	}
	clock_gettime(CLOCK_THREAD_CPUTIME_ID, &tp2);
	printf("drc processing takes %g seconds for %zu samples\n",
	       tp_diff(&tp2, &tp1), frames * 2);
}

int main(int argc, char **argv)
{
	double NQ = 44100 / 2; /* nyquist frequency */
	struct drc *drc;
	size_t frames;
	float *buf;

	if (argc != 3) {
		printf("Usage: drc_test input.raw output.raw\n");
		return 1;
	}

	dsp_enable_flush_denormal_to_zero();
	dsp_util_clear_fp_exceptions();
	drc = drc_new(44100);

	drc->emphasis_disabled = 0;
	drc_set_param(drc, 0, PARAM_CROSSOVER_LOWER_FREQ, 0);
	drc_set_param(drc, 0, PARAM_ENABLED, 1);
	drc_set_param(drc, 0, PARAM_THRESHOLD, -29);
	drc_set_param(drc, 0, PARAM_KNEE, 3);
	drc_set_param(drc, 0, PARAM_RATIO, 6.677);
	drc_set_param(drc, 0, PARAM_ATTACK, 0.02);
	drc_set_param(drc, 0, PARAM_RELEASE, 0.2);
	drc_set_param(drc, 0, PARAM_POST_GAIN, -7);

	drc_set_param(drc, 1, PARAM_CROSSOVER_LOWER_FREQ, 200 / NQ);
	drc_set_param(drc, 1, PARAM_ENABLED, 1);
	drc_set_param(drc, 1, PARAM_THRESHOLD, -32);
	drc_set_param(drc, 1, PARAM_KNEE, 23);
	drc_set_param(drc, 1, PARAM_RATIO, 12);
	drc_set_param(drc, 1, PARAM_ATTACK, 0.02);
	drc_set_param(drc, 1, PARAM_RELEASE, 0.2);
	drc_set_param(drc, 1, PARAM_POST_GAIN, 0.7);

	drc_set_param(drc, 2, PARAM_CROSSOVER_LOWER_FREQ, 1200 / NQ);
	drc_set_param(drc, 2, PARAM_ENABLED, 1);
	drc_set_param(drc, 2, PARAM_THRESHOLD, -24);
	drc_set_param(drc, 2, PARAM_KNEE, 30);
	drc_set_param(drc, 2, PARAM_RATIO, 1);
	drc_set_param(drc, 2, PARAM_ATTACK, 0.001);
	drc_set_param(drc, 2, PARAM_RELEASE, 1);
	drc_set_param(drc, 2, PARAM_POST_GAIN, 0);

	drc_init(drc);
	buf = read_raw(argv[1], &frames);
	process(drc, buf, frames);
	write_raw(argv[2], buf, frames);
	drc_free(drc);
	free(buf);
	dsp_util_print_fp_exceptions();
	return 0;
}
