[SCM] calf/master: + New knob control (using temporary, cairo-rendered bitmap, will add knob Python sources later) - doesn't use libphat + Modified knob tag to allow for knob type (basically, polarity) + Monosynth: Use bipolar knob where applicable

js at users.alioth.debian.org js at users.alioth.debian.org
Tue May 7 15:36:50 UTC 2013


The following commit has been merged in the master branch:
commit 7e55cb02a2ae9480d42cef8bf0168fd8aac7b890
Author: kfoltman <kfoltman at 78b06b96-2940-0410-b7fc-879d825d01d8>
Date:   Thu Dec 27 16:47:29 2007 +0000

    + New knob control (using temporary, cairo-rendered bitmap, will add knob Python sources later) - doesn't use libphat
    + Modified knob tag to allow for knob type (basically, polarity)
    + Monosynth: Use bipolar knob where applicable
    
    
    
    git-svn-id: https://calf.svn.sourceforge.net/svnroot/calf/trunk@48 78b06b96-2940-0410-b7fc-879d825d01d8

diff --git a/Makefile.am b/Makefile.am
index 3e2c629..e313068 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -4,7 +4,7 @@ SUBDIRS = $(SRCDIRS)
 
 distdir = $(PACKAGE)-$(VERSION)
 
-EXTRA_DIST = COPYING.GPL TODO autogen.sh calf.glade presets.xml
+EXTRA_DIST = COPYING.GPL TODO autogen.sh calf.glade presets.xml knob.png
 
 clean-local:
 	rm -f *~ *.old
diff --git a/knob.png b/knob.png
new file mode 100644
index 0000000..436ce21
Binary files /dev/null and b/knob.png differ
diff --git a/src/Makefile.am b/src/Makefile.am
index 03929dc..3319275 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -59,6 +59,7 @@ clean-local:
 install-data-hook:
 	install -d -m 755 $(DESTDIR)$(pkglibdir)    
 	install -c -m 644 $(top_srcdir)/presets.xml $(DESTDIR)$(pkglibdir)
+	install -c -m 644 $(top_srcdir)/knob.png $(DESTDIR)$(pkglibdir)
 if USE_JACK
 	install -c -m 644 $(top_srcdir)/calf.glade $(DESTDIR)$(pkglibdir)
 endif
@@ -79,6 +80,7 @@ if USE_JACK
 	rm -f $(DESTDIR)$(pkglibdir)/calf.glade 
 endif
 	rm -f $(DESTDIR)$(pkglibdir)/presets.xml
+	rm -f $(DESTDIR)$(pkglibdir)/knob.png
 	rmdir $(DESTDIR)$(pkglibdir)    
 if USE_LADSPA
 	$(RM) -f $(DESTDIR)$(with_ladspa_dir)/calf.so
diff --git a/src/calf/custom_ctl.h b/src/calf/custom_ctl.h
index c971b9d..de9ab1d 100644
--- a/src/calf/custom_ctl.h
+++ b/src/calf/custom_ctl.h
@@ -28,6 +28,30 @@ extern GtkWidget *calf_line_graph_new();
 
 extern GType calf_line_graph_get_type();
 
+#define CALF_TYPE_KNOB          (calf_knob_get_type())
+#define CALF_KNOB(obj)          (G_TYPE_CHECK_INSTANCE_CAST ((obj), CALF_TYPE_KNOB, CalfKnob))
+#define CALF_IS_KNOB(obj)       (G_TYPE_CHECK_INSTANCE_TYPE ((obj), CALF_TYPE_KNOB))
+#define CALF_KNOB_CLASS(klass)  (G_TYPE_CHECK_CLASS_CAST ((klass),  CALF_TYPE_KNOB, CalfKnobClass))
+#define CALF_IS_KNOB_CLASS(obj) (G_TYPE_CHECK_CLASS_TYPE ((klass),  CALF_TYPE_KNOB))
+
+struct CalfKnob
+{
+    GtkRange parent;
+    int knob_type;
+    double start_x, start_y, start_value;
+};
+
+struct CalfKnobClass
+{
+    GtkRangeClass parent_class;
+    GdkPixbuf *knob_image;
+};
+
+extern GtkWidget *calf_knob_new();
+extern GtkWidget *calf_knob_new_with_adjustment(GtkAdjustment *_adjustment);
+
+extern GType calf_knob_get_type();
+
 G_END_DECLS
 
 #endif
diff --git a/src/calf/gui.h b/src/calf/gui.h
index 39f58fb..968c710 100644
--- a/src/calf/gui.h
+++ b/src/calf/gui.h
@@ -174,17 +174,19 @@ struct line_graph_param_control: public param_control
     static gboolean update(void *data);
 };
 
