int main (int argc, char *argv[]) { GtkWidget *window, *vbox, *hbox, *sbar, *spin, *button; GslConfigValue gslconfig[] = { { "wave_chunk_padding", 1, }, { "dcache_block_size", 8192, }, { "dcache_cache_memory", 5 * 1024 * 1024, }, { NULL, }, }; WaveView *view, *first_view = NULL; guint i; g_thread_init (NULL); g_type_init (); birnet_init (&argc, &argv, NULL); gsl_init (gslconfig); bse_init_inprocess (&argc, &argv, NULL, NULL); gtk_init (&argc, &argv); gxk_init (); _bst_init_utils (); if (argc < 2) g_error ("need filenames"); vbox = gtk_widget_new (GTK_TYPE_VBOX, "visible", TRUE, "border_width", 10, NULL); gtk_box_pack_start (GTK_BOX (vbox), pack_test_widget (), TRUE, TRUE, 0); sbar = gtk_widget_new (GTK_TYPE_HSCROLLBAR, "visible", TRUE, NULL); gtk_box_pack_start (GTK_BOX (vbox), sbar, FALSE, TRUE, 0); for (i = 1; i < argc; i++) { view = g_new (WaveView, 1); view->handle = gsl_wave_handle_new (argv[i], 1, 44100, 440, GSL_WAVE_FORMAT_SIGNED_16, G_LITTLE_ENDIAN, 0, -1); if (!view->handle) g_error ("failed to create handle for \"%s\": stat() failed", argv[i]); view->qsampler = g_object_new (BST_TYPE_QSAMPLER, "visible", TRUE, "events", (GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_BUTTON1_MOTION_MASK), NULL); g_object_connect (view->qsampler, "signal::button_press_event", qsampler_button_event, view, "signal::button_release_event", qsampler_button_event, view, "signal::motion_notify_event", qsampler_motion_event, view, NULL); qsampler_set_handle (view->qsampler, view->handle); bst_qsampler_set_adjustment (view->qsampler, gtk_range_get_adjustment (GTK_RANGE (sbar))); gtk_box_pack_start (GTK_BOX (vbox), GTK_WIDGET (view->qsampler), TRUE, TRUE, 2); view->next = wave_views; wave_views = view; if (i == 1) first_view = view; } spin = gtk_spin_button_new (GTK_ADJUSTMENT (gtk_adjustment_new (100, 1e-16, 1e+16, 0.1, 10, 0)), 0, 5); gtk_widget_set (spin, "visible", TRUE, "width_request", 40, NULL); for (view = wave_views; view; view = view->next) g_object_connect (GTK_OBJECT (gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON (spin))), "signal::value_changed", adjust_zoom, view->qsampler, NULL); gtk_box_pack_start (GTK_BOX (vbox), spin, FALSE, TRUE, 0); spin = gtk_spin_button_new (GTK_ADJUSTMENT (gtk_adjustment_new (100, 1e-16, 1e+16, 1, 10, 0)), 0, 5); gtk_widget_set (spin, "visible", TRUE, "width_request", 40, NULL); for (view = wave_views; view; view = view->next) g_object_connect (GTK_OBJECT (gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON (spin))), "signal::value_changed", adjust_vscale, view->qsampler, NULL); gtk_box_pack_start (GTK_BOX (vbox), spin, FALSE, TRUE, 0); hbox = gtk_widget_new (GTK_TYPE_HBOX, "visible", TRUE, "border_width", 10, NULL); gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0); button = g_object_connect (g_object_new (GTK_TYPE_BUTTON, "visible", TRUE, "label", _("Selection to Loop"), NULL), "swapped_signal::clicked", selection_to_loop, first_view->qsampler, NULL); gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, TRUE, 0); button = g_object_connect (g_object_new (GTK_TYPE_BUTTON, "visible", TRUE, "label", _("Loop to Selection"), NULL), "swapped_signal::clicked", loop_to_selection, first_view->qsampler, NULL); gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, TRUE, 0); button = g_object_connect (g_object_new (GTK_TYPE_BUTTON, "visible", TRUE, "label", _("Zoom Selection"), NULL), "swapped_signal::clicked", zoom_selection, first_view->qsampler, NULL); gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, TRUE, 0); button = g_object_connect (g_object_new (GTK_TYPE_BUTTON, "visible", TRUE, "label", _("Apply Loop"), NULL), "swapped_signal::clicked", set_loop, first_view->qsampler, NULL); gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, TRUE, 0); button = g_object_connect (g_object_new (GTK_TYPE_BUTTON, "visible", TRUE, "label", _("Reset Loop"), NULL), "swapped_signal::clicked", unset_loop, first_view->qsampler, NULL); gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, TRUE, 0); button = g_object_connect (g_object_new (GTK_TYPE_BUTTON, "visible", TRUE, "label", _("Score"), NULL), "swapped_signal::clicked", score, first_view->qsampler, NULL); gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, TRUE, 0); button = g_object_connect (g_object_new (GTK_TYPE_BUTTON, "visible", TRUE, "label", _("Find"), NULL), "swapped_signal::clicked", find, first_view, NULL); gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, TRUE, 0); window = g_object_connect (gtk_widget_new (GTK_TYPE_WINDOW, "child", vbox, "visible", TRUE, "height_request", 450, "width_request", 1400, "allow_shrink", TRUE, NULL), "signal::destroy", gtk_main_quit, NULL, NULL); button = g_object_new (GTK_TYPE_BUTTON, "visible", TRUE, "label", _("Mark Signal (Head)"), NULL); gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, TRUE, 0); for (view = wave_views; view; view = view->next) g_object_connect (GTK_OBJECT (button), "swapped_signal::clicked", mark_signalh, view, NULL); button = g_object_new (GTK_TYPE_BUTTON, "visible", TRUE, "label", _("Mark Signal (Tail)"), NULL); gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, TRUE, 0); for (view = wave_views; view; view = view->next) g_object_connect (GTK_OBJECT (button), "swapped_signal::clicked", mark_signalt, view, NULL); gtk_main (); return 0; }
static GslDataHandle* gslwave_create_chunk_handle (gpointer data, GslWaveDsc *wave_dsc, guint nth_chunk, GslErrorType *error_p) { WaveDsc *dsc = (WaveDsc*) wave_dsc; FileInfo *fi = (FileInfo*) dsc->wdsc.file_info; GslWaveChunkDsc *chunk = wave_dsc->chunks + nth_chunk; if (chunk->loader_data1) /* file_name */ { GslDataHandle *dhandle; GslWaveFileInfo *cfi; gchar *string; /* construct chunk file name from (hopefully) relative path */ if (g_path_is_absolute (chunk->loader_data1)) string = g_strdup (chunk->loader_data1); else string = g_strdup_printf ("%s%c%s", fi->cwd, G_DIR_SEPARATOR, (char*) chunk->loader_data1); /* first, try to load the chunk via registered loaders */ cfi = gsl_wave_file_info_load (string, error_p); if (cfi) { /* FIXME: there's a potential attack here, in letting a single chunk * wave's chunk point to its own wave. this'll trigger recursions until * stack overflow */ dhandle = gslwave_load_singlechunk_wave (cfi, chunk->loader_data2, /* wave_name */ error_p); gsl_wave_file_info_unref (cfi); g_free (string); return dhandle; } /* didn't work, assume it's a raw sample */ if (chunk->loader_data2) /* wave_name */ { /* raw samples don't give names to their data */ *error_p = GSL_ERROR_NOT_FOUND; g_free (string); return NULL; } dhandle = gsl_wave_handle_new (string, /* file_name */ dsc->wdsc.n_channels, dsc->format, dsc->byte_order, chunk->loader_offset, /* byte_offset */ chunk->loader_length > 0 /* n_values */ ? chunk->loader_length : -1); *error_p = dhandle ? GSL_ERROR_NONE : GSL_ERROR_IO; g_free (string); return dhandle; } else { /* no file_name specified */ *error_p = GSL_ERROR_NOT_FOUND; return NULL; } }