[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