Exemple #1
0
static bool cb_set_oct (RobWidget* handle, void *data) {
	MF2UI* ui = (MF2UI*) (data);
	if (ui->disable_signals) return TRUE;
	float val = robtk_cbtn_get_active(ui->btn_oct) ? 1.0 : 0.0;
	ui->write(ui->controller, MF_BAND, sizeof(float), 0, (const void*) &val);
	return TRUE;
}
Exemple #2
0
static bool cb_set_oct (RobWidget* handle, void *data) {
	SFSUI* ui = (SFSUI*) (data);
	ui->clear_persistence = true;
	if (ui->disable_signals) return TRUE;
	float val = robtk_cbtn_get_active(ui->btn_oct) ? 1.0 : 0.0;
	ui->write(ui->controller, SS_BAND, sizeof(float), 0, (const void*) &val);
	return TRUE;
}
Exemple #3
0
static bool cb_set_norm (RobWidget* handle, void *data) {
	MF2UI* ui = (MF2UI*) (data);
	float val = robtk_cbtn_get_active(ui->btn_norm) ? 1.0 : 0.0;
	robtk_dial_set_sensitive(ui->gain, val == 0.0);
	if (ui->disable_signals) return TRUE;
	ui->write(ui->controller, MF_NORM, sizeof(float), 0, (const void*) &val);
	return TRUE;
}
Exemple #4
0
static bool cb_btn_avg (RobWidget *w, void* handle) {
	BITui* ui = (BITui*)handle;
	if (robtk_cbtn_get_active (ui->btn_avg)) {
		forge_message_kv (ui, ui->uris.mtr_meters_cfg, CTL_AVERAGE, 0);
	} else {
		forge_message_kv (ui, ui->uris.mtr_meters_cfg, CTL_WINDOWED, 0);
	}
	return TRUE;
}
Exemple #5
0
static bool cb_btn_freeze (RobWidget *w, void* handle) {
	BITui* ui = (BITui*)handle;
	if (robtk_cbtn_get_active (ui->btn_freeze)) {
		forge_message_kv (ui, ui->uris.mtr_meters_cfg, CTL_PAUSE, 0);
	} else {
		forge_message_kv (ui, ui->uris.mtr_meters_cfg, CTL_START, 0);
	}
	return TRUE;
}
Exemple #6
0
static bool cb_set_gain (RobWidget* handle, void *data) {
	MF2UI* ui = (MF2UI*) (data);

	const float val = robtk_dial_get_value(ui->gain);
	if (rintf(ui->pgain) != rintf(val)) {
		ui->pgain = val;
		ui->update_annotations = true;
		queue_draw(ui->m2);
	}
#ifdef __USE_GNU
	const float thresh = pow10f(.05 * (MIN_CUTOFF - val));
#else
	const float thresh = powf(10, .05 * (MIN_CUTOFF - val));
#endif
	ui->db_thresh = thresh * thresh;
	if (ui->disable_signals) return TRUE;
	if (robtk_cbtn_get_active(ui->btn_norm)) return TRUE;
	ui->write(ui->controller, MF_GAIN, sizeof(float), 0, (const void*) &val);
	return TRUE;
}
Exemple #7
0
static bool expose_event(RobWidget* handle, cairo_t* cr, cairo_rectangle_t *ev) {
	SFSUI* ui = (SFSUI*)GET_HANDLE(handle);

	if (ui->update_grid) {
		update_grid(ui);
		ui->update_grid = false;
	}
	if (ui->clear_persistence) {
		cairo_t* crx;
		crx = cairo_create (ui->sf_dat);
		rounded_rectangle (crx, SS_BORDER, SS_BORDER, SS_SIZE, SS_SIZE, SS_BORDER);
		cairo_set_source_rgba(crx, 0, 0, 0, 1.0);
		cairo_fill(crx);
		cairo_destroy(crx);
		ui->clear_persistence = false;
	}

	if (pthread_mutex_trylock (&ui->fft_lock) == 0 ) {
		if (robtk_cbtn_get_active(ui->btn_oct)) {
			plot_data_oct(ui);
		} else {
			plot_data_fft(ui);
		}
		pthread_mutex_unlock (&ui->fft_lock);
	}

	cairo_rectangle (cr, ev->x, ev->y, ev->width, ev->height);
	cairo_clip (cr);

	cairo_set_source_surface(cr, ui->sf_ann, 0, 0);
	cairo_paint (cr);

	cairo_set_operator (cr, CAIRO_OPERATOR_ADD);
	cairo_set_source_surface(cr, ui->sf_dat, 0, 0);
	cairo_paint (cr);

	return TRUE;
}
Exemple #8
0
/* main drawing callback */
static bool expose_event(RobWidget* handle, cairo_t* cr, cairo_rectangle_t *ev) {
	MF2UI* ui = (MF2UI*)GET_HANDLE(handle);

	if (ui->update_grid) {
		ui->width  = floor(ui->scale * 2 * (PH_RAD + XOFF));
		ui->height = floor(ui->scale * 2 * (PH_RAD + YOFF));

		m0_create_surfaces(ui);
		update_grid(ui);
		ui->update_grid = false;
	}

	cairo_translate(cr,
			rint((ui->m0_width - ui->width) * .5),
			rint((ui->m0_height - ui->height) * .5));

	if (pthread_mutex_trylock (&ui->fft_lock) == 0 ) {
		if (robtk_cbtn_get_active(ui->btn_oct)) {
			plot_data_oct(ui);
		} else {
			plot_data_fft(ui);
		}
		pthread_mutex_unlock (&ui->fft_lock);
	}

	cairo_rectangle (cr, ev->x, ev->y, ev->width, ev->height);
	cairo_clip (cr);

	cairo_set_source_surface(cr, ui->sf_ann, 0, 0);
	cairo_paint (cr);

	cairo_set_operator (cr, CAIRO_OPERATOR_ADD);
	cairo_set_source_surface(cr, ui->sf_dat, 0, 0);
	cairo_paint (cr);

	return TRUE;
}
Exemple #9
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);
}