-#if USE_PHAT
 struct knob_param_control: public param_control
 {
+#if USE_PHAT
     PhatKnob *knob;
+#else
+    CalfKnob *knob;
+#endif
     
     virtual GtkWidget *create(plugin_gui *_gui, int _param_no);
     virtual void get();
     virtual void set();
-    static void knob_value_changed(PhatKnob *widget, gpointer value);
+    static void knob_value_changed(GtkWidget *widget, gpointer value);
 };
-#endif
 
 class plugin_gui_window;
 
diff --git a/src/custom_ctl.cpp b/src/custom_ctl.cpp
index 7756bcf..61154a4 100644
--- a/src/custom_ctl.cpp
+++ b/src/custom_ctl.cpp
@@ -8,7 +8,6 @@ calf_line_graph_expose (GtkWidget *widget, GdkEventExpose *event)
     g_assert(CALF_IS_LINE_GRAPH(widget));
     
     CalfLineGraph *lg = CALF_LINE_GRAPH(widget);
-    GdkWindow *window = widget->window;
     int ox = widget->allocation.x + 1, oy = widget->allocation.y + 1;
     int sx = widget->allocation.width - 2, sy = widget->allocation.height - 2;
     
@@ -30,7 +29,7 @@ calf_line_graph_expose (GtkWidget *widget, GdkEventExpose *event)
         {
             for (int i = 0; i < 2 * sx; i++)
             {
-                int y = oy + sy / 2 - (sy / 2 - 1) * data[i];
+                int y = (int)(oy + sy / 2 - (sy / 2 - 1) * data[i]);
                 if (y < oy) y = oy;
                 if (y >= oy + sy) y = oy + sy - 1;
                 if (i)
@@ -57,7 +56,7 @@ calf_line_graph_size_request (GtkWidget *widget,
 {
     g_assert(CALF_IS_LINE_GRAPH(widget));
     
-    CalfLineGraph *lg = CALF_LINE_GRAPH(widget);
+    // CalfLineGraph *lg = CALF_LINE_GRAPH(widget);
 
     requisition->width = 64;
     requisition->height = 64;
@@ -70,7 +69,7 @@ calf_line_graph_size_allocate (GtkWidget *widget,
     g_assert(CALF_IS_LINE_GRAPH(widget));
     
     widget->allocation = *allocation;
-    printf("allocation %d x %d\n", allocation->width, allocation->height);
+    // printf("allocation %d x %d\n", allocation->width, allocation->height);
 }
 
 static void
@@ -120,3 +119,149 @@ calf_line_graph_get_type (void)
   return type;
 }
 
+///////////////////////////////////////// knob ///////////////////////////////////////////////
+
+static gboolean
+calf_knob_expose (GtkWidget *widget, GdkEventExpose *event)
+{
+    g_assert(CALF_IS_KNOB(widget));
+    
+    CalfKnob *self = CALF_KNOB(widget);
+    GdkWindow *window = widget->window;
+    GtkAdjustment *adj = gtk_range_get_adjustment(GTK_RANGE(widget));
+
+    // printf("adjustment = %p value = %f\n", adj, adj->value);
+    int ox = widget->allocation.x, oy = widget->allocation.y;
+    int phase = (adj->value - adj->lower) * 64 / (adj->upper - adj->lower);
+    if (self->knob_type == 1 && phase == 32) {
+        double pt = (adj->value - adj->lower) * 2.0 / (adj->upper - adj->lower) - 1.0;
+        if (pt < 0)
+            phase = 31;
+        if (pt > 0)
+            phase = 33;
+    }
+    gdk_draw_pixbuf(GDK_DRAWABLE(widget->window), widget->style->fg_gc[0], CALF_KNOB_CLASS(GTK_OBJECT_GET_CLASS(widget))->knob_image, phase * 40, self->knob_type * 40, ox, oy, 40, 40, GDK_RGB_DITHER_NORMAL, 0, 0);
+    // printf("exposed %p %d+%d\n", widget->window, widget->allocation.x, widget->allocation.y);
+    
+    return TRUE;
+}
+
+static void
+calf_knob_size_request (GtkWidget *widget,
+                           GtkRequisition *requisition)
+{
+    g_assert(CALF_IS_KNOB(widget));
+    
+    CalfKnob *self = CALF_KNOB(widget);
+
+    requisition->width = 40;
+    requisition->height = 40;
+}
+
+static gboolean
+calf_knob_button_press (GtkWidget *widget, GdkEventButton *event)
+{
+    g_assert(CALF_IS_KNOB(widget));
+    CalfKnob *self = CALF_KNOB(widget);
+
+    // CalfKnob *lg = CALF_KNOB(widget);
+    gtk_widget_grab_focus(widget);
+    gtk_grab_add(widget);
+    self->start_x = event->x;
+    self->start_y = event->y;
+    self->start_value = gtk_range_get_value(GTK_RANGE(widget));
+    
+    return TRUE;
+}
+
+static gboolean
+calf_knob_button_release (GtkWidget *widget, GdkEventButton *event)
+{
+    g_assert(CALF_IS_KNOB(widget));
+
+    if (GTK_WIDGET_HAS_GRAB(widget))
+        gtk_grab_remove(widget);
+    return FALSE;
+}
+
+static gboolean
+calf_knob_pointer_motion (GtkWidget *widget, GdkEventMotion *event)
+{
+    g_assert(CALF_IS_KNOB(widget));
+    CalfKnob *self = CALF_KNOB(widget);
+
+    if (GTK_WIDGET_HAS_GRAB(widget)) 
+        gtk_range_set_value(GTK_RANGE(widget), self->start_value - (event->y - self->start_y) / 100);
+    return FALSE;
+}
+
+static void
+calf_knob_class_init (CalfKnobClass *klass)
+{
+    // GObjectClass *gobject_class = G_OBJECT_CLASS(klass);
+    GtkWidgetClass *widget_class = GTK_WIDGET_CLASS(klass);
+    widget_class->expose_event = calf_knob_expose;
+    widget_class->size_request = calf_knob_size_request;
+    widget_class->button_press_event = calf_knob_button_press;
+    widget_class->button_release_event = calf_knob_button_release;
+    widget_class->motion_notify_event = calf_knob_pointer_motion;
+    GError *error = NULL;
+    klass->knob_image = gdk_pixbuf_new_from_file(PKGLIBDIR "/knob.png", &error);
+    g_assert(klass->knob_image != NULL);
+}
+
+static void
+calf_knob_init (CalfKnob *self)
+{
+    GTK_WIDGET_SET_FLAGS (GTK_WIDGET(self), GTK_CAN_FOCUS);
+}
+
+GtkWidget *
+calf_knob_new()
+{
+    GtkAdjustment *adj = (GtkAdjustment *)gtk_adjustment_new(0, 0, 1, 0.01, 0.5, 0);
+    return calf_knob_new_with_adjustment(adj);
+}
+
+static gboolean calf_knob_value_changed(gpointer obj)
+{
+    GtkWidget *widget = (GtkWidget *)obj;
+    gtk_widget_queue_draw(widget);
+    return FALSE;
+}
+
+GtkWidget *calf_knob_new_with_adjustment(GtkAdjustment *_adjustment)
+{
+    GtkWidget *widget = GTK_WIDGET( g_object_new (CALF_TYPE_KNOB, NULL ));
+    if (widget) {
+        gtk_range_set_adjustment(GTK_RANGE(widget), _adjustment);
+        gtk_signal_connect(GTK_OBJECT(widget), "value-changed", G_CALLBACK(calf_knob_value_changed), widget);
+    }
+    return widget;
+}
+
+GType
+calf_knob_get_type (void)
+{
+  static GType type = 0;
+  if (!type) {
+    static const GTypeInfo type_info = {
+      sizeof(CalfKnobClass),
+      NULL, /* base_init */
+      NULL, /* base_finalize */
+      (GClassInitFunc)calf_knob_class_init,
+      NULL, /* class_finalize */
+      NULL, /* class_data */
+      sizeof(CalfKnob),
+      0,    /* n_preallocs */
+      (GInstanceInitFunc)calf_knob_init
+    };
+    
+    type = g_type_register_static(GTK_TYPE_RANGE,
+                                  "CalfKnob",
+                                  &type_info,
+                                  (GTypeFlags)0);
+  }
+  return type;
+}
+
diff --git a/src/gui.cpp b/src/gui.cpp
index 498d55c..a41bb93 100644
--- a/src/gui.cpp
+++ b/src/gui.cpp
@@ -219,10 +219,31 @@ GtkWidget *knob_param_control::create(plugin_gui *_gui, int _param_no)
     return widget;
 }
 
+#else
+
+GtkWidget *knob_param_control::create(plugin_gui *_gui, int _param_no)
+{
+    gui = _gui;
+    param_no = _param_no;
+    const parameter_properties &props = get_props();
+    
+    //widget = calf_knob_new_with_range (props.to_01 (gui->plugin->get_param_value(param_no)), 0, 1, 0.01);
+    widget = calf_knob_new();
+    CALF_KNOB(widget)->knob_type = get_int("type");
+    gtk_signal_connect(GTK_OBJECT(widget), "value-changed", G_CALLBACK(knob_value_changed), (gpointer)this);
+    return widget;
+}
+
+#endif
+
 void knob_param_control::get()
 {
     const parameter_properties &props = get_props();
+#if USE_PHAT
     float value = props.from_01(phat_knob_get_value(PHAT_KNOB(widget)));
+#else
+    float value = props.from_01(gtk_range_get_value(GTK_RANGE(widget)));
+#endif
     gui->set_param_value(param_no, value, this);
     if (label)
         update_label();
@@ -232,16 +253,20 @@ void knob_param_control::set()
 {
     _GUARD_CHANGE_
     const parameter_properties &props = get_props();
+#if USE_PHAT
     phat_knob_set_value(PHAT_KNOB(widget), props.to_01 (gui->plugin->get_param_value(param_no)));
-    knob_value_changed(PHAT_KNOB(widget), (gpointer)this);
+#else
+    gtk_range_set_value(GTK_RANGE(widget), props.to_01 (gui->plugin->get_param_value(param_no)));
+#endif
+    if (label)
+        update_label();
 }
 
-void knob_param_control::knob_value_changed(PhatKnob *widget, gpointer value)
+void knob_param_control::knob_value_changed(GtkWidget *widget, gpointer value)
 {
     param_control *jhp = (param_control *)value;
     jhp->get();
 }
-#endif
 
 // line graph
 
@@ -328,7 +353,6 @@ GtkWidget *plugin_gui::create(plugin_ctl_iface *_plugin)
             widget = params[i]->create(this, i);
             gtk_table_attach (GTK_TABLE (container), widget, 1, 3, trow, trow + 1, GTK_EXPAND, GTK_SHRINK, 0, 0);
         }
-#if USE_PHAT
         else if ((props.flags & PF_CTLMASK) != PF_CTL_FADER)
         {
             params[i] = new knob_param_control();
@@ -336,7 +360,6 @@ GtkWidget *plugin_gui::create(plugin_ctl_iface *_plugin)
             gtk_table_attach (GTK_TABLE (container), widget, 1, 2, trow, trow + 1, GTK_SHRINK, GTK_SHRINK, 0, 0);
             gtk_table_attach (GTK_TABLE (container), params[i]->create_label(), 2, 3, trow, trow + 1, (GtkAttachOptions)(GTK_SHRINK | GTK_FILL), GTK_SHRINK, 0, 0);
         }
-#endif
         else
         {
             gtk_misc_set_alignment (GTK_MISC (label), 1.0, 1.0);
diff --git a/src/monosynth.cpp b/src/monosynth.cpp
index fd588f3..aae393d 100644
--- a/src/monosynth.cpp
+++ b/src/monosynth.cpp
@@ -83,7 +83,7 @@ static const char *monosynth_gui_xml =
                         "</align>" 
                         "<vbox>"
                         "  <label param=\"o2_xpose\" />"
-                        "  <align align-x=\"0.5\" align-y=\"0.5\"><knob param=\"o2_xpose\" expand=\"0\" fill=\"0\"/></align><value param=\"o2_xpose\"/>"
+                        "  <align align-x=\"0.5\" align-y=\"0.5\"><knob type=\"1\" param=\"o2_xpose\" expand=\"0\" fill=\"0\"/></align><value param=\"o2_xpose\"/>"
                         "</vbox>"
                     "</hbox>"
                 "</vbox>"
@@ -107,7 +107,7 @@ static const char *monosynth_gui_xml =
                         "</vbox>"
                         "<vbox>"
                         "  <label param=\"filter_sep\" />"
-                        "  <align align-x=\"0.5\" align-y=\"0.5\"><knob param=\"filter_sep\" expand=\"0\" fill=\"0\"/></align><value param=\"filter_sep\"/>"
+                        "  <align align-x=\"0.5\" align-y=\"0.5\"><knob type=\"1\" param=\"filter_sep\" expand=\"0\" fill=\"0\"/></align><value param=\"filter_sep\"/>"
                         "</vbox>"
                     "</hbox>"
                 "</vbox>"
@@ -137,7 +137,7 @@ static const char *monosynth_gui_xml =
                     "<hbox>"
                         "<vbox>"
                         "  <label param=\"env2cutoff\" />"
-                        "  <align align-x=\"0.5\" align-y=\"0.5\"><knob param=\"env2cutoff\" expand=\"0\" fill=\"0\"/></align><value param=\"env2cutoff\"/>"
+                        "  <align align-x=\"0.5\" align-y=\"0.5\"><knob type=\"1\" param=\"env2cutoff\" expand=\"0\" fill=\"0\"/></align><value param=\"env2cutoff\"/>"
                         "</vbox>"
                         "<vbox>"
                         "  <label param=\"env2res\" />"

-- 
calf audio plugins packaging



More information about the pkg-multimedia-commits mailing list