⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 uif_sfont.c

📁 A GTK sound font editor. Sound font files are used to synthesize instruments from audio samples for
💻 C
📖 第 1 页 / 共 5 页
字号:
    save_as = FALSE: just saves it    returns: NULL if just saved it or ignored, or file selection widget pointer *--------------------------------- */GtkWidget *uisf_save_sfont (gint save_as){  SFItemID itemid, pitemid;  GtkCTreeNode *node;  UISFont *uisf;  UIVBank *uivb;  GTokenValue *val;  GtkWidget *savewin;  if (!(itemid = sftree_get_selection_single ())) return (NULL);  if (!(node = SFTREE_LOOKUP_ITEMID (itemid))) return (NULL);  uisf = SFTREE_UPFIND_UISF (node);  /* if not a sound font, then its a virtual bank */  if (!uisf) uivb = SFTREE_UPFIND_UIVB (node);  /* Save As not requested and not first save, then just save it */  if (uisf)			/* ?: sound font? */    {      if (!save_as && uisf->sf->sffd && uisf->sf->beensaved)	{	  uisf_cb_save_continue (uisf->sf->fname, itemid);	  return (NULL);	}      pitemid = uisf->sf->itemid; /* parent (sfont) item ID */    }  else				/* ?: no, virtual bank */    {      if (!save_as && uivb->vbnk->beensaved)	{	  uisf_cb_save_continue (uivb->vbnk->fname, itemid);	  return (NULL);	}      pitemid = uivb->vbnk->itemid; /* parent (vbank) item ID */    }  /* Save As, i.e. pops a save file selection window */  /* check if save file selection dialog already active */  if (util_activate_unique_dialog ("savesf", pitemid))    return (NULL);  /* pop save dialog window */  savewin = gtk_file_selection_new ((uisf != NULL) ? _("Save Sound Font")				    : _("Save Virtual Bank"));  util_register_unique_dialog (savewin, "savesf", pitemid);  /* if save path isn't set, use default sfont path from smurf.cfg */  if (!uisf_sfont_save_path)    {      val = smurfcfg_get_val (SMURFCFG_DEF_SFONT_PATH);      uisf_sfont_save_path = g_strdup (val->v_string);    }  if (strlen (uisf_sfont_save_path))    gtk_file_selection_set_filename (GTK_FILE_SELECTION (savewin),      uisf_sfont_save_path);  gtk_object_set_data (GTK_OBJECT (GTK_FILE_SELECTION (savewin)->ok_button),    "savewin", savewin);  gtk_signal_connect (GTK_OBJECT (GTK_FILE_SELECTION (savewin)->ok_button),    "clicked", (GtkSignalFunc) uisf_cb_saveas_dialog_okay,    GINT_TO_POINTER (itemid));  gtk_signal_connect_object (GTK_OBJECT (GTK_FILE_SELECTION (savewin)->      cancel_button), "clicked", (GtkSignalFunc) gtk_widget_destroy,    GTK_OBJECT (savewin));  gtk_widget_show (savewin);  return (savewin);}static voiduisf_cb_saveas_dialog_okay (GtkWidget * btn, SFItemID itemid){  GtkCTreeNode *node;  UISFont *uisf;  UIVBank *uivb;  GtkWidget *popup;		/* popup used for overwrite confirmation */  GtkWidget *savewin;		/* save file selection widget */  gchar *fname;  struct stat st;  gchar *s;  /* get save file selection widget */  savewin = gtk_object_get_data (GTK_OBJECT (btn), "savewin");  if (!(node = SFTREE_LOOKUP_ITEMID (itemid)))    {      gtk_widget_destroy (savewin);      return;    }  uisf = SFTREE_UPFIND_UISF (node);  if (!uisf) uivb = SFTREE_UPFIND_UIVB (node);  else uivb = NULL;  fname = gtk_file_selection_get_filename (GTK_FILE_SELECTION (savewin));  if (strlen (fname) == 0)    return;  if ((uisf && uisf_find_sfont_by_fname (fname, uisf->sf))      || (uivb && uisf_find_vbank_by_fname (fname, uivb->vbnk)))    {      util_quick_popup (	_("That sound font is currently loaded and should not be saved over"),	NULL);      return;    }  if (!strlen (g_basename (fname)))    {      logit (LogFubar, _("No file specified in path '%s'"), fname);      return;    }  if (stat (fname, &st) != -1)    {				/* file exists? */      s = g_strdup_printf (_("Overwrite existing file '%s'?"), fname);      popup =	util_quick_popup (s, _("OK"), uisf_cb_save_ovrwrite_okay, itemid,	_("Cancel"), NULL, NULL, NULL);      g_free (s);      gtk_object_set_data (GTK_OBJECT (popup), "savewin", savewin);      return;    }  if (uisf_cb_save_continue (fname, itemid))    {      g_free (uisf_sfont_save_path);	/* free old save path */      s = g_dirname (fname);	/* new save path */      uisf_sfont_save_path = g_strconcat (s, G_DIR_SEPARATOR_S, NULL);      g_free (s);      gtk_widget_destroy (savewin);	/* destroy save dialog on success */    }}/* user confirmed file overwrite for sound font save */static voiduisf_cb_save_ovrwrite_okay (gpointer data, GtkWidget *popdog){  GtkCTreeNode *node;  GtkWidget *savewin;		/* save file selection widget */  gchar *fname;  SFItemID itemid = GPOINTER_TO_INT (data);  savewin = gtk_object_get_data (GTK_OBJECT (popdog), "savewin");  gtk_widget_destroy (popdog);  if (!(node = SFTREE_LOOKUP_ITEMID (itemid))) return;  fname = gtk_file_selection_get_filename (GTK_FILE_SELECTION (savewin));  if (uisf_cb_save_continue (fname, itemid))    gtk_widget_destroy (savewin);	/* destroy save dialog on success */}static gintuisf_cb_save_continue (gchar * fname, SFItemID itemid){  GtkCTreeNode *node;  UISFont *uisf;  UIVBank *uivb;  gchar *dirname;  FILE *tmpfd;  gchar *tmpfname;  gint mksfd = -1;  struct stat st;  gint retval;  if (!(node = SFTREE_LOOKUP_ITEMID (itemid))) return (FAIL);  uisf = SFTREE_UPFIND_UISF (node);  if (!uisf) uivb = SFTREE_UPFIND_UIVB (node);  dirname = g_dirname (fname);  /* stat the target directory */  if (stat (dirname, &st) == -1)    {      g_free (dirname);      return (logit (LogFubar | LogErrno,	  _("Target directory doesn't exist or error occured")));    }  /* is it really a directory? (is this necessary?) */  if (!S_ISDIR (st.st_mode))    {      g_free (dirname);      return (logit (LogFubar, _("Target path is not a directory")));    }  tmpfname = g_strconcat (dirname, G_DIR_SEPARATOR_S "smurf_tmp.XXXXXX", NULL);  g_free (dirname);		/* string from g_dirname() needs to be freed */  if ((mksfd = mkstemp (tmpfname)) == -1 || !(tmpfd = fdopen (mksfd, "w+")))    {      if (mksfd != -1)	{	  unlink (tmpfname);	  close (mksfd);	}      logit (LogFubar | LogErrno,	     _("Unable to open temp file '%s' for writing"), tmpfname);      g_free (tmpfname);      return (FAIL);    }  if (uisf) retval = sfsave_file (uisf->sf, tmpfd);  else retval = vbank_save (uivb->vbnk, tmpfd);  if (!retval)    {      fclose (tmpfd);      if (unlink (tmpfname) == -1)	logit (LogWarn, _("Could not delete temporary file '%s'"), tmpfname);      g_free (tmpfname);      return (FAIL);    }  if (rename (tmpfname, fname) == -1)    {      /* sample file offsets need restoration (sfload.c)? */      if (uisf)			/* only valid if a sound font */	sfsave_undo_sample_posofs ();	/* restore sample file offsets */      logit (LogFubar | LogErrno,	     _("Failed to rename temp file to destination file name"));      fclose (tmpfd);      if (unlink (tmpfname) == -1)	logit (LogWarn, _("Could not delete temporary file \"%s\""), tmpfname);      g_free (tmpfname);      return (FAIL);    }  g_free (tmpfname);  if (uisf)			/* ?: sound font? */    {      uisf->sf->up2date = TRUE;	/* sfont is now up to date */      uisf->sf->beensaved = TRUE;	/* the sound font has now been saved */      if (uisf->sf->sffd)	fclose (uisf->sf->sffd);	/* close old sound font fd */      uisf->sf->sffd = tmpfd;	/* assign new fd */      fflush (tmpfd);		/* flush all writes to disk, fd stays open */      /* update sound font file name */      sfont_set_fname (uisf->sf, fname);      sftree_update_sfont_node_label (uisf);      /* ohh! Didn't need it after all (see sfload.c) */      sfsave_free_sample_posofs ();    }  else				/* ?: No, virtual bank */    {      uivb->vbnk->up2date = TRUE; /* vbank now up to date */      uivb->vbnk->beensaved = TRUE; /* been saved now */      vbank_set_fname (uivb->vbnk, fname);      sftree_update_vbank_node_label (uivb);      fclose (tmpfd);		/* close file descriptor */    }  return (OK);}/* pops a dialog to edit/view sound font info (itemid should be sf node) */voiduisf_sfont_info (void){  SFItemID itemid;  GtkCTreeNode *node;  UISFont *uisf;  SFData *sf;  GtkWidget *infowin;  GtkWidget *lbl;  GtkWidget *entry;  GtkWidget *text;  gchar *s, *s2, *s3;  if (!(itemid = sftree_get_selection_single ())) return;  if (!(node = SFTREE_LOOKUP_ITEMID (itemid))) return;  uisf = SFTREE_UPFIND_UISF (node);  sf = uisf->sf;  /* check if info dialog already active for this sound font */  if (util_activate_unique_dialog ("sfinfo", sf->itemid))    return;  infowin = create_infowin ();  util_register_unique_dialog (infowin, "sfinfo", sf->itemid);  gtk_object_set_data (GTK_OBJECT (infowin), "itemid",GINT_TO_POINTER (itemid));  entry = gtk_object_get_data (GTK_OBJECT (infowin), "ENinam");  s = sfont_get_info (sf, INAM_ID);  if (s) gtk_entry_set_text (GTK_ENTRY (entry), s);  entry = gtk_object_get_data (GTK_OBJECT (infowin), "ENieng");  s = sfont_get_info (sf, IENG_ID);  if (s) gtk_entry_set_text (GTK_ENTRY (entry), s);  entry = gtk_object_get_data (GTK_OBJECT (infowin), "ENicop");  s = sfont_get_info (sf, ICOP_ID);  if (s) gtk_entry_set_text (GTK_ENTRY (entry), s);  entry = gtk_object_get_data (GTK_OBJECT (infowin), "ENiprd");  s = sfont_get_info (sf, IPRD_ID);  if (s) gtk_entry_set_text (GTK_ENTRY (entry), s);  entry = gtk_object_get_data (GTK_OBJECT (infowin), "ENicrd");  s = sfont_get_info (sf, ICRD_ID);  if (s) gtk_entry_set_text (GTK_ENTRY (entry), s);  lbl = gtk_object_get_data (GTK_OBJECT (infowin), "LBLiver");  s = g_strdup_printf ("%d.%d", sf->version.major, sf->version.minor);  gtk_label_set_text (GTK_LABEL (lbl), s);  g_free (s);  s = sfont_get_info (sf, ISFT_ID);  s2 = strchr (s, ':');  if (s2)    {      s3 = g_strndup (s, (gint) (s2 - s));      s2 = g_strdup (s2 + 1);    }  else    {      s3 = g_strdup (s);      s2 = g_strdup ("");    }  entry = gtk_object_get_data (GTK_OBJECT (infowin), "ENcreate");  gtk_entry_set_text (GTK_ENTRY (entry), s3);  g_free (s3);  entry = gtk_object_get_data (GTK_OBJECT (infowin), "ENedit");  gtk_entry_set_text (GTK_ENTRY (entry), s2);  g_free (s2);  if (!(s = sfont_get_info (sf, ISNG_ID))) s = "";  lbl = gtk_object_get_data (GTK_OBJECT (infowin), "LBLisng");  gtk_label_set_text (GTK_LABEL (lbl), s);  if ((s = sfont_get_info (sf, IROM_ID)))    s = g_strdup_printf ("%s v%d.%d", s, sf->romver.major, sf->romver.minor);  else s = g_strdup ("");  lbl = gtk_object_get_data (GTK_OBJECT (infowin), "LBLirom");  gtk_label_set_text (GTK_LABEL (lbl), s);  g_free (s);  text = gtk_object_get_data (GTK_OBJECT (infowin), "TXTicmt");  s = sfont_get_info (sf, ICMT_ID);  if (s)    {      s2 = str_crlf2lf (s);      gtk_text_insert (GTK_TEXT (text), NULL, NULL, NULL, s2, -1);      g_free (s2);    }  gtk_widget_show (infowin);}voiduisf_cb_sfont_info_date_today (GtkWidget * btn, GtkWidget * entry){  time_t t;  struct tm *tm;  gchar s[41];  time (&t);  tm = localtime (&t);  strftime (s, 40, "%B %e, %Y", tm);  gtk_entry_set_text (GTK_ENTRY (entry), s);}voiduisf_cb_sfont_info_okay (GtkWidget * btn, GtkWidget *infowin){  SFItemID itemid;  GtkCTreeNode *node;  UISFont *uisf;  SFData *sf;  SFItemID sfitemid;  GtkWidget *entry;  GtkWidget *text;  gchar *s, *s2;  itemid = GPOINTER_TO_INT(gtk_object_get_data (GTK_OBJECT (infowin),"itemid"));  if (!(node = SFTREE_LOOKUP_ITEMID (itemid)))    {				/* node still exists? */      gtk_widget_destroy (infowin);      return;    }  uisf = SFTREE_UPFIND_UISF (node);  sf = uisf->sf;  sfitemid = sf->itemid;  sfdo_group(_("Modified sound font info"));     /* start undo group */  entry = gtk_object_get_data (GTK_OBJECT (infowin), "ENinam");  s = gtk_entry_get_text (GTK_ENTRY (entry));  s2 = sfont_get_info (sf, INAM_ID);  if (strcmp (s, s2) != 0)    {      dofunc_sfinfo_save (sfitemid, INAM_ID);      sfont_set_info (sf, INAM_ID, s);      sftree_update_sfont_node_label (uisf);	/* update sfont tree label */    }  entry = gtk_object_get_data (GTK_OBJECT (infowin), "ENieng");  s = gtk_entry_get_text (GTK_ENTRY (entry));  s2 = sfont_get_info (sf, IENG_ID);  if (strcmp (s, s2) != 0)    {      dofunc_sfinfo_save (sfitemid, IENG_ID);      sfont_set_info (sf, IENG_ID, s);    }  entry = gtk_object_get_data (GTK_OBJECT (infowin), "ENicop");  s = gtk_entry_get_text (GTK_ENTRY (entry));  s2 = sfont_get_info (sf, ICOP_ID);  if (strcmp (s, s2) != 0)    {      dofunc_sfinfo_save (sfitemid, ICOP_ID);      sfont_set_info (sf, ICOP_ID, s);    }  entry = gtk_object_get_data (GTK_OBJECT (infowin), "ENiprd");  s = gtk_entry_get_text (GTK_ENTRY (entry));  s2 = sfont_get_info (sf, IPRD_ID);  if (strcmp (s, s2) != 0)    {      dofunc_sfinfo_save (sfitemid, IPRD_ID);      sfont_set_info (sf, IPRD_ID, s);    }  entry = gtk_object_get_data (GTK_OBJECT (infowin), "ENicrd");  s = gtk_entry_get_text (GTK_ENTRY (entry));  s2 = sfont_get_info (sf, ICRD_ID);  if (strcmp (s, s2) != 0)    {      dofunc_sfinfo_save (sfitemid, ICRD_ID);      sfont_set_info (sf, ICRD_ID, s);    }  text = gtk_object_get_data (GTK_OBJECT (infowin), "TXTicmt");  s2 = gtk_editable_get_chars (GTK_EDITABLE (text), 0, -1);  s = str_lf2crlf (s2);		/* convert end of line characters */  g_free (s2);  /* yeah, that is awefully large, but who knows what someone might want to     store here, perhaps complementary ascii pictures of cows mating */  if (strlen (s) > 65535)    s2[65535] = '\0';  s2 = sfont_get_info (sf, ICMT_ID);  if (strcmp (s, s2) != 0)    {      dofunc_sfinfo_save (sfitemid, ICMT_ID);      sfont_set_info (sf, ICMT_ID, s);    }  g_free (s);  sfdo_done();      /* done with undo group */  gtk_widget_destroy (infowin);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -