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 void port_event (LV2UI_Handle handle, uint32_t port_index, uint32_t buffer_size, uint32_t format, const void* buffer) { BITui* ui = (BITui*)handle; const EBULV2URIs* uris = &ui->uris; if (format != uris->atom_eventTransfer) { return; } LV2_Atom* atom = (LV2_Atom*)buffer; if (atom->type != uris->atom_Blank && atom->type != uris->atom_Object) { fprintf (stderr, "UI: Unknown message type.\n"); return; } LV2_Atom_Object* obj = (LV2_Atom_Object*)atom; if (obj->body.otype == uris->mtr_control) { int k; float v; get_cc_key_value (&ui->uris, obj, &k, &v); if (k == CTL_SAMPLERATE) { if (v > 0) { ui->rate = v; } queue_draw (ui->m0); } } else if (obj->body.otype == uris->bim_stats) { LV2_Atom *bcnt = NULL; LV2_Atom *bmin = NULL; LV2_Atom *bmax = NULL; LV2_Atom *bnan = NULL; LV2_Atom *binf = NULL; LV2_Atom *bden = NULL; LV2_Atom *bpos = NULL; LV2_Atom *bnul = NULL; LV2_Atom *bdat = NULL; if (9 == lv2_atom_object_get (obj, uris->ebu_integr_time, &bcnt, uris->bim_zero, &bnul, uris->bim_pos, &bpos, uris->bim_max, &bmax, uris->bim_min, &bmin, uris->bim_nan, &bnan, uris->bim_inf, &binf, uris->bim_den, &bden, uris->bim_data, &bdat, NULL) && bcnt && bnul && bpos && bmin && bmax && bnan && binf && bden && bdat && bcnt->type == uris->atom_Long && bpos->type == uris->atom_Int && bnul->type == uris->atom_Int && bmin->type == uris->atom_Double && bmax->type == uris->atom_Double && bnan->type == uris->atom_Int && binf->type == uris->atom_Int && bden->type == uris->atom_Int && bdat->type == uris->atom_Vector ) { CB_INT(bnan, update_oops, 0); CB_INT(binf, update_oops, 1); CB_INT(bden, update_oops, 2); PARSE_A_INT(bpos, ui->f_pos); PARSE_A_INT(bnul, ui->f_zero); CB_DBL(bmin, update_minmax, 0); CB_DBL(bmax, update_minmax, 1); LV2_Atom_Vector* data = (LV2_Atom_Vector*)LV2_ATOM_BODY(bdat); if (data->atom.type == uris->atom_Int) { const size_t n_elem = (bdat->size - sizeof (LV2_Atom_Vector_Body)) / data->atom.size; assert (n_elem == BIM_LAST); const int32_t *d = (int32_t*) LV2_ATOM_BODY(&data->atom); memcpy (ui->flt, d, sizeof (int32_t) * n_elem); } update_time (ui, (uint64_t)(((LV2_Atom_Long*)bcnt)->body)); btn_start_sens (ui); // maybe set 2^31 limit. queue_draw (ui->m0); } } else if (obj->body.otype == uris->bim_information) { LV2_Atom *ii = NULL; LV2_Atom *av = NULL; lv2_atom_object_get (obj, uris->ebu_integrating, &ii, uris->bim_averaging, &av, NULL); ui->disable_signals = true; if (ii && ii->type == uris->atom_Bool) { bool ix = ((LV2_Atom_Bool*)ii)->body; robtk_cbtn_set_active (ui->btn_freeze, !ix); } if (av && av->type == uris->atom_Bool) { bool ix = ((LV2_Atom_Bool*)av)->body; robtk_cbtn_set_active (ui->btn_avg, ix); } ui->disable_signals = false; } else { fprintf (stderr, "UI: Unknown control message.\n"); } }
static RobWidget * toplevel(SFSUI* ui, void * const top) { /* main widget: layout */ ui->rw = rob_vbox_new(FALSE, 0); robwidget_make_toplevel(ui->rw, top); ui->hbox1 = rob_hbox_new(FALSE, 0); ui->hbox2 = rob_hbox_new(FALSE, 0); ui->sep2 = robtk_sep_new(true); rob_vbox_child_pack(ui->rw, ui->hbox1, FALSE, FALSE); rob_vbox_child_pack(ui->rw, robtk_sep_widget(ui->sep2), FALSE, FALSE); rob_vbox_child_pack(ui->rw, ui->hbox2, FALSE, FALSE); ui->font[0] = pango_font_description_from_string("Mono 7"); ui->font[1] = pango_font_description_from_string("Mono 8"); get_color_from_theme(0, ui->c_fg); get_color_from_theme(1, ui->c_bg); create_surfaces(ui); /* main drawing area */ ui->m0 = robwidget_new(ui); ROBWIDGET_SETNAME(ui->m0, "stsco (m0)"); robwidget_set_expose_event(ui->m0, expose_event); robwidget_set_size_request(ui->m0, size_request); rob_hbox_child_pack(ui->hbox1, ui->m0, FALSE, FALSE); /* screen persistence dial */ ui->lbl_screen = robtk_lbl_new("Persistence:"); ui->screen = robtk_dial_new_with_size(0.0, 100.0, 1, 22, 22, 10.5, 10.5, 10); robtk_dial_set_alignment(ui->screen, 1.0, 0.5); robtk_dial_set_value(ui->screen, 50); robtk_dial_set_default(ui->screen, 50.0); robtk_dial_set_callback(ui->screen, cb_set_persistence, ui); /* fft bins */ ui->lbl_fft = robtk_lbl_new("FFT Samples:"); ui->sel_fft = robtk_select_new(); robtk_select_add_item(ui->sel_fft, 128, "256"); robtk_select_add_item(ui->sel_fft, 256, "512"); robtk_select_add_item(ui->sel_fft, 512, "1024"); robtk_select_add_item(ui->sel_fft, 1024, "2048"); robtk_select_add_item(ui->sel_fft, 2048, "4096"); robtk_select_add_item(ui->sel_fft, 4096, "8192"); robtk_select_add_item(ui->sel_fft, 6144, "12288"); robtk_select_add_item(ui->sel_fft, 8192, "16384"); robtk_select_set_default_item(ui->sel_fft, 3); robtk_select_set_value(ui->sel_fft, 512); robtk_select_set_callback(ui->sel_fft, cb_set_fft, ui); /* N/octave */ ui->btn_oct = robtk_cbtn_new("N/Octave Bands", GBT_LED_LEFT, false); robtk_cbtn_set_active(ui->btn_oct, false); robtk_cbtn_set_callback(ui->btn_oct, cb_set_oct, ui); robtk_cbtn_set_color_on(ui->btn_oct, .2, .8, .1); robtk_cbtn_set_color_off(ui->btn_oct, .1, .3, .1); /* explicit alignment */ ui->sep0 = robtk_sep_new(true); robtk_sep_set_linewidth(ui->sep0, 0); rob_hbox_child_pack(ui->hbox2, robtk_lbl_widget(ui->lbl_screen), FALSE, FALSE); rob_hbox_child_pack(ui->hbox2, robtk_dial_widget(ui->screen), FALSE, FALSE); rob_hbox_child_pack(ui->hbox2, robtk_lbl_widget(ui->lbl_fft), FALSE, FALSE); rob_hbox_child_pack(ui->hbox2, robtk_select_widget(ui->sel_fft), FALSE, FALSE); rob_hbox_child_pack(ui->hbox2, robtk_sep_widget(ui->sep0), TRUE, FALSE); rob_hbox_child_pack(ui->hbox2, robtk_cbtn_widget(ui->btn_oct), FALSE, FALSE); return ui->rw; }
static RobWidget * toplevel(MF2UI* ui, void * const top) { /* main widget: layout */ ui->rw = rob_vbox_new(FALSE, 0); robwidget_make_toplevel(ui->rw, top); ui->hbox1 = rob_hbox_new(FALSE, 0); ui->hbox2 = rob_hbox_new(FALSE, 0); ui->hbox3 = rob_hbox_new(FALSE, 0); ui->sep2 = robtk_sep_new(true); rob_vbox_child_pack(ui->rw, ui->hbox1, TRUE, TRUE); rob_vbox_child_pack(ui->rw, ui->hbox2, FALSE, TRUE); rob_vbox_child_pack(ui->rw, robtk_sep_widget(ui->sep2), FALSE, TRUE); rob_vbox_child_pack(ui->rw, ui->hbox3, FALSE, TRUE); ui->font[0] = pango_font_description_from_string("Mono 9px"); ui->font[1] = pango_font_description_from_string("Mono 10px"); get_color_from_theme(0, ui->c_fg); get_color_from_theme(1, ui->c_bg); m1_create_surfaces(ui); m2_create_surfaces(ui); /* main drawing area */ ui->m0 = robwidget_new(ui); ROBWIDGET_SETNAME(ui->m0, "mphase (m0)"); robwidget_set_expose_event(ui->m0, expose_event); robwidget_set_size_request(ui->m0, size_request); robwidget_set_size_allocate(ui->m0, m0_size_allocate); rob_hbox_child_pack(ui->hbox1, ui->m0, TRUE, TRUE); /* phase correlation */ ui->m1 = robwidget_new(ui); ROBWIDGET_SETNAME(ui->m1, "phase (m1)"); robwidget_set_expose_event(ui->m1, pc_expose_event); robwidget_set_size_request(ui->m1, pc_size_request); robwidget_set_size_allocate(ui->m1, pc_size_allocate); rob_hbox_child_pack(ui->hbox1, ui->m1, FALSE, TRUE); /* gain box */ ui->sep3 = robtk_sep_new(true); ui->sep4 = robtk_sep_new(true); robtk_sep_set_linewidth(ui->sep3, 0); robtk_sep_set_linewidth(ui->sep4, 0); /* gain annotation */ ui->m2 = robwidget_new(ui); ROBWIDGET_SETNAME(ui->m2, "gain (m2)"); robwidget_set_expose_event(ui->m2, ga_expose_event); robwidget_set_size_request(ui->m2, ga_size_request); rob_hbox_child_pack(ui->hbox2, robtk_sep_widget(ui->sep3), TRUE, TRUE); rob_hbox_child_pack(ui->hbox2, ui->m2, FALSE, FALSE); rob_hbox_child_pack(ui->hbox2, robtk_sep_widget(ui->sep4), TRUE, TRUE); robwidget_set_mousedown(ui->m2, m2_mousedown); robwidget_set_mouseup(ui->m2, m2_mouseup); robwidget_set_mousemove(ui->m2, m2_mousemove); robwidget_set_enter_notify(ui->m2, m2_enter); robwidget_set_leave_notify(ui->m2, m2_leave); /* gain dial */ ui->gain = robtk_dial_new_with_size(-40.0, 40.0, .01, 60, 40, 30.5, 16.5, 10); robtk_dial_set_alignment(ui->gain, 1.0, 0.5); robtk_dial_set_value(ui->gain, 0); robtk_dial_set_default(ui->gain, 20.0); robtk_dial_set_callback(ui->gain, cb_set_gain, ui); robtk_dial_set_surface(ui->gain,ui->sf_dial); robtk_dial_annotation_callback(ui->gain, dial_annotation_db, ui); rob_hbox_child_pack(ui->hbox2, robtk_dial_widget(ui->gain), FALSE, FALSE); /* fft bins */ ui->lbl_fft = robtk_lbl_new("FFT:"); ui->sel_fft = robtk_select_new(); robtk_select_add_item(ui->sel_fft, 64, "128"); robtk_select_add_item(ui->sel_fft, 128, "256"); robtk_select_add_item(ui->sel_fft, 256, "512"); robtk_select_add_item(ui->sel_fft, 512, "1024"); robtk_select_add_item(ui->sel_fft, 1024, "2048"); robtk_select_add_item(ui->sel_fft, 2048, "4096"); robtk_select_add_item(ui->sel_fft, 4096, "8192"); robtk_select_add_item(ui->sel_fft, 6144, "12288"); robtk_select_add_item(ui->sel_fft, 8192, "16384"); robtk_select_set_default_item(ui->sel_fft, 3); robtk_select_set_value(ui->sel_fft, 512); robtk_select_set_callback(ui->sel_fft, cb_set_fft, ui); /* N/octave */ ui->btn_oct = robtk_cbtn_new("N/Octave Bands", GBT_LED_LEFT, false); robtk_cbtn_set_active(ui->btn_oct, false); robtk_cbtn_set_callback(ui->btn_oct, cb_set_oct, ui); robtk_cbtn_set_color_on(ui->btn_oct, .2, .8, .1); robtk_cbtn_set_color_off(ui->btn_oct, .1, .3, .1); /* Normalize */ ui->btn_norm = robtk_cbtn_new("Normalize", GBT_LED_LEFT, false); robtk_cbtn_set_active(ui->btn_norm, false); robtk_cbtn_set_callback(ui->btn_norm, cb_set_norm, ui); robtk_cbtn_set_color_on(ui->btn_norm, .2, .8, .1); robtk_cbtn_set_color_off(ui->btn_norm, .1, .3, .1); /* screen persistence dial */ ui->lbl_screen = robtk_lbl_new("Persistence:"); ui->screen = robtk_dial_new_with_size(0.0, 100.0, 1, 22, 22, 10.5, 10.5, 10); robtk_dial_set_alignment(ui->screen, 1.0, 0.5); robtk_dial_set_value(ui->screen, 33); robtk_dial_set_default(ui->screen, 33.0); robtk_dial_set_callback(ui->screen, cb_set_persistence, ui); /* explicit alignment */ ui->sep0 = robtk_sep_new(true); robtk_sep_set_linewidth(ui->sep0, 0); ui->sep1 = robtk_sep_new(true); robtk_sep_set_linewidth(ui->sep1, 0); rob_hbox_child_pack(ui->hbox3, robtk_lbl_widget(ui->lbl_screen), FALSE, FALSE); rob_hbox_child_pack(ui->hbox3, robtk_dial_widget(ui->screen), FALSE, FALSE); rob_hbox_child_pack(ui->hbox3, robtk_lbl_widget(ui->lbl_fft), FALSE, FALSE); rob_hbox_child_pack(ui->hbox3, robtk_select_widget(ui->sel_fft), FALSE, FALSE); rob_hbox_child_pack(ui->hbox3, robtk_sep_widget(ui->sep0), TRUE, FALSE); rob_hbox_child_pack(ui->hbox3, robtk_cbtn_widget(ui->btn_oct), FALSE, FALSE); rob_hbox_child_pack(ui->hbox3, robtk_sep_widget(ui->sep1), TRUE, FALSE); rob_hbox_child_pack(ui->hbox3, robtk_cbtn_widget(ui->btn_norm), FALSE, FALSE); update_annotations(ui); return ui->rw; }