[beast/wip/soundfont: 18/832] BEAST-GTK: implemented browsing and selection of available sound fonts



commit f8e6b98ef84260b94c12da217131e4b20a9a5923
Author: Stefan Westerfeld <stefan space twc de>
Date:   Mon Nov 8 23:14:48 2010 +0100

    BEAST-GTK: implemented browsing and selection of available sound fonts
    
    Selecting sound font presets in now supported as an alternative to synth
    and wave selection.

 beast-gtk/bsttracksynthdialog.c |   34 +++++++++++++++++++++++++++-------
 beast-gtk/bsttracksynthdialog.h |    8 +++++++-
 beast-gtk/bsttrackview.c        |   37 ++++++++++++++++++++++++++++++-------
 3 files changed, 64 insertions(+), 15 deletions(-)
---
diff --git a/beast-gtk/bsttracksynthdialog.c b/beast-gtk/bsttracksynthdialog.c
index d1ea14b..b2ddf2b 100644
--- a/beast-gtk/bsttracksynthdialog.c
+++ b/beast-gtk/bsttracksynthdialog.c
@@ -57,7 +57,7 @@ bst_track_synth_dialog_init (BstTrackSynthDialog *self)
                           GXK_DIALOG_POPUP_POS |
                           GXK_DIALOG_MODAL),
                 NULL);
