static bool cb_set_fft (RobWidget* handle, void *data) { SFSUI* ui = (SFSUI*) (data); const float fft_size = 2 * robtk_select_get_value(ui->sel_fft); uint32_t fft_bins = floorf(fft_size / 2.0); if (ui->fft_bins == fft_bins) return TRUE; reinitialize_fft(ui, fft_bins); ui->write(ui->controller, SS_FFT, sizeof(float), 0, (const void*) &fft_size); return TRUE; }
static LV2UI_Handle instantiate( void* const ui_toplevel, const LV2UI_Descriptor* descriptor, const char* plugin_uri, const char* bundle_path, LV2UI_Write_Function write_function, LV2UI_Controller controller, RobWidget** widget, const LV2_Feature* const* features) { SFSUI* ui = (SFSUI*) calloc(1,sizeof(SFSUI)); *widget = NULL; ui->map = NULL; if (!strcmp(plugin_uri, MTR_URI "stereoscope")) { ; } else if (!strcmp(plugin_uri, MTR_URI "stereoscope_gtk")) { ; } else { free(ui); return NULL; } for (int i = 0; features[i]; ++i) { if (!strcmp(features[i]->URI, LV2_URID_URI "#map")) { ui->map = (LV2_URID_Map*)features[i]->data; } } if (!ui->map) { fprintf(stderr, "meters.lv2 UI: Host does not support urid:map\n"); free(ui); return NULL; } map_xfer_uris(ui->map, &ui->uris); lv2_atom_forge_init(&ui->forge, ui->map); ui->write = write_function; ui->controller = controller; ui->rate = 48000; ui->disable_signals = false; ui->update_grid = false; ui->clear_persistence = false; ui->fft_bins = 512; ui->freq_band = NULL; ui->freq_bins = 0; ui->width = SS_SIZE + 2 * SS_BORDER; ui->height = SS_SIZE + 2 * SS_BORDER; pthread_mutex_init(&ui->fft_lock, NULL); *widget = toplevel(ui, ui_toplevel); reinitialize_fft(ui, ui->fft_bins); ui_enable(ui); return ui; }
static void port_event(LV2UI_Handle handle, uint32_t port_index, uint32_t buffer_size, uint32_t format, const void* buffer) { SFSUI* ui = (SFSUI*)handle; LV2_Atom* atom = (LV2_Atom*)buffer; if (format == ui->uris.atom_eventTransfer && (atom->type == ui->uris.atom_Blank|| atom->type == ui->uris.atom_Object)) { /* cast the buffer to Atom Object */ LV2_Atom_Object* obj = (LV2_Atom_Object*)atom; LV2_Atom *a0 = NULL; LV2_Atom *a1 = NULL; if (obj->body.otype == ui->uris.rawstereo && 2 == lv2_atom_object_get(obj, ui->uris.audioleft, &a0, ui->uris.audioright, &a1, NULL) && a0 && a1 && a0->type == ui->uris.atom_Vector && a1->type == ui->uris.atom_Vector ) { LV2_Atom_Vector* left = (LV2_Atom_Vector*)LV2_ATOM_BODY(a0); LV2_Atom_Vector* right = (LV2_Atom_Vector*)LV2_ATOM_BODY(a1); if (left->atom.type == ui->uris.atom_Float && right->atom.type == ui->uris.atom_Float) { const size_t n_elem = (a0->size - sizeof(LV2_Atom_Vector_Body)) / left->atom.size; const float *l = (float*) LV2_ATOM_BODY(&left->atom); const float *r = (float*) LV2_ATOM_BODY(&right->atom); process_audio(ui, n_elem, l, r); } } else if ( /* handle 'state/settings' data object */ obj->body.otype == ui->uris.ui_state /* retrieve properties from object and * check that there the [here] three required properties are set.. */ && 1 == lv2_atom_object_get(obj, ui->uris.samplerate, &a0, NULL) /* ..and non-null.. */ && a0 /* ..and match the expected type */ && a0->type == ui->uris.atom_Float ) { ui->rate = ((LV2_Atom_Float*)a0)->body; reinitialize_fft(ui, ui->fft_bins); } } else if (format != 0) return; if (port_index == SS_FFT) { float val = *(float *)buffer; uint32_t fft_bins = floorf(val / 2.0); if (ui->fft_bins != fft_bins) { reinitialize_fft(ui, fft_bins); robtk_select_set_value(ui->sel_fft, ui->fft_bins); } } else if (port_index == SS_BAND) { float val = *(float *)buffer; ui->disable_signals = true; robtk_cbtn_set_active(ui->btn_oct, val != 0); ui->disable_signals = false; } else if (port_index == SS_SCREEN) { ui->disable_signals = true; robtk_dial_set_value(ui->screen, *(float *)buffer); ui->disable_signals = false; } }
static LV2UI_Handle instantiate( void* const ui_toplevel, const LV2UI_Descriptor* descriptor, const char* plugin_uri, const char* bundle_path, LV2UI_Write_Function write_function, LV2UI_Controller controller, RobWidget** widget, const LV2_Feature* const* features) { MF2UI* ui = (MF2UI*) calloc(1,sizeof(MF2UI)); *widget = NULL; ui->map = NULL; if (!strcmp(plugin_uri, MTR_URI "phasewheel")) { ; } else { free(ui); return NULL; } for (int i = 0; features[i]; ++i) { if (!strcmp(features[i]->URI, LV2_URID_URI "#map")) { ui->map = (LV2_URID_Map*)features[i]->data; } } if (!ui->map) { fprintf(stderr, "meters.lv2 UI: Host does not support urid:map\n"); free(ui); return NULL; } ui->nfo = robtk_info(ui_toplevel); map_xfer_uris(ui->map, &ui->uris); lv2_atom_forge_init(&ui->forge, ui->map); ui->write = write_function; ui->controller = controller; ui->rate = 48000; ui->db_cutoff = -60; ui->db_thresh = 0.000001; // (-60dB)^2 // XXX ui->drag_cutoff_x = -1; ui->prelight_cutoff = false; ui->cor = 0.5; ui->disable_signals = false; ui->update_annotations = false; ui->update_grid = false; ui->fft_bins = 512; ui->freq_band = NULL; ui->freq_bins = 0; ui->pgain = -100; ui->peak = 0; ui->scale = 0.0; ui->pscale = 1.0; ui->width = 2 * (PH_RAD + XOFF); ui->height = 2 * (PH_RAD + YOFF); pthread_mutex_init(&ui->fft_lock, NULL); *widget = toplevel(ui, ui_toplevel); reinitialize_fft(ui, ui->fft_bins); ui_enable(ui); return ui; }