Exemplo n.º 1
0
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;
}
Exemplo n.º 2
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;
    }
}