-  gxk_dialog_set_sizes (GXK_DIALOG (self), 550, 300, 600, 320);
+  gxk_dialog_set_sizes (GXK_DIALOG (self), 550, 300, 600, 450);
   
   /* notebook */
   self->notebook = g_object_new (GXK_TYPE_NOTEBOOK,
@@ -120,6 +120,10 @@ bst_track_synth_dialog_init (BstTrackSynthDialog *self)
   self->wpage = g_object_new (BST_TYPE_WAVE_VIEW, "visible", TRUE, NULL);
   gxk_notebook_append (self->notebook, self->wpage, "wave", TRUE);
   bst_wave_view_set_editable (BST_WAVE_VIEW (self->wpage), FALSE);
+
+  /* sound font view */
+  self->sfont_page = g_object_new (BST_TYPE_SOUND_FONT_VIEW, "visible", TRUE, NULL);
+  gxk_notebook_append (self->notebook, self->sfont_page, "sound_font", TRUE);
   
   /* provide buttons */
   self->ok = gxk_dialog_default_action_swapped (GXK_DIALOG (self), BST_STOCK_OK, 
bst_track_synth_dialog_activate, self);
@@ -236,6 +240,9 @@ bst_track_synth_dialog_popup (gpointer     parent_widget,
                               const gchar *wrepo_label,
                               const gchar *wrepo_tooltip,
                               SfiProxy     wrepo,
+                              const gchar *sfrepo_label,
+                              const gchar *sfrepo_tooltip,
+                              SfiProxy     sfrepo,
                               BstTrackSynthDialogSelected  selected_callback,
                               gpointer                     selected_data,
                               GxkFreeFunc                  selected_cleanup)
@@ -246,6 +253,8 @@ bst_track_synth_dialog_popup (gpointer     parent_widget,
     candidate_label = "";
   if (!wrepo_label)
     wrepo_label = "";
+  if (!sfrepo_label)
+    sfrepo_label = "";
 
   bst_track_synth_dialog_setup (self, NULL, NULL, 0);
 
@@ -253,8 +262,10 @@ bst_track_synth_dialog_popup (gpointer     parent_widget,
   gxk_widget_set_tooltip (self->tview, candidate_tooltip);
   g_object_set (gtk_notebook_get_tab_label (self->notebook, self->wpage), "label", wrepo_label, NULL);
   gxk_widget_set_tooltip (BST_ITEM_VIEW (self->wpage)->tree, wrepo_tooltip);
+  g_object_set (gtk_notebook_get_tab_label (self->notebook, self->sfont_page), "label", sfrepo_label, NULL);
+  gxk_widget_set_tooltip (BST_ITEM_VIEW (self->sfont_page)->tree, sfrepo_tooltip);
 
-  bst_track_synth_dialog_set (self, candidates, wrepo);
+  bst_track_synth_dialog_set (self, candidates, wrepo, sfrepo);
   bst_track_synth_dialog_setup (self, parent_widget,
                                 /* TRANSLATORS: this is a dialog title and %s is replaced by an object name 
*/
                                 _("Synthesizer Selection: %s"),
@@ -271,14 +282,17 @@ bst_track_synth_dialog_popup (gpointer     parent_widget,
 void
 bst_track_synth_dialog_set (BstTrackSynthDialog *self,
                             BseItemSeq          *iseq,
-                            SfiProxy             wrepo)
+                            SfiProxy             wrepo,
+                           SfiProxy             sfrepo)
 {
   g_return_if_fail (BST_IS_TRACK_SYNTH_DIALOG (self));
   
   bst_item_view_set_container (BST_ITEM_VIEW (self->wpage), wrepo);
+  bst_item_view_set_container (BST_ITEM_VIEW (self->sfont_page), sfrepo);
   bst_item_seq_store_set (self->pstore, iseq);
-  g_object_set (self->wpage, "visible", wrepo != 0, NULL);
   g_object_set (self->spage, "visible", iseq != NULL, NULL);
+  g_object_set (self->wpage, "visible", wrepo != 0, NULL);
+  g_object_set (self->sfont_page, "visible", sfrepo != 0, NULL);
 }
 
 static void
@@ -303,9 +317,15 @@ bst_track_synth_dialog_activate (BstTrackSynthDialog *self)
           proxy = bst_item_seq_store_get_from_iter (self->pstore, &piter);
         }
     }
-  else if (self->wpage)
-    proxy = bst_item_view_get_current (BST_ITEM_VIEW (self->wpage));
-  
+  else if (self->wpage && gxk_widget_viewable (GTK_WIDGET (self->wpage)))
+    {
+      proxy = bst_item_view_get_current (BST_ITEM_VIEW (self->wpage));
+    }
+  else if (self->sfont_page && gxk_widget_viewable (GTK_WIDGET (self->sfont_page)))
+    {
+      proxy = bst_sound_font_view_get_preset (BST_SOUND_FONT_VIEW (self->sfont_page));
+    }
+
   /* ignore_activate guards against multiple clicks */
   self->ignore_activate = TRUE;
   /* notify and done */
diff --git a/beast-gtk/bsttracksynthdialog.h b/beast-gtk/bsttracksynthdialog.h
index 96159cd..4687c37 100644
--- a/beast-gtk/bsttracksynthdialog.h
+++ b/beast-gtk/bsttracksynthdialog.h
@@ -19,6 +19,7 @@
 
 #include "bstutils.h"
 #include "bstwaveview.h"
+#include "bstsoundfontview.h"
 
 G_BEGIN_DECLS
 
@@ -44,6 +45,7 @@ struct _BstTrackSynthDialog
   GtkNotebook   *notebook;
   GtkWidget     *wpage;         /* wave repo item view */
   GtkWidget     *spage;         /* synth list */
+  GtkWidget     *sfont_page;    /* sound font patch selection */
   GtkWidget     *ok;            /* ok button */
   GtkWindow     *parent_window;
   guint          ignore_activate : 1;
@@ -69,12 +71,16 @@ GtkWidget* bst_track_synth_dialog_popup    (gpointer                     parent_
                                             const gchar                 *wrepo_label,
                                             const gchar                 *wrepo_tooltip,
                                             SfiProxy                     wrepo,
+                                            const gchar                 *sfrepo_label,
+                                            const gchar                 *sfrepo_tooltip,
+                                            SfiProxy                     sfrepo,
                                             BstTrackSynthDialogSelected  selected_callback,
                                             gpointer                     selected_data,
                                             GxkFreeFunc                  selected_cleanup);
 void       bst_track_synth_dialog_set      (BstTrackSynthDialog         *self,
                                             BseItemSeq                  *iseq,
-                                            SfiProxy                     wrepo);
+                                            SfiProxy                     wrepo,
+                                           SfiProxy                     sfrepo);
 
 
 
diff --git a/beast-gtk/bsttrackview.c b/beast-gtk/bsttrackview.c
index bca8e74..e6c44e9 100644
--- a/beast-gtk/bsttrackview.c
+++ b/beast-gtk/bsttrackview.c
@@ -135,7 +135,7 @@ track_view_fill_value (BstItemView *iview,
       const gchar *string;
       gboolean vbool;
       SfiInt vint;
-      SfiProxy snet, wave;
+      SfiProxy snet, wave, sound_font_preset;
       BseItemSeq *iseq;
       SfiSeq *seq;
     case COL_SEQID:
@@ -154,8 +154,18 @@ track_view_fill_value (BstItemView *iview,
       break;
     case COL_SYNTH:
       snet = 0;
-      bse_proxy_get (item, "snet", &snet, "wave", &wave, NULL);
-      g_value_set_string (value, snet || wave ? bse_item_get_name (snet ? snet : wave) : "");
+      wave = 0;
+      sound_font_preset = 0;
+      bse_proxy_get (item, "snet", &snet, "wave", &wave, "sound_font_preset", &sound_font_preset, NULL);
+      if (snet)
+       string = bse_item_get_name (snet);
+      else if (wave)
+       string = bse_item_get_name (wave);
+      else if (sound_font_preset)
+       string = bse_item_get_name (sound_font_preset);
+      else
+       string = "";
+      g_value_set_string (value, string);
       break;
     case COL_MIDI_CHANNEL:
       bse_proxy_get (item, "midi-channel", &vint, NULL);
@@ -190,7 +200,7 @@ track_view_synth_edited (BstTrackView *self,
                         const gchar  *text)
 {
   g_return_if_fail (BST_IS_TRACK_VIEW (self));
-  
+
   if (strpath)
     {
       gint row = gxk_tree_spath_index0 (strpath);
@@ -199,11 +209,18 @@ track_view_synth_edited (BstTrackView *self,
        {
          SfiProxy proxy = 0;
          GSList *slist = NULL;
-         /* list possible snet/wave candidates */
+         /* list possible snet/wave/sound_font_preset candidates */
           BsePropertyCandidates *pc = bse_item_get_property_candidates (item, "snet");
+          printf ("[0] slist=%p\n", slist);
          slist = g_slist_append (slist, pc->items);
           pc = bse_item_get_property_candidates (item, "wave");
+          printf ("[1] slist=%p\n", slist);
          slist = g_slist_append (slist, pc->items);
+         pc = bse_item_get_property_candidates (item, "sound_font_preset");
+          printf ("[2] slist=%p\n", slist);
+          printf ("pc=%p\n", pc);
+          printf ("pc->items=%p\n", pc->items);
+          slist = g_slist_append (slist, pc->items);
          /* find best match */
          proxy = bst_item_seq_list_match (slist, text);
          g_slist_free (slist);
@@ -211,11 +228,13 @@ track_view_synth_edited (BstTrackView *self,
            bse_proxy_set (item, "snet", proxy, NULL);
          else if (proxy && BSE_IS_WAVE (proxy))
            bse_proxy_set (item, "wave", proxy, NULL);
+         else if (proxy && BSE_IS_SOUND_FONT_PRESET (proxy))
+           bse_proxy_set (item, "sound_font_preset", proxy, NULL);
          else
-           bse_proxy_set (item, "snet", 0, "wave", 0, NULL);
+           bse_proxy_set (item, "snet", 0, "wave", 0, "sound_font_preset", 0, NULL);
        }
       else
-       bse_proxy_set (item, "snet", 0, "wave", 0, NULL);
+       bse_proxy_set (item, "snet", 0, "wave", 0, "sound_font_preset", 0, NULL);
     }
 }
 
@@ -296,6 +315,9 @@ track_view_synth_popup (BstTrackView         *self,
                                                             _("Available Waves"),
                                                             _("List of available waves to choose a track 
instrument from"),
                                                             bse_project_get_wave_repo (bse_item_get_project 
(item)),
+                                                           _("Available Sound Fonts"),
+                                                           _("List of available sound fonts to choose track 
instrument from"),
+                                                           bse_project_get_sound_font_repo 
(bse_item_get_project (item)),
                                                             track_view_synth_popup_cb, g_memdup (&sdata, 
sizeof (sdata)), track_view_synth_popup_cleanup);
           gxk_cell_renderer_popup_dialog (pcell, dialog);
         }
@@ -323,6 +345,7 @@ track_view_post_synth_popup (BstTrackView         *self,
           GtkWidget *dialog = bst_track_synth_dialog_popup (self, item,
                                                             pc->label, pc->tooltip, pc->items,
                                                             NULL, NULL, 0,
+                                                           NULL, NULL, 0,
                                                             track_view_synth_popup_cb, g_memdup (&sdata, 
sizeof (sdata)), track_view_synth_popup_cleanup);
           gxk_cell_renderer_popup_dialog (pcell, dialog);
         }


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]