Example #1
0
static void process_audio(SFSUI* ui, const size_t n_elem, float const * const left, float const * const right) {
	pthread_mutex_lock(&ui->fft_lock);

	fftx_run(ui->fa, n_elem, left);
	bool display = !fftx_run(ui->fb, n_elem, right);

	if (display) {
		assert (fftx_bins(ui->fa) == ui->fft_bins);
		const float db_thresh = 1e-20;

		for (uint32_t i = 1; i < ui->fft_bins-1; i++) {
			if (ui->fa->power[i] < db_thresh && ui->fb->power[i] < db_thresh) {
				ui->lr[i] = 0.5;
				ui->level[i] = 0;
				continue;
			}
			const float lv = MAX(ui->fa->power[i], ui->fb->power[i]);
#if 1
			const float lr = .5 + .5 * (sqrtf(ui->fb->power[i]) - sqrtf(ui->fa->power[i])) / sqrtf(lv);
#else
			//XXX TODO log-scale / deflection of fraction
			//const float lr = .5 + .25 * fast_log10(ui->fb->power[i] / ui->fa->power[i]);
			float lr;
			if (ui->fb->power[i] < ui->fa->power[i]) {
				lr = .5 + .5 * fast_log10(ui->fb->power[i] / ui->fa->power[i]);
			} else {
				lr = .5 - .5 * fast_log10(ui->fa->power[i] / ui->fb->power[i]);
			}
#endif

			ui->level[i] += .1 * (lv - ui->level[i]) + 1e-20;
			ui->lr[i] += .1 * (lr - ui->lr[i]) + 1e-10;
		}
		queue_draw(ui->m0);
	}
	pthread_mutex_unlock(&ui->fft_lock);
}
Example #2
0
static void process_audio(MF2UI* ui, const size_t n_elem, float const * const left, float const * const right) {
	pthread_mutex_lock(&ui->fft_lock);

	fftx_run(ui->fa, n_elem, left);
	bool display = !fftx_run(ui->fb, n_elem, right);

	if (display) {
		assert (fftx_bins(ui->fa) == ui->fft_bins);
		float peak = 0;
		const float db_thresh = ui->db_thresh;
		for (uint32_t i = 1; i < ui->fft_bins-1; i++) {
			if (ui->fa->power[i] < db_thresh || ui->fb->power[i] < db_thresh) {
				ui->phase[i] = 0;
				ui->level[i] = -100;
				continue;
			}
			const float phase0 = ui->fa->phase[i];
			const float phase1 = ui->fb->phase[i];
			float phase = phase1 - phase0;
			ui->phase[i] = phase;
			ui->level[i] = MAX(ui->fa->power[i], ui->fb->power[i]);
			if (ui->level[i] > peak) {
				peak = ui->level[i];
			}
		}

		ui->peak += .04 * (peak - ui->peak) + 1e-15;
		if (isnan (ui->peak)) { ui->peak = 0; }
		if (ui->peak > 1000) { ui->peak = 1000; }
		if (robtk_cbtn_get_active(ui->btn_norm)) {
			robtk_dial_set_value(ui->gain, - fftx_power_to_dB(ui->peak));
		}
		queue_draw(ui->m0);
	}
	pthread_mutex_unlock(&ui->fft_lock);
}