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; }
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; }
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; }
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; }
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; }
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; }
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; }
/* 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; }
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); }