diff -Nru guitarix-0.22.4/changelog guitarix-0.24.2/changelog --- guitarix-0.22.4/changelog 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/changelog 2012-10-20 03:56:02.000000000 +0000 @@ -1,3 +1,19 @@ +guitarix2 (0.24.2) unstable; urgency=low + * remove dunwah from build to avoid unwonted install + * correct version mismatch in wscript + + -- brummer Sat, 20 Oct 2012 05:37:35 +0200 + +guitarix2 (0.24.1) unstable; urgency=low + * fix In "organize" mod copying preset form one bank to the + same one corrupts the bank + * add sse4a (optimization) to wscript + * add treble booster unit + * set osc buffersize menu to sensitive false when jack buffer + is larger then 1023 + + -- brummer Mon, 14 Oct 2012 05:37:35 +0200 + guitarix2 (0.17.0svn) unstable; urgency=low * SVN head diff -Nru guitarix-0.22.4/debian/README guitarix-0.24.2/debian/README --- guitarix-0.22.4/debian/README 1970-01-01 00:00:00.000000000 +0000 +++ guitarix-0.24.2/debian/README 2012-10-20 03:56:02.000000000 +0000 @@ -0,0 +1,16 @@ +The Debian Package guitarfx +---------------------------- +guitarix a simple mono amplifier with one input and two output's. Designed to get trashguitar sounds. Avaliable are the controls for bass, treble, gain, balance, distortion and freeverb. A resonator and a small echo is fixed because I dont wont to overload the interface. + +It comes with a GTK Interface and as Ladspa plugin. + +I use faust to translate the dsp file to cpp. +http://faust.grame.fr/ + +contributors : Julius Smith + : Albert Graef + : Yann Orlary + + + + -- brummer Thu, 03 Jul 2008 13:24:31 +0200 diff -Nru guitarix-0.22.4/debian/changelog guitarix-0.24.2/debian/changelog --- guitarix-0.22.4/debian/changelog 2012-06-12 19:14:01.000000000 +0000 +++ guitarix-0.24.2/debian/changelog 2012-11-06 01:44:29.000000000 +0000 @@ -1,3 +1,33 @@ +guitarix (0.24.2-1sound1~13.04) raring; urgency=medium + + * Import from 'debian experimental'. + + -- DNS777 Mon, 05 Nov 2012 03:00:00 +0000 + +guitarix (0.24.2-1) experimental; urgency=low + + * New upstream release + + -- Roland Stigge Sat, 20 Oct 2012 10:34:27 +0200 + +guitarix (0.24.1-1) experimental; urgency=low + + * New upstream release + + -- Roland Stigge Sun, 14 Oct 2012 20:40:31 +0200 + +guitarix (0.24.0-1) experimental; urgency=low + + * New upstream release + + -- Roland Stigge Mon, 13 Aug 2012 10:55:42 +0200 + +guitarix (0.23.3-1) experimental; urgency=low + + * New upstream release + + -- Roland Stigge Thu, 02 Aug 2012 17:57:39 +0200 + guitarix (0.22.4-1) unstable; urgency=low * New upstream release diff -Nru guitarix-0.22.4/debian/control guitarix-0.24.2/debian/control --- guitarix-0.22.4/debian/control 2012-04-01 10:06:21.000000000 +0000 +++ guitarix-0.24.2/debian/control 2012-08-02 16:16:31.000000000 +0000 @@ -2,7 +2,7 @@ Section: sound Priority: extra Maintainer: Roland Stigge -Build-Depends: debhelper (>= 8), python, libjack-dev, libsndfile1-dev, libgtk2.0-dev, ladspa-sdk, libzita-convolver-dev, libgtkmm-2.4-dev, libboost-dev, libboost-thread-dev, intltool +Build-Depends: debhelper (>= 8), python, libjack-dev, libsndfile1-dev, libgtk2.0-dev, ladspa-sdk, libzita-convolver-dev, libgtkmm-2.4-dev, libboost-dev, libboost-thread-dev, intltool, liblrdf0-dev, libboost-system-dev Standards-Version: 3.9.3 Homepage: http://guitarix.sourceforge.net/ diff -Nru guitarix-0.22.4/debian/docs guitarix-0.24.2/debian/docs --- guitarix-0.22.4/debian/docs 1970-01-01 00:00:00.000000000 +0000 +++ guitarix-0.24.2/debian/docs 2012-10-20 03:56:02.000000000 +0000 @@ -0,0 +1 @@ +README diff -Nru guitarix-0.22.4/debian/rules guitarix-0.24.2/debian/rules --- guitarix-0.22.4/debian/rules 2012-01-18 10:50:14.000000000 +0000 +++ guitarix-0.24.2/debian/rules 2012-08-17 09:25:17.000000000 +0000 @@ -7,13 +7,19 @@ dh $@ override_dh_auto_configure: - ./waf configure --prefix=/usr --no-faust + ./waf configure --prefix=/usr --no-faust \ + --cxxflags="$(shell dpkg-buildflags --get CXXFLAGS) \ + $(shell dpkg-buildflags --get CPPFLAGS)" \ + --ldflags="$(shell dpkg-buildflags --get LDFLAGS)" -v override_dh_auto_build: - ./waf build + ./waf build -v override_dh_auto_clean: ./waf distclean + rm -rf build/* + rm -rf build/.conf* + rm -rf build/.waf* find . -name "*.pyc" -delete override_dh_auto_install: diff -Nru guitarix-0.22.4/debian/source/options guitarix-0.24.2/debian/source/options --- guitarix-0.22.4/debian/source/options 1970-01-01 00:00:00.000000000 +0000 +++ guitarix-0.24.2/debian/source/options 2012-11-06 01:41:06.000000000 +0000 @@ -0,0 +1,2 @@ +compression=xz +compression-level=9 diff -Nru guitarix-0.22.4/factorysettings/flanger_mono_gx guitarix-0.24.2/factorysettings/flanger_mono_gx --- guitarix-0.22.4/factorysettings/flanger_mono_gx 1970-01-01 00:00:00.000000000 +0000 +++ guitarix-0.24.2/factorysettings/flanger_mono_gx 2012-10-20 03:56:02.000000000 +0000 @@ -0,0 +1,26 @@ +["gx_plugin_version", 1, + "Aqua", { + "flanger_mono_gx.depth": 0.5, + "flanger_mono_gx.feedback": -0.707, + "flanger_mono_gx.freq": 0.2, + "flanger_mono_gx.mix": 1, + "flanger_mono_gx.wet": 100, + "flanger_mono_gx.width": 5 + }, + "Flanger Mono", { + "flanger_mono_gx.depth": 1, + "flanger_mono_gx.feedback": -0.5, + "flanger_mono_gx.freq": 0.2, + "flanger_mono_gx.mix": -1, + "flanger_mono_gx.wet": 100, + "flanger_mono_gx.width": 10 + } + "standard", { + "flanger_mono_gx.depth": 0.5, + "flanger_mono_gx.feedback": -0.707, + "flanger_mono_gx.freq": 0.2, + "flanger_mono_gx.mix": 0, + "flanger_mono_gx.wet": 100, + "flanger_mono_gx.width": 5 + }, +] diff -Nru guitarix-0.22.4/glade-gxw/glade-gxw.c guitarix-0.24.2/glade-gxw/glade-gxw.c --- guitarix-0.22.4/glade-gxw/glade-gxw.c 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/glade-gxw/glade-gxw.c 2012-10-20 03:56:02.000000000 +0000 @@ -16,7 +16,6 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -#include #include #include "config.h" @@ -60,6 +59,7 @@ {24, "ir_expose", "ir_expose" }, {25, "main_expose", "main_expose" }, {26, "level_meter_expose", "level_meter_expose" }, + {27, "cab_expose", "cab_expose" }, { 0, NULL, NULL } }; etype = g_enum_register_static (g_intern_static_string ("GxPaintFunc"), values); diff -Nru guitarix-0.22.4/glade-gxw/gxw.xml guitarix-0.24.2/glade-gxw/gxw.xml --- guitarix-0.22.4/glade-gxw/gxw.xml 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/glade-gxw/gxw.xml 2012-10-20 03:56:02.000000000 +0000 @@ -32,6 +32,7 @@ + @@ -56,6 +57,7 @@ + diff -Nru guitarix-0.22.4/glade-gxw/wscript guitarix-0.24.2/glade-gxw/wscript --- guitarix-0.22.4/glade-gxw/wscript 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/glade-gxw/wscript 2012-10-20 03:56:02.000000000 +0000 @@ -43,4 +43,4 @@ install_path = bld.env["GLADE_MODULES_DIR"], ) - bld.install_files(bld.env["GLADE_CATALOG_DIR"], "gxw.xml", chmod=0644) + bld.install_files(bld.env["GLADE_CATALOG_DIR"], "gxw.xml", chmod=0o644) diff -Nru guitarix-0.22.4/ladspa/distortion.cpp guitarix-0.24.2/ladspa/distortion.cpp --- guitarix-0.22.4/ladspa/distortion.cpp 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/ladspa/distortion.cpp 2012-10-20 03:56:02.000000000 +0000 @@ -245,7 +245,7 @@ interface->openHorizontalBox("distortion"); // interface->openVerticalBox("overdrive"); interface->addVerticalSlider("overdrive ", &drive, 0.0f, 1.0f, 20.0f, 0.1f); - interface->addToggleButton("over_drive", &overdrive4); + interface->addToggleButton("driveover", &overdrive4); // interface->closeBox(); interface->addVerticalSlider("drive", &fslider5, 0.64f, 0.0f, 1.0f, 0.01f); interface->addVerticalSlider0("drivelevel", &fslider4, 0.0f, 0.0f, 1.0f, 0.01f); diff -Nru guitarix-0.22.4/ladspa/wscript guitarix-0.24.2/ladspa/wscript --- guitarix-0.22.4/ladspa/wscript 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/ladspa/wscript 2012-10-20 03:56:02.000000000 +0000 @@ -17,7 +17,7 @@ ladspa_plugin.source = source ladspa_plugin.env.append_value("CXXFLAGS", ['-fPIC', '-shared']) ladspa_plugin.install_path = '${LADSPADIR}' - ladspa_plugin.chmod = 0755 + ladspa_plugin.chmod = 0o755 return ladspa_plugin diff -Nru guitarix-0.22.4/libgxw/gxw/GxControlParameter.cpp guitarix-0.24.2/libgxw/gxw/GxControlParameter.cpp --- guitarix-0.22.4/libgxw/gxw/GxControlParameter.cpp 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/libgxw/gxw/GxControlParameter.cpp 2012-10-20 03:56:02.000000000 +0000 @@ -17,7 +17,6 @@ */ #include "GxControlParameter.h" -#include #include #define P_(s) (s) // FIXME -> gettext @@ -29,12 +28,13 @@ if (!is_initialized) { /* add properties and signals to the interface here */ - g_object_interface_install_property (g_class, - g_param_spec_string("var-id", - P_("Variable"), - P_("The id of the linked variable"), - NULL, - GParamFlags(GTK_PARAM_READWRITE))); + g_object_interface_install_property ( + g_class, + g_param_spec_string("var-id", + P_("Variable"), + P_("The id of the linked variable"), + NULL, + GParamFlags(G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS))); is_initialized = TRUE; } } diff -Nru guitarix-0.22.4/libgxw/gxw/GxEQSlider.cpp guitarix-0.24.2/libgxw/gxw/GxEQSlider.cpp --- guitarix-0.22.4/libgxw/gxw/GxEQSlider.cpp 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/libgxw/gxw/GxEQSlider.cpp 2012-10-20 03:56:02.000000000 +0000 @@ -17,8 +17,6 @@ */ #include "GxEQSlider.h" -#include -#include #define P_(s) (s) // FIXME -> gettext @@ -45,8 +43,8 @@ gtk_widget_class_install_style_property( widget_class, g_param_spec_int("slider-width",P_("size of slider"), - P_("Height of movable part of vslider"), - 0, 100, 5, GParamFlags(GTK_PARAM_READABLE))); + P_("Height of movable part of vslider"), + 0, 100, 5, GParamFlags(G_PARAM_READABLE|G_PARAM_STATIC_STRINGS))); } static void gx_eq_slider_size_request (GtkWidget *widget, GtkRequisition *requisition) diff -Nru guitarix-0.22.4/libgxw/gxw/GxFastMeter.cpp guitarix-0.24.2/libgxw/gxw/GxFastMeter.cpp --- guitarix-0.22.4/libgxw/gxw/GxFastMeter.cpp 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/libgxw/gxw/GxFastMeter.cpp 2012-10-20 03:56:02.000000000 +0000 @@ -24,7 +24,6 @@ */ #include #include -#include #include "GxFastMeter.h" #ifndef max @@ -77,41 +76,41 @@ gobject_class, PROP_HOLD, g_param_spec_int( "hold", P_("Hold"), P_("Count of cycles for which the peak value is held on display"), - 0, 1000, 5, GParamFlags(GTK_PARAM_READWRITE))); + 0, 1000, 5, GParamFlags(G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS))); g_object_class_install_property( gobject_class, PROP_DIMEN, g_param_spec_int( "dimen", P_("Dimen"), P_("Horizontal size of meter"), - 0, 100, 20, GParamFlags(GTK_PARAM_READWRITE))); + 0, 100, 20, GParamFlags(G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS))); gtk_widget_class_install_style_property( widget_class, g_param_spec_boxed("clr-bottom",P_("bottom color"), P_("indicator color gradient: value at the bottom"), GDK_TYPE_COLOR, - GParamFlags(GTK_PARAM_READABLE))); + GParamFlags(G_PARAM_READABLE|G_PARAM_STATIC_STRINGS))); gtk_widget_class_install_style_property( widget_class, g_param_spec_boxed("clr-middle",P_("middle color"), P_("indicator color gradient: value in the middle"), GDK_TYPE_COLOR, - GParamFlags(GTK_PARAM_READABLE))); + GParamFlags(G_PARAM_READABLE|G_PARAM_STATIC_STRINGS))); gtk_widget_class_install_style_property( widget_class, g_param_spec_boxed("clr-top",P_("top color"), P_("indicator color gradient: value near the top"), GDK_TYPE_COLOR, - GParamFlags(GTK_PARAM_READABLE))); + GParamFlags(G_PARAM_READABLE|G_PARAM_STATIC_STRINGS))); gtk_widget_class_install_style_property( widget_class, g_param_spec_boxed("over",P_("clip warn color"), P_("indicator color for values > 0 dbFS"), GDK_TYPE_COLOR, - GParamFlags(GTK_PARAM_READABLE))); + GParamFlags(G_PARAM_READABLE|G_PARAM_STATIC_STRINGS))); gtk_widget_class_install_style_property( widget_class, g_param_spec_int("dimen",P_("width of indicator"), P_("width of (vertical) indicator"), - 0, 100, 5, GParamFlags(GTK_PARAM_READABLE))); + 0, 100, 5, GParamFlags(G_PARAM_READABLE|G_PARAM_STATIC_STRINGS))); } /* ----- fast meter init ----- */ diff -Nru guitarix-0.22.4/libgxw/gxw/GxFastMeter.h guitarix-0.24.2/libgxw/gxw/GxFastMeter.h --- guitarix-0.22.4/libgxw/gxw/GxFastMeter.h 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/libgxw/gxw/GxFastMeter.h 2012-10-20 03:56:02.000000000 +0000 @@ -27,8 +27,7 @@ #ifndef __GX_FAST_METER_H__ #define __GX_FAST_METER_H__ -#include -#include "compat2-12.h" +#include G_BEGIN_DECLS diff -Nru guitarix-0.22.4/libgxw/gxw/GxGradient.cpp guitarix-0.24.2/libgxw/gxw/GxGradient.cpp --- guitarix-0.22.4/libgxw/gxw/GxGradient.cpp 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/libgxw/gxw/GxGradient.cpp 2012-10-20 03:56:02.000000000 +0000 @@ -17,7 +17,7 @@ */ #include "GxGradient.h" -#include +#include void gx_rgba_free(GxRgba *rgba) { diff -Nru guitarix-0.22.4/libgxw/gxw/GxHSlider.cpp guitarix-0.24.2/libgxw/gxw/GxHSlider.cpp --- guitarix-0.22.4/libgxw/gxw/GxHSlider.cpp 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/libgxw/gxw/GxHSlider.cpp 2012-10-20 03:56:02.000000000 +0000 @@ -17,8 +17,6 @@ */ #include "GxHSlider.h" -#include -#include #define P_(s) (s) // FIXME -> gettext @@ -50,7 +48,7 @@ widget_class, g_param_spec_int("slider-width",P_("size of slider"), P_("Width of movable part of vslider"), - 0, 100, 20, GParamFlags(GTK_PARAM_READABLE))); + 0, 100, 20, GParamFlags(G_PARAM_READABLE|G_PARAM_STATIC_STRINGS))); } static void gx_hslider_size_request (GtkWidget *widget, GtkRequisition *requisition) diff -Nru guitarix-0.22.4/libgxw/gxw/GxIREdit.cpp guitarix-0.24.2/libgxw/gxw/GxIREdit.cpp --- guitarix-0.22.4/libgxw/gxw/GxIREdit.cpp 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/libgxw/gxw/GxIREdit.cpp 2012-10-20 03:56:02.000000000 +0000 @@ -19,7 +19,6 @@ #include "GxIREdit.h" #include "GxGradient.h" #include -#include #include #include #include @@ -163,64 +162,64 @@ gobject_class, PROP_Y_BORDER_TOP, g_param_spec_int( "y-border-top", P_("top border"), P_("area above x axis at the top of the window"), - 0, G_MAXINT, 5, GParamFlags(GTK_PARAM_READWRITE))); + 0, G_MAXINT, 5, GParamFlags(G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS))); g_object_class_install_property( gobject_class, PROP_Y_BORDER_BOTTOM, g_param_spec_int( "y-border-bottom", P_("bottom border"), P_(NULL), - 0, G_MAXINT, 10, GParamFlags(GTK_PARAM_READWRITE))); + 0, G_MAXINT, 10, GParamFlags(G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS))); g_object_class_install_property( gobject_class, PROP_X_BORDER, g_param_spec_int( "x-border", P_("right border"), P_(NULL), - 0, G_MAXINT, 5, GParamFlags(GTK_PARAM_READWRITE))); + 0, G_MAXINT, 5, GParamFlags(G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS))); g_object_class_install_property( gobject_class, PROP_LABEL_SEP, g_param_spec_int( "label-sep", P_("label sep"), P_(NULL), - 0, G_MAXINT, 4, GParamFlags(GTK_PARAM_READWRITE))); + 0, G_MAXINT, 4, GParamFlags(G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS))); g_object_class_install_property( gobject_class, PROP_DOT_DIAMETER, g_param_spec_double( "dot-diameter", P_("dot diameter"), P_(NULL), - 0, G_MAXDOUBLE, 5.0, GParamFlags(GTK_PARAM_READWRITE))); + 0, G_MAXDOUBLE, 5.0, GParamFlags(G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS))); g_object_class_install_property( gobject_class, PROP_SEGMENT_DISTANCE, g_param_spec_double( "segment-distance", P_("hit distance"), P_(NULL), - 0, G_MAXDOUBLE, 2.0, GParamFlags(GTK_PARAM_READWRITE))); + 0, G_MAXDOUBLE, 2.0, GParamFlags(G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS))); g_object_class_install_property( gobject_class, PROP_LIMIT, g_param_spec_double( "limit", P_("limit"), P_(NULL), - 0, G_MAXDOUBLE, 5.0, GParamFlags(GTK_PARAM_READWRITE))); + 0, G_MAXDOUBLE, 5.0, GParamFlags(G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS))); g_object_class_install_property( gobject_class, PROP_FS, g_param_spec_int( "fs", P_("samplerate"), P_(NULL), - 0, G_MAXINT, 4, GParamFlags(GTK_PARAM_READABLE))); + 0, G_MAXINT, 4, GParamFlags(G_PARAM_READABLE|G_PARAM_STATIC_STRINGS))); g_object_class_install_property( gobject_class, PROP_MAX_SCALE_FACT, g_param_spec_double( "max-scale-fact", P_("max scale fact"), P_(NULL), - 0, G_MAXDOUBLE, 50.0, GParamFlags(GTK_PARAM_READWRITE))); + 0, G_MAXDOUBLE, 50.0, GParamFlags(G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS))); g_object_class_install_property( gobject_class, PROP_MIN_SCALE, g_param_spec_double( "min-scale", P_("min scale"), P_(NULL), - 0, G_MAXDOUBLE, 0.02, GParamFlags(GTK_PARAM_READWRITE))); + 0, G_MAXDOUBLE, 0.02, GParamFlags(G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS))); g_object_class_install_property( gobject_class, PROP_SCALE, g_param_spec_double( "scale", P_("scale"), P_(NULL), - 0, G_MAXDOUBLE, 1.0, GParamFlags(GTK_PARAM_READWRITE))); + 0, G_MAXDOUBLE, 1.0, GParamFlags(G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS))); g_object_class_install_property( gobject_class, PROP_NO_DATA_TEXT, g_param_spec_string("no-data-text", P_("no data text"), P_("text displayed when no data is available"), "NO DATA", - GParamFlags(GTK_PARAM_READWRITE))); + GParamFlags(G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS))); /* style properties */ gtk_widget_class_install_style_property( @@ -229,14 +228,14 @@ P_("Zoom marker color"), P_("Color of zoom marker"), GDK_TYPE_COLOR, - GParamFlags(GTK_PARAM_READABLE))); + GParamFlags(G_PARAM_READABLE|G_PARAM_STATIC_STRINGS))); gtk_widget_class_install_style_property_parser( GTK_WIDGET_CLASS(klass), g_param_spec_boxed ("no-data-color", P_("No data color"), P_("Color of graph background when no data is available"), GX_TYPE_RGBA, - GParamFlags(GTK_PARAM_READABLE)), + GParamFlags(G_PARAM_READABLE|G_PARAM_STATIC_STRINGS)), gx_parse_rgba); gtk_widget_class_install_style_property_parser( GTK_WIDGET_CLASS(klass), @@ -244,7 +243,7 @@ P_("Sample graph color"), P_("Color of graph with sampled values"), GX_TYPE_RGBA, - GParamFlags(GTK_PARAM_READABLE)), + GParamFlags(G_PARAM_READABLE|G_PARAM_STATIC_STRINGS)), gx_parse_rgba); gtk_widget_class_install_style_property_parser( GTK_WIDGET_CLASS(klass), @@ -252,7 +251,7 @@ P_("Sample graph color outside"), P_("Color of graph outside of cut region"), GX_TYPE_RGBA, - GParamFlags(GTK_PARAM_READABLE)), + GParamFlags(G_PARAM_READABLE|G_PARAM_STATIC_STRINGS)), gx_parse_rgba); gtk_widget_class_install_style_property_parser( GTK_WIDGET_CLASS(klass), @@ -260,14 +259,14 @@ P_("Gain line color"), P_("Color of gain line"), GX_TYPE_RGBA, - GParamFlags(GTK_PARAM_READABLE)), + GParamFlags(G_PARAM_READABLE|G_PARAM_STATIC_STRINGS)), gx_parse_rgba); gtk_widget_class_install_style_property( GTK_WIDGET_CLASS(klass), g_param_spec_double( "shade-alpha", P_("Shade alpha value"), P_("Alpha Value for shading outside of cut region"), - 0, 1, 0.1, GParamFlags(GTK_PARAM_READWRITE))); + 0, 1, 0.1, GParamFlags(G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS))); } static gdouble ir_edit_get_default_scale(GxIREdit *ir_edit) diff -Nru guitarix-0.22.4/libgxw/gxw/GxIREdit.h guitarix-0.24.2/libgxw/gxw/GxIREdit.h --- guitarix-0.22.4/libgxw/gxw/GxIREdit.h 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/libgxw/gxw/GxIREdit.h 2012-10-20 03:56:02.000000000 +0000 @@ -19,8 +19,7 @@ #ifndef __GX_IR_EDIT_H__ #define __GX_IR_EDIT_H__ -#include -#include "compat2-12.h" +#include #include "gainpoints.h" G_BEGIN_DECLS diff -Nru guitarix-0.22.4/libgxw/gxw/GxKnob.cpp guitarix-0.24.2/libgxw/gxw/GxKnob.cpp --- guitarix-0.22.4/libgxw/gxw/GxKnob.cpp 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/libgxw/gxw/GxKnob.cpp 2012-10-20 03:56:02.000000000 +0000 @@ -17,8 +17,6 @@ */ #include "GxKnob.h" -#include -#include #include @@ -66,7 +64,7 @@ widget_class, g_param_spec_int("arc-inset",P_("inset of arch"), P_("Inset of the arc around the knob"), - 0, 100, 2, GParamFlags(GTK_PARAM_READABLE))); + 0, 100, 2, GParamFlags(G_PARAM_READABLE|G_PARAM_STATIC_STRINGS))); gtk_widget_class_install_style_property( widget_class, @@ -74,7 +72,7 @@ P_("Framecount"), P_("Number of frames in the animation specified by the gtkrc"), -1, 250, -1, - GParamFlags(GTK_PARAM_READABLE))); + GParamFlags(G_PARAM_READABLE|G_PARAM_STATIC_STRINGS))); g_type_class_add_private(klass, sizeof (GxKnobPrivate)); } diff -Nru guitarix-0.22.4/libgxw/gxw/GxLevelSlider.cpp guitarix-0.24.2/libgxw/gxw/GxLevelSlider.cpp --- guitarix-0.22.4/libgxw/gxw/GxLevelSlider.cpp 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/libgxw/gxw/GxLevelSlider.cpp 2012-10-20 03:56:02.000000000 +0000 @@ -17,8 +17,6 @@ */ #include "GxLevelSlider.h" -#include -#include #define P_(s) (s) // FIXME -> gettext @@ -46,7 +44,7 @@ widget_class, g_param_spec_int("slider-width",P_("size of slider"), P_("Height of movable part of vslider"), - 0, 100, 5, GParamFlags(GTK_PARAM_READABLE))); + 0, 100, 5, GParamFlags(G_PARAM_READABLE|G_PARAM_STATIC_STRINGS))); } static void gx_level_slider_size_request (GtkWidget *widget, GtkRequisition *requisition) diff -Nru guitarix-0.22.4/libgxw/gxw/GxMeterScale.cpp guitarix-0.24.2/libgxw/gxw/GxMeterScale.cpp --- guitarix-0.22.4/libgxw/gxw/GxMeterScale.cpp 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/libgxw/gxw/GxMeterScale.cpp 2012-10-20 03:56:02.000000000 +0000 @@ -18,7 +18,6 @@ #include "GxMeterScale.h" -#include #include #define P_(s) (s) // FIXME -> gettext @@ -78,7 +77,7 @@ "tick-pos", P_("tick position"), P_("Position of the tick relativ to the tick text"), GX_TYPE_TICK_POSITION, GX_TICK_RIGHT, - GParamFlags(GTK_PARAM_READWRITE))); + GParamFlags(G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS))); // style properties gtk_widget_class_install_style_property( GTK_WIDGET_CLASS(klass), @@ -86,14 +85,14 @@ P_("Tick size"), P_("Size of ticks"), 0, 100, 5, - GParamFlags(GTK_PARAM_READABLE))); + GParamFlags(G_PARAM_READABLE|G_PARAM_STATIC_STRINGS))); gtk_widget_class_install_style_property( GTK_WIDGET_CLASS(klass), g_param_spec_int("tick-space", P_("Tick space"), P_("Space between tick and text"), 0, 100, 2, - GParamFlags(GTK_PARAM_READABLE))); + GParamFlags(G_PARAM_READABLE|G_PARAM_STATIC_STRINGS))); g_type_class_add_private(gobject_class, sizeof (GxMeterScalePrivate)); } diff -Nru guitarix-0.22.4/libgxw/gxw/GxMeterScale.h guitarix-0.24.2/libgxw/gxw/GxMeterScale.h --- guitarix-0.22.4/libgxw/gxw/GxMeterScale.h 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/libgxw/gxw/GxMeterScale.h 2012-10-20 03:56:02.000000000 +0000 @@ -19,8 +19,7 @@ #ifndef __GX_METER_SCALE_H__ #define __GX_METER_SCALE_H__ -#include -#include "compat2-12.h" +#include G_BEGIN_DECLS diff -Nru guitarix-0.22.4/libgxw/gxw/GxMiniSlider.cpp guitarix-0.24.2/libgxw/gxw/GxMiniSlider.cpp --- guitarix-0.22.4/libgxw/gxw/GxMiniSlider.cpp 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/libgxw/gxw/GxMiniSlider.cpp 2012-10-20 03:56:02.000000000 +0000 @@ -17,7 +17,6 @@ */ #include "GxMiniSlider.h" -#include #define P_(s) (s) // FIXME -> gettext @@ -31,8 +30,8 @@ gtk_widget_class_install_style_property( widget_class, g_param_spec_int("slider-width",P_("size of slider"), - P_("Width of movable part of vslider"), - 0, 100, 6, GParamFlags(GTK_PARAM_READABLE))); + P_("Width of movable part of vslider"), + 0, 100, 6, GParamFlags(G_PARAM_READABLE|G_PARAM_STATIC_STRINGS))); } static void gx_mini_slider_init(GxMiniSlider *mini_slider) diff -Nru guitarix-0.22.4/libgxw/gxw/GxPaintBox.cpp guitarix-0.24.2/libgxw/gxw/GxPaintBox.cpp --- guitarix-0.22.4/libgxw/gxw/GxPaintBox.cpp 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/libgxw/gxw/GxPaintBox.cpp 2012-10-20 03:56:02.000000000 +0000 @@ -20,8 +20,6 @@ #include "GxPaintBox.h" #include "GxGradient.h" #include "GxLevelSlider.h" -#include -#include #include #include @@ -49,6 +47,7 @@ #define get_main_image_id(widget) (GX_PAINT_BOX_CLASS(GTK_OBJECT_GET_CLASS(widget))->main_image_id) #define get_widget_id(widget) (GX_PAINT_BOX_CLASS(GTK_OBJECT_GET_CLASS(widget))->widget_id) #define get_widget_id2(widget) (GX_PAINT_BOX_CLASS(GTK_OBJECT_GET_CLASS(widget))->widget_id2) +#define get_cab_id(widget) (GX_PAINT_BOX_CLASS(GTK_OBJECT_GET_CLASS(widget))->cab_id) static void gx_paint_box_class_init (GxPaintBoxClass *klass) @@ -65,20 +64,21 @@ klass->main_image_id = "main_image"; klass->widget_id = "gxplate"; klass->widget_id2 = "gxplate2"; + klass->cab_id = "texture_cab"; g_object_class_install_property( gobject_class, PROP_PAINT_FUNC, g_param_spec_string("paint-func", P_("Paint Type"), P_("Type of paint function for background"), "", - GParamFlags(GTK_PARAM_READWRITE))); + GParamFlags(G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS))); gtk_widget_class_install_style_property_parser( GTK_WIDGET_CLASS(klass), g_param_spec_boxed("skin-gradient", P_("Skin color"), P_("Color gradient defined as part of skin"), GX_TYPE_GRADIENT, - GParamFlags(GTK_PARAM_READABLE)), + GParamFlags(G_PARAM_READABLE|G_PARAM_STATIC_STRINGS)), gx_parse_gradient); gtk_widget_class_install_style_property_parser( GTK_WIDGET_CLASS(klass), @@ -86,7 +86,15 @@ P_("Skin color"), P_("Color gradient defined as part of skin"), GX_TYPE_GRADIENT, - GParamFlags(GTK_PARAM_READABLE)), + GParamFlags(G_PARAM_READABLE|G_PARAM_STATIC_STRINGS)), + gx_parse_gradient); + gtk_widget_class_install_style_property_parser( + GTK_WIDGET_CLASS(klass), + g_param_spec_boxed("rack-gradient", + P_("Skin color"), + P_("Color gradient defined as part of skin"), + GX_TYPE_GRADIENT, + GParamFlags(G_PARAM_READABLE|G_PARAM_STATIC_STRINGS)), gx_parse_gradient); gtk_widget_class_install_style_property( GTK_WIDGET_CLASS(klass), @@ -94,43 +102,43 @@ P_("Paint Type"), P_("Type of paint function for background"), NULL, - GParamFlags(GTK_PARAM_READABLE))); + GParamFlags(G_PARAM_READABLE|G_PARAM_STATIC_STRINGS))); g_object_class_install_property( gobject_class,PROP_ICON_SET, g_param_spec_int ("icon-set", - P_("Icon Set"), - P_("Type of Icon function for background"), - 0, - G_MAXINT, - 0, - GParamFlags(GTK_PARAM_READWRITE))); + P_("Icon Set"), + P_("Type of Icon function for background"), + 0, + G_MAXINT, + 0, + GParamFlags(G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS))); gtk_widget_class_install_style_property( GTK_WIDGET_CLASS(klass), g_param_spec_int("icon-set", P_("Icon Set"), P_("Type of Icon function for background"), 0, - G_MAXINT, - 0, - GParamFlags(GTK_PARAM_READABLE))); + G_MAXINT, + 0, + GParamFlags(G_PARAM_READABLE|G_PARAM_STATIC_STRINGS))); gtk_widget_class_install_style_property( GTK_WIDGET_CLASS(klass), g_param_spec_int("width", P_("Width"), P_("size.width request for paintbox"), 0, - G_MAXINT, - 0, - GParamFlags(GTK_PARAM_READABLE))); + G_MAXINT, + 0, + GParamFlags(G_PARAM_READABLE|G_PARAM_STATIC_STRINGS))); gtk_widget_class_install_style_property( GTK_WIDGET_CLASS(klass), g_param_spec_int("height", P_("Height"), P_("size.height request for paintbox"), 0, - G_MAXINT, - 0, - GParamFlags(GTK_PARAM_READABLE))); + G_MAXINT, + 0, + GParamFlags(G_PARAM_READABLE|G_PARAM_STATIC_STRINGS))); } @@ -320,6 +328,31 @@ gx_gradient_free(grad); } +// set cairo color related to the used skin +static void set_rack_color(GtkWidget *wi, cairo_pattern_t *pat) +{ + GxGradient *grad; + gtk_widget_style_get(wi, "rack-gradient", &grad, NULL); + if (!grad) { + GdkColor *p1 = &wi->style->bg[GTK_STATE_NORMAL]; + cairo_pattern_add_color_stop_rgba( + pat, 0, cairo_clr(p1->red), cairo_clr(p1->green), + cairo_clr(p1->blue), 0.8); + GdkColor *p2 = &wi->style->fg[GTK_STATE_NORMAL]; + cairo_pattern_add_color_stop_rgba( + pat, 1, (cairo_clr(p1->red)+cairo_clr(p2->red))/2, + (cairo_clr(p1->green)+cairo_clr(p2->green))/2, + (cairo_clr(p1->blue)+cairo_clr(p2->blue))/2, 0.8); + return; + } + GSList *p; + for (p = grad->colors; p; p = g_slist_next(p)) { + GxGradientElement *el = (GxGradientElement*)p->data; + cairo_pattern_add_color_stop_rgba(pat, el->offset, el->red, el->green, el->blue, el->alpha); + } + gx_gradient_free(grad); +} + //----- paint boxes with cairo ----- static void amp_expose(GtkWidget *wi, GdkEventExpose *ev) { @@ -641,6 +674,61 @@ gdk_region_destroy (region); } +static void cab_expose(GtkWidget *wi, GdkEventExpose *ev) +{ + cairo_t *cr; + cairo_pattern_t*pat; + /* create a cairo context */ + cr = gdk_cairo_create(wi->window); + GdkRegion *region; + region = gdk_region_rectangle (&wi->allocation); + gdk_region_intersect (region, ev->region); + gdk_cairo_region (cr, region); + cairo_clip (cr); + + double x0 = wi->allocation.x+1; + double y0 = wi->allocation.y+1; + double rect_width = wi->allocation.width-2; + double rect_height = wi->allocation.height-2; + + + + cairo_set_operator(cr, CAIRO_OPERATOR_SOURCE); + cairo_set_source_rgba(cr, 0.0, 0.0, 0.0, 0.0); + cairo_paint(cr); + cairo_set_operator(cr, CAIRO_OPERATOR_OVER); + + GdkPixbuf * stock_image = + gtk_widget_render_icon(wi,get_cab_id(wi),(GtkIconSize)-1,NULL); + + guchar *pb_pixel = gdk_pixbuf_get_pixels (stock_image); + gint pixbuf_rowstride = gdk_pixbuf_get_rowstride (stock_image); + gint width = gdk_pixbuf_get_width (stock_image); + gint height = gdk_pixbuf_get_height (stock_image); + cairo_surface_t *s_image = + cairo_image_surface_create_for_data + (pb_pixel,CAIRO_FORMAT_RGB24 ,width, height,pixbuf_rowstride); + + pat = cairo_pattern_create_for_surface(s_image); + cairo_set_source (cr, pat); + cairo_pattern_set_extend(cairo_get_source(cr), CAIRO_EXTEND_REPEAT); + cairo_rectangle (cr, x0+1,y0+1,rect_width-2,rect_height-1); + + cairo_fill(cr); + g_object_unref(stock_image); + cairo_surface_destroy(s_image); + + pat = cairo_pattern_create_linear (x0, y0, x0, y0+rect_height); + set_rack_color(wi, pat); + + cairo_set_source (cr, pat); + cairo_rectangle (cr, x0+1,y0+1,rect_width-2,rect_height-1); + cairo_fill (cr); + cairo_pattern_destroy (pat); + cairo_destroy(cr); + gdk_region_destroy (region); +} + static void convolver_icon_expose(GtkWidget *wi, GdkEventExpose *ev) { cairo_t *cr; @@ -2226,6 +2314,8 @@ paint_box->expose_func = main_expose; } else if (strcmp(paint_func, "level_meter_expose") == 0) { paint_box->expose_func = level_meter_expose; + } else if (strcmp(paint_func, "cab_expose") == 0) { + paint_box->expose_func = cab_expose; } else { paint_box->expose_func = 0; } diff -Nru guitarix-0.22.4/libgxw/gxw/GxPaintBox.h guitarix-0.24.2/libgxw/gxw/GxPaintBox.h --- guitarix-0.22.4/libgxw/gxw/GxPaintBox.h 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/libgxw/gxw/GxPaintBox.h 2012-10-20 03:56:02.000000000 +0000 @@ -19,7 +19,7 @@ #ifndef __GX_PAINT_BOX_H__ #define __GX_PAINT_BOX_H__ -#include +#include G_BEGIN_DECLS @@ -50,6 +50,7 @@ const gchar *main_image_id; const gchar *widget_id; const gchar *widget_id2; + const gchar *cab_id; }; GType gx_paint_box_get_type(void) G_GNUC_CONST; diff -Nru guitarix-0.22.4/libgxw/gxw/GxPortDisplay.cpp guitarix-0.24.2/libgxw/gxw/GxPortDisplay.cpp --- guitarix-0.22.4/libgxw/gxw/GxPortDisplay.cpp 1970-01-01 00:00:00.000000000 +0000 +++ guitarix-0.24.2/libgxw/gxw/GxPortDisplay.cpp 2012-10-20 03:56:02.000000000 +0000 @@ -0,0 +1,96 @@ +/* + * Copyright (C) 2009, 2010 Hermann Meyer, James Warden, Andreas Degert + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#include "GxPortDisplay.h" + +#define P_(s) (s) // FIXME -> gettext + +#define get_stock_id(widget) (GX_PORT_DISPLAY_CLASS(GTK_OBJECT_GET_CLASS(widget))->parent_class.stock_id) + +static gboolean gx_port_display_expose (GtkWidget *widget, GdkEventExpose *event); +static void gx_port_display_size_request (GtkWidget *widget, GtkRequisition *requisition); + +G_DEFINE_TYPE(GxPortDisplay, gx_port_display, GX_TYPE_VSLIDER); + +static void gx_port_display_class_init(GxPortDisplayClass *klass) +{ + GtkWidgetClass *widget_class = (GtkWidgetClass*) klass; + + widget_class->expose_event = gx_port_display_expose; + widget_class->size_request = gx_port_display_size_request; + widget_class->button_press_event = NULL; + widget_class->motion_notify_event = NULL; + widget_class->enter_notify_event = NULL; + widget_class->leave_notify_event = NULL; + klass->parent_class.stock_id = "portdisplay"; + gtk_widget_class_install_style_property( + widget_class, + g_param_spec_int("display-width",P_("size of display"), + P_("Height of movable part of display"), + 0, 80, 0, GParamFlags(G_PARAM_READABLE|G_PARAM_STATIC_STRINGS))); +} + +static void gx_port_display_size_request (GtkWidget *widget, GtkRequisition *requisition) +{ + g_assert(GX_IS_PORT_DISPLAY(widget)); + gint display_width; + gtk_widget_style_get(widget, "display-width", &display_width, NULL); + GdkPixbuf *pb = gtk_widget_render_icon(widget, get_stock_id(widget), GtkIconSize(-1), NULL); + requisition->height = 12+gdk_pixbuf_get_height(pb); + requisition->width = (gdk_pixbuf_get_width(pb) + display_width) / 2; + _gx_regler_calc_size_request(GX_REGLER(widget), requisition); + g_object_unref(pb); +} + +static void port_display_expose( + GtkWidget *widget, GdkRectangle *rect, gdouble sliderstate, GdkPixbuf *image) +{ + gdk_draw_pixbuf(GDK_DRAWABLE(widget->window), widget->style->fg_gc[0], + image, rect->width-(gint)sliderstate, 0, rect->x, rect->y, + rect->width, rect->height, GDK_RGB_DITHER_NORMAL, 0, 0); +} + +static gboolean gx_port_display_expose(GtkWidget *widget, GdkEventExpose *event) +{ + g_assert(GX_IS_PORT_DISPLAY(widget)); + gint display_width; + GdkRectangle image_rect, value_rect; + GdkPixbuf *pb = gtk_widget_render_icon(widget, get_stock_id(widget), GtkIconSize(-1), NULL); + gtk_widget_style_get(widget, "display-width", &display_width, NULL); + image_rect.height = gdk_pixbuf_get_height(pb); + image_rect.width = (gdk_pixbuf_get_width(pb) + display_width) / 2; + gdouble sliderstate = _gx_regler_get_step_pos(GX_REGLER(widget), image_rect.width-display_width); + _gx_regler_get_positions(GX_REGLER(widget), &image_rect, &value_rect); + port_display_expose(widget, &image_rect, sliderstate, pb); + _gx_regler_simple_display_value(GX_REGLER(widget), &value_rect); + g_object_unref(pb); + return FALSE; +} + +static inline void get_width_height(GtkWidget *widget, GdkRectangle *r) +{ + GdkPixbuf *pb = gtk_widget_render_icon(widget, get_stock_id(widget), GtkIconSize(-1), NULL); + r->width = gdk_pixbuf_get_width(pb); + r->height = gdk_pixbuf_get_height(pb); + g_object_unref(pb); +} + +static void gx_port_display_init(GxPortDisplay *port_display) +{ + gtk_widget_set_name (GTK_WIDGET(port_display),"rack_slider"); +} diff -Nru guitarix-0.22.4/libgxw/gxw/GxPortDisplay.h guitarix-0.24.2/libgxw/gxw/GxPortDisplay.h --- guitarix-0.22.4/libgxw/gxw/GxPortDisplay.h 1970-01-01 00:00:00.000000000 +0000 +++ guitarix-0.24.2/libgxw/gxw/GxPortDisplay.h 2012-10-20 03:56:02.000000000 +0000 @@ -0,0 +1,49 @@ +/* + * Copyright (C) 2009, 2010 Hermann Meyer, James Warden, Andreas Degert + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#ifndef __GX_PORT_DISPLAY_H__ +#define __GX_PORT_DISPLAY_H__ + + +#include "GxVSlider.h" + +G_BEGIN_DECLS + +#define GX_TYPE_PORT_DISPLAY (gx_port_display_get_type()) +#define GX_PORT_DISPLAY(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GX_TYPE_PORT_DISPLAY, GxPortDisplay)) +#define GX_PORT_DISPLAY_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GX_TYPE_PORT_DISPLAY, GxPortDisplayClass)) +#define GX_IS_PORT_DISPLAY(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GX_TYPE_PORT_DISPLAY)) +#define GX_IS_PORT_DISPLAY_CLASS(obj) (G_TYPE_CHECK_CLASS_TYPE ((klass), GX_TYPE_PORT_DISPLAY)) +#define GX_PORT_DISPLAY_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GX_TYPE_PORT_DISPLAY, GxPortDisplayClass)) + +typedef struct _GxPortDisplay GxPortDisplay; +typedef struct _GxPortDisplayClass GxPortDisplayClass; + +struct _GxPortDisplay { + GxVSlider parent; +}; + +struct _GxPortDisplayClass { + GxVSliderClass parent_class; +}; + +GType gx_port_display_get_type(void); + +G_END_DECLS + +#endif /* __GX_PORT_DISPLAY_H__ */ diff -Nru guitarix-0.22.4/libgxw/gxw/GxRackTuner.cpp guitarix-0.24.2/libgxw/gxw/GxRackTuner.cpp --- guitarix-0.22.4/libgxw/gxw/GxRackTuner.cpp 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/libgxw/gxw/GxRackTuner.cpp 2012-10-20 03:56:02.000000000 +0000 @@ -18,7 +18,6 @@ #include "GxRackTuner.h" #include -#include #include #include @@ -94,37 +93,37 @@ gobject_class, PROP_FREQ, g_param_spec_double ( "freq", P_("Frequency"), P_("The frequency for which tuning is displayed"), - 0.0, 1000.0, 0.0, GParamFlags(GTK_PARAM_READWRITE))); + 0.0, 1000.0, 0.0, GParamFlags(G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS))); g_object_class_install_property( gobject_class, PROP_SCALE_LIM, g_param_spec_double ( "scale-lim", P_("Scale Limit"), P_("The threshold for display of tune match (0.01 = 1 cent)"), - 0.005, 0.3, 0.03, GParamFlags(GTK_PARAM_READWRITE))); + 0.005, 0.3, 0.03, GParamFlags(G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS))); g_object_class_install_property( gobject_class, PROP_SPEED, g_param_spec_double ( "speed", P_("Streaming Speed"), P_("Speed of streaming mode display (led positions per msec)"), - 0.0001, 1.0, 0.15, GParamFlags(GTK_PARAM_READWRITE))); + 0.0001, 1.0, 0.15, GParamFlags(G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS))); g_object_class_install_property( gobject_class, PROP_DISPLAY_FLAT, g_param_spec_boolean ( "display-flat", P_("Display Flat Notes"), P_("select flat enharmonic equivalents instead of sharp"), - FALSE, GParamFlags(GTK_PARAM_READWRITE))); + FALSE, GParamFlags(G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS))); g_object_class_install_property( gobject_class, PROP_STREAMING, g_param_spec_boolean ( "streaming", P_("Streaming"), P_("use streaming display"), - FALSE, GParamFlags(GTK_PARAM_READWRITE))); + FALSE, GParamFlags(G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS))); g_object_class_install_property( gobject_class, PROP_TIMESTEP, g_param_spec_int ( "timestep", P_("Time Step"), P_("time interval in msec for refreshing the streaming display"), - 1, 1000, 50, GParamFlags(GTK_PARAM_READWRITE))); + 1, 1000, 50, GParamFlags(G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS))); g_object_class_install_property( gobject_class, PROP_LIMIT_TIMESTEP, g_param_spec_int ( "limit-timestep", P_("In-Limit Time Step"), P_("time interval in msec for refreshing the streaming match display"), - 1, 100, 8, GParamFlags(GTK_PARAM_READWRITE))); + 1, 100, 8, GParamFlags(G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS))); /* new signals */ signals[FREQUENCY_POLL] = g_signal_new(I_("frequency-poll"), diff -Nru guitarix-0.22.4/libgxw/gxw/GxRadioButton.cpp guitarix-0.24.2/libgxw/gxw/GxRadioButton.cpp --- guitarix-0.22.4/libgxw/gxw/GxRadioButton.cpp 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/libgxw/gxw/GxRadioButton.cpp 2012-10-20 03:56:02.000000000 +0000 @@ -21,7 +21,6 @@ */ #include "GxRadioButton.h" -#include #define P_(s) (s) // FIXME -> gettext @@ -52,7 +51,7 @@ P_("Indicator"), P_("Base name of the indicator image, append \"_on\" and \"_off\" for the stock names"), "switch", - GParamFlags(GTK_PARAM_READWRITE))); + GParamFlags(G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS))); } static void gx_radio_button_init(GxRadioButton *radio_button) diff -Nru guitarix-0.22.4/libgxw/gxw/GxRadioButton.h guitarix-0.24.2/libgxw/gxw/GxRadioButton.h --- guitarix-0.22.4/libgxw/gxw/GxRadioButton.h 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/libgxw/gxw/GxRadioButton.h 2012-10-20 03:56:02.000000000 +0000 @@ -23,8 +23,7 @@ #ifndef __GX_RADIO_BUTTON_H__ #define __GX_RADIO_BUTTON_H__ -#include -#include "compat2-12.h" +#include G_BEGIN_DECLS diff -Nru guitarix-0.22.4/libgxw/gxw/GxRegler.cpp guitarix-0.24.2/libgxw/gxw/GxRegler.cpp --- guitarix-0.22.4/libgxw/gxw/GxRegler.cpp 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/libgxw/gxw/GxRegler.cpp 2012-10-20 03:56:02.000000000 +0000 @@ -24,10 +24,6 @@ #include "GxRegler.h" #include "GxControlParameter.h" #include -#include -#include -#include -#include #define gtk_widget_get_requisition(w, r) (*r = (w)->requisition) @@ -48,6 +44,7 @@ enum { VALUE_ENTRY, FORMAT_VALUE, + INPUT_VALUE, LAST_SIGNAL }; @@ -345,25 +342,36 @@ G_TYPE_STRING, 1, G_TYPE_DOUBLE); + signals[INPUT_VALUE] = + g_signal_new (I_("input-value"), + G_TYPE_FROM_CLASS (gobject_class), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GxReglerClass, input_value), + NULL, NULL, + NULL, + G_TYPE_INT, 2, + G_TYPE_POINTER, //FIXME: GtkEntry*, gdouble* + G_TYPE_POINTER); + gtk_widget_class_install_style_property( widget_class, g_param_spec_boolean("show-value", P_("show value"), P_("display the value"), TRUE, - GParamFlags(GTK_PARAM_READABLE))); + GParamFlags(G_PARAM_READABLE|G_PARAM_STATIC_STRINGS))); gtk_widget_class_install_style_property( widget_class, g_param_spec_int("value-spacing",P_("Value spacing"), P_("Distance of value display"), - 0, 100, 5, GParamFlags(GTK_PARAM_READABLE))); + 0, 100, 5, GParamFlags(G_PARAM_READABLE|G_PARAM_STATIC_STRINGS))); gtk_widget_class_install_style_property( widget_class, g_param_spec_boxed("value-border", P_("Value Spacing"), P_("Extra space for value display"), GTK_TYPE_BORDER, - GParamFlags(GTK_PARAM_READABLE))); + GParamFlags(G_PARAM_READABLE|G_PARAM_STATIC_STRINGS))); g_object_class_install_property( gobject_class, PROP_SHOW_VALUE, @@ -371,14 +379,14 @@ P_("show value"), P_("display the value"), TRUE, - GParamFlags(GTK_PARAM_READWRITE))); + GParamFlags(G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS))); g_object_class_install_property( gobject_class, PROP_LABEL_REF, g_param_spec_object("label-ref", P_("Label ref"), P_("GtkLabel for caption"), GTK_TYPE_LABEL, - GParamFlags(GTK_PARAM_READWRITE))); + GParamFlags(G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS))); g_object_class_install_property( gobject_class, PROP_VALUE_POSITION, g_param_spec_enum("value-position", @@ -386,21 +394,21 @@ P_("The position of the value display"), GTK_TYPE_POSITION_TYPE, GTK_POS_BOTTOM, - GParamFlags(GTK_PARAM_READWRITE))); + GParamFlags(G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS))); g_object_class_install_property( gobject_class, PROP_VALUE_XALIGN, g_param_spec_double("value-xalign", P_("Value Alignment"), P_("The horizontal position of the value (0..1)"), 0, 1, 0.5, - GParamFlags(GTK_PARAM_READWRITE))); + GParamFlags(G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS))); g_object_class_install_property( gobject_class, PROP_DIGITS, g_param_spec_int("digits", P_("Digits"), P_("Number of digits for display"), 0, 10, 1, - GParamFlags(GTK_PARAM_READABLE))); + GParamFlags(G_PARAM_READABLE|G_PARAM_STATIC_STRINGS))); g_object_class_override_property(gobject_class, PROP_VAR_ID, "var-id"); binding_set = gtk_binding_set_by_class(klass); @@ -899,12 +907,11 @@ if (fmt) { return fmt; } else { - /* insert a LRM, to prevent -20 to come out as 20- in RTL locales */ int rd = GTK_RANGE(regler)->round_digits; if (rd < 0) { rd = 0; } - return g_strdup_printf ("\342\200\216%0.*f", rd, value); + return g_strdup_printf ("%0.*f", rd, value); } } @@ -1104,6 +1111,9 @@ if (event->button == 3) { return TRUE; } + if (event->type == GDK_2BUTTON_PRESS) { + return TRUE; + } return FALSE; } @@ -1164,7 +1174,22 @@ } static void gx_regler_relay_value(GtkAdjustment *src, GtkAdjustment *dst) { - gtk_adjustment_set_value(dst, gtk_adjustment_get_value(src)); + gtk_adjustment_set_value(dst, gtk_adjustment_get_value(src)); +} + +static gint gx_regler_spinner_input(GtkSpinButton *spin_button, gdouble *new_val, GxRegler *regler) +{ + gint ret; + g_signal_emit(regler, signals[INPUT_VALUE], 0, spin_button, new_val, &ret); + return ret; +} + +static void gx_regler_spinner_output(GtkSpinButton *spinner, GxRegler *regler) { + gchar *fmt; + gdouble value = gtk_adjustment_get_value(gtk_spin_button_get_adjustment(spinner)); + fmt = _gx_regler_format_value(regler, value); + gtk_entry_set_text (GTK_ENTRY(spinner), fmt); + g_free(fmt); } static gboolean gx_regler_value_entry(GxRegler *regler, GdkRectangle *rect, GdkEventButton *event) @@ -1187,6 +1212,8 @@ } GtkWidget *spinner = gtk_spin_button_new( src_adj, src_adj->step_increment, rd); + g_signal_connect(spinner, "output", G_CALLBACK(gx_regler_spinner_output), regler); + g_signal_connect(spinner, "input", G_CALLBACK(gx_regler_spinner_input), regler); g_signal_connect(src_adj, "value-changed", G_CALLBACK(gx_regler_relay_value), dst_adj); gtk_container_add(GTK_CONTAINER(dialog), spinner); diff -Nru guitarix-0.22.4/libgxw/gxw/GxRegler.h guitarix-0.24.2/libgxw/gxw/GxRegler.h --- guitarix-0.22.4/libgxw/gxw/GxRegler.h 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/libgxw/gxw/GxRegler.h 2012-10-20 03:56:02.000000000 +0000 @@ -23,9 +23,7 @@ #ifndef __GX_REGLER_H__ #define __GX_REGLER_H__ -#include -#include -#include "compat2-12.h" +#include G_BEGIN_DECLS @@ -56,6 +54,7 @@ GtkRangeClass parent_class; gboolean (*value_entry)(GxRegler *regler, GdkRectangle *rect, GdkEventButton *event); gchar* (*format_value)(GxRegler *regler, gdouble value); + gint (*input_value)(GxRegler *regler, gpointer spin, gpointer value); }; diff -Nru guitarix-0.22.4/libgxw/gxw/GxSelector.cpp guitarix-0.24.2/libgxw/gxw/GxSelector.cpp --- guitarix-0.22.4/libgxw/gxw/GxSelector.cpp 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/libgxw/gxw/GxSelector.cpp 2012-10-20 03:56:02.000000000 +0000 @@ -17,13 +17,8 @@ */ #include "GxSelector.h" -#include -#include #include -#include -#include - #define gtk_widget_get_requisition(w, r) (*r = (w)->requisition) #define P_(s) (s) // FIXME -> gettext @@ -81,7 +76,7 @@ g_param_spec_object( "model", P_("Selector model"), P_("The model for the selector"), - GTK_TYPE_TREE_MODEL, GParamFlags(GTK_PARAM_READWRITE))); + GTK_TYPE_TREE_MODEL, GParamFlags(G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS))); g_type_class_add_private(klass, sizeof (GxSelectorPrivate)); } @@ -91,14 +86,28 @@ return 0; } int n = gtk_tree_model_iter_n_children(selector->model, NULL); - int selectorstate = (int)gtk_range_get_value(GTK_RANGE(selector)); + int lower = gtk_adjustment_get_lower(gtk_range_get_adjustment(GTK_RANGE(selector))); + int selectorstate = (int)gtk_range_get_value(GTK_RANGE(selector)) - lower; if (selectorstate < 0 || selectorstate >= n) { - selectorstate = 0 ; - gtk_range_set_value(GTK_RANGE(selector), 0); + selectorstate = 0; + gtk_range_set_value(GTK_RANGE(selector), lower); } return selectorstate; } +static void set_value_from_selector_state(GxSelector *selector, int selectorstate) +{ + if (!selector->model) { + return; + } + int n = gtk_tree_model_iter_n_children(selector->model, NULL); + if (selectorstate < 0 || selectorstate >= n) { + selectorstate = 0; + } + int lower = gtk_adjustment_get_lower(gtk_range_get_adjustment(GTK_RANGE(selector))); + gtk_range_set_value(GTK_RANGE(selector), lower + selectorstate); +} + static const GtkBorder default_selector_border = { 10, 10, 3, 3 }; static void get_selector_border(GtkWidget *widget, GtkBorder *selector_border) @@ -323,7 +332,7 @@ if (strcmp(label, s) == 0) { g_free(s); if (n != get_selector_state(selector)) { - gtk_range_set_value(GTK_RANGE(selector), n); + set_value_from_selector_state(selector, n); gtk_widget_queue_draw(GTK_WIDGET(selector)); } return; @@ -380,12 +389,11 @@ gtk_widget_grab_focus(widget); gtk_grab_add(widget); n = gtk_tree_model_iter_n_children(selector->model, NULL); - i = (int)gtk_range_get_value(GTK_RANGE(widget)) + 1; - gtk_range_set_range(GTK_RANGE(widget), 0, n-1); + i = get_selector_state(GX_SELECTOR(widget)) + 1; if (i >= n) { i = 0; } - gtk_range_set_value(GTK_RANGE(widget), i); + set_value_from_selector_state(GX_SELECTOR(widget), i); break; case 3: // right button show num entry rect.width = widget->requisition.width; diff -Nru guitarix-0.22.4/libgxw/gxw/GxSelector.h guitarix-0.24.2/libgxw/gxw/GxSelector.h --- guitarix-0.22.4/libgxw/gxw/GxSelector.h 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/libgxw/gxw/GxSelector.h 2012-10-20 03:56:02.000000000 +0000 @@ -24,7 +24,6 @@ #define __GX_SELECTOR_H__ #include "GxRegler.h" -#include G_BEGIN_DECLS diff -Nru guitarix-0.22.4/libgxw/gxw/GxSimpleValueDisplay.cpp guitarix-0.24.2/libgxw/gxw/GxSimpleValueDisplay.cpp --- guitarix-0.22.4/libgxw/gxw/GxSimpleValueDisplay.cpp 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/libgxw/gxw/GxSimpleValueDisplay.cpp 2012-10-20 03:56:02.000000000 +0000 @@ -17,8 +17,6 @@ */ #include "GxSimpleValueDisplay.h" -#include -#include #define P_(s) (s) // FIXME -> gettext @@ -64,7 +62,8 @@ static gboolean gx_simple_value_display_button_press (GtkWidget *widget, GdkEventButton *event) { g_assert(GX_IS_SIMPLE_VALUE_DISPLAY(widget)); - if (event->button != 1 && event->button != 3) { + gtk_widget_grab_focus(widget); + if (event->button != 3) { return FALSE; } GdkRectangle image_rect, value_rect; diff -Nru guitarix-0.22.4/libgxw/gxw/GxSmallKnob.cpp guitarix-0.24.2/libgxw/gxw/GxSmallKnob.cpp --- guitarix-0.22.4/libgxw/gxw/GxSmallKnob.cpp 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/libgxw/gxw/GxSmallKnob.cpp 2012-10-20 03:56:02.000000000 +0000 @@ -17,7 +17,6 @@ */ #include "GxSmallKnob.h" -#include #define P_(s) (s) // FIXME -> gettext @@ -30,7 +29,7 @@ widget_class, g_param_spec_int("arc-inset",P_("inset of arch"), P_("Inset of the arc around the knob"), - 0, 100, 0, GParamFlags(GTK_PARAM_READABLE))); + 0, 100, 0, GParamFlags(G_PARAM_READABLE|G_PARAM_STATIC_STRINGS))); klass->parent_class.stock_id = "smallknob"; } diff -Nru guitarix-0.22.4/libgxw/gxw/GxSmallKnobR.cpp guitarix-0.24.2/libgxw/gxw/GxSmallKnobR.cpp --- guitarix-0.22.4/libgxw/gxw/GxSmallKnobR.cpp 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/libgxw/gxw/GxSmallKnobR.cpp 2012-10-20 03:56:02.000000000 +0000 @@ -17,7 +17,6 @@ */ #include "GxSmallKnobR.h" -#include #define P_(s) (s) // FIXME -> gettext @@ -30,7 +29,7 @@ widget_class, g_param_spec_int("arc-inset",P_("inset of arch"), P_("Inset of the arc around the knob"), - 0, 100, 0, GParamFlags(GTK_PARAM_READABLE))); + 0, 100, 0, GParamFlags(G_PARAM_READABLE|G_PARAM_STATIC_STRINGS))); klass->parent_class.stock_id = "smallknobr"; } diff -Nru guitarix-0.22.4/libgxw/gxw/GxSwitch.cpp guitarix-0.24.2/libgxw/gxw/GxSwitch.cpp --- guitarix-0.22.4/libgxw/gxw/GxSwitch.cpp 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/libgxw/gxw/GxSwitch.cpp 2012-10-20 03:56:02.000000000 +0000 @@ -19,8 +19,6 @@ #include "GxSwitch.h" #include "GxToggleImage.h" #include "GxControlParameter.h" -#include -#include #include #include #include @@ -97,14 +95,14 @@ P_("Label ref"), P_("GtkLabel for caption"), GTK_TYPE_LABEL, - GParamFlags(GTK_PARAM_READWRITE))); + GParamFlags(G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS))); g_object_class_install_property( gobject_class, PROP_BASE_NAME, g_param_spec_string("base-name", P_("Image base name"), P_("Base name of the image, append \"_on\" and \"_off\" for the stock names"), "", - GParamFlags(GTK_PARAM_READWRITE))); + GParamFlags(G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS))); g_object_class_override_property(gobject_class, PROP_VAR_ID, "var-id"); g_object_class_override_property(gobject_class, PROP_IMAGE, "image"); } diff -Nru guitarix-0.22.4/libgxw/gxw/GxSwitch.h guitarix-0.24.2/libgxw/gxw/GxSwitch.h --- guitarix-0.22.4/libgxw/gxw/GxSwitch.h 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/libgxw/gxw/GxSwitch.h 2012-10-20 03:56:02.000000000 +0000 @@ -19,9 +19,7 @@ #ifndef __GX_SWITCH_H__ #define __GX_SWITCH_H__ -#include -#include -#include "compat2-12.h" +#include G_BEGIN_DECLS diff -Nru guitarix-0.22.4/libgxw/gxw/GxToggleImage.cpp guitarix-0.24.2/libgxw/gxw/GxToggleImage.cpp --- guitarix-0.22.4/libgxw/gxw/GxToggleImage.cpp 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/libgxw/gxw/GxToggleImage.cpp 2012-10-20 03:56:02.000000000 +0000 @@ -17,9 +17,6 @@ */ #include "GxToggleImage.h" -#include -#include -#include #define P_(s) (s) // FIXME -> gettext @@ -57,7 +54,7 @@ P_("Image base name"), P_("Base name of the image, append \"_on\" and \"_off\" for the stock names"), "switch", - GParamFlags(GTK_PARAM_READWRITE))); + GParamFlags(G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS))); } static void gx_toggle_image_init(GxToggleImage *toggle_image) diff -Nru guitarix-0.22.4/libgxw/gxw/GxToggleImage.h guitarix-0.24.2/libgxw/gxw/GxToggleImage.h --- guitarix-0.22.4/libgxw/gxw/GxToggleImage.h 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/libgxw/gxw/GxToggleImage.h 2012-10-20 03:56:02.000000000 +0000 @@ -19,8 +19,7 @@ #ifndef __GX_TOGGLE_IMAGE_H__ #define __GX_TOGGLE_IMAGE_H__ -#include -#include "compat2-12.h" +#include G_BEGIN_DECLS diff -Nru guitarix-0.22.4/libgxw/gxw/GxTuner.cpp guitarix-0.24.2/libgxw/gxw/GxTuner.cpp --- guitarix-0.22.4/libgxw/gxw/GxTuner.cpp 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/libgxw/gxw/GxTuner.cpp 2012-10-20 03:56:02.000000000 +0000 @@ -17,7 +17,6 @@ */ #include "GxTuner.h" -#include #include #define P_(s) (s) // FIXME -> gettext @@ -70,17 +69,17 @@ gobject_class, PROP_FREQ, g_param_spec_double ( "freq", P_("Frequency"), P_("The frequency for which tuning is displayed"), - 0.0, 1000.0, 0.0, GParamFlags(GTK_PARAM_READWRITE))); + 0.0, 1000.0, 0.0, GParamFlags(G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS))); g_object_class_install_property( gobject_class, PROP_REFERENCE_PITCH, g_param_spec_double ( "reference-pitch", P_("Reference Pitch"), P_("The frequency for which tuning is displayed"), - 400.0, 500.0, 440.0, GParamFlags(GTK_PARAM_READWRITE))); + 400.0, 500.0, 440.0, GParamFlags(G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS))); g_object_class_install_property( gobject_class, PROP_SCALE, g_param_spec_double ( "scale", P_("Image Scale"), P_("scale the tuner area to make it bigger or smaller"), - 0.5, 10.0, 1.0, GParamFlags(GTK_PARAM_READWRITE))); + 0.5, 10.0, 1.0, GParamFlags(G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS))); } static void tuner_surface_init(GxTuner *tuner) diff -Nru guitarix-0.22.4/libgxw/gxw/GxTuner.h guitarix-0.24.2/libgxw/gxw/GxTuner.h --- guitarix-0.22.4/libgxw/gxw/GxTuner.h 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/libgxw/gxw/GxTuner.h 2012-10-20 03:56:02.000000000 +0000 @@ -19,8 +19,7 @@ #ifndef __GX_TUNER_H__ #define __GX_TUNER_H__ -#include -#include "compat2-12.h" +#include G_BEGIN_DECLS diff -Nru guitarix-0.22.4/libgxw/gxw/GxVSlider.cpp guitarix-0.24.2/libgxw/gxw/GxVSlider.cpp --- guitarix-0.22.4/libgxw/gxw/GxVSlider.cpp 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/libgxw/gxw/GxVSlider.cpp 2012-10-20 03:56:02.000000000 +0000 @@ -17,8 +17,6 @@ */ #include "GxVSlider.h" -#include -#include #define P_(s) (s) // FIXME -> gettext @@ -47,8 +45,8 @@ gtk_widget_class_install_style_property( widget_class, g_param_spec_int("slider-width",P_("size of slider"), - P_("Height of movable part of vslider"), - 0, 100, 20, GParamFlags(GTK_PARAM_READABLE))); + P_("Height of movable part of vslider"), + 0, 100, 20, GParamFlags(G_PARAM_READABLE|G_PARAM_STATIC_STRINGS))); } static void gx_vslider_size_request (GtkWidget *widget, GtkRequisition *requisition) diff -Nru guitarix-0.22.4/libgxw/gxw/GxValueDisplay.cpp guitarix-0.24.2/libgxw/gxw/GxValueDisplay.cpp --- guitarix-0.22.4/libgxw/gxw/GxValueDisplay.cpp 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/libgxw/gxw/GxValueDisplay.cpp 2012-10-20 03:56:02.000000000 +0000 @@ -17,8 +17,6 @@ */ #include "GxValueDisplay.h" -#include -#include #define P_(s) (s) // FIXME -> gettext @@ -64,7 +62,8 @@ static gboolean gx_value_display_button_press (GtkWidget *widget, GdkEventButton *event) { g_assert(GX_IS_VALUE_DISPLAY(widget)); - if (event->button != 1 && event->button != 3) { + gtk_widget_grab_focus(widget); + if (event->button != 3) { return FALSE; } GdkRectangle image_rect, value_rect; diff -Nru guitarix-0.22.4/libgxw/gxw/GxWaveView.cpp guitarix-0.24.2/libgxw/gxw/GxWaveView.cpp --- guitarix-0.22.4/libgxw/gxw/GxWaveView.cpp 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/libgxw/gxw/GxWaveView.cpp 2012-10-20 03:56:02.000000000 +0000 @@ -22,7 +22,7 @@ ******************************************************************************/ #include "GxWaveView.h" -#include +#include "GxGradient.h" #include #define P_(s) (s) // FIXME -> gettext @@ -51,6 +51,36 @@ static const int background_width = 282; static const int background_height = 52; +inline double cairo_clr(guint16 clr) +{ + return clr / 65535.0; +} + +// set cairo color related to the used skin +static void set_box_color(GtkWidget *wi, cairo_pattern_t *pat) +{ + GxGradient *grad; + gtk_widget_style_get(wi, "box-gradient", &grad, NULL); + if (!grad) { + GdkColor *p1 = &wi->style->bg[GTK_STATE_NORMAL]; + cairo_pattern_add_color_stop_rgba( + pat, 0, cairo_clr(p1->red), cairo_clr(p1->green), + cairo_clr(p1->blue), 0.8); + GdkColor *p2 = &wi->style->fg[GTK_STATE_NORMAL]; + cairo_pattern_add_color_stop_rgba( + pat, 1, (cairo_clr(p1->red)+cairo_clr(p2->red))/2, + (cairo_clr(p1->green)+cairo_clr(p2->green))/2, + (cairo_clr(p1->blue)+cairo_clr(p2->blue))/2, 0.8); + return; + } + GSList *p; + for (p = grad->colors; p; p = g_slist_next(p)) { + GxGradientElement *el = (GxGradientElement*)p->data; + cairo_pattern_add_color_stop_rgba(pat, el->offset, el->red, el->green, el->blue, el->alpha); + } + gx_gradient_free(grad); +} + static void wave_view_background(GxWaveView *waveview,GtkWidget *widget , int liveviewx, int liveviewy) { @@ -211,10 +241,11 @@ cairo_line_to (cr, liveviewx, liveviewy+25); cairo_pattern_t* linpat = cairo_pattern_create_linear (liveviewx, liveviewy-15,liveviewx, liveviewy+25); - cairo_pattern_set_extend(linpat, CAIRO_EXTEND_REFLECT); - cairo_pattern_add_color_stop_rgba (linpat, 0.4, 1, 0.2, 0,0.8); - cairo_pattern_add_color_stop_rgba (linpat, 0.8, 0.2, 1, 0.2,0.8); + set_box_color(widget, linpat); + + //cairo_pattern_add_color_stop_rgba (linpat, 0.4, 1, 0.2, 0,0.8); + //cairo_pattern_add_color_stop_rgba (linpat, 0.8, 0.2, 1, 0.2,0.8); cairo_set_source (cr, linpat); cairo_close_path (cr); @@ -234,8 +265,9 @@ cairo_pattern_create_linear (liveviewx, liveviewy,liveviewx+140, liveviewy); cairo_pattern_set_extend(linpat, CAIRO_EXTEND_REFLECT); - cairo_pattern_add_color_stop_rgba (linpat, 0.2, 1, 0.2, 0,0.8); - cairo_pattern_add_color_stop_rgba (linpat, 0.8, 0.2, 1, 0.2,0.8); + set_box_color(widget, linpat); + //cairo_pattern_add_color_stop_rgba (linpat, 0.2, 1, 0.2, 0,0.8); + //cairo_pattern_add_color_stop_rgba (linpat, 0.8, 0.2, 1, 0.2,0.8); cairo_set_source (cr, linpat); cairo_set_line_width (cr, 3.0); cairo_stroke (cr); @@ -269,42 +301,50 @@ P_("Text top left"), P_("Text to be displayed at the top left"), "", - GParamFlags(GTK_PARAM_READWRITE))); + GParamFlags(G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS))); g_object_class_install_property (gobject_class, PROP_TEXT_TOP_RIGHT, g_param_spec_string ("text-top-right", P_("Text top right"), P_("Text to be displayed at the top right"), "", - GParamFlags(GTK_PARAM_READWRITE))); + GParamFlags(G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS))); g_object_class_install_property (gobject_class, PROP_TEXT_BOTTOM_LEFT, g_param_spec_string ("text-bottom-left", P_("Text bottom left"), P_("Text to be displayed at the bottom left"), "", - GParamFlags(GTK_PARAM_READWRITE))); + GParamFlags(G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS))); g_object_class_install_property (gobject_class, PROP_TEXT_BOTTOM_RIGHT, g_param_spec_string ("text-bottom-right", P_("Text bottom right"), P_("Text to be displayed at the bottom right"), "", - GParamFlags(GTK_PARAM_READWRITE))); + GParamFlags(G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS))); g_object_class_install_property (gobject_class, PROP_TEXT_POS_LEFT, g_param_spec_double ("text-pos-left", P_("Left Position"), P_("Text to be displayed at the bottom right"), 0, 100, 5, - GParamFlags(GTK_PARAM_READWRITE))); + GParamFlags(G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS))); g_object_class_install_property (gobject_class, PROP_TEXT_POS_RIGHT, g_param_spec_double ("text-pos-right", P_("Right Position"), P_("Text to be displayed at the bottom right"), 0, 100, 70, - GParamFlags(GTK_PARAM_READWRITE))); + GParamFlags(G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS))); + gtk_widget_class_install_style_property_parser( + GTK_WIDGET_CLASS(klass), + g_param_spec_boxed("box-gradient", + P_("Skin color"), + P_("Color gradient defined as part of skin"), + GX_TYPE_GRADIENT, + GParamFlags(G_PARAM_READABLE|G_PARAM_STATIC_STRINGS)), + gx_parse_gradient); } static void gx_wave_view_init(GxWaveView *waveview) diff -Nru guitarix-0.22.4/libgxw/gxw/GxWaveView.h guitarix-0.24.2/libgxw/gxw/GxWaveView.h --- guitarix-0.22.4/libgxw/gxw/GxWaveView.h 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/libgxw/gxw/GxWaveView.h 2012-10-20 03:56:02.000000000 +0000 @@ -23,8 +23,7 @@ #ifndef __GX_WAVE_VIEW_H__ #define __GX_WAVE_VIEW_H__ -#include -#include "compat2-12.h" +#include G_BEGIN_DECLS diff -Nru guitarix-0.22.4/libgxw/gxw/GxWheel.cpp guitarix-0.24.2/libgxw/gxw/GxWheel.cpp --- guitarix-0.22.4/libgxw/gxw/GxWheel.cpp 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/libgxw/gxw/GxWheel.cpp 2012-10-20 03:56:02.000000000 +0000 @@ -17,8 +17,6 @@ */ #include "GxWheel.h" -#include -#include #define P_(s) (s) // FIXME -> gettext @@ -51,7 +49,7 @@ P_("framecount"), P_("Number of frames in the animation specified by the gtkrc"), -1, 250, -1, - GParamFlags(GTK_PARAM_READABLE))); + GParamFlags(G_PARAM_READABLE|G_PARAM_STATIC_STRINGS))); g_type_class_add_private(klass, sizeof (GxWheelPrivate)); } diff -Nru guitarix-0.22.4/libgxw/gxw/GxWheelVertical.cpp guitarix-0.24.2/libgxw/gxw/GxWheelVertical.cpp --- guitarix-0.22.4/libgxw/gxw/GxWheelVertical.cpp 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/libgxw/gxw/GxWheelVertical.cpp 2012-10-20 03:56:02.000000000 +0000 @@ -17,8 +17,6 @@ */ #include "GxWheelVertical.h" -#include -#include #define P_(s) (s) // FIXME -> gettext @@ -51,7 +49,7 @@ P_("framecount"), P_("Number of frames in the animation specified by the gtkrc"), -1, 250, -1, - GParamFlags(GTK_PARAM_READABLE))); + GParamFlags(G_PARAM_READABLE|G_PARAM_STATIC_STRINGS))); g_type_class_add_private(klass, sizeof (GxWheelVerticalPrivate)); } diff -Nru guitarix-0.22.4/libgxw/gxw/compat2-12.h guitarix-0.24.2/libgxw/gxw/compat2-12.h --- guitarix-0.22.4/libgxw/gxw/compat2-12.h 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/libgxw/gxw/compat2-12.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,19 +0,0 @@ -#ifndef GSEAL -#define GSEAL(x) x -#define gtk_widget_get_state(w) GtkStateType(GTK_WIDGET_STATE(w)) -#define gtk_widget_has_default(w) GTK_WIDGET_HAS_DEFAULT(w) -#define gtk_widget_get_can_default(w) GTK_WIDGET_CAN_DEFAULT(w) -#define gtk_widget_has_focus(w) GTK_WIDGET_HAS_FOCUS(w) -#define gtk_widget_has_grab(w) GTK_WIDGET_HAS_GRAB(w) -#define gtk_widget_get_visible(w) GTK_WIDGET_VISIBLE(w) -#define gtk_widget_is_drawable(w) GTK_WIDGET_DRAWABLE(w) -#define gtk_widget_set_can_focus(w, s) GTK_WIDGET_SET_FLAGS(w, GTK_CAN_FOCUS) -#define gtk_widget_set_receives_default(w, s) GTK_WIDGET_SET_FLAGS(w, GTK_CAN_DEFAULT) -#define gtk_widget_set_has_window(w, s) {if(s)GTK_WIDGET_UNSET_FLAGS(w, GTK_NO_WINDOW); else GTK_WIDGET_SET_FLAGS(w, GTK_NO_WINDOW);} -#define gtk_widget_get_window(w) ((w)->window) -#define gtk_widget_get_requisition(w, r) (*r = (w)->requisition) -#define gtk_adjustment_get_lower(w) ((w)->lower) -#define gtk_adjustment_get_upper(w) ((w)->upper) -#define gtk_adjustment_configure(w, v, l, u, s, p, pp) {w->value=v;w->lower=l;w->upper=u;w->step_increment=s;w->page_increment=p;w->page_size=pp;} -#define gtk_menu_item_get_label(w) gtk_label_get_label(GTK_LABEL(gtk_bin_get_child(GTK_BIN(w)))) -#endif diff -Nru guitarix-0.22.4/libgxw/gxw/gxinit.cpp guitarix-0.24.2/libgxw/gxw/gxinit.cpp --- guitarix-0.22.4/libgxw/gxw/gxinit.cpp 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/libgxw/gxw/gxinit.cpp 2012-10-20 03:56:02.000000000 +0000 @@ -16,7 +16,6 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -#include #include "gxinit.h" #include "gximages.cc" @@ -60,6 +59,8 @@ { "main_image", pb_gxhead }, { "gxplate", pb_gxplate }, { "gxplate2", pb_gxplate2 }, + { "portdisplay", pb_portdisplay }, + { "texture_cab", pb_texture_cab }, { NULL, NULL }, }; diff -Nru guitarix-0.22.4/libgxw/gxw/gxinit.h guitarix-0.24.2/libgxw/gxw/gxinit.h --- guitarix-0.22.4/libgxw/gxw/gxinit.h 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/libgxw/gxw/gxinit.h 2012-10-20 03:56:02.000000000 +0000 @@ -23,8 +23,7 @@ #ifndef __GX_RADIO_BUTTON_H__ #define __GX_RADIO_BUTTON_H__ -#include -#include "compat2-12.h" +#include G_BEGIN_DECLS diff -Nru guitarix-0.22.4/libgxw/gxw/wscript guitarix-0.24.2/libgxw/gxw/wscript --- guitarix-0.22.4/libgxw/gxw/wscript 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/libgxw/gxw/wscript 2012-10-20 03:56:02.000000000 +0000 @@ -51,6 +51,8 @@ "gxhead_face.png", "gxplate.png", "gxplate2.png", + "portdisplay.png", + "texture_cab.png" ] bld(name = "img2c", @@ -90,6 +92,7 @@ 'GxValueDisplay.cpp', 'GxSimpleValueDisplay.cpp', 'GxRackTuner.cpp', + 'GxPortDisplay.cpp', ] build_stock_images(bld) if bld.env["GX_LIB_STATIC"]: @@ -100,7 +103,7 @@ source = sources, uselib = ['GTHREAD', 'GTK2'], target = 'gxw', - chmod=0755, + chmod=0o755, ) if bld.env["GX_LIB_SHARED"] or bld.env["GXW_SHARED"]: # shared library @@ -110,7 +113,7 @@ source = sources, uselib = ['GTHREAD', 'GTK2'], target = 'gxw', - chmod=0755, + chmod=0o755, ) if bld.env["GX_LIB_SHARED"] or bld.env["GXW_SHARED_INSTALL"]: prog.features.append('libtool') Binary files /tmp/mbEWcaD4tf/guitarix-0.22.4/libgxw/icons/portdisplay.png and /tmp/awGLg2skY7/guitarix-0.24.2/libgxw/icons/portdisplay.png differ Binary files /tmp/mbEWcaD4tf/guitarix-0.22.4/libgxw/icons/texture_cab.png and /tmp/awGLg2skY7/guitarix-0.24.2/libgxw/icons/texture_cab.png differ diff -Nru guitarix-0.22.4/libgxwmm/gxwmm/generate_defs_gxw.cc guitarix-0.24.2/libgxwmm/gxwmm/generate_defs_gxw.cc --- guitarix-0.22.4/libgxwmm/gxwmm/generate_defs_gxw.cc 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/libgxwmm/gxwmm/generate_defs_gxw.cc 2012-10-20 03:56:02.000000000 +0000 @@ -17,7 +17,6 @@ */ #include -#include #include int main(int argc, char** argv) diff -Nru guitarix-0.22.4/libgxwmm/gxwmm/portdisplay.ccg guitarix-0.24.2/libgxwmm/gxwmm/portdisplay.ccg --- guitarix-0.22.4/libgxwmm/gxwmm/portdisplay.ccg 1970-01-01 00:00:00.000000000 +0000 +++ guitarix-0.24.2/libgxwmm/gxwmm/portdisplay.ccg 2012-10-20 03:56:02.000000000 +0000 @@ -0,0 +1,23 @@ +/* + * Copyright (C) 2009, 2010 Hermann Meyer, James Warden, Andreas Degert + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#include + +Gxw::PortDisplay::PortDisplay(Gtk::Adjustment& adjustment): + _CONSTRUCT("adjustment", adjustment.gobj()) +{} diff -Nru guitarix-0.22.4/libgxwmm/gxwmm/portdisplay.hg guitarix-0.24.2/libgxwmm/gxwmm/portdisplay.hg --- guitarix-0.22.4/libgxwmm/gxwmm/portdisplay.hg 1970-01-01 00:00:00.000000000 +0000 +++ guitarix-0.24.2/libgxwmm/gxwmm/portdisplay.hg 2012-10-20 03:56:02.000000000 +0000 @@ -0,0 +1,34 @@ +/* + * Copyright (C) 2009, 2010 Hermann Meyer, James Warden, Andreas Degert + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#include +#include + +_DEFS(gxwmm,gxw) +_PINCLUDE(gxwmm/private/vslider_p.h) + +namespace Gxw { + +class PortDisplay: public Gxw::VSlider { + _CLASS_GTKOBJECT(PortDisplay,GxPortDisplay,GX_PORT_DISPLAY,Gxw::VSlider,GxVSlider) + public: + explicit PortDisplay(Gtk::Adjustment& adjustment); + _CTOR_DEFAULT +}; + +} // namespace Gxw diff -Nru guitarix-0.22.4/libgxwmm/gxwmm/regler.hg guitarix-0.24.2/libgxwmm/gxwmm/regler.hg --- guitarix-0.22.4/libgxwmm/gxwmm/regler.hg 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/libgxwmm/gxwmm/regler.hg 2012-10-20 03:56:02.000000000 +0000 @@ -37,6 +37,7 @@ _WRAP_METHOD(void set_value_position(Gtk::PositionType), gx_regler_set_value_position) _WRAP_METHOD(Gtk::PositionType get_value_position(), gx_regler_get_value_position) _WRAP_SIGNAL(bool value_entry(const Gdk::Rectangle&, GdkEventButton*), "value-entry") + _WRAP_SIGNAL(int input_value(void *spin, void *new_val), "input-value") _WRAP_PROPERTY("label-ref", Gtk::Label) _WRAP_PROPERTY("show-value", bool) _WRAP_PROPERTY("value-xalign", double) diff -Nru guitarix-0.22.4/libgxwmm/gxwmm/wscript guitarix-0.24.2/libgxwmm/gxwmm/wscript --- guitarix-0.22.4/libgxwmm/gxwmm/wscript 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/libgxwmm/gxwmm/wscript 2012-10-20 03:56:02.000000000 +0000 @@ -68,7 +68,7 @@ shutil.copy2(dpath+basename+".cc", spath+basename+".cc") shutil.copy2(dpath+basename+".h", spath+basename+".h") shutil.copy2(dpath+"private/"+basename+"_p.h", spath+"private/"+basename+"_p.h") - except (OSError, IOError), e: + except (OSError, IOError) as e: Logs.error("runner: cannot copy file -> %s" % e) return e.errno return 0 @@ -128,6 +128,7 @@ "GxGradient.h", "GxValueDisplay.h", "GxSimpleValueDisplay.h", + "GxPortDisplay.h", ] header = ["../../libgxw/gxw/"+v for v in header] bld(features = ['cxx', 'cprogram'], @@ -198,6 +199,7 @@ #"gradient.hg", "valuedisplay.hg", "simplevaluedisplay.hg", + "portdisplay.hg", ] if bld.env["USE_GENERATED_CPP"]: gdir = "../gxwmm-generated/" diff -Nru guitarix-0.22.4/libgxwmm/gxwmm-generated/controlparameter.h guitarix-0.24.2/libgxwmm/gxwmm-generated/controlparameter.h --- guitarix-0.22.4/libgxwmm/gxwmm-generated/controlparameter.h 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/libgxwmm/gxwmm-generated/controlparameter.h 2012-10-20 03:56:02.000000000 +0000 @@ -64,9 +64,14 @@ ControlParameter(const ControlParameter&); ControlParameter& operator=(const ControlParameter&); +#endif /* DOXYGEN_SHOULD_SKIP_THIS */ protected: - ControlParameter(); // you must derive from this class - + /** + * You should derive from this class to use it. + */ + ControlParameter(); + +#ifndef DOXYGEN_SHOULD_SKIP_THIS /** Called by constructors of derived classes. Provide the result of * the Class init() function to ensure that it is properly * initialized. diff -Nru guitarix-0.22.4/libgxwmm/gxwmm-generated/portdisplay.cc guitarix-0.24.2/libgxwmm/gxwmm-generated/portdisplay.cc --- guitarix-0.22.4/libgxwmm/gxwmm-generated/portdisplay.cc 1970-01-01 00:00:00.000000000 +0000 +++ guitarix-0.24.2/libgxwmm/gxwmm-generated/portdisplay.cc 2012-10-20 03:56:02.000000000 +0000 @@ -0,0 +1,141 @@ +// Generated by gtkmmproc -- DO NOT MODIFY! + + +#include + +#include +#include + + +/* + * Copyright (C) 2009, 2010 Hermann Meyer, James Warden, Andreas Degert + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#include + +Gxw::PortDisplay::PortDisplay(Gtk::Adjustment& adjustment): + // Mark this class as non-derived to allow C++ vfuncs to be skipped. + Glib::ObjectBase(0), + Gxw::VSlider(Glib::ConstructParams(portdisplay_class_.init(), "adjustment",adjustment.gobj(), static_cast(0))) +{} + +namespace +{ +} // anonymous namespace + + +namespace Glib +{ + +Gxw::PortDisplay* wrap(GxPortDisplay* object, bool take_copy) +{ + return dynamic_cast (Glib::wrap_auto ((GObject*)(object), take_copy)); +} + +} /* namespace Glib */ + +namespace Gxw +{ + + +/* The *_Class implementation: */ + +const Glib::Class& PortDisplay_Class::init() +{ + if(!gtype_) // create the GType if necessary + { + // Glib::Class has to know the class init function to clone custom types. + class_init_func_ = &PortDisplay_Class::class_init_function; + + // This is actually just optimized away, apparently with no harm. + // Make sure that the parent type has been created. + //CppClassParent::CppObjectType::get_type(); + + // Create the wrapper type, with the same class/instance size as the base type. + register_derived_type(gx_port_display_get_type()); + + // Add derived versions of interfaces, if the C type implements any interfaces: + + } + + return *this; +} + + +void PortDisplay_Class::class_init_function(void* g_class, void* class_data) +{ + BaseClassType *const klass = static_cast(g_class); + CppClassParent::class_init_function(klass, class_data); + + +} + + +Glib::ObjectBase* PortDisplay_Class::wrap_new(GObject* o) +{ + return manage(new PortDisplay((GxPortDisplay*)(o))); + +} + + +/* The implementation: */ + +PortDisplay::PortDisplay(const Glib::ConstructParams& construct_params) +: + Gxw::VSlider(construct_params) +{ + } + +PortDisplay::PortDisplay(GxPortDisplay* castitem) +: + Gxw::VSlider((GxVSlider*)(castitem)) +{ + } + +PortDisplay::~PortDisplay() +{ + destroy_(); +} + +PortDisplay::CppClassType PortDisplay::portdisplay_class_; // initialize static member + +GType PortDisplay::get_type() +{ + return portdisplay_class_.init().get_type(); +} + + +GType PortDisplay::get_base_type() +{ + return gx_port_display_get_type(); +} + + +PortDisplay::PortDisplay() +: + // Mark this class as non-derived to allow C++ vfuncs to be skipped. + Glib::ObjectBase(0), + Gxw::VSlider(Glib::ConstructParams(portdisplay_class_.init())) +{ + + +} + + +} // namespace Gxw + + diff -Nru guitarix-0.22.4/libgxwmm/gxwmm-generated/portdisplay.h guitarix-0.24.2/libgxwmm/gxwmm-generated/portdisplay.h --- guitarix-0.22.4/libgxwmm/gxwmm-generated/portdisplay.h 1970-01-01 00:00:00.000000000 +0000 +++ guitarix-0.24.2/libgxwmm/gxwmm-generated/portdisplay.h 2012-10-20 03:56:02.000000000 +0000 @@ -0,0 +1,121 @@ +// -*- c++ -*- +// Generated by gtkmmproc -- DO NOT MODIFY! +#ifndef _GXWMM_PORTDISPLAY_H +#define _GXWMM_PORTDISPLAY_H + + +#include +#include + +/* + * Copyright (C) 2009, 2010 Hermann Meyer, James Warden, Andreas Degert + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#include +#include + + +#ifndef DOXYGEN_SHOULD_SKIP_THIS +typedef struct _GxPortDisplay GxPortDisplay; +typedef struct _GxPortDisplayClass GxPortDisplayClass; +#endif /* DOXYGEN_SHOULD_SKIP_THIS */ + + +namespace Gxw +{ class PortDisplay_Class; } // namespace Gxw +namespace Gxw { + + +class PortDisplay: public Gxw::VSlider { + public: +#ifndef DOXYGEN_SHOULD_SKIP_THIS + typedef PortDisplay CppObjectType; + typedef PortDisplay_Class CppClassType; + typedef GxPortDisplay BaseObjectType; + typedef GxPortDisplayClass BaseClassType; +#endif /* DOXYGEN_SHOULD_SKIP_THIS */ + + virtual ~PortDisplay(); + +#ifndef DOXYGEN_SHOULD_SKIP_THIS + +private: + friend class PortDisplay_Class; + static CppClassType portdisplay_class_; + + // noncopyable + PortDisplay(const PortDisplay&); + PortDisplay& operator=(const PortDisplay&); + +protected: + explicit PortDisplay(const Glib::ConstructParams& construct_params); + explicit PortDisplay(GxPortDisplay* castitem); + +#endif /* DOXYGEN_SHOULD_SKIP_THIS */ + +public: +#ifndef DOXYGEN_SHOULD_SKIP_THIS + static GType get_type() G_GNUC_CONST; + + + static GType get_base_type() G_GNUC_CONST; +#endif + + ///Provides access to the underlying C GtkObject. + GxPortDisplay* gobj() { return reinterpret_cast(gobject_); } + + ///Provides access to the underlying C GtkObject. + const GxPortDisplay* gobj() const { return reinterpret_cast(gobject_); } + + +public: + //C++ methods used to invoke GTK+ virtual functions: + +protected: + //GTK+ Virtual Functions (override these to change behaviour): + + //Default Signal Handlers:: + + +private: + + public: + explicit PortDisplay(Gtk::Adjustment& adjustment); + PortDisplay(); + + +}; + +} // namespace Gxw + + +namespace Glib +{ + /** A Glib::wrap() method for this object. + * + * @param object The C instance. + * @param take_copy False if the result should take ownership of the C instance. True if it should take a new copy or ref. + * @result A C++ instance that wraps this C instance. + * + * @relates Gxw::PortDisplay + */ + Gxw::PortDisplay* wrap(GxPortDisplay* object, bool take_copy = false); +} //namespace Glib + + +#endif /* _GXWMM_PORTDISPLAY_H */ + diff -Nru guitarix-0.22.4/libgxwmm/gxwmm-generated/private/portdisplay_p.h guitarix-0.24.2/libgxwmm/gxwmm-generated/private/portdisplay_p.h --- guitarix-0.22.4/libgxwmm/gxwmm-generated/private/portdisplay_p.h 1970-01-01 00:00:00.000000000 +0000 +++ guitarix-0.24.2/libgxwmm/gxwmm-generated/private/portdisplay_p.h 2012-10-20 03:56:02.000000000 +0000 @@ -0,0 +1,48 @@ +// -*- c++ -*- +// Generated by gtkmmproc -- DO NOT MODIFY! +#ifndef _GXWMM_PORTDISPLAY_P_H +#define _GXWMM_PORTDISPLAY_P_H + + +#include + +#include + +namespace Gxw +{ + +class PortDisplay_Class : public Glib::Class +{ +public: +#ifndef DOXYGEN_SHOULD_SKIP_THIS + typedef PortDisplay CppObjectType; + typedef GxPortDisplay BaseObjectType; + typedef GxPortDisplayClass BaseClassType; + typedef Gxw::VSlider_Class CppClassParent; + typedef GxVSliderClass BaseClassParent; + + friend class PortDisplay; +#endif /* DOXYGEN_SHOULD_SKIP_THIS */ + + const Glib::Class& init(); + + + static void class_init_function(void* g_class, void* class_data); + + static Glib::ObjectBase* wrap_new(GObject*); + +protected: + + //Callbacks (default signal handlers): + //These will call the *_impl member methods, which will then call the existing default signal callbacks, if any. + //You could prevent the original default signal handlers being called by overriding the *_impl method. + + //Callbacks (virtual functions): +}; + + +} // namespace Gxw + + +#endif /* _GXWMM_PORTDISPLAY_P_H */ + diff -Nru guitarix-0.22.4/libgxwmm/gxwmm-generated/private/regler_p.h guitarix-0.24.2/libgxwmm/gxwmm-generated/private/regler_p.h --- guitarix-0.22.4/libgxwmm/gxwmm-generated/private/regler_p.h 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/libgxwmm/gxwmm-generated/private/regler_p.h 2012-10-20 03:56:02.000000000 +0000 @@ -37,6 +37,7 @@ //These will call the *_impl member methods, which will then call the existing default signal callbacks, if any. //You could prevent the original default signal handlers being called by overriding the *_impl method. static gboolean value_entry_callback(GxRegler* self, GdkRectangle* p0, GdkEventButton* p1); + static gint input_value_callback(GxRegler* self, gpointer p0, gpointer p1); static gchar* format_value_callback(GxRegler* self, gdouble p0); //Callbacks (virtual functions): diff -Nru guitarix-0.22.4/libgxwmm/gxwmm-generated/regler.cc guitarix-0.24.2/libgxwmm/gxwmm-generated/regler.cc --- guitarix-0.22.4/libgxwmm/gxwmm-generated/regler.cc 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/libgxwmm/gxwmm-generated/regler.cc 2012-10-20 03:56:02.000000000 +0000 @@ -96,6 +96,72 @@ }; +static gint Regler_signal_input_value_callback(GxRegler* self, gpointer p0,gpointer p1,void* data) +{ + using namespace Gxw; + typedef sigc::slot< int,void *,void * > SlotType; + + // Do not try to call a signal on a disassociated wrapper. + if(Glib::ObjectBase::_get_current_wrapper((GObject*) self)) + { + #ifdef GLIBMM_EXCEPTIONS_ENABLED + try + { + #endif //GLIBMM_EXCEPTIONS_ENABLED + if(sigc::slot_base *const slot = Glib::SignalProxyNormal::data_to_slot(data)) + return (*static_cast(slot))(p0 +, p1 +); + #ifdef GLIBMM_EXCEPTIONS_ENABLED + } + catch(...) + { + Glib::exception_handlers_invoke(); + } + #endif //GLIBMM_EXCEPTIONS_ENABLED + } + + typedef gint RType; + return RType(); +} + +static gint Regler_signal_input_value_notify_callback(GxRegler* self, gpointer p0,gpointer p1, void* data) +{ + using namespace Gxw; + typedef sigc::slot< void,void *,void * > SlotType; + + // Do not try to call a signal on a disassociated wrapper. + if(Glib::ObjectBase::_get_current_wrapper((GObject*) self)) + { + #ifdef GLIBMM_EXCEPTIONS_ENABLED + try + { + #endif //GLIBMM_EXCEPTIONS_ENABLED + if(sigc::slot_base *const slot = Glib::SignalProxyNormal::data_to_slot(data)) + (*static_cast(slot))(p0 +, p1 +); + #ifdef GLIBMM_EXCEPTIONS_ENABLED + } + catch(...) + { + Glib::exception_handlers_invoke(); + } + #endif //GLIBMM_EXCEPTIONS_ENABLED + } + + typedef gint RType; + return RType(); +} + +static const Glib::SignalProxyInfo Regler_signal_input_value_info = +{ + "input-value", + (GCallback) &Regler_signal_input_value_callback, + (GCallback) &Regler_signal_input_value_notify_callback +}; + + static gchar* Regler_signal_format_value_callback(GxRegler* self, gdouble p0,void* data) { using namespace Gxw; @@ -210,6 +276,7 @@ klass->value_entry = &value_entry_callback; + klass->input_value = &input_value_callback; klass->format_value = &format_value_callback; } @@ -257,6 +324,50 @@ typedef gboolean RType; return RType(); } +gint Regler_Class::input_value_callback(GxRegler* self, gpointer p0, gpointer p1) +{ + Glib::ObjectBase *const obj_base = static_cast( + Glib::ObjectBase::_get_current_wrapper((GObject*)self)); + + // Non-gtkmmproc-generated custom classes implicitly call the default + // Glib::ObjectBase constructor, which sets is_derived_. But gtkmmproc- + // generated classes can use this optimisation, which avoids the unnecessary + // parameter conversions if there is no possibility of the virtual function + // being overridden: + if(obj_base && obj_base->is_derived_()) + { + CppObjectType *const obj = dynamic_cast(obj_base); + if(obj) // This can be NULL during destruction. + { + #ifdef GLIBMM_EXCEPTIONS_ENABLED + try // Trap C++ exceptions which would normally be lost because this is a C callback. + { + #endif //GLIBMM_EXCEPTIONS_ENABLED + // Call the virtual member method, which derived classes might override. + return obj->on_input_value(p0 +, p1 +); + #ifdef GLIBMM_EXCEPTIONS_ENABLED + } + catch(...) + { + Glib::exception_handlers_invoke(); + } + #endif //GLIBMM_EXCEPTIONS_ENABLED + } + } + + BaseClassType *const base = static_cast( + g_type_class_peek_parent(G_OBJECT_GET_CLASS(self)) // Get the parent class of the object class (The original underlying C class). + ); + + // Call the original underlying C function: + if(base && base->input_value) + return (*base->input_value)(self, p0, p1); + + typedef gint RType; + return RType(); +} gchar* Regler_Class::format_value_callback(GxRegler* self, gdouble p0) { Glib::ObjectBase *const obj_base = static_cast( @@ -390,6 +501,12 @@ } +Glib::SignalProxy2< int,void *,void * > Regler::signal_input_value() +{ + return Glib::SignalProxy2< int,void *,void * >(this, &Regler_signal_input_value_info); +} + + Glib::SignalProxy1< Glib::ustring,double > Regler::signal_format_value() { return Glib::SignalProxy1< Glib::ustring,double >(this, &Regler_signal_format_value_info); @@ -472,6 +589,18 @@ typedef bool RType; return RType(); } +int Gxw::Regler::on_input_value(void * spin, void * new_val) +{ + BaseClassType *const base = static_cast( + g_type_class_peek_parent(G_OBJECT_GET_CLASS(gobject_)) // Get the parent class of the object class (The original underlying C class). + ); + + if(base && base->input_value) + return (*base->input_value)(gobj(),spin,new_val); + + typedef int RType; + return RType(); +} Glib::ustring Gxw::Regler::on_format_value(double value) { BaseClassType *const base = static_cast( diff -Nru guitarix-0.22.4/libgxwmm/gxwmm-generated/regler.h guitarix-0.24.2/libgxwmm/gxwmm-generated/regler.h --- guitarix-0.22.4/libgxwmm/gxwmm-generated/regler.h 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/libgxwmm/gxwmm-generated/regler.h 2012-10-20 03:56:02.000000000 +0000 @@ -93,6 +93,8 @@ //Default Signal Handlers:: /// This is a default handler for the signal signal_value_entry(). virtual bool on_value_entry(const Gdk::Rectangle& p1, GdkEventButton* p2); + /// This is a default handler for the signal signal_input_value(). + virtual int on_input_value(void * spin, void * new_val); /// This is a default handler for the signal signal_format_value(). virtual Glib::ustring on_format_value(double value); @@ -122,6 +124,15 @@ Glib::SignalProxy2< bool,const Gdk::Rectangle&,GdkEventButton* > signal_value_entry(); + +/** + * @par Slot Prototype: + * int on_my_%input_value(void * spin, void * new_val) + * + */ + + Glib::SignalProxy2< int,void *,void * > signal_input_value(); + #ifdef GLIBMM_PROPERTIES_ENABLED /** GtkLabel for caption. * diff -Nru guitarix-0.22.4/libgxwmm/gxwmm-generated/wrap_init.cc guitarix-0.24.2/libgxwmm/gxwmm-generated/wrap_init.cc --- guitarix-0.22.4/libgxwmm/gxwmm-generated/wrap_init.cc 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/libgxwmm/gxwmm-generated/wrap_init.cc 2012-10-20 03:56:02.000000000 +0000 @@ -23,6 +23,7 @@ #include "meterscale.h" #include "minislider.h" #include "paintbox.h" +#include "portdisplay.h" #include "racktuner.h" #include "radiobutton.h" #include "regler.h" @@ -53,6 +54,7 @@ GType gx_meter_scale_get_type(void); GType gx_mini_slider_get_type(void); GType gx_paint_box_get_type(void); +GType gx_port_display_get_type(void); GType gx_rack_tuner_get_type(void); GType gx_radio_button_get_type(void); GType gx_regler_get_type(void); @@ -87,6 +89,7 @@ class MeterScale_Class { public: static Glib::ObjectBase* wrap_new(GObject*); }; class MiniSlider_Class { public: static Glib::ObjectBase* wrap_new(GObject*); }; class PaintBox_Class { public: static Glib::ObjectBase* wrap_new(GObject*); }; +class PortDisplay_Class { public: static Glib::ObjectBase* wrap_new(GObject*); }; class RackTuner_Class { public: static Glib::ObjectBase* wrap_new(GObject*); }; class RadioButton_Class { public: static Glib::ObjectBase* wrap_new(GObject*); }; class Regler_Class { public: static Glib::ObjectBase* wrap_new(GObject*); }; @@ -118,6 +121,7 @@ Glib::wrap_register(gx_meter_scale_get_type(), &MeterScale_Class::wrap_new); Glib::wrap_register(gx_mini_slider_get_type(), &MiniSlider_Class::wrap_new); Glib::wrap_register(gx_paint_box_get_type(), &PaintBox_Class::wrap_new); + Glib::wrap_register(gx_port_display_get_type(), &PortDisplay_Class::wrap_new); Glib::wrap_register(gx_rack_tuner_get_type(), &RackTuner_Class::wrap_new); Glib::wrap_register(gx_radio_button_get_type(), &RadioButton_Class::wrap_new); Glib::wrap_register(gx_regler_get_type(), &Regler_Class::wrap_new); @@ -145,6 +149,7 @@ MeterScale::get_type(); MiniSlider::get_type(); PaintBox::get_type(); + PortDisplay::get_type(); RackTuner::get_type(); RadioButton::get_type(); Regler::get_type(); diff -Nru guitarix-0.22.4/libgxwmm/gxwmm.h guitarix-0.24.2/libgxwmm/gxwmm.h --- guitarix-0.22.4/libgxwmm/gxwmm.h 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/libgxwmm/gxwmm.h 2012-10-20 03:56:02.000000000 +0000 @@ -40,5 +40,6 @@ #include #include #include +#include #endif /* __GXWMM_H__ */ diff -Nru guitarix-0.22.4/pixmaps/wscript guitarix-0.24.2/pixmaps/wscript --- guitarix-0.22.4/pixmaps/wscript 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/pixmaps/wscript 2012-10-20 03:56:02.000000000 +0000 @@ -21,4 +21,4 @@ pass def build(bld): - bld.install_files(bld.env['GX_PIXMAPS_DIR'], pixmap_files, chmod=0644) + bld.install_files(bld.env['GX_PIXMAPS_DIR'], pixmap_files, chmod=0o644) diff -Nru guitarix-0.22.4/rcstyles/common.rc guitarix-0.24.2/rcstyles/common.rc --- guitarix-0.22.4/rcstyles/common.rc 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/rcstyles/common.rc 2012-10-20 03:56:02.000000000 +0000 @@ -66,6 +66,10 @@ style "guitarix_waveview" { + GxWaveView::box-gradient = { + { 26214, 65536, 13107, 0, 52428 }, # 0.4, 1, 0.2, 0, 0.8 + { 52428, 13107, 65536, 13107, 52428 }} # 0.8, 0.2, 1, 0.2, 0.8 + fg[NORMAL] = { 0.48, 0.48, 0.12 } # RGBA: 0.8, 0.8, 0.2, 0.6 font_name = "sans 6" } diff -Nru guitarix-0.22.4/rcstyles/gx_head_gx1-alloy.rc guitarix-0.24.2/rcstyles/gx_head_gx1-alloy.rc --- guitarix-0.22.4/rcstyles/gx_head_gx1-alloy.rc 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/rcstyles/gx_head_gx1-alloy.rc 2012-10-20 03:56:02.000000000 +0000 @@ -69,7 +69,11 @@ { 65536, 0, 0, 13107, 52428 }, # 1, 0, 0, 0.2, 0.8 { 52428, 0, 0, 0, 52428 }, # 0.8, 0, 0, 0, 0.8 { 13107, 0, 0, 13107, 13107 }} # 0.2, 0, 0, 0.2, 0.2 - + + GxPaintBox::rack-gradient = { + { 65536, 0, 0, 0, 52428 }, # 1, 0, 0, 0.2, 0.9 + { 52428, 0, 0, 0, 52428 }, # 0.8, 0, 0, 0, 0.8 + { 13107, 0, 0, 0, 52428 }} # 0.2, 0, 0, 0.2, 0.8 GxPaintBox::width =600 GxPaintBox::height =180 stock["main_image"] = {{"gx18.png"}} diff -Nru guitarix-0.22.4/rcstyles/gx_head_gx2-emerald.rc guitarix-0.24.2/rcstyles/gx_head_gx2-emerald.rc --- guitarix-0.22.4/rcstyles/gx_head_gx2-emerald.rc 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/rcstyles/gx_head_gx2-emerald.rc 2012-10-20 03:56:02.000000000 +0000 @@ -57,16 +57,20 @@ style "gx2_head-paintbox" { -GxPaintBox::skin-gradient = { -{ 0, 9830, 19661, 9830, 65536 }, # 0, 0.3, 0.3, 0.3 ,1 -{ 32768, 6554, 9830, 6554, 65536 }, # 0.5, 0.15, 0.15, 0.15, 1 -{ 65536, 6554, 6554, 6554, 65536 }} # 1, 0.1, 0.1, 0.1, 1 + GxPaintBox::skin-gradient = { + { 0, 9830, 19661, 9830, 65536 }, # 0, 0.3, 0.3, 0.3 ,1 + { 32768, 6554, 9830, 6554, 65536 }, # 0.5, 0.15, 0.15, 0.15, 1 + { 65536, 6554, 6554, 6554, 65536 }} # 1, 0.1, 0.1, 0.1, 1 GxPaintBox::box-gradient = { { 65536, 0, 0, 13107, 52428 }, # 1, 0, 0, 0.2, 0.8 { 52428, 0, 0, 0, 52428 }, # 0.8, 0, 0, 0, 0.8 { 13107, 0, 0, 13107, 13107 }} # 0.2, 0, 0, 0.2, 0.2 + GxPaintBox::rack-gradient = { + { 65536, 0, 2768, 0, 62428 }, # 1, 0, 0, 0.2, 0.9 + { 52428, 0, 3107, 0, 52428 }, # 0.8, 0, 0, 0, 0.8 + { 13107, 0, 0, 0, 42428 }} # 0.2, 0, 0, 0.2, 0.8 GxPaintBox::icon-set =2 GxPaintBox::width =600 GxPaintBox::height =180 diff -Nru guitarix-0.22.4/rcstyles/gx_head_gx3-dezert.rc guitarix-0.24.2/rcstyles/gx_head_gx3-dezert.rc --- guitarix-0.22.4/rcstyles/gx_head_gx3-dezert.rc 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/rcstyles/gx_head_gx3-dezert.rc 2012-10-20 03:56:02.000000000 +0000 @@ -73,6 +73,11 @@ { 32768, 9830, 9830, 9830, 65536 }, # 0.5, 0.15, 0.15, 1 { 65536, 6554, 6554, 6554, 65536 }} # 1, 0.1, 0.1, 0.1, 1 + GxPaintBox::rack-gradient = { + { 65536, 0, 0, 0, 52428 }, # 1, 0, 0, 0.2, 0.9 + { 52428, 0, 0, 0, 52428 }, # 0.8, 0, 0, 0, 0.8 + { 13107, 0, 0, 0, 52428 }} # 0.2, 0, 0, 0.2, 0.8 + GxPaintBox::width =600 GxPaintBox::height =180 stock["main_image"] = {{"gx-dezert_18.png"}} diff -Nru guitarix-0.22.4/rcstyles/gx_head_gx4-black.rc guitarix-0.24.2/rcstyles/gx_head_gx4-black.rc --- guitarix-0.22.4/rcstyles/gx_head_gx4-black.rc 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/rcstyles/gx_head_gx4-black.rc 2012-10-20 03:56:02.000000000 +0000 @@ -69,6 +69,11 @@ { 52428, 0, 0, 0, 52428 }, # 0.8, 0, 0, 0, 0.8 { 13107, 0, 0, 0, 13107 }} # 0.2, 0, 0, 0., 0.2 + GxPaintBox::rack-gradient = { + { 65536, 0, 0, 0, 52428 }, # 1, 0, 0, 0.2, 0.9 + { 52428, 0, 0, 0, 52428 }, # 0.8, 0, 0, 0, 0.8 + { 13107, 0, 0, 0, 52428 }} # 0.2, 0, 0, 0.2, 0.8 + GxPaintBox::width =600 GxPaintBox::height =180 stock["main_image"] = {{"gx_black18.png"}} diff -Nru guitarix-0.22.4/rcstyles/gx_head_gx5-gree.rc guitarix-0.24.2/rcstyles/gx_head_gx5-gree.rc --- guitarix-0.22.4/rcstyles/gx_head_gx5-gree.rc 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/rcstyles/gx_head_gx5-gree.rc 2012-10-20 03:56:02.000000000 +0000 @@ -69,6 +69,11 @@ { 0, 0, 0, 0, 52428 }, # 0.8, 0, 0, 0, 0.8 { 13107, 13107, 13107, 13107, 39321 }} # 0.2, 0.2, 0.2, 0.2, 0.6 + GxPaintBox::rack-gradient = { + { 65536, 0, 0, 0, 52428 }, # 1, 0, 0, 0.2, 0.9 + { 52428, 0, 0, 0, 52428 }, # 0.8, 0, 0, 0, 0.8 + { 13107, 0, 0, 0, 52428 }} # 0.2, 0, 0, 0.2, 0.8 + GxPaintBox::width =600 GxPaintBox::height =180 stock["main_image"] = {{"gx_gree18.png"}} diff -Nru guitarix-0.22.4/rcstyles/gx_head_gx6-blue.rc guitarix-0.24.2/rcstyles/gx_head_gx6-blue.rc --- guitarix-0.22.4/rcstyles/gx_head_gx6-blue.rc 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/rcstyles/gx_head_gx6-blue.rc 2012-10-20 03:56:02.000000000 +0000 @@ -71,6 +71,11 @@ { 52428, 0, 0, 0, 52428 }, # 0.8, 0, 0, 0, 0.8 { 13107, 0, 0, 13107, 13107 }} # 0.2, 0, 0, 0.2, 0.2 + GxPaintBox::rack-gradient = { + { 65536, 0, 0, 0, 52428 }, # 1, 0, 0, 0.2, 0.9 + { 52428, 0, 0, 0, 52428 }, # 0.8, 0, 0, 0, 0.8 + { 13107, 0, 0, 0, 42428 }} # 0.2, 0, 0, 0.2, 0.8 + GxPaintBox::width =600 GxPaintBox::height =180 stock["main_image"] = {{"gx_steal.png"}} diff -Nru guitarix-0.22.4/rcstyles/gx_head_gx7-blues.rc guitarix-0.24.2/rcstyles/gx_head_gx7-blues.rc --- guitarix-0.22.4/rcstyles/gx_head_gx7-blues.rc 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/rcstyles/gx_head_gx7-blues.rc 2012-10-20 03:56:02.000000000 +0000 @@ -71,6 +71,11 @@ { 52428, 0, 0, 0, 52428 }, # 0.8, 0, 0, 0, 0.8 { 13107, 0, 0, 13107, 13107 }} # 0.2, 0, 0, 0.2, 0.2 + GxPaintBox::rack-gradient = { + { 65536, 0, 0, 2768, 52428 }, # 1, 0, 0, 0.2, 0.9 + { 52428, 0, 0, 3107, 52428 }, # 0.8, 0, 0, 0, 0.8 + { 13107, 0, 0, 0, 42428 }} # 0.2, 0, 0, 0.2, 0.8 + GxPaintBox::width =600 GxPaintBox::height =180 stock["main_image"] = {{"gx_steal.png"}} @@ -518,3 +523,4 @@ widget "*.MonoBox.*GtkLabel" style:highest "gx_head_blue-rack" widget "*.*GtkFrame.*GtkLabel" style:highest "gx_head_blue-rack-group" +widget "*.*GtkToolPalette.*GtkLabel" style:highest "gx_head_blue-rack-group" diff -Nru guitarix-0.22.4/rcstyles/wscript guitarix-0.24.2/rcstyles/wscript --- guitarix-0.22.4/rcstyles/wscript 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/rcstyles/wscript 2012-10-20 03:56:02.000000000 +0000 @@ -52,5 +52,5 @@ pass def build(bld): - bld.install_files(bld.env['GX_STYLE_DIR'], gxstyle_files, chmod=0644) + bld.install_files(bld.env['GX_STYLE_DIR'], gxstyle_files, chmod=0o644) diff -Nru guitarix-0.22.4/src/faust/biquad.dsp guitarix-0.24.2/src/faust/biquad.dsp --- guitarix-0.22.4/src/faust/biquad.dsp 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/src/faust/biquad.dsp 2012-10-20 03:56:02.000000000 +0000 @@ -1,4 +1,5 @@ declare name "BiQuad Filter"; +declare category "Tone control"; import("music.lib"); import("filter.lib"); diff -Nru guitarix-0.22.4/src/faust/chorus.dsp guitarix-0.24.2/src/faust/chorus.dsp --- guitarix-0.22.4/src/faust/chorus.dsp 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/src/faust/chorus.dsp 2012-10-20 03:56:02.000000000 +0000 @@ -1,4 +1,5 @@ declare name "Chorus"; +declare category "Modulation"; /* Stereo chorus. */ diff -Nru guitarix-0.22.4/src/faust/chorus_mono.dsp guitarix-0.24.2/src/faust/chorus_mono.dsp --- guitarix-0.22.4/src/faust/chorus_mono.dsp 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/src/faust/chorus_mono.dsp 2012-10-20 03:56:02.000000000 +0000 @@ -1,4 +1,5 @@ declare name "Chorus Mono"; +declare category "Modulation"; declare author "Albert Graef"; declare version "1.0"; diff -Nru guitarix-0.22.4/src/faust/compressor.dsp guitarix-0.24.2/src/faust/compressor.dsp --- guitarix-0.22.4/src/faust/compressor.dsp 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/src/faust/compressor.dsp 2012-10-20 03:56:02.000000000 +0000 @@ -1,4 +1,5 @@ declare name "Compressor"; +declare category "Guitar Effects"; /* Compressor unit. */ diff -Nru guitarix-0.22.4/src/faust/delay.dsp guitarix-0.24.2/src/faust/delay.dsp --- guitarix-0.22.4/src/faust/delay.dsp 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/src/faust/delay.dsp 2012-10-20 03:56:02.000000000 +0000 @@ -1,4 +1,5 @@ declare name "Delay"; +declare category "Echo / Delay"; import("music.lib"); import("guitarix.lib"); diff -Nru guitarix-0.22.4/src/faust/echo.dsp guitarix-0.24.2/src/faust/echo.dsp --- guitarix-0.22.4/src/faust/echo.dsp 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/src/faust/echo.dsp 2012-10-20 03:56:02.000000000 +0000 @@ -1,4 +1,5 @@ declare name "Echo"; +declare category "Echo / Delay"; declare version "0.01"; declare author "brummer"; diff -Nru guitarix-0.22.4/src/faust/expander.dsp guitarix-0.24.2/src/faust/expander.dsp --- guitarix-0.22.4/src/faust/expander.dsp 1970-01-01 00:00:00.000000000 +0000 +++ guitarix-0.24.2/src/faust/expander.dsp 2012-10-20 03:56:02.000000000 +0000 @@ -0,0 +1,48 @@ + +/* Expander unit. */ + +/* This is pretty much the same as compressor.dsp, but here the given ratio is + applied to *attenuate* levels *below* the threshold. */ + +declare name "Expander"; +declare category "Guitar Effects"; + +declare description "expander unit"; +declare author "Albert Graef"; +declare version "1.0"; + +import("music.lib"); + +/* Controls. */ + +ratio = nentry("ratio", 2, 1, 20, 0.1); +threshold = nentry("threshold", -40, -96, 10, 0.1); +knee = nentry("knee", 3, 0, 20, 0.1); + +attack = hslider("attack", 0.001, 0, 1, 0.001) : max(1/SR); +release = hslider("release", 0.1, 0, 10, 0.01) : max(1/SR); + +t = 0.1; +g = exp(-1/(SR*t)); +env = abs : *(1-g) : + ~ *(g); +rms = sqr : *(1-g) : + ~ *(g) : sqrt; +sqr(x) = x*x; + +env2(x) = max(env(x)); + +expand(env) = level*(1-r) +with { + level = env : h ~ _ : linear2db : (threshold+knee-_) : max(0) + with { + h(x,y) = f*x+(1-f)*y with { f = (x=y)*gr; }; + ga = exp(-1/(SR*attack)); + gr = exp(-1/(SR*release)); + }; + p = level/(knee+eps) : max(0) : min(1) with { eps = 0.001; }; + r = 1-p+p*ratio; +}; + +process(x) = (g(x)*x) +with { + g = env2(x) : expand : db2linear; +}; diff -Nru guitarix-0.22.4/src/faust/flanger.dsp guitarix-0.24.2/src/faust/flanger.dsp --- guitarix-0.22.4/src/faust/flanger.dsp 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/src/faust/flanger.dsp 2012-10-20 03:56:02.000000000 +0000 @@ -1,5 +1,6 @@ declare id "flanger"; declare name "Flanger"; +declare category "Modulation"; declare license "BSD"; import("effect.lib"); diff -Nru guitarix-0.22.4/src/faust/flanger_mono.dsp guitarix-0.24.2/src/faust/flanger_mono.dsp --- guitarix-0.22.4/src/faust/flanger_mono.dsp 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/src/faust/flanger_mono.dsp 2012-10-20 03:56:02.000000000 +0000 @@ -1,5 +1,6 @@ -declare name "Flanger Mono"; declare id "flanger_mono"; +declare name "Flanger Mono"; +declare category "Modulation"; declare license "BSD"; import("effect.lib"); diff -Nru guitarix-0.22.4/src/faust/freeverb.dsp guitarix-0.24.2/src/faust/freeverb.dsp --- guitarix-0.22.4/src/faust/freeverb.dsp 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/src/faust/freeverb.dsp 2012-10-20 03:56:02.000000000 +0000 @@ -1,4 +1,5 @@ declare name "Freeverb"; +declare category "Reverb"; declare version "0.01"; declare author "brummer"; diff -Nru guitarix-0.22.4/src/faust/guitarix.lib guitarix-0.24.2/src/faust/guitarix.lib --- guitarix-0.22.4/src/faust/guitarix.lib 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/src/faust/guitarix.lib 2012-10-20 03:56:02.000000000 +0000 @@ -84,11 +84,11 @@ TB_6C16_250k = fconstant(int TUBE_TABLE_6C16_250k, "valve.h"); tubestageF(tb,vplus,divider,fck,Rk,Vk0) = tube : hpf with { - lpfk = lowpass1(fck); + lpfk = lowpass(1,fck); Rp = 100.0e3; VkC = Vk0 * (Rp/Rk); tube = (+ : -(Vk0) : Ftube(tb) : +(VkC-vplus)) ~ (*(Rk/Rp) : lpfk) : /(divider); - hpf = highpass1(31.0); + hpf = highpass(1,31.0); }; tubestage(tb,fck,Rk,Vk0) = tubestageF(tb,250.0,40.0,fck,Rk,Vk0); @@ -194,7 +194,7 @@ }; }; -tonestack(tse) = 1/A0*tf3(B0,B1,B2,B3,A1/A0,A2/A0,A3/A0) with { +tonestack(tse) = 1/A0*iir((B0,B1,B2,B3),(A1/A0,A2/A0,A3/A0)) with { C1 = tse.C1; C2 = tse.C2; C3 = tse.C3; diff -Nru guitarix-0.22.4/src/faust/gx_ampmodul.dsp guitarix-0.24.2/src/faust/gx_ampmodul.dsp --- guitarix-0.22.4/src/faust/gx_ampmodul.dsp 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/src/faust/gx_ampmodul.dsp 2012-10-20 03:56:02.000000000 +0000 @@ -1,5 +1,6 @@ declare id "ampmodul"; declare name "Postamp"; +declare category "Distortion"; declare groups "amp2.stage1[Postamp Tube1], amp2.stage2[Postamp Tube2]"; import("guitarix.lib"); diff -Nru guitarix-0.22.4/src/faust/gx_distortion.dsp guitarix-0.24.2/src/faust/gx_distortion.dsp --- guitarix-0.22.4/src/faust/gx_distortion.dsp 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/src/faust/gx_distortion.dsp 2012-10-20 03:56:02.000000000 +0000 @@ -1,4 +1,6 @@ declare name "Multi Band Distortion"; +declare shortname "Distortion"; +declare category "Distortion"; declare groups "resonator[Distortion resonator]"; declare version "0.01"; declare author "brummer"; @@ -124,7 +126,7 @@ distortion2 = _:cubicnl(drive2,drivelevel) : *(high_gain); distortion3 = _:cubicnl(drive3,drivelevel) : *(middle_gain_l); distortion4 = _:cubicnl(drive4,drivelevel) : *(middle_gain_h); -distortion = lowpassN(2,15000.0): highpass1(31.0) : filterbankN((F,(F1,F2))) : distortion2,distortion4 ,distortion3,distortion1 :>lowpass1(6531.0); +distortion = lowpassN(2,15000.0): highpass(1,31.0) : filterbankN((F,(F1,F2))) : distortion2,distortion4 ,distortion3,distortion1 :>lowpass(1,6531.0); //-resonator resonator = (+ <: (delay(4096, d-1) + delay(4096, d)) / 2) ~ *(1.0-a) diff -Nru guitarix-0.22.4/src/faust/gx_feedback.dsp guitarix-0.24.2/src/faust/gx_feedback.dsp --- guitarix-0.22.4/src/faust/gx_feedback.dsp 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/src/faust/gx_feedback.dsp 2012-10-20 03:56:02.000000000 +0000 @@ -1,5 +1,6 @@ declare id "feedback"; declare name "Feedback"; +declare category "Tone control"; import("guitarix.lib"); diff -Nru guitarix-0.22.4/src/faust/gxamp.dsp guitarix-0.24.2/src/faust/gxamp.dsp --- guitarix-0.22.4/src/faust/gxamp.dsp 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/src/faust/gxamp.dsp 2012-10-20 03:56:02.000000000 +0000 @@ -14,8 +14,8 @@ hgroup("stage2", stage2) with { stage1 = tubestage(TB_12AX7_68k,86.0,2700.0,1.581656) : *(preamp): - lowpass1(6531.0) : tubestage(TB_12AX7_250k,132.0,1500.0,1.204285) : *(preamp); - stage2 = lowpass1(6531.0) : tubestage(TB_12AX7_250k,194.0,820.0,0.840703) : *(gain1); + lowpass(1,6531.0) : tubestage(TB_12AX7_250k,132.0,1500.0,1.204285) : *(preamp); + stage2 = lowpass(1,6531.0) : tubestage(TB_12AX7_250k,194.0,820.0,0.840703) : *(gain1); }; diff -Nru guitarix-0.22.4/src/faust/gxamp10.dsp guitarix-0.24.2/src/faust/gxamp10.dsp --- guitarix-0.22.4/src/faust/gxamp10.dsp 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/src/faust/gxamp10.dsp 2012-10-20 03:56:02.000000000 +0000 @@ -14,8 +14,8 @@ hgroup("stage2", stage2) with { stage1 = tubestage130_20(TB_6DJ8_68k,86.0,2700.0,1.863946) : *(preamp): - lowpass1(6531.0) : tubestage130_20(TB_6DJ8_250k,132.0,1500.0,1.271609) : *(preamp) ; - stage2 = lowpass1(6531.0) <: ( tubestage130_20(TB_6DJ8_68k,194.0,820.0,0.799031), tubestage130_20(TB_6DJ8_250k,194.0,820.0,0.797043)) :> *(gain1); + lowpass(1,6531.0) : tubestage130_20(TB_6DJ8_250k,132.0,1500.0,1.271609) : *(preamp) ; + stage2 = lowpass(1,6531.0) <: ( tubestage130_20(TB_6DJ8_68k,194.0,820.0,0.799031), tubestage130_20(TB_6DJ8_250k,194.0,820.0,0.797043)) :> *(gain1); } ; diff -Nru guitarix-0.22.4/src/faust/gxamp11.dsp guitarix-0.24.2/src/faust/gxamp11.dsp --- guitarix-0.22.4/src/faust/gxamp11.dsp 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/src/faust/gxamp11.dsp 2012-10-20 03:56:02.000000000 +0000 @@ -29,8 +29,8 @@ with { stage1 = tubestage130_10(TB_12AU7_68k,86.0,2700.0,1.257240) : - ~ tubestage130_10(TB_12AU7_250k,132.0,1500.0,0.776162) : *(preamp): - lowpass1(6531.0) : tubestage130_10(TB_12AU7_250k,132.0,1500.0,0.776162): + ~ tubestage130_10(TB_12AU7_250k,194.0,820.0,0.445487) ; - stage2 = lowpass1(6531.0) : tubestage130_10(TB_12AU7_250k,194.0,820.0,0.445487) : *(gain1); + lowpass(1,6531.0) : tubestage130_10(TB_12AU7_250k,132.0,1500.0,0.776162): + ~ tubestage130_10(TB_12AU7_250k,194.0,820.0,0.445487) ; + stage2 = lowpass(1,6531.0) : tubestage130_10(TB_12AU7_250k,194.0,820.0,0.445487) : *(gain1); } ; diff -Nru guitarix-0.22.4/src/faust/gxamp12.dsp guitarix-0.24.2/src/faust/gxamp12.dsp --- guitarix-0.22.4/src/faust/gxamp12.dsp 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/src/faust/gxamp12.dsp 2012-10-20 03:56:02.000000000 +0000 @@ -29,8 +29,8 @@ preamp = vslider(".amp2.stage1.Pregain[alias]",0,-20,20,0.1) : db2linear : smoothi(0.999); */ stage1 = *(preamp): tubestage130_20(TB_6DJ8_68k,86.0,2700.0,1.863946) : - lowpass1(6531.0) : tubestage130_20(TB_6DJ8_250k,132.0,1500.0,1.271609) :tubestage130_20(TB_6DJ8_250k,194.0,820.0,0.797043); - stage2 = lowpass1(6531.0) : *(gain1) <: (tubestage(TB_6V6_250k,6531.0,820.0,1.130462),tubestage(TB_6V6_68k,6531.0,820.0,1.130740)) :> _ + lowpass(1,6531.0) : tubestage130_20(TB_6DJ8_250k,132.0,1500.0,1.271609) :tubestage130_20(TB_6DJ8_250k,194.0,820.0,0.797043); + stage2 = lowpass(1,6531.0) : *(gain1) <: (tubestage(TB_6V6_250k,6531.0,820.0,1.130462),tubestage(TB_6V6_68k,6531.0,820.0,1.130740)) :> _ with { gain1 = ampctrl.gain1; /* diff -Nru guitarix-0.22.4/src/faust/gxamp13.dsp guitarix-0.24.2/src/faust/gxamp13.dsp --- guitarix-0.22.4/src/faust/gxamp13.dsp 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/src/faust/gxamp13.dsp 2012-10-20 03:56:02.000000000 +0000 @@ -29,8 +29,8 @@ atten = 0.6; stage1 = tubestage130_20(TB_6DJ8_68k,86.0,2700.0,1.863946) : - ~ (atten*tubestage130_20(TB_6DJ8_250k,132.0,1500.0,1.271609)) : *(preamp): - lowpass1(6531.0) : tubestage130_20(TB_6DJ8_250k,132.0,1500.0,1.271609): + ~ (atten*tubestage130_20(TB_6DJ8_250k,194.0,820.0,0.797043)); - stage2 = lowpass1(6531.0) : tubestage130_20(TB_6DJ8_250k,194.0,820.0,0.797043) : *(gain1); + lowpass(1,6531.0) : tubestage130_20(TB_6DJ8_250k,132.0,1500.0,1.271609): + ~ (atten*tubestage130_20(TB_6DJ8_250k,194.0,820.0,0.797043)); + stage2 = lowpass(1,6531.0) : tubestage130_20(TB_6DJ8_250k,194.0,820.0,0.797043) : *(gain1); }; diff -Nru guitarix-0.22.4/src/faust/gxamp14.dsp guitarix-0.24.2/src/faust/gxamp14.dsp --- guitarix-0.22.4/src/faust/gxamp14.dsp 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/src/faust/gxamp14.dsp 2012-10-20 03:56:02.000000000 +0000 @@ -17,8 +17,8 @@ with { stage1 = tubestage(TB_12AT7_68k,86.0,2700.0,2.617753) : *(preamp): - lowpass1(6531.0) : tubestage(TB_12AT7_250k,132.0,1500.0,1.887332) : *(preamp); - stage2 = lowpass1(6531.0) : tubestage(TB_12AT7_250k,194.0,820.0,1.256962) : *(gain1); + lowpass(1,6531.0) : tubestage(TB_12AT7_250k,132.0,1500.0,1.887332) : *(preamp); + stage2 = lowpass(1,6531.0) : tubestage(TB_12AT7_250k,194.0,820.0,1.256962) : *(gain1); } ; diff -Nru guitarix-0.22.4/src/faust/gxamp15.dsp guitarix-0.24.2/src/faust/gxamp15.dsp --- guitarix-0.22.4/src/faust/gxamp15.dsp 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/src/faust/gxamp15.dsp 2012-10-20 03:56:02.000000000 +0000 @@ -30,8 +30,8 @@ preamp = vslider(".amp2.stage1.Pregain[alias]",0,-20,20,0.1) : db2linear : smoothi(0.999); */ stage1 = *(preamp): tubestage(TB_12AT7_68k,86.0,2700.0,2.617753) : - lowpass1(6531.0) : tubestage(TB_12AT7_250k,132.0,1500.0,1.887332) :tubestage(TB_12AT7_250k,194.0,820.0,1.256962); - stage2 = lowpass1(6531.0) : *(gain1) <: (tubestage(TB_6V6_250k,6531.0,820.0,1.130462),tubestage(TB_6V6_68k,6531.0,820.0,1.130740)) :> _ + lowpass(1,6531.0) : tubestage(TB_12AT7_250k,132.0,1500.0,1.887332) :tubestage(TB_12AT7_250k,194.0,820.0,1.256962); + stage2 = lowpass(1,6531.0) : *(gain1) <: (tubestage(TB_6V6_250k,6531.0,820.0,1.130462),tubestage(TB_6V6_68k,6531.0,820.0,1.130740)) :> _ with { gain1 = ampctrl.gain1; /* diff -Nru guitarix-0.22.4/src/faust/gxamp16.dsp guitarix-0.24.2/src/faust/gxamp16.dsp --- guitarix-0.22.4/src/faust/gxamp16.dsp 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/src/faust/gxamp16.dsp 2012-10-20 03:56:02.000000000 +0000 @@ -34,8 +34,8 @@ atten = 0.6; stage1 = speakerbp(310.0, 12000.0) : *(preamp) : (tubestage(TB_12AT7_68k,86.0,2700.0,2.617753) : + ~ (atten*tubestage(TB_12AT7_250k,132.0,1500.0,1.887333))): - lowpass1(6531.0) : (tubestage(TB_12AT7_250k,132.0,1500.0,1.887333) : + ~ (atten*tubestage(TB_12AT7_250k,194.0,820.0,1.256962))) : tubestage(TB_12AT7_250k,194.0,820.0,1.256962); - stage2 = lowpass1(6531.0) : *(gain1) <: ((min(0.7,tubestage(TB_6V6_250k,6531.0,410.0,0.659761))),(max(-0.75,tubestage(TB_6V6_68k,6531.0,410.0,0.664541)))) :> + lowpass(1,6531.0) : (tubestage(TB_12AT7_250k,132.0,1500.0,1.887333) : + ~ (atten*tubestage(TB_12AT7_250k,194.0,820.0,1.256962))) : tubestage(TB_12AT7_250k,194.0,820.0,1.256962); + stage2 = lowpass(1,6531.0) : *(gain1) <: ((min(0.7,tubestage(TB_6V6_250k,6531.0,410.0,0.659761))),(max(-0.75,tubestage(TB_6V6_68k,6531.0,410.0,0.664541)))) :> notch1 : notch2 : notch3 with { gain1 = ampctrl.gain1; diff -Nru guitarix-0.22.4/src/faust/gxamp17.dsp guitarix-0.24.2/src/faust/gxamp17.dsp --- guitarix-0.22.4/src/faust/gxamp17.dsp 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/src/faust/gxamp17.dsp 2012-10-20 03:56:02.000000000 +0000 @@ -30,8 +30,8 @@ atten = 0.6; stage1 = tubestage(TB_12AT7_68k,86.0,2700.0,2.617753) : - ~ (atten*tubestage(TB_12AT7_250k,132.0,1500.0,1.887332)) : *(preamp): - lowpass1(6531.0) : tubestage(TB_12AT7_250k,132.0,1500.0,1.887332): + ~ (atten*tubestage(TB_12AT7_250k,194.0,820.0,1.256962)); - stage2 = lowpass1(6531.0) : tubestage(TB_12AT7_250k,194.0,820.0,1.256962) : *(gain1); + lowpass(1,6531.0) : tubestage(TB_12AT7_250k,132.0,1500.0,1.887332): + ~ (atten*tubestage(TB_12AT7_250k,194.0,820.0,1.256962)); + stage2 = lowpass(1,6531.0) : tubestage(TB_12AT7_250k,194.0,820.0,1.256962) : *(gain1); } ; diff -Nru guitarix-0.22.4/src/faust/gxamp18.dsp guitarix-0.24.2/src/faust/gxamp18.dsp --- guitarix-0.22.4/src/faust/gxamp18.dsp 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/src/faust/gxamp18.dsp 2012-10-20 03:56:02.000000000 +0000 @@ -15,8 +15,8 @@ hgroup("stage2", stage2) with { stage1 = tubestage(TB_6C16_68k,86.0,2700.0,2.921806) : *(preamp): - lowpass1(6531.0) : tubestage(TB_6C16_250k,132.0,1500.0,2.097743) : *(preamp); - stage2 = lowpass1(6531.0) : tubestage(TB_6C16_250k,194.0,820.0,1.378742) : *(gain1); + lowpass(1,6531.0) : tubestage(TB_6C16_250k,132.0,1500.0,2.097743) : *(preamp); + stage2 = lowpass(1,6531.0) : tubestage(TB_6C16_250k,194.0,820.0,1.378742) : *(gain1); }; diff -Nru guitarix-0.22.4/src/faust/gxamp2.dsp guitarix-0.24.2/src/faust/gxamp2.dsp --- guitarix-0.22.4/src/faust/gxamp2.dsp 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/src/faust/gxamp2.dsp 2012-10-20 03:56:02.000000000 +0000 @@ -39,8 +39,8 @@ with { stage1 = tubestage(TB_6V6_68k,86.0,2700.0,2.296150): - lowpass1(6531.0) : *(preamp) : tubestage(TB_6V6_250k,132.0,1500.0,1.675587); - stage2 = lowpass1(6531.0) : *(gain1) : tubestage(TB_6V6_250k,194.0,820.0,1.130462); + lowpass(1,6531.0) : *(preamp) : tubestage(TB_6V6_250k,132.0,1500.0,1.675587); + stage2 = lowpass(1,6531.0) : *(gain1) : tubestage(TB_6V6_250k,194.0,820.0,1.130462); }; @@ -49,8 +49,8 @@ with { stage1 = *(preamp): tubestage(TB_6V6_68k,86.0,2700.0,2.296150): *(0.77) : - lowpass1(6531.0) : *(preamp) : tubestage(TB_6V6_250k,132.0,1500.0,1.675587): *(0.77); - stage2 = lowpass1(6531.0) : *(gain1) : bifilter : tubestage(TB_6V6_250k,194.0,820.0,1.130462) : *(0.77); + lowpass(1,6531.0) : *(preamp) : tubestage(TB_6V6_250k,132.0,1500.0,1.675587): *(0.77); + stage2 = lowpass(1,6531.0) : *(gain1) : bifilter : tubestage(TB_6V6_250k,194.0,820.0,1.130462) : *(0.77); } ; diff -Nru guitarix-0.22.4/src/faust/gxamp3.dsp guitarix-0.24.2/src/faust/gxamp3.dsp --- guitarix-0.22.4/src/faust/gxamp3.dsp 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/src/faust/gxamp3.dsp 2012-10-20 03:56:02.000000000 +0000 @@ -15,8 +15,8 @@ with { stage1 = tubestage(TB_12AU7_68k,86.0,2700.0,3.718962) : *(preamp):*(2.0): - lowpass1(6531.0) : tubestage(TB_12AU7_250k,132.0,1500.0,2.314844) : *(preamp) :*(2.0); - stage2 = lowpass1(6531.0) : tubestage(TB_12AU7_250k,194.0,820.0,1.356567) : *(gain1):*(2.0); + lowpass(1,6531.0) : tubestage(TB_12AU7_250k,132.0,1500.0,2.314844) : *(preamp) :*(2.0); + stage2 = lowpass(1,6531.0) : tubestage(TB_12AU7_250k,194.0,820.0,1.356567) : *(gain1):*(2.0); } ; diff -Nru guitarix-0.22.4/src/faust/gxamp4.dsp guitarix-0.24.2/src/faust/gxamp4.dsp --- guitarix-0.22.4/src/faust/gxamp4.dsp 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/src/faust/gxamp4.dsp 2012-10-20 03:56:02.000000000 +0000 @@ -47,8 +47,8 @@ preamp = vslider(".amp2.stage1.Pregain[alias]",0,-20,20,0.1) : db2linear : smoothi(0.999); */ stage1 = *(preamp): tubestage130_10(TB_12AU7_68k,86.0,2700.0,1.257240) : - lowpass1(6531.0) : tubestage130_10(TB_12AU7_250k,132.0,1500.0,0.776162): tubestage130_10(TB_12AU7_250k,194.0,820.0,0.445487); - stage2 = lowpass1(6531.0) : *(gain1) <: (tubestage(TB_6V6_250k,6531.0,820.0,1.130462),tubestage(TB_6V6_68k,6531.0,820.0,1.130740)) :>_ + lowpass(1,6531.0) : tubestage130_10(TB_12AU7_250k,132.0,1500.0,0.776162): tubestage130_10(TB_12AU7_250k,194.0,820.0,0.445487); + stage2 = lowpass(1,6531.0) : *(gain1) <: (tubestage(TB_6V6_250k,6531.0,820.0,1.130462),tubestage(TB_6V6_68k,6531.0,820.0,1.130740)) :>_ with { gain1 = ampctrl.gain1; /* diff -Nru guitarix-0.22.4/src/faust/gxamp5.dsp guitarix-0.24.2/src/faust/gxamp5.dsp --- guitarix-0.22.4/src/faust/gxamp5.dsp 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/src/faust/gxamp5.dsp 2012-10-20 03:56:02.000000000 +0000 @@ -47,8 +47,8 @@ preamp = vslider(".amp2.stage1.Pregain[alias]",0,-20,20,0.1) : db2linear : smoothi(0.999); */ stage1 = *(preamp): tubestage(TB_12AX7_68k,86.0,2700.0,1.581656): - lowpass1(6531.0) : tubestage(TB_12AX7_250k,132.0,1500.0,1.204285):tubestage(TB_12AX7_250k,194.0,820.0,0.840703); - stage2 = lowpass1(6531.0) : *(gain1) <: (tubestage(TB_6V6_250k,6531.0,820.0,1.130462),tubestage(TB_6V6_68k,6531.0,820.0,1.130740)) :>_ + lowpass(1,6531.0) : tubestage(TB_12AX7_250k,132.0,1500.0,1.204285):tubestage(TB_12AX7_250k,194.0,820.0,0.840703); + stage2 = lowpass(1,6531.0) : *(gain1) <: (tubestage(TB_6V6_250k,6531.0,820.0,1.130462),tubestage(TB_6V6_68k,6531.0,820.0,1.130740)) :>_ with { gain1 = ampctrl.gain1; /* diff -Nru guitarix-0.22.4/src/faust/gxamp6.dsp guitarix-0.24.2/src/faust/gxamp6.dsp --- guitarix-0.22.4/src/faust/gxamp6.dsp 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/src/faust/gxamp6.dsp 2012-10-20 03:56:02.000000000 +0000 @@ -33,8 +33,8 @@ atten = 0.6; stage1 = speakerbp(310.0, 12000.0) : *(preamp): (tubestage130_20(TB_6DJ8_68k,86.0,2700.0,1.863946) : + ~ (atten*tubestage130_20(TB_6DJ8_250k,132.0,1500.0,1.271609))): - lowpass1(6531.0) : (tubestage130_20(TB_6DJ8_250k,132.0,1500.0,1.271609) : + ~ (atten*tubestage130_20(TB_6DJ8_250k,194.0,820.0,0.797043))) : tubestage130_20(TB_6DJ8_250k,194.0,820.0,0.797043) ; - stage2 = lowpass1(6531.0) : *(gain1) <: ((min(0.7,tubestage(TB_6V6_250k,6531.0,410.0,0.659761))),(max(-0.75,tubestage(TB_6V6_68k,6531.0,410.0,0.664541)))) :> + lowpass(1,6531.0) : (tubestage130_20(TB_6DJ8_250k,132.0,1500.0,1.271609) : + ~ (atten*tubestage130_20(TB_6DJ8_250k,194.0,820.0,0.797043))) : tubestage130_20(TB_6DJ8_250k,194.0,820.0,0.797043) ; + stage2 = lowpass(1,6531.0) : *(gain1) <: ((min(0.7,tubestage(TB_6V6_250k,6531.0,410.0,0.659761))),(max(-0.75,tubestage(TB_6V6_68k,6531.0,410.0,0.664541)))) :> notch1 : notch2 : notch3 with { gain1 = ampctrl.gain1; diff -Nru guitarix-0.22.4/src/faust/gxamp7.dsp guitarix-0.24.2/src/faust/gxamp7.dsp --- guitarix-0.22.4/src/faust/gxamp7.dsp 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/src/faust/gxamp7.dsp 2012-10-20 03:56:02.000000000 +0000 @@ -34,8 +34,8 @@ atten = 0.6; stage1 = speakerbp(310.0, 12000.0) : *(preamp): (tubestage(TB_12AX7_68k,86.0,2700.0,1.581656) : + ~ (atten*tubestage(TB_12AX7_250k,132.0,1500.0,1.204285))) - : lowpass1(6531.0) : (tubestage(TB_12AX7_250k,132.0,1500.0,1.204285) : + ~ (atten*tubestage(TB_12AX7_250k,194.0,820.0,0.840703))) : tubestage(TB_12AX7_250k,194.0,820.0,0.840703); - stage2 = lowpass1(6531.0) : *(gain1) <: ((min(0.7,tubestage(TB_6V6_250k,6531.0,410.0,0.659761))),(max(-0.75,tubestage(TB_6V6_68k,6531.0,410.0,0.664541)))) :> + : lowpass(1,6531.0) : (tubestage(TB_12AX7_250k,132.0,1500.0,1.204285) : + ~ (atten*tubestage(TB_12AX7_250k,194.0,820.0,0.840703))) : tubestage(TB_12AX7_250k,194.0,820.0,0.840703); + stage2 = lowpass(1,6531.0) : *(gain1) <: ((min(0.7,tubestage(TB_6V6_250k,6531.0,410.0,0.659761))),(max(-0.75,tubestage(TB_6V6_68k,6531.0,410.0,0.664541)))) :> notch1 : notch2 : notch3 with { gain1 = ampctrl.gain1; diff -Nru guitarix-0.22.4/src/faust/gxamp8.dsp guitarix-0.24.2/src/faust/gxamp8.dsp --- guitarix-0.22.4/src/faust/gxamp8.dsp 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/src/faust/gxamp8.dsp 2012-10-20 03:56:02.000000000 +0000 @@ -34,8 +34,8 @@ atten = 0.6; stage1 = speakerbp(310.0, 12000.0) : *(preamp):*(2.0): (tubestage130_10(TB_12AU7_68k,86.0,2700.0,1.257240) : + ~ (atten*tubestage130_10(TB_12AU7_250k,132.0,1500.0,0.776162))): - lowpass1(6531.0) : (tubestage130_10(TB_12AU7_250k,132.0,1500.0,0.776162) : + ~ (atten*tubestage130_10(TB_12AU7_250k,194.0,820.0,0.445487))) : tubestage130_10(TB_12AU7_250k,194.0,820.0,0.445487); - stage2 = lowpass1(6531.0) : *(gain1) <: ((min(0.7,tubestage(TB_6V6_250k,6531.0,410.0,0.659761))),(max(-0.75,tubestage(TB_6V6_68k,6531.0,410.0,0.664541)))) :> + lowpass(1,6531.0) : (tubestage130_10(TB_12AU7_250k,132.0,1500.0,0.776162) : + ~ (atten*tubestage130_10(TB_12AU7_250k,194.0,820.0,0.445487))) : tubestage130_10(TB_12AU7_250k,194.0,820.0,0.445487); + stage2 = lowpass(1,6531.0) : *(gain1) <: ((min(0.7,tubestage(TB_6V6_250k,6531.0,410.0,0.659761))),(max(-0.75,tubestage(TB_6V6_68k,6531.0,410.0,0.664541)))) :> notch1 : notch2 : notch3 with { gain1 = ampctrl.gain1; diff -Nru guitarix-0.22.4/src/faust/gxamp9.dsp guitarix-0.24.2/src/faust/gxamp9.dsp --- guitarix-0.22.4/src/faust/gxamp9.dsp 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/src/faust/gxamp9.dsp 2012-10-20 03:56:02.000000000 +0000 @@ -30,8 +30,8 @@ atten = 0.6; stage1 = tubestage(TB_12AX7_68k,86.0,2700.0,1.581656) : - ~ (atten*tubestage(TB_12AX7_250k,132.0,1500.0,1.204285)) : *(preamp): - lowpass1(6531.0) : tubestage(TB_12AX7_250k,132.0,1500.0,1.204285): + ~ (atten*tubestage(TB_12AX7_250k,194.0,820.0,0.840702)); - stage2 = lowpass1(6531.0) : tubestage(TB_12AX7_250k,194.0,820.0,0.840702) : *(gain1); + lowpass(1,6531.0) : tubestage(TB_12AX7_250k,132.0,1500.0,1.204285): + ~ (atten*tubestage(TB_12AX7_250k,194.0,820.0,0.840702)); + stage2 = lowpass(1,6531.0) : tubestage(TB_12AX7_250k,194.0,820.0,0.840702) : *(gain1); } ; diff -Nru guitarix-0.22.4/src/faust/gxdistortion.dsp guitarix-0.24.2/src/faust/gxdistortion.dsp --- guitarix-0.22.4/src/faust/gxdistortion.dsp 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/src/faust/gxdistortion.dsp 2012-10-20 03:56:02.000000000 +0000 @@ -143,7 +143,7 @@ distortion2 = _:cubicnl(0.4*drive,0.0) : *(1.584893192); // h distortion3 = _:cubicnl(1.0*drive,0.0) : *(1.584893192); //ml distortion4 = _:cubicnl(0.6*drive,0.0) : *(1.333521432); //mh -distortion = lowpassN(2,15000.0): highpass1(31.0) : filterbankN((F,(F1,F2))) : distortion2,distortion4 ,distortion3,distortion1 :>lowpass1(6531.0); +distortion = lowpassN(2,15000.0): highpass(1,31.0) : filterbankN((F,(F1,F2))) : distortion2,distortion4 ,distortion3,distortion1 :>lowpass(1,6531.0); wet_dry = (drive - 0.5) * 2; }; diff -Nru guitarix-0.22.4/src/faust/gxnoamp.dsp guitarix-0.24.2/src/faust/gxnoamp.dsp --- guitarix-0.22.4/src/faust/gxnoamp.dsp 1970-01-01 00:00:00.000000000 +0000 +++ guitarix-0.24.2/src/faust/gxnoamp.dsp 2012-10-20 03:56:02.000000000 +0000 @@ -0,0 +1,8 @@ +declare id "noamp"; // in amp tube selector +declare name "---"; + +import("guitarix.lib"); + +process = *(gain1) with { + gain1 = ampctrl.gain1; +}; diff -Nru guitarix-0.22.4/src/faust/highbooster.dsp guitarix-0.24.2/src/faust/highbooster.dsp --- guitarix-0.22.4/src/faust/highbooster.dsp 1970-01-01 00:00:00.000000000 +0000 +++ guitarix-0.24.2/src/faust/highbooster.dsp 2012-10-20 03:56:02.000000000 +0000 @@ -0,0 +1,9 @@ +declare name "Treble boost"; +declare category "Tone control"; + +import("filter.lib"); + +level = vslider("Level", 0, 0.5, 20, 0.5) ; +hfboost(level,fx,x) = x + (db2linear(level)-1)*highpass(1,fx,x); + +process = hfboost(level, 1500); diff -Nru guitarix-0.22.4/src/faust/impulseresponse.dsp guitarix-0.24.2/src/faust/impulseresponse.dsp --- guitarix-0.22.4/src/faust/impulseresponse.dsp 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/src/faust/impulseresponse.dsp 2012-10-20 03:56:02.000000000 +0000 @@ -1,5 +1,6 @@ declare id "IR"; declare name "ImpulseResponse"; +declare category "Tone control"; declare version "0.01"; declare author "brummer"; diff -Nru guitarix-0.22.4/src/faust/jconv_post_mono.dsp guitarix-0.24.2/src/faust/jconv_post_mono.dsp --- guitarix-0.22.4/src/faust/jconv_post_mono.dsp 1970-01-01 00:00:00.000000000 +0000 +++ guitarix-0.24.2/src/faust/jconv_post_mono.dsp 2012-10-20 03:56:02.000000000 +0000 @@ -0,0 +1,10 @@ +declare id "jconv_mono"; + +import("music.lib"); +import("guitarix.lib"); + +wet = vslider("wet_dry[name:wet/dry][tooltip:percentage of processed signal in output signal]", 100, 0, 100, 1) : /(100); +dry = 1 - wet; +gain = vslider("gain[name:Gain][tooltip:gain trim for processed signal (unit: dB)]", 0, -20, 20, 0.1) : db2linear : smoothi(0.999); + +process = *(dry), (*(wet): *(gain)) :>_ ; diff -Nru guitarix-0.22.4/src/faust/low_high_pass.dsp guitarix-0.24.2/src/faust/low_high_pass.dsp --- guitarix-0.22.4/src/faust/low_high_pass.dsp 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/src/faust/low_high_pass.dsp 2012-10-20 03:56:02.000000000 +0000 @@ -1,5 +1,7 @@ declare id "low_highpass"; declare name "low high pass"; +declare shortname "L/H/Filter"; +declare category "Tone control"; declare groups ".low_high_pass.lhp[low_highpass], .low_high_pass.lhc[low_highcutoff]"; declare version "0.01"; diff -Nru guitarix-0.22.4/src/faust/moog.dsp guitarix-0.24.2/src/faust/moog.dsp --- guitarix-0.22.4/src/faust/moog.dsp 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/src/faust/moog.dsp 2012-10-20 03:56:02.000000000 +0000 @@ -1,5 +1,6 @@ declare id "moog"; declare name "Moog Filter"; +declare category "Tone control"; declare license "BSD"; diff -Nru guitarix-0.22.4/src/faust/overdrive.dsp guitarix-0.24.2/src/faust/overdrive.dsp --- guitarix-0.22.4/src/faust/overdrive.dsp 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/src/faust/overdrive.dsp 2012-10-20 03:56:02.000000000 +0000 @@ -1,4 +1,5 @@ declare name "Overdrive"; +declare category "Distortion"; import("music.lib"); import("guitarix.lib"); diff -Nru guitarix-0.22.4/src/faust/phaser.dsp guitarix-0.24.2/src/faust/phaser.dsp --- guitarix-0.22.4/src/faust/phaser.dsp 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/src/faust/phaser.dsp 2012-10-20 03:56:02.000000000 +0000 @@ -1,5 +1,6 @@ declare id "phaser"; declare name "Phaser"; +declare category "Modulation"; //phaser taken from effect.lib // by Julius O. Smith III diff -Nru guitarix-0.22.4/src/faust/phaser_mono.dsp guitarix-0.24.2/src/faust/phaser_mono.dsp --- guitarix-0.22.4/src/faust/phaser_mono.dsp 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/src/faust/phaser_mono.dsp 2012-10-20 03:56:02.000000000 +0000 @@ -1,5 +1,6 @@ declare id "phaser_mono"; declare name "Phaser Mono"; +declare category "Modulation"; import("effect.lib"); diff -Nru guitarix-0.22.4/src/faust/preamp_impulse_former.dsp guitarix-0.24.2/src/faust/preamp_impulse_former.dsp --- guitarix-0.22.4/src/faust/preamp_impulse_former.dsp 1970-01-01 00:00:00.000000000 +0000 +++ guitarix-0.24.2/src/faust/preamp_impulse_former.dsp 2012-10-20 03:56:02.000000000 +0000 @@ -0,0 +1,16 @@ +//declare name "Preamp Impulse Former"; +declare id "pre"; + +import("music.lib"); +import("guitarix.lib"); + +gain = vslider("Level[alias]", 1, 0.1, 2.1, 0.1) ; + +bass_gain = vslider("bass[name:bass][alias]", 0, -10, 10, 0.5); + +treble_gain = vslider("treble[name:treble][alias]", 0, -10, 10, 0.5); + +tone = component("tone.dsp").gxlow_shelf(300,bass_gain): + component("tone.dsp").gxhigh_shelf(2400,treble_gain); + +process = tone : *(gain * pow(10, -0.1 * gain)); // FIXME diff -Nru guitarix-0.22.4/src/faust/selecteq.dsp guitarix-0.24.2/src/faust/selecteq.dsp --- guitarix-0.22.4/src/faust/selecteq.dsp 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/src/faust/selecteq.dsp 2012-10-20 03:56:02.000000000 +0000 @@ -1,5 +1,6 @@ declare id "eqs"; declare name "Scaleable EQ"; +declare category "Tone control"; declare license "BSD"; declare copyright "(c)GRAME 2006"; diff -Nru guitarix-0.22.4/src/faust/stereodelay.dsp guitarix-0.24.2/src/faust/stereodelay.dsp --- guitarix-0.22.4/src/faust/stereodelay.dsp 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/src/faust/stereodelay.dsp 2012-10-20 03:56:02.000000000 +0000 @@ -1,4 +1,5 @@ declare name "Stereo Delay"; +declare category "Echo / Delay"; import("music.lib"); import("guitarix.lib"); diff -Nru guitarix-0.22.4/src/faust/stereoecho.dsp guitarix-0.24.2/src/faust/stereoecho.dsp --- guitarix-0.22.4/src/faust/stereoecho.dsp 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/src/faust/stereoecho.dsp 2012-10-20 03:56:02.000000000 +0000 @@ -1,19 +1,21 @@ declare name "Stereo Echo"; +declare category "Echo / Delay"; import("music.lib"); import("guitarix.lib"); msec = SR/1000.0; +lfol = component("oscillator.lib").oscrs; // sine for left channel -d = vslider("l_delay", 0, 0, 5000, 10)*msec; -r = vslider("r_delay", 0, 0, 5000, 10)*msec; +freq = hslider("LFO freq [unit:Hz]", 0.2, 0, 5, 0.01); +pingpong = checkbox("invert[enum:linear|pingpong]"); tl = vslider("time_l", 1, 1, 2000, 1); releasel = vslider("percent_l", 0, 0, 100, 0.1); tr = vslider("time_r", 1, 1, 2000, 1); releaser = vslider("percent_r", 0, 0, 100, 0.1); -echo1 = +~(delay(131072, int(tl*millisec)-1) * (releasel/100.0) ); -echo2 = +~(delay(131072, int(tr*millisec)-1) * (releaser/100.0) ); +echo1 = +~(fdelay2(131072, int(tl*millisec)-1) * ((releasel/100.0)*(1+(lfol(freq)*pingpong))) ); +echo2 = +~(fdelay2(131072, int(tr*millisec)-1) * ((releaser/100.0)*(1-(lfol(freq)*pingpong))) ); process = echo1,echo2; diff -Nru guitarix-0.22.4/src/faust/stereoverb.dsp guitarix-0.24.2/src/faust/stereoverb.dsp --- guitarix-0.22.4/src/faust/stereoverb.dsp 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/src/faust/stereoverb.dsp 2012-10-20 03:56:02.000000000 +0000 @@ -1,4 +1,5 @@ declare name "Stereo Verb"; +declare category "Reverb"; declare version "0.01"; declare author "brummer"; declare license "BSD"; @@ -61,6 +62,13 @@ //---------------------------------------------------------------- +lfol = component("oscillator.lib").oscrs; // sine for left channel + +freq = hslider("LFO freq [unit:Hz]", 0.2, 0, 5, 0.01); +pingpong = checkbox("invert[enum:linear|pingpong]"); + fxctrl(g,w,Fx) = _ <: (*(g) <: _ + Fx ), *(1-w) +> _; -process = (_<:*(dry),(*(wet_dry):fxctrl(0.015,wet_dry, monoReverb(combfeed, 0.5, dampslider, 23))):>_), - (_<:*(dry),(*(wet_dry):fxctrl(0.015,wet_dry, monoReverb(combfeed, 0.5, dampslider, 23))):>_); + +freeverb_r = (_<:*(dry),(*(wet_dry):fxctrl(0.015,wet_dry, monoReverb(combfeed, 0.5, dampslider, 23))* (1+(lfol(freq)*pingpong))):>_); +freeverb_l = (_<:*(dry),(*(wet_dry):fxctrl(0.015,wet_dry, monoReverb(combfeed, 0.5, dampslider, 23))* (1-(lfol(freq)*pingpong))):>_); +process = freeverb_r, freeverb_l; diff -Nru guitarix-0.22.4/src/faust/tonecontroll.dsp guitarix-0.24.2/src/faust/tonecontroll.dsp --- guitarix-0.22.4/src/faust/tonecontroll.dsp 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/src/faust/tonecontroll.dsp 2012-10-20 03:56:02.000000000 +0000 @@ -1,5 +1,6 @@ declare id "tonemodul"; declare name "3 Band EQ"; +declare category "Tone control"; declare version "0.01"; declare author "brummer"; declare license "BSD"; diff -Nru guitarix-0.22.4/src/faust/tonestack.dsp guitarix-0.24.2/src/faust/tonestack.dsp --- guitarix-0.22.4/src/faust/tonestack.dsp 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/src/faust/tonestack.dsp 2012-10-20 03:56:02.000000000 +0000 @@ -304,7 +304,9 @@ m = vslider(".amp.tonestack.Middle[alias]", 0.5, 0, 1, 0.01); l = vslider(".amp.tonestack.Bass[alias]", 0.5, 0, 1, 0.01) : (_-1)*3.4 : exp; -tonestack = 1/A0*tf3(B0,B1,B2,B3,A1/A0,A2/A0,A3/A0) with { + + +tonestack = 1/A0*iir((B0,B1,B2,B3),(A1/A0,A2/A0,A3/A0)) with { C1 = tse.C1; C2 = tse.C2; C3 = tse.C3; diff -Nru guitarix-0.22.4/src/faust/tremolo.dsp guitarix-0.24.2/src/faust/tremolo.dsp --- guitarix-0.22.4/src/faust/tremolo.dsp 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/src/faust/tremolo.dsp 2012-10-20 03:56:02.000000000 +0000 @@ -1,4 +1,5 @@ declare name "Tremolo"; +declare category "Modulation"; /* ** Model of a vactrol tremolo unit by "transmogrify" diff -Nru guitarix-0.22.4/src/faust/wscript guitarix-0.24.2/src/faust/wscript --- guitarix-0.22.4/src/faust/wscript 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/src/faust/wscript 2012-10-20 03:56:02.000000000 +0000 @@ -33,8 +33,10 @@ ] sources = [ + 'jconv_post_mono.dsp', 'presence_level.dsp', 'cabinet_impulse_former.dsp', + 'preamp_impulse_former.dsp', ] sources_static = [ @@ -58,6 +60,7 @@ 'gx_distortion.dsp', 'impulseresponse.dsp', 'compressor.dsp', + 'expander.dsp', 'overdrive.dsp', 'freeverb.dsp', 'biquad.dsp', @@ -80,6 +83,7 @@ 'gx_outputlevel.dsp', 'gx_outputlevel_ladspa.dsp', 'gxfeed.dsp', + 'highbooster.dsp', # tone stacks 'tonestack_default.dsp', @@ -128,6 +132,7 @@ 'gxamp16.dsp', 'gxamp17.dsp', 'gxamp18.dsp', + 'gxnoamp.dsp', # bypass mode 'balance.dsp', diff -Nru guitarix-0.22.4/src/faust-generated/autowah.cc guitarix-0.24.2/src/faust-generated/autowah.cc --- guitarix-0.22.4/src/faust-generated/autowah.cc 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/src/faust-generated/autowah.cc 2012-10-20 03:56:02.000000000 +0000 @@ -1,5 +1,5 @@ // generated from file '../src/faust/autowah.dsp' by dsp2cc: -// Code generated with Faust 0.9.43 (http://faust.grame.fr) +// Code generated with Faust 0.9.46 (http://faust.grame.fr) namespace autowah { @@ -48,6 +48,9 @@ id = "auto"; name = N_("auto"); groups = 0; + description = ""; // description (tooltip) + category = ""; // category + shortname = ""; // shortname mono_audio = compute_static; stereo_audio = 0; set_samplerate = init_static; diff -Nru guitarix-0.22.4/src/faust-generated/balance.cc guitarix-0.24.2/src/faust-generated/balance.cc --- guitarix-0.22.4/src/faust-generated/balance.cc 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/src/faust-generated/balance.cc 2012-10-20 03:56:02.000000000 +0000 @@ -1,5 +1,5 @@ // generated from file '../src/faust/balance.dsp' by dsp2cc: -// Code generated with Faust 0.9.43 (http://faust.grame.fr) +// Code generated with Faust 0.9.46 (http://faust.grame.fr) namespace balance { @@ -35,6 +35,9 @@ id = "balance"; name = "?balance"; groups = 0; + description = ""; // description (tooltip) + category = ""; // category + shortname = ""; // shortname mono_audio = 0; stereo_audio = compute_static; set_samplerate = init_static; diff -Nru guitarix-0.22.4/src/faust-generated/bassbooster.cc guitarix-0.24.2/src/faust-generated/bassbooster.cc --- guitarix-0.22.4/src/faust-generated/bassbooster.cc 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/src/faust-generated/bassbooster.cc 2012-10-20 03:56:02.000000000 +0000 @@ -1,5 +1,5 @@ // generated from file '../src/faust/bassbooster.dsp' by dsp2cc: -// Code generated with Faust 0.9.43 (http://faust.grame.fr) +// Code generated with Faust 0.9.46 (http://faust.grame.fr) namespace bassbooster { @@ -44,6 +44,9 @@ id = "amp.bass_boost"; name = N_("Bassbooster"); groups = parm_groups; + description = ""; // description (tooltip) + category = ""; // category + shortname = ""; // shortname mono_audio = compute_static; stereo_audio = 0; set_samplerate = init_static; diff -Nru guitarix-0.22.4/src/faust-generated/biquad.cc guitarix-0.24.2/src/faust-generated/biquad.cc --- guitarix-0.22.4/src/faust-generated/biquad.cc 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/src/faust-generated/biquad.cc 2012-10-20 03:56:02.000000000 +0000 @@ -1,5 +1,5 @@ // generated from file '../src/faust/biquad.dsp' by dsp2cc: -// Code generated with Faust 0.9.43 (http://faust.grame.fr) +// Code generated with Faust 0.9.46 (http://faust.grame.fr) namespace biquad { @@ -35,6 +35,9 @@ id = "biquad"; name = N_("BiQuad Filter"); groups = 0; + description = ""; // description (tooltip) + category = N_("Tone control"); // category + shortname = ""; // shortname mono_audio = compute_static; stereo_audio = 0; set_samplerate = init_static; diff -Nru guitarix-0.22.4/src/faust-generated/cabinet_impulse_former.cc guitarix-0.24.2/src/faust-generated/cabinet_impulse_former.cc --- guitarix-0.22.4/src/faust-generated/cabinet_impulse_former.cc 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/src/faust-generated/cabinet_impulse_former.cc 2012-10-20 03:56:02.000000000 +0000 @@ -1,5 +1,5 @@ // generated from file '../src/faust/cabinet_impulse_former.dsp' by dsp2cc: -// Code generated with Faust 0.9.43 (http://faust.grame.fr) +// Code generated with Faust 0.9.46 (http://faust.grame.fr) namespace cabinet_impulse_former { diff -Nru guitarix-0.22.4/src/faust-generated/cabinet_impulse_former.h guitarix-0.24.2/src/faust-generated/cabinet_impulse_former.h --- guitarix-0.22.4/src/faust-generated/cabinet_impulse_former.h 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/src/faust-generated/cabinet_impulse_former.h 2012-10-20 03:56:02.000000000 +0000 @@ -1,5 +1,5 @@ // generated from file '../src/faust/cabinet_impulse_former.dsp' by dsp2cc: -// Code generated with Faust 0.9.43 (http://faust.grame.fr) +// Code generated with Faust 0.9.46 (http://faust.grame.fr) #define FAUSTFLOAT float diff -Nru guitarix-0.22.4/src/faust-generated/chorus.cc guitarix-0.24.2/src/faust-generated/chorus.cc --- guitarix-0.22.4/src/faust-generated/chorus.cc 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/src/faust-generated/chorus.cc 2012-10-20 03:56:02.000000000 +0000 @@ -1,5 +1,5 @@ // generated from file '../src/faust/chorus.dsp' by dsp2cc: -// Code generated with Faust 0.9.43 (http://faust.grame.fr) +// Code generated with Faust 0.9.46 (http://faust.grame.fr) namespace chorus { @@ -73,6 +73,9 @@ id = "chorus"; name = N_("Chorus"); groups = 0; + description = ""; // description (tooltip) + category = N_("Modulation"); // category + shortname = ""; // shortname mono_audio = 0; stereo_audio = compute_static; set_samplerate = init_static; diff -Nru guitarix-0.22.4/src/faust-generated/chorus_mono.cc guitarix-0.24.2/src/faust-generated/chorus_mono.cc --- guitarix-0.22.4/src/faust-generated/chorus_mono.cc 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/src/faust-generated/chorus_mono.cc 2012-10-20 03:56:02.000000000 +0000 @@ -1,5 +1,5 @@ // generated from file '../src/faust/chorus_mono.dsp' by dsp2cc: -// Code generated with Faust 0.9.43 (http://faust.grame.fr) +// Code generated with Faust 0.9.46 (http://faust.grame.fr) namespace chorus_mono { @@ -63,6 +63,9 @@ id = "chorus_mono"; name = N_("Chorus Mono"); groups = 0; + description = ""; // description (tooltip) + category = N_("Modulation"); // category + shortname = ""; // shortname mono_audio = compute_static; stereo_audio = 0; set_samplerate = init_static; diff -Nru guitarix-0.22.4/src/faust-generated/compressor.cc guitarix-0.24.2/src/faust-generated/compressor.cc --- guitarix-0.22.4/src/faust-generated/compressor.cc 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/src/faust-generated/compressor.cc 2012-10-20 03:56:02.000000000 +0000 @@ -1,5 +1,5 @@ // generated from file '../src/faust/compressor.dsp' by dsp2cc: -// Code generated with Faust 0.9.43 (http://faust.grame.fr) +// Code generated with Faust 0.9.46 (http://faust.grame.fr) namespace compressor { @@ -43,6 +43,9 @@ id = "compressor"; name = N_("Compressor"); groups = 0; + description = ""; // description (tooltip) + category = N_("Guitar Effects"); // category + shortname = ""; // shortname mono_audio = compute_static; stereo_audio = 0; set_samplerate = init_static; diff -Nru guitarix-0.22.4/src/faust-generated/crybaby.cc guitarix-0.24.2/src/faust-generated/crybaby.cc --- guitarix-0.22.4/src/faust-generated/crybaby.cc 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/src/faust-generated/crybaby.cc 2012-10-20 03:56:02.000000000 +0000 @@ -1,5 +1,5 @@ // generated from file '../src/faust/crybaby.dsp' by dsp2cc: -// Code generated with Faust 0.9.43 (http://faust.grame.fr) +// Code generated with Faust 0.9.46 (http://faust.grame.fr) namespace crybaby { @@ -45,6 +45,9 @@ id = "manual"; name = N_("manual"); groups = 0; + description = ""; // description (tooltip) + category = ""; // category + shortname = ""; // shortname mono_audio = compute_static; stereo_audio = 0; set_samplerate = init_static; diff -Nru guitarix-0.22.4/src/faust-generated/delay.cc guitarix-0.24.2/src/faust-generated/delay.cc --- guitarix-0.22.4/src/faust-generated/delay.cc 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/src/faust-generated/delay.cc 2012-10-20 03:56:02.000000000 +0000 @@ -1,5 +1,5 @@ // generated from file '../src/faust/delay.dsp' by dsp2cc: -// Code generated with Faust 0.9.43 (http://faust.grame.fr) +// Code generated with Faust 0.9.46 (http://faust.grame.fr) namespace delay { @@ -45,6 +45,9 @@ id = "delay"; name = N_("Delay"); groups = 0; + description = ""; // description (tooltip) + category = N_("Echo / Delay"); // category + shortname = ""; // shortname mono_audio = compute_static; stereo_audio = 0; set_samplerate = init_static; diff -Nru guitarix-0.22.4/src/faust-generated/echo.cc guitarix-0.24.2/src/faust-generated/echo.cc --- guitarix-0.22.4/src/faust-generated/echo.cc 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/src/faust-generated/echo.cc 2012-10-20 03:56:02.000000000 +0000 @@ -1,5 +1,5 @@ // generated from file '../src/faust/echo.dsp' by dsp2cc: -// Code generated with Faust 0.9.43 (http://faust.grame.fr) +// Code generated with Faust 0.9.46 (http://faust.grame.fr) namespace echo { @@ -44,6 +44,9 @@ id = "echo"; name = N_("Echo"); groups = 0; + description = ""; // description (tooltip) + category = N_("Echo / Delay"); // category + shortname = ""; // shortname mono_audio = compute_static; stereo_audio = 0; set_samplerate = init_static; diff -Nru guitarix-0.22.4/src/faust-generated/expander.cc guitarix-0.24.2/src/faust-generated/expander.cc --- guitarix-0.22.4/src/faust-generated/expander.cc 1970-01-01 00:00:00.000000000 +0000 +++ guitarix-0.24.2/src/faust-generated/expander.cc 2012-10-20 03:56:02.000000000 +0000 @@ -0,0 +1,139 @@ +// generated from file '../src/faust/expander.dsp' by dsp2cc: +// Code generated with Faust 0.9.46 (http://faust.grame.fr) + + +namespace expander { + +class Dsp: public PluginDef { +private: + int fSamplingFreq; + int iConst0; + double fConst1; + double fConst2; + double fRec1[2]; + double fConst3; + FAUSTFLOAT fslider0; + FAUSTFLOAT fslider1; + double fRec0[2]; + FAUSTFLOAT fentry0; + FAUSTFLOAT fentry1; + FAUSTFLOAT fentry2; + void clear_state_f(); + void init(unsigned int samplingFreq); + void compute(int count, float *input0, float *output0); + int register_par(const ParamReg& reg); + + static void clear_state_f_static(PluginDef*); + static void init_static(unsigned int samplingFreq, PluginDef*); + static void compute_static(int count, float *input0, float *output0, PluginDef*); + static int register_params_static(const ParamReg& reg); + static void del_instance(PluginDef *p); + +public: + Dsp(); + ~Dsp(); +}; + + + +Dsp::Dsp() + : PluginDef() { + version = PLUGINDEF_VERSION; + flags = 0; + id = "expander"; + name = N_("Expander"); + groups = 0; + description = N_("expander unit"); // description (tooltip) + category = N_("Guitar Effects"); // category + shortname = ""; // shortname + mono_audio = compute_static; + stereo_audio = 0; + set_samplerate = init_static; + activate_plugin = 0; + register_params = register_params_static; + load_ui = 0; + clear_state = clear_state_f_static; + delete_instance = del_instance; +} + +Dsp::~Dsp() { +} + +inline void Dsp::clear_state_f() +{ + for (int i=0; i<2; i++) fRec1[i] = 0; + for (int i=0; i<2; i++) fRec0[i] = 0; +} + +void Dsp::clear_state_f_static(PluginDef *p) +{ + static_cast(p)->clear_state_f(); +} + +inline void Dsp::init(unsigned int samplingFreq) +{ + fSamplingFreq = samplingFreq; + iConst0 = min(192000, max(1, fSamplingFreq)); + fConst1 = exp((0 - (1e+01 / iConst0))); + fConst2 = (1 - fConst1); + fConst3 = (1.0 / iConst0); + clear_state_f(); +} + +void Dsp::init_static(unsigned int samplingFreq, PluginDef *p) +{ + static_cast(p)->init(samplingFreq); +} + +inline void Dsp::compute(int count, float *input0, float *output0) +{ + double fSlow0 = exp((0 - (fConst3 / max(fConst3, fslider0)))); + double fSlow1 = exp((0 - (fConst3 / max(fConst3, fslider1)))); + double fSlow2 = fentry1; + double fSlow3 = (fSlow2 + fentry0); + double fSlow4 = (1.0 / (0.001 + fSlow2)); + double fSlow5 = (fentry2 - 1); + for (int i=0; i= fTemp1)) + (fSlow0 * (fRec0[1] < fTemp1))); + fRec0[0] = ((fTemp1 * (0 - (fTemp2 - 1))) + (fRec0[1] * fTemp2)); + double fTemp3 = max(0, (fSlow3 - (20 * log10(fRec0[0])))); + output0[i] = (FAUSTFLOAT)(fTemp0 * pow(10,(0.05 * (fTemp3 * (0 - (fSlow5 * min(1, max(0, (fSlow4 * fTemp3))))))))); + // post processing + fRec0[1] = fRec0[0]; + fRec1[1] = fRec1[0]; + } +} + +void Dsp::compute_static(int count, float *input0, float *output0, PluginDef *p) +{ + static_cast(p)->compute(count, input0, output0); +} + +int Dsp::register_par(const ParamReg& reg) +{ + reg.registerVar("expander.ratio","","S","",&fentry2, 2.0, 1.0, 2e+01, 0.1); + reg.registerVar("expander.knee","","S","",&fentry1, 3.0, 0.0, 2e+01, 0.1); + reg.registerVar("expander.threshold","","S","",&fentry0, -4e+01, -96.0, 1e+01, 0.1); + reg.registerVar("expander.release","","S","",&fslider1, 0.1, 0.0, 1e+01, 0.01); + reg.registerVar("expander.attack","","S","",&fslider0, 0.001, 0.0, 1.0, 0.001); + return 0; +} + +int Dsp::register_params_static(const ParamReg& reg) +{ + return static_cast(reg.plugin)->register_par(reg); +} + +PluginDef *plugin() { + return new Dsp(); +} + +void Dsp::del_instance(PluginDef *p) +{ + delete static_cast(p); +} + +} // end namespace expander diff -Nru guitarix-0.22.4/src/faust-generated/flanger.cc guitarix-0.24.2/src/faust-generated/flanger.cc --- guitarix-0.22.4/src/faust-generated/flanger.cc 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/src/faust-generated/flanger.cc 2012-10-20 03:56:02.000000000 +0000 @@ -1,5 +1,5 @@ // generated from file '../src/faust/flanger.dsp' by dsp2cc: -// Code generated with Faust 0.9.43 (http://faust.grame.fr) +// Code generated with Faust 0.9.46 (http://faust.grame.fr) namespace flanger { @@ -49,6 +49,9 @@ id = "flanger"; name = N_("Flanger"); groups = 0; + description = ""; // description (tooltip) + category = N_("Modulation"); // category + shortname = ""; // shortname mono_audio = 0; stereo_audio = compute_static; set_samplerate = init_static; diff -Nru guitarix-0.22.4/src/faust-generated/flanger_mono.cc guitarix-0.24.2/src/faust-generated/flanger_mono.cc --- guitarix-0.22.4/src/faust-generated/flanger_mono.cc 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/src/faust-generated/flanger_mono.cc 2012-10-20 03:56:02.000000000 +0000 @@ -1,5 +1,5 @@ // generated from file '../src/faust/flanger_mono.dsp' by dsp2cc: -// Code generated with Faust 0.9.43 (http://faust.grame.fr) +// Code generated with Faust 0.9.46 (http://faust.grame.fr) namespace flanger_mono { @@ -43,6 +43,9 @@ id = "flanger_mono"; name = N_("Flanger Mono"); groups = 0; + description = ""; // description (tooltip) + category = N_("Modulation"); // category + shortname = ""; // shortname mono_audio = compute_static; stereo_audio = 0; set_samplerate = init_static; diff -Nru guitarix-0.22.4/src/faust-generated/freeverb.cc guitarix-0.24.2/src/faust-generated/freeverb.cc --- guitarix-0.22.4/src/faust-generated/freeverb.cc 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/src/faust-generated/freeverb.cc 2012-10-20 03:56:02.000000000 +0000 @@ -1,5 +1,5 @@ // generated from file '../src/faust/freeverb.dsp' by dsp2cc: -// Code generated with Faust 0.9.43 (http://faust.grame.fr) +// Code generated with Faust 0.9.46 (http://faust.grame.fr) namespace freeverb { @@ -68,6 +68,9 @@ id = "freeverb"; name = N_("Freeverb"); groups = 0; + description = ""; // description (tooltip) + category = N_("Reverb"); // category + shortname = ""; // shortname mono_audio = compute_static; stereo_audio = 0; set_samplerate = init_static; diff -Nru guitarix-0.22.4/src/faust-generated/gx_ampmodul.cc guitarix-0.24.2/src/faust-generated/gx_ampmodul.cc --- guitarix-0.22.4/src/faust-generated/gx_ampmodul.cc 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/src/faust-generated/gx_ampmodul.cc 2012-10-20 03:56:02.000000000 +0000 @@ -1,5 +1,5 @@ // generated from file '../src/faust/gx_ampmodul.dsp' by dsp2cc: -// Code generated with Faust 0.9.43 (http://faust.grame.fr) +// Code generated with Faust 0.9.46 (http://faust.grame.fr) #include "valve.h" @@ -96,6 +96,9 @@ id = "ampmodul"; name = N_("Postamp"); groups = parm_groups; + description = ""; // description (tooltip) + category = N_("Distortion"); // category + shortname = ""; // shortname mono_audio = 0; stereo_audio = compute_static; set_samplerate = init_static; diff -Nru guitarix-0.22.4/src/faust-generated/gx_ampout.cc guitarix-0.24.2/src/faust-generated/gx_ampout.cc --- guitarix-0.22.4/src/faust-generated/gx_ampout.cc 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/src/faust-generated/gx_ampout.cc 2012-10-20 03:56:02.000000000 +0000 @@ -1,5 +1,5 @@ // generated from file '../src/faust/gx_ampout.dsp' by dsp2cc: -// Code generated with Faust 0.9.43 (http://faust.grame.fr) +// Code generated with Faust 0.9.46 (http://faust.grame.fr) namespace gx_ampout { @@ -34,6 +34,9 @@ id = "amp"; name = N_("Amplifier"); groups = 0; + description = ""; // description (tooltip) + category = ""; // category + shortname = ""; // shortname mono_audio = compute_static; stereo_audio = 0; set_samplerate = init_static; diff -Nru guitarix-0.22.4/src/faust-generated/gx_ampout_ladspa.cc guitarix-0.24.2/src/faust-generated/gx_ampout_ladspa.cc --- guitarix-0.22.4/src/faust-generated/gx_ampout_ladspa.cc 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/src/faust-generated/gx_ampout_ladspa.cc 2012-10-20 03:56:02.000000000 +0000 @@ -1,5 +1,5 @@ // generated from file '../src/faust/gx_ampout_ladspa.dsp' by dsp2cc: -// Code generated with Faust 0.9.43 (http://faust.grame.fr) +// Code generated with Faust 0.9.46 (http://faust.grame.fr) namespace gx_ampout_ladspa { @@ -41,6 +41,9 @@ id = "gx_ampout_ladspa"; name = "?gx_ampout_ladspa"; groups = parm_groups; + description = ""; // description (tooltip) + category = ""; // category + shortname = ""; // shortname mono_audio = compute_static; stereo_audio = 0; set_samplerate = init_static; diff -Nru guitarix-0.22.4/src/faust-generated/gx_distortion.cc guitarix-0.24.2/src/faust-generated/gx_distortion.cc --- guitarix-0.22.4/src/faust-generated/gx_distortion.cc 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/src/faust-generated/gx_distortion.cc 2012-10-20 03:56:02.000000000 +0000 @@ -1,5 +1,5 @@ // generated from file '../src/faust/gx_distortion.dsp' by dsp2cc: -// Code generated with Faust 0.9.43 (http://faust.grame.fr) +// Code generated with Faust 0.9.46 (http://faust.grame.fr) namespace gx_distortion { @@ -104,6 +104,9 @@ id = "gx_distortion"; name = N_("Multi Band Distortion"); groups = parm_groups; + description = ""; // description (tooltip) + category = N_("Distortion"); // category + shortname = N_("Distortion"); // shortname mono_audio = compute_static; stereo_audio = 0; set_samplerate = init_static; diff -Nru guitarix-0.22.4/src/faust-generated/gx_feedback.cc guitarix-0.24.2/src/faust-generated/gx_feedback.cc --- guitarix-0.22.4/src/faust-generated/gx_feedback.cc 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/src/faust-generated/gx_feedback.cc 2012-10-20 03:56:02.000000000 +0000 @@ -1,5 +1,5 @@ // generated from file '../src/faust/gx_feedback.dsp' by dsp2cc: -// Code generated with Faust 0.9.43 (http://faust.grame.fr) +// Code generated with Faust 0.9.46 (http://faust.grame.fr) namespace gx_feedback { @@ -35,6 +35,9 @@ id = "feedback"; name = N_("Feedback"); groups = 0; + description = ""; // description (tooltip) + category = N_("Tone control"); // category + shortname = ""; // shortname mono_audio = compute_static; stereo_audio = 0; set_samplerate = init_static; diff -Nru guitarix-0.22.4/src/faust-generated/gx_outputlevel.cc guitarix-0.24.2/src/faust-generated/gx_outputlevel.cc --- guitarix-0.22.4/src/faust-generated/gx_outputlevel.cc 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/src/faust-generated/gx_outputlevel.cc 2012-10-20 03:56:02.000000000 +0000 @@ -1,5 +1,5 @@ // generated from file '../src/faust/gx_outputlevel.dsp' by dsp2cc: -// Code generated with Faust 0.9.43 (http://faust.grame.fr) +// Code generated with Faust 0.9.46 (http://faust.grame.fr) namespace gx_outputlevel { @@ -34,6 +34,9 @@ id = "gx_outputlevel"; name = "?gx_outputlevel"; groups = 0; + description = ""; // description (tooltip) + category = ""; // category + shortname = ""; // shortname mono_audio = 0; stereo_audio = compute_static; set_samplerate = init_static; diff -Nru guitarix-0.22.4/src/faust-generated/gx_outputlevel_ladspa.cc guitarix-0.24.2/src/faust-generated/gx_outputlevel_ladspa.cc --- guitarix-0.22.4/src/faust-generated/gx_outputlevel_ladspa.cc 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/src/faust-generated/gx_outputlevel_ladspa.cc 2012-10-20 03:56:02.000000000 +0000 @@ -1,5 +1,5 @@ // generated from file '../src/faust/gx_outputlevel_ladspa.dsp' by dsp2cc: -// Code generated with Faust 0.9.43 (http://faust.grame.fr) +// Code generated with Faust 0.9.46 (http://faust.grame.fr) namespace gx_outputlevel_ladspa { @@ -40,6 +40,9 @@ id = "gx_outputlevel_ladspa"; name = "?gx_outputlevel_ladspa"; groups = parm_groups; + description = ""; // description (tooltip) + category = ""; // category + shortname = ""; // shortname mono_audio = 0; stereo_audio = compute_static; set_samplerate = init_static; diff -Nru guitarix-0.22.4/src/faust-generated/gxamp.cc guitarix-0.24.2/src/faust-generated/gxamp.cc --- guitarix-0.22.4/src/faust-generated/gxamp.cc 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/src/faust-generated/gxamp.cc 2012-10-20 03:56:02.000000000 +0000 @@ -1,5 +1,5 @@ // generated from file '../src/faust/gxamp.dsp' by dsp2cc: -// Code generated with Faust 0.9.43 (http://faust.grame.fr) +// Code generated with Faust 0.9.46 (http://faust.grame.fr) #include "valve.h" @@ -147,6 +147,9 @@ id = "12ax7"; name = N_("12ax7"); groups = 0; + description = ""; // description (tooltip) + category = ""; // category + shortname = ""; // shortname mono_audio = compute_static; stereo_audio = 0; set_samplerate = init_static; diff -Nru guitarix-0.22.4/src/faust-generated/gxamp10.cc guitarix-0.24.2/src/faust-generated/gxamp10.cc --- guitarix-0.22.4/src/faust-generated/gxamp10.cc 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/src/faust-generated/gxamp10.cc 2012-10-20 03:56:02.000000000 +0000 @@ -1,5 +1,5 @@ // generated from file '../src/faust/gxamp10.dsp' by dsp2cc: -// Code generated with Faust 0.9.43 (http://faust.grame.fr) +// Code generated with Faust 0.9.46 (http://faust.grame.fr) #include "valve.h" @@ -150,6 +150,9 @@ id = "6DJ8"; name = N_("6DJ8"); groups = 0; + description = ""; // description (tooltip) + category = ""; // category + shortname = ""; // shortname mono_audio = compute_static; stereo_audio = 0; set_samplerate = init_static; diff -Nru guitarix-0.22.4/src/faust-generated/gxamp11.cc guitarix-0.24.2/src/faust-generated/gxamp11.cc --- guitarix-0.22.4/src/faust-generated/gxamp11.cc 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/src/faust-generated/gxamp11.cc 2012-10-20 03:56:02.000000000 +0000 @@ -1,5 +1,5 @@ // generated from file '../src/faust/gxamp11.dsp' by dsp2cc: -// Code generated with Faust 0.9.43 (http://faust.grame.fr) +// Code generated with Faust 0.9.46 (http://faust.grame.fr) #include "valve.h" @@ -161,6 +161,9 @@ id = "12AU7 feedback"; name = N_("12AU7 feedback"); groups = 0; + description = ""; // description (tooltip) + category = ""; // category + shortname = ""; // shortname mono_audio = compute_static; stereo_audio = 0; set_samplerate = init_static; diff -Nru guitarix-0.22.4/src/faust-generated/gxamp12.cc guitarix-0.24.2/src/faust-generated/gxamp12.cc --- guitarix-0.22.4/src/faust-generated/gxamp12.cc 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/src/faust-generated/gxamp12.cc 2012-10-20 03:56:02.000000000 +0000 @@ -1,5 +1,5 @@ // generated from file '../src/faust/gxamp12.dsp' by dsp2cc: -// Code generated with Faust 0.9.43 (http://faust.grame.fr) +// Code generated with Faust 0.9.46 (http://faust.grame.fr) #include "valve.h" @@ -154,6 +154,9 @@ id = "pre 6DJ8/ master 6V6"; name = N_("pre 6DJ8/ master 6V6"); groups = 0; + description = ""; // description (tooltip) + category = ""; // category + shortname = ""; // shortname mono_audio = compute_static; stereo_audio = 0; set_samplerate = init_static; diff -Nru guitarix-0.22.4/src/faust-generated/gxamp13.cc guitarix-0.24.2/src/faust-generated/gxamp13.cc --- guitarix-0.22.4/src/faust-generated/gxamp13.cc 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/src/faust-generated/gxamp13.cc 2012-10-20 03:56:02.000000000 +0000 @@ -1,5 +1,5 @@ // generated from file '../src/faust/gxamp13.dsp' by dsp2cc: -// Code generated with Faust 0.9.43 (http://faust.grame.fr) +// Code generated with Faust 0.9.46 (http://faust.grame.fr) #include "valve.h" @@ -161,6 +161,9 @@ id = "6DJ8 feedback"; name = N_("6DJ8 feedback"); groups = 0; + description = ""; // description (tooltip) + category = ""; // category + shortname = ""; // shortname mono_audio = compute_static; stereo_audio = 0; set_samplerate = init_static; diff -Nru guitarix-0.22.4/src/faust-generated/gxamp14.cc guitarix-0.24.2/src/faust-generated/gxamp14.cc --- guitarix-0.22.4/src/faust-generated/gxamp14.cc 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/src/faust-generated/gxamp14.cc 2012-10-20 03:56:02.000000000 +0000 @@ -1,5 +1,5 @@ // generated from file '../src/faust/gxamp14.dsp' by dsp2cc: -// Code generated with Faust 0.9.43 (http://faust.grame.fr) +// Code generated with Faust 0.9.46 (http://faust.grame.fr) #include "valve.h" @@ -147,6 +147,9 @@ id = "12AT7"; name = N_("12AT7"); groups = 0; + description = ""; // description (tooltip) + category = ""; // category + shortname = ""; // shortname mono_audio = compute_static; stereo_audio = 0; set_samplerate = init_static; diff -Nru guitarix-0.22.4/src/faust-generated/gxamp15.cc guitarix-0.24.2/src/faust-generated/gxamp15.cc --- guitarix-0.22.4/src/faust-generated/gxamp15.cc 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/src/faust-generated/gxamp15.cc 2012-10-20 03:56:02.000000000 +0000 @@ -1,5 +1,5 @@ // generated from file '../src/faust/gxamp15.dsp' by dsp2cc: -// Code generated with Faust 0.9.43 (http://faust.grame.fr) +// Code generated with Faust 0.9.46 (http://faust.grame.fr) #include "valve.h" @@ -153,6 +153,9 @@ id = "pre 12AT7/ master 6V6"; name = N_("pre 12AT7/ master 6V6"); groups = 0; + description = ""; // description (tooltip) + category = ""; // category + shortname = ""; // shortname mono_audio = compute_static; stereo_audio = 0; set_samplerate = init_static; diff -Nru guitarix-0.22.4/src/faust-generated/gxamp16.cc guitarix-0.24.2/src/faust-generated/gxamp16.cc --- guitarix-0.22.4/src/faust-generated/gxamp16.cc 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/src/faust-generated/gxamp16.cc 2012-10-20 03:56:02.000000000 +0000 @@ -1,5 +1,5 @@ // generated from file '../src/faust/gxamp16.dsp' by dsp2cc: -// Code generated with Faust 0.9.43 (http://faust.grame.fr) +// Code generated with Faust 0.9.46 (http://faust.grame.fr) #include "valve.h" @@ -205,6 +205,9 @@ id = "pre 12AT7/ push pull 6V6"; name = N_("pre 12AT7/ push pull 6V6"); groups = 0; + description = ""; // description (tooltip) + category = ""; // category + shortname = ""; // shortname mono_audio = compute_static; stereo_audio = 0; set_samplerate = init_static; diff -Nru guitarix-0.22.4/src/faust-generated/gxamp17.cc guitarix-0.24.2/src/faust-generated/gxamp17.cc --- guitarix-0.22.4/src/faust-generated/gxamp17.cc 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/src/faust-generated/gxamp17.cc 2012-10-20 03:56:02.000000000 +0000 @@ -1,5 +1,5 @@ // generated from file '../src/faust/gxamp17.dsp' by dsp2cc: -// Code generated with Faust 0.9.43 (http://faust.grame.fr) +// Code generated with Faust 0.9.46 (http://faust.grame.fr) #include "valve.h" @@ -161,6 +161,9 @@ id = "12AT7 feedback"; name = N_("12AT7 feedback"); groups = 0; + description = ""; // description (tooltip) + category = ""; // category + shortname = ""; // shortname mono_audio = compute_static; stereo_audio = 0; set_samplerate = init_static; diff -Nru guitarix-0.22.4/src/faust-generated/gxamp18.cc guitarix-0.24.2/src/faust-generated/gxamp18.cc --- guitarix-0.22.4/src/faust-generated/gxamp18.cc 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/src/faust-generated/gxamp18.cc 2012-10-20 03:56:02.000000000 +0000 @@ -1,5 +1,5 @@ // generated from file '../src/faust/gxamp18.dsp' by dsp2cc: -// Code generated with Faust 0.9.43 (http://faust.grame.fr) +// Code generated with Faust 0.9.46 (http://faust.grame.fr) #include "valve.h" @@ -147,6 +147,9 @@ id = "6C16"; name = N_("6C16"); groups = 0; + description = ""; // description (tooltip) + category = ""; // category + shortname = ""; // shortname mono_audio = compute_static; stereo_audio = 0; set_samplerate = init_static; diff -Nru guitarix-0.22.4/src/faust-generated/gxamp2.cc guitarix-0.24.2/src/faust-generated/gxamp2.cc --- guitarix-0.22.4/src/faust-generated/gxamp2.cc 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/src/faust-generated/gxamp2.cc 2012-10-20 03:56:02.000000000 +0000 @@ -1,5 +1,5 @@ // generated from file '../src/faust/gxamp2.dsp' by dsp2cc: -// Code generated with Faust 0.9.43 (http://faust.grame.fr) +// Code generated with Faust 0.9.46 (http://faust.grame.fr) #include "valve.h" @@ -149,6 +149,9 @@ id = "6V6"; name = N_("6V6"); groups = 0; + description = ""; // description (tooltip) + category = ""; // category + shortname = ""; // shortname mono_audio = compute_static; stereo_audio = 0; set_samplerate = init_static; diff -Nru guitarix-0.22.4/src/faust-generated/gxamp3.cc guitarix-0.24.2/src/faust-generated/gxamp3.cc --- guitarix-0.22.4/src/faust-generated/gxamp3.cc 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/src/faust-generated/gxamp3.cc 2012-10-20 03:56:02.000000000 +0000 @@ -1,5 +1,5 @@ // generated from file '../src/faust/gxamp3.dsp' by dsp2cc: -// Code generated with Faust 0.9.43 (http://faust.grame.fr) +// Code generated with Faust 0.9.46 (http://faust.grame.fr) #include "valve.h" @@ -148,6 +148,9 @@ id = "12AU7"; name = N_("12AU7"); groups = 0; + description = ""; // description (tooltip) + category = ""; // category + shortname = ""; // shortname mono_audio = compute_static; stereo_audio = 0; set_samplerate = init_static; diff -Nru guitarix-0.22.4/src/faust-generated/gxamp4.cc guitarix-0.24.2/src/faust-generated/gxamp4.cc --- guitarix-0.22.4/src/faust-generated/gxamp4.cc 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/src/faust-generated/gxamp4.cc 2012-10-20 03:56:02.000000000 +0000 @@ -1,5 +1,5 @@ // generated from file '../src/faust/gxamp4.dsp' by dsp2cc: -// Code generated with Faust 0.9.43 (http://faust.grame.fr) +// Code generated with Faust 0.9.46 (http://faust.grame.fr) #include "valve.h" @@ -154,6 +154,9 @@ id = "pre 12AU7/ master 6V6"; name = N_("pre 12AU7/ master 6V6"); groups = 0; + description = ""; // description (tooltip) + category = ""; // category + shortname = ""; // shortname mono_audio = compute_static; stereo_audio = 0; set_samplerate = init_static; diff -Nru guitarix-0.22.4/src/faust-generated/gxamp5.cc guitarix-0.24.2/src/faust-generated/gxamp5.cc --- guitarix-0.22.4/src/faust-generated/gxamp5.cc 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/src/faust-generated/gxamp5.cc 2012-10-20 03:56:02.000000000 +0000 @@ -1,5 +1,5 @@ // generated from file '../src/faust/gxamp5.dsp' by dsp2cc: -// Code generated with Faust 0.9.43 (http://faust.grame.fr) +// Code generated with Faust 0.9.46 (http://faust.grame.fr) #include "valve.h" @@ -153,6 +153,9 @@ id = "pre 12ax7/ master 6V6"; name = N_("pre 12ax7/ master 6V6"); groups = 0; + description = ""; // description (tooltip) + category = ""; // category + shortname = ""; // shortname mono_audio = compute_static; stereo_audio = 0; set_samplerate = init_static; diff -Nru guitarix-0.22.4/src/faust-generated/gxamp6.cc guitarix-0.24.2/src/faust-generated/gxamp6.cc --- guitarix-0.22.4/src/faust-generated/gxamp6.cc 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/src/faust-generated/gxamp6.cc 2012-10-20 03:56:02.000000000 +0000 @@ -1,5 +1,5 @@ // generated from file '../src/faust/gxamp6.dsp' by dsp2cc: -// Code generated with Faust 0.9.43 (http://faust.grame.fr) +// Code generated with Faust 0.9.46 (http://faust.grame.fr) #include "valve.h" @@ -206,6 +206,9 @@ id = "pre 6DJ8/ push-pull 6V6"; name = N_("pre 6DJ8/ push-pull 6V6"); groups = 0; + description = ""; // description (tooltip) + category = ""; // category + shortname = ""; // shortname mono_audio = compute_static; stereo_audio = 0; set_samplerate = init_static; diff -Nru guitarix-0.22.4/src/faust-generated/gxamp7.cc guitarix-0.24.2/src/faust-generated/gxamp7.cc --- guitarix-0.22.4/src/faust-generated/gxamp7.cc 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/src/faust-generated/gxamp7.cc 2012-10-20 03:56:02.000000000 +0000 @@ -1,5 +1,5 @@ // generated from file '../src/faust/gxamp7.dsp' by dsp2cc: -// Code generated with Faust 0.9.43 (http://faust.grame.fr) +// Code generated with Faust 0.9.46 (http://faust.grame.fr) #include "valve.h" @@ -205,6 +205,9 @@ id = "pre 12ax7/ push-pull 6V6"; name = N_("pre 12ax7/ push-pull 6V6"); groups = 0; + description = ""; // description (tooltip) + category = ""; // category + shortname = ""; // shortname mono_audio = compute_static; stereo_audio = 0; set_samplerate = init_static; diff -Nru guitarix-0.22.4/src/faust-generated/gxamp8.cc guitarix-0.24.2/src/faust-generated/gxamp8.cc --- guitarix-0.22.4/src/faust-generated/gxamp8.cc 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/src/faust-generated/gxamp8.cc 2012-10-20 03:56:02.000000000 +0000 @@ -1,5 +1,5 @@ // generated from file '../src/faust/gxamp8.dsp' by dsp2cc: -// Code generated with Faust 0.9.43 (http://faust.grame.fr) +// Code generated with Faust 0.9.46 (http://faust.grame.fr) #include "valve.h" @@ -208,6 +208,9 @@ id = "pre 12AU7/ push-pull 6V6"; name = N_("pre 12AU7/ push-pull 6V6"); groups = 0; + description = ""; // description (tooltip) + category = ""; // category + shortname = ""; // shortname mono_audio = compute_static; stereo_audio = 0; set_samplerate = init_static; diff -Nru guitarix-0.22.4/src/faust-generated/gxamp9.cc guitarix-0.24.2/src/faust-generated/gxamp9.cc --- guitarix-0.22.4/src/faust-generated/gxamp9.cc 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/src/faust-generated/gxamp9.cc 2012-10-20 03:56:02.000000000 +0000 @@ -1,5 +1,5 @@ // generated from file '../src/faust/gxamp9.dsp' by dsp2cc: -// Code generated with Faust 0.9.43 (http://faust.grame.fr) +// Code generated with Faust 0.9.46 (http://faust.grame.fr) #include "valve.h" @@ -161,6 +161,9 @@ id = "12ax7 feedback"; name = N_("12ax7 feedback"); groups = 0; + description = ""; // description (tooltip) + category = ""; // category + shortname = ""; // shortname mono_audio = compute_static; stereo_audio = 0; set_samplerate = init_static; diff -Nru guitarix-0.22.4/src/faust-generated/gxfeed.cc guitarix-0.24.2/src/faust-generated/gxfeed.cc --- guitarix-0.22.4/src/faust-generated/gxfeed.cc 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/src/faust-generated/gxfeed.cc 2012-10-20 03:56:02.000000000 +0000 @@ -1,5 +1,5 @@ // generated from file '../src/faust/gxfeed.dsp' by dsp2cc: -// Code generated with Faust 0.9.43 (http://faust.grame.fr) +// Code generated with Faust 0.9.46 (http://faust.grame.fr) namespace gxfeed { @@ -49,6 +49,9 @@ id = "gxfeed"; name = "?gxfeed"; groups = 0; + description = ""; // description (tooltip) + category = ""; // category + shortname = ""; // shortname mono_audio = 0; stereo_audio = compute_static; set_samplerate = init_static; diff -Nru guitarix-0.22.4/src/faust-generated/gxnoamp.cc guitarix-0.24.2/src/faust-generated/gxnoamp.cc --- guitarix-0.22.4/src/faust-generated/gxnoamp.cc 1970-01-01 00:00:00.000000000 +0000 +++ guitarix-0.24.2/src/faust-generated/gxnoamp.cc 2012-10-20 03:56:02.000000000 +0000 @@ -0,0 +1,113 @@ +// generated from file '../src/faust/gxnoamp.dsp' by dsp2cc: +// Code generated with Faust 0.9.46 (http://faust.grame.fr) + + +namespace gxnoamp { + +class Dsp: public PluginDef { +private: + int fSamplingFreq; + FAUSTFLOAT fslider0; + FAUSTFLOAT *fslider0_; + double fRec0[2]; + void clear_state_f(); + void init(unsigned int samplingFreq); + void compute(int count, float *input0, float *output0); + int register_par(const ParamReg& reg); + + static void clear_state_f_static(PluginDef*); + static void init_static(unsigned int samplingFreq, PluginDef*); + static void compute_static(int count, float *input0, float *output0, PluginDef*); + static int register_params_static(const ParamReg& reg); + static void del_instance(PluginDef *p); + +public: + Dsp(); + ~Dsp(); +}; + + + +Dsp::Dsp() + : PluginDef() { + version = PLUGINDEF_VERSION; + flags = 0; + id = "noamp"; + name = N_("---"); + groups = 0; + description = ""; // description (tooltip) + category = ""; // category + shortname = ""; // shortname + mono_audio = compute_static; + stereo_audio = 0; + set_samplerate = init_static; + activate_plugin = 0; + register_params = register_params_static; + load_ui = 0; + clear_state = clear_state_f_static; + delete_instance = del_instance; +} + +Dsp::~Dsp() { +} + +inline void Dsp::clear_state_f() +{ + for (int i=0; i<2; i++) fRec0[i] = 0; +} + +void Dsp::clear_state_f_static(PluginDef *p) +{ + static_cast(p)->clear_state_f(); +} + +inline void Dsp::init(unsigned int samplingFreq) +{ + fSamplingFreq = samplingFreq; + clear_state_f(); +} + +void Dsp::init_static(unsigned int samplingFreq, PluginDef *p) +{ + static_cast(p)->init(samplingFreq); +} + +inline void Dsp::compute(int count, float *input0, float *output0) +{ +#define fslider0 (*fslider0_) + double fSlow0 = (0.0010000000000000009 * pow(10,(0.05 * fslider0))); + for (int i=0; i(p)->compute(count, input0, output0); +} + +int Dsp::register_par(const ParamReg& reg) +{ + fslider0_ = reg.registerVar("amp2.stage2.gain1","","SA","",&fslider0, -6.0, -2e+01, 2e+01, 0.1); + return 0; +} + +int Dsp::register_params_static(const ParamReg& reg) +{ + return static_cast(reg.plugin)->register_par(reg); +} + +PluginDef *plugin() { + return new Dsp(); +} + +void Dsp::del_instance(PluginDef *p) +{ + delete static_cast(p); +} + +} // end namespace gxnoamp diff -Nru guitarix-0.22.4/src/faust-generated/highbooster.cc guitarix-0.24.2/src/faust-generated/highbooster.cc --- guitarix-0.22.4/src/faust-generated/highbooster.cc 1970-01-01 00:00:00.000000000 +0000 +++ guitarix-0.24.2/src/faust-generated/highbooster.cc 2012-10-20 03:56:02.000000000 +0000 @@ -0,0 +1,125 @@ +// generated from file '../src/faust/highbooster.dsp' by dsp2cc: +// Code generated with Faust 0.9.46 (http://faust.grame.fr) + + +namespace highbooster { + +class Dsp: public PluginDef { +private: + int fSamplingFreq; + double fConst0; + double fConst1; + double fConst2; + double fVec0[2]; + double fConst3; + double fConst4; + double fRec0[2]; + FAUSTFLOAT fslider0; + void clear_state_f(); + void init(unsigned int samplingFreq); + void compute(int count, float *input0, float *output0); + int register_par(const ParamReg& reg); + + static void clear_state_f_static(PluginDef*); + static void init_static(unsigned int samplingFreq, PluginDef*); + static void compute_static(int count, float *input0, float *output0, PluginDef*); + static int register_params_static(const ParamReg& reg); + static void del_instance(PluginDef *p); + +public: + Dsp(); + ~Dsp(); +}; + + + +Dsp::Dsp() + : PluginDef() { + version = PLUGINDEF_VERSION; + flags = 0; + id = "highbooster"; + name = N_("Treble boost"); + groups = 0; + description = ""; // description (tooltip) + category = N_("Tone control"); // category + shortname = ""; // shortname + mono_audio = compute_static; + stereo_audio = 0; + set_samplerate = init_static; + activate_plugin = 0; + register_params = register_params_static; + load_ui = 0; + clear_state = clear_state_f_static; + delete_instance = del_instance; +} + +Dsp::~Dsp() { +} + +inline void Dsp::clear_state_f() +{ + for (int i=0; i<2; i++) fVec0[i] = 0; + for (int i=0; i<2; i++) fRec0[i] = 0; +} + +void Dsp::clear_state_f_static(PluginDef *p) +{ + static_cast(p)->clear_state_f(); +} + +inline void Dsp::init(unsigned int samplingFreq) +{ + fSamplingFreq = samplingFreq; + fConst0 = (1.0 / tan((4712.38898038469 / min(192000, max(1, fSamplingFreq))))); + fConst1 = (1 + fConst0); + fConst2 = (0 - ((1 - fConst0) / fConst1)); + fConst3 = (0 - fConst0); + fConst4 = (1.0 / fConst1); + clear_state_f(); +} + +void Dsp::init_static(unsigned int samplingFreq, PluginDef *p) +{ + static_cast(p)->init(samplingFreq); +} + +inline void Dsp::compute(int count, float *input0, float *output0) +{ + double fSlow0 = (pow(10,(0.05 * fslider0)) - 1); + for (int i=0; i(p)->compute(count, input0, output0); +} + +int Dsp::register_par(const ParamReg& reg) +{ + reg.registerVar("highbooster.Level","","S","",&fslider0, 0.0, 0.5, 2e+01, 0.5); + return 0; +} + +int Dsp::register_params_static(const ParamReg& reg) +{ + return static_cast(reg.plugin)->register_par(reg); +} + +PluginDef *plugin() { + return new Dsp(); +} + +void Dsp::del_instance(PluginDef *p) +{ + delete static_cast(p); +} + +} // end namespace highbooster diff -Nru guitarix-0.22.4/src/faust-generated/impulseresponse.cc guitarix-0.24.2/src/faust-generated/impulseresponse.cc --- guitarix-0.22.4/src/faust-generated/impulseresponse.cc 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/src/faust-generated/impulseresponse.cc 2012-10-20 03:56:02.000000000 +0000 @@ -1,5 +1,5 @@ // generated from file '../src/faust/impulseresponse.dsp' by dsp2cc: -// Code generated with Faust 0.9.43 (http://faust.grame.fr) +// Code generated with Faust 0.9.46 (http://faust.grame.fr) namespace impulseresponse { @@ -41,6 +41,9 @@ id = "IR"; name = N_("ImpulseResponse"); groups = 0; + description = ""; // description (tooltip) + category = N_("Tone control"); // category + shortname = ""; // shortname mono_audio = compute_static; stereo_audio = 0; set_samplerate = init_static; diff -Nru guitarix-0.22.4/src/faust-generated/jconv_post.cc guitarix-0.24.2/src/faust-generated/jconv_post.cc --- guitarix-0.22.4/src/faust-generated/jconv_post.cc 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/src/faust-generated/jconv_post.cc 2012-10-20 03:56:02.000000000 +0000 @@ -1,5 +1,5 @@ // generated from file '../src/faust/jconv_post.dsp' by dsp2cc: -// Code generated with Faust 0.9.43 (http://faust.grame.fr) +// Code generated with Faust 0.9.46 (http://faust.grame.fr) namespace jconv_post { diff -Nru guitarix-0.22.4/src/faust-generated/jconv_post.h guitarix-0.24.2/src/faust-generated/jconv_post.h --- guitarix-0.22.4/src/faust-generated/jconv_post.h 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/src/faust-generated/jconv_post.h 2012-10-20 03:56:02.000000000 +0000 @@ -1,5 +1,5 @@ // generated from file '../src/faust/jconv_post.dsp' by dsp2cc: -// Code generated with Faust 0.9.43 (http://faust.grame.fr) +// Code generated with Faust 0.9.46 (http://faust.grame.fr) #define FAUSTFLOAT float diff -Nru guitarix-0.22.4/src/faust-generated/jconv_post_mono.cc guitarix-0.24.2/src/faust-generated/jconv_post_mono.cc --- guitarix-0.22.4/src/faust-generated/jconv_post_mono.cc 1970-01-01 00:00:00.000000000 +0000 +++ guitarix-0.24.2/src/faust-generated/jconv_post_mono.cc 2012-10-20 03:56:02.000000000 +0000 @@ -0,0 +1,45 @@ +// generated from file '../src/faust/jconv_post_mono.dsp' by dsp2cc: +// Code generated with Faust 0.9.46 (http://faust.grame.fr) + + +namespace jconv_post_mono { + + +Dsp::Dsp() { +} + +Dsp::~Dsp() { +} + +inline void Dsp::clear_state_f() +{ + for (int i=0; i<2; i++) fRec0[i] = 0; +} + +inline void Dsp::init(unsigned int samplingFreq) +{ + fSamplingFreq = samplingFreq; + clear_state_f(); +} + +inline void Dsp::compute(int count, float *input0, float *input1, float *output0) +{ + double fSlow0 = (0.01 * fslider0); + double fSlow1 = (1 - fSlow0); + double fSlow2 = (0.0010000000000000009 * pow(10,(0.05 * fslider1))); + for (int i=0; i/Main/AboutMenu" "") (gtk_accel_path "/Main/Animations" "") (gtk_accel_path "/Main/Compress" "m") -(gtk_accel_path "/Main/EngineBypass" "y") +(gtk_accel_path "/Main/EngineBypass" "y") (gtk_accel_path "/Main/EngineMenu" "") (gtk_accel_path "/Main/EngineMute" "space") (gtk_accel_path "/Main/Expand" "e") (gtk_accel_path "/Main/Help" "F1") (gtk_accel_path "/Main/JackLatency" "") +(gtk_accel_path "/Main/OscBuffer" "") (gtk_accel_path "/Main/JackPorts" "p") (gtk_accel_path "/Main/JackServerConnection" "c") (gtk_accel_path "/Main/JackStartup" "j") (gtk_accel_path "/Main/Liveplay" "d") +(gtk_accel_path "/Main/LoadLADSPA" "u") (gtk_accel_path "/Main/LoggingBox" "l") (gtk_accel_path "/Main/Meterbridge" "m") (gtk_accel_path "/Main/MidiController" "i") (gtk_accel_path "/Main/MidiInPresets" "") (gtk_accel_path "/Main/MonoPlugins" "") (gtk_accel_path "/Main/OptionsMenu" "") -(gtk_accel_path "/Main/Organize" "o") +(gtk_accel_path "/Main/Organize" "o") (gtk_accel_path "/Main/PluginCategory_Distortion" "") (gtk_accel_path "/Main/PluginCategory_Echo / Delay" "") (gtk_accel_path "/Main/PluginCategory_External" "") @@ -38,6 +40,7 @@ (gtk_accel_path "/Main/RackH" "h") (gtk_accel_path "/Main/ResetAll" "") (gtk_accel_path "/Main/Save" "") +(gtk_accel_path "/Main/SetPresetSwitcher" "") (gtk_accel_path "/Main/ShowPluginBar" "b") (gtk_accel_path "/Main/ShowRack" "r") (gtk_accel_path "/Main/ShowTooltips" "") @@ -46,3 +49,11 @@ (gtk_accel_path "/Main/StereoPlugins" "") (gtk_accel_path "/Main/TubeMenu" "") (gtk_accel_path "/Main/Tuner" "t") +(gtk_accel_path "/ladspa_window/ApplyAction" "s") +(gtk_accel_path "/ladspa_window/FileMenuAction" "") +(gtk_accel_path "/ladspa_window/FindAction" "f") +(gtk_accel_path "/ladspa_window/QuitAction" "q") +(gtk_accel_path "/ladspa_window/SaveAction" "o") +(gtk_accel_path "/ladspa_window/SelectAllAction" "a") +(gtk_accel_path "/ladspa_window/SelectNoneAction" "n") +(gtk_accel_path "/ladspa_window/ViewMenuAction" "") diff -Nru guitarix-0.22.4/src/gx_head/builder/crybaby_ui.glade guitarix-0.24.2/src/gx_head/builder/crybaby_ui.glade --- guitarix-0.22.4/src/gx_head/builder/crybaby_ui.glade 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/src/gx_head/builder/crybaby_ui.glade 2012-10-20 03:56:02.000000000 +0000 @@ -6,96 +6,36 @@ False - + True False - + True False + 5 - + True True True - crybaby.autowah + crybaby.wah + label4:rack_label - False - False + True + True 0 - - True - False - - - True - False - label - - - False - True - 0 - - - - - True - True - True - crybaby.wah - label1:rack_label - - - False - False - 1 - - - - - False - False - 1 - - - - - True - False - 0 - - - - - True - False - - + True False label - False - True - 0 - - - - - True - True - True - crybaby.level - label2:rack_label - - - False + True True 1 @@ -104,60 +44,169 @@ True True - 1 + 0 - + True False - + True False - label + + + True + True + True + crybaby.autowah + + + False + False + 0 + + + + + True + False + + + True + False + label + + + False + True + 0 + + + + + True + True + True + crybaby.wah + label1:rack_label + + + False + False + 1 + + + + + False + False + 1 + + - False - True + True + False 0 - + True - True - True - crybaby.wet_dry - False - label3:rack_label + False + + + True + False + label + + + False + True + 0 + + + + + True + True + True + crybaby.level + label2:rack_label + + + False + True + 1 + + True - False + True 1 - + True False - + + True + False + label + + + False + True + 0 + + + + True True True crybaby.wet_dry + False + label3:rack_label True False - 0 + 1 + + + + + True + False + + + True + True + True + crybaby.wet_dry + + + True + False + 0 + + + + + False + True + 2 - False + True True 2 @@ -166,7 +215,7 @@ True True - 2 + 1 diff -Nru guitarix-0.22.4/src/gx_head/builder/iredit.glade guitarix-0.24.2/src/gx_head/builder/iredit.glade --- guitarix-0.22.4/src/gx_head/builder/iredit.glade 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/src/gx_head/builder/iredit.glade 2012-10-20 03:56:02.000000000 +0000 @@ -1024,6 +1024,43 @@ + + True + False + + + True + False + <b>Chan.:</b> + True + + + False + True + 0 + + + + + True + False + 0 + label + + + False + True + 1 + + + + + True + True + 1 + + + True False @@ -1060,7 +1097,7 @@ False True - 1 + 2 @@ -1100,7 +1137,7 @@ False True - 2 + 3 diff -Nru guitarix-0.22.4/src/gx_head/builder/iredit_mono.glade guitarix-0.24.2/src/gx_head/builder/iredit_mono.glade --- guitarix-0.22.4/src/gx_head/builder/iredit_mono.glade 1970-01-01 00:00:00.000000000 +0000 +++ guitarix-0.24.2/src/gx_head/builder/iredit_mono.glade 2012-10-20 03:56:02.000000000 +0000 @@ -0,0 +1,1322 @@ + + + + + + + False + Guitarix JConvolver Parameters + 600 + dialog + + + + True + False + 20 + gxhead_expose + + + True + False + 5 + + + True + False + 10 + + + True + False + + + True + False + 4 + 6 + 4 + 4 + + + True + False + False + 0 + <span font_desc="Sans bold 20" foreground="#666666">No file selected +</span> +<span font_desc="Sans 12" foreground="#991A1A">Please open an impulse +response file with the +<b>File:</b> button</span> + + + + + + + + + + True + True + 0 + + + + + True + False + 5 + + + True + False + 0 + none + + + True + False + 12 + + + True + False + + + linear + True + True + False + linear scale for viewing the wave form + False + True + True + minitoggle + + + + True + True + 0 + + + + + log. + True + True + False + logarithmic scale + False + True + linear + minitoggle + + + True + True + 1 + + + + + + + + + True + False + <b>Display</b> + True + + + + + False + True + 0 + + + + + True + False + 1 + 2 + + + True + False + 2 + 2 + 2 + 2 + + + True + True + True + zoom out (center: triangle at bottom of graph) + False + + + + True + False + gtk-zoom-in + + + + + 1 + 2 + + + + + True + True + True + zoom in (center: triangle at bottom of graph) + False + + + + True + False + gtk-zoom-out + + + + + + + True + True + True + display entire range + False + + + + True + False + gtk-zoom-fit + + + + + 1 + 2 + + + + + True + True + True + move to zoom center +(triangle mark at bottom of graph) + False + + + + True + False + gtk-jump-to + + + + + 1 + 2 + 1 + 2 + + + + + + + False + True + 1 + + + + + False + False + 1 + + + + + True + True + 0 + + + + + True + False + 10 + + + True + False + 0 + + + True + False + 0 + 0 + 2 + 12 + 4 + + + True + False + + + True + False + 5 + 3 + 5 + + + True + False + 0 + Delay + + + 1 + 2 + GTK_FILL + GTK_FILL + + + + + True + False + 0 + Offset + + + 2 + 3 + GTK_FILL + GTK_FILL + + + + + True + False + 0 + Length + + + 3 + 4 + GTK_FILL + GTK_FILL + + + + + True + True + True + adjustment1 + 1 + + + + 1 + 2 + 1 + 2 + + + + + True + True + True + adjustment2 + 1 + + + + 1 + 2 + 2 + 3 + + + + + True + True + True + adjustment3 + 1 + + + + 1 + 2 + 3 + 4 + + + + + App_ly + True + True + True + False + True + + + + 3 + 4 + 5 + + + 8 + + + + + True + True + True + adjustment5 + 1 + + + + 2 + 3 + 1 + 2 + + + + + True + True + True + adjustment6 + 1 + + + + 2 + 3 + 2 + 3 + + + + + True + True + True + adjustment7 + 1 + + + + 2 + 3 + 3 + 4 + + + + + True + False + 1 + <small>Samples</small> + True + + + 1 + 2 + GTK_FILL + GTK_FILL + + + + + True + False + <small>MSec</small> + True + + + 2 + 3 + + + + + + + + True + True + 0 + + + + + Auto _Gain correction + True + True + True + False + True + + + False + False + 1 + + + + + + + + + True + False + <b>Settings</b> + True + + + + + False + False + 0 + + + + + True + False + 0 + + + True + False + 0 + 0 + 0 + 20 + 12 + 12 + + + True + False + 10 + + + True + False + 2 + 2 + 20 + + + True + True + True + adjustment4 + jconv_mono.gain + label13 + + + 1 + 2 + + + + + True + False + gain + + + GTK_FILL + GTK_FILL + + + + + True + False + 0 + 0 + + + True + True + True + False + none + jconv_mono.on_off + + + True + False + switchit + + + + + + + 1 + 2 + 1 + 2 + + + + + True + False + run + + + 1 + 2 + + + + + False + False + 0 + + + + + True + False + + + True + False + 8 + + + True + False + 1 + 1 + <small><small>dry</small></small> + True + + + False + False + 0 + + + + + True + False + <b>Mix</b> + True + + + True + True + 1 + + + + + True + False + 0 + 1 + <small><small>wet</small></small> + True + + + False + False + 2 + + + + + False + False + 0 + + + + + True + True + True + adjustment8 + jconv_mono.wet_dry + + + False + False + 1 + + + + + True + False + 1 + + + + + + + + + True + False + <b>Parameter (live update)</b> + True + + + + + False + False + 1 + + + + + True + False + 0.20000000298023224 + 8 + + + True + False + + + Reset + True + True + True + False + + + + True + False + 0 + + + + + Presets + True + True + True + False + + + True + False + 1 + + + + + + + False + False + 2 + + + + + False + True + 1 + + + + + True + False + 0 + + + True + False + 2 + 2 + 6 + 4 + + + True + False + 6 + + + True + False + 10 + + + True + False + 2 + + + True + False + 0 + <b>Samplerate:</b> + True + + + False + True + 0 + + + + + True + False + 0 + label + 7 + + + False + True + 1 + + + + + False + True + 0 + + + + + True + False + + + True + False + <b>Chan.:</b> + True + + + False + True + 0 + + + + + True + False + 0 + label + + + False + True + 1 + + + + + True + True + 1 + + + + + True + False + 2 + + + True + False + 0 + <b>Length:</b> + True + + + False + True + 0 + + + + + True + False + 0 + label + 7 + + + False + True + 1 + + + + + False + True + 2 + + + + + True + False + 2 + + + True + False + 0 + <b>Format:</b> + True + + + False + True + 0 + + + + + True + False + 0 + label + 10 + + + False + True + 1 + + + + + False + True + 3 + + + + + False + True + 0 + + + + + True + False + 4 + + + True + True + True + impulse response file to use for convolution +it can be mono or stereo + + False + + + + True + False + 2 + + + True + False + gtk-open + + + False + True + 0 + + + + + True + False + <b>File:</b> + True + + + False + True + 1 + + + + + + + False + True + 0 + + + + + True + False + <b>Dir:</b> + True + + + False + True + 1 + + + + + True + False + 0 + 4 + no file selected + True + start + + + True + True + 2 + + + + + False + True + 1 + + + + + True + False + + + end + 60 + + + 0 + + + + + True + True + 2 + + + + + + + + + True + False + <b>IR File Details</b> + True + + + + + False + False + 2 + + + + + True + True + 0 + + + + + True + False + 20 + end + + + gtk-help + True + True + True + False + True + + + False + False + 0 + True + + + + + gtk-cancel + True + True + True + False + True + + + + False + False + 1 + + + + + gtk-ok + True + True + True + True + True + False + True + + + + False + False + 2 + + + + + False + False + end + 1 + + + + + True + True + 0 + + + + + + + False + dialog + + + True + False + 20 + gxhead_expose + + + True + False + 8 + + + True + False + <b><big>Using the mouse in the graph window</big></b> + +<b>set delay / offset:</b> drag top scale +<b>cut left:</b> ctrl + left mouse button +<b>cut right:</b> ctrl + right mouse button + +gain line (initially just a green line at the top + corner areas): +<b>move point:</b> drag with mouse +<b>add point:</b> click on green line +<b>delete point:</b> click with right mouse button + +<b>zoom in / out:</b> use scroll wheel +<b>move left / right:</b> drag graph area + +<b>move mark / zoom center:</b> drag triangle in the bottom area +<b>switch between 2 predefined scales:</b> click right mouse button + +<big>click on the displays in the settings frame +to change values with the keyboard</big> + True + + + True + True + 0 + + + + + True + False + + + gtk-close + True + True + True + False + True + + + False + False + 0 + + + + + False + True + 1 + + + + + False + False + 0 + + + + + + + 100 + 1 + 10 + + + -10 + 10 + 0.10000000000000001 + 1 + + + 100 + 1 + 10 + + + 100 + 1 + 10 + + + -20 + 20 + 0.10000000000000001 + 1 + + + 100 + 0.10000000000000001 + 1 + + + 100 + 0.10000000000000001 + 1 + + + 100 + 0.10000000000000001 + 1 + + + 100 + 100 + 1 + 10 + + + -10 + 10 + 0.10000000000000001 + 1 + + + + + + + + + + + 0 + 0 + + + + + + diff -Nru guitarix-0.22.4/src/gx_head/builder/ladspaliste.glade guitarix-0.24.2/src/gx_head/builder/ladspaliste.glade --- guitarix-0.22.4/src/gx_head/builder/ladspaliste.glade 1970-01-01 00:00:00.000000000 +0000 +++ guitarix-0.24.2/src/gx_head/builder/ladspaliste.glade 2012-10-20 03:56:02.000000000 +0000 @@ -0,0 +1,985 @@ + + + + + + + + + + + + mono/stereo + + + mono + + + stereo + + + + + + + + + + + Tone control + + + Distortion + + + Reverb + + + Echo / Delay + + + Modulation + + + Guitar Effects + + + Misc + + + External + + + + + + + + + + + coarse + + + normal + + + fine + + + + + + + + + + + + + -- + 0 + + + no cleanup + 1 + + + activate + 2 + + + + + False + Select LADSPA plugins for Guitarix + 600 + + + True + False + 4 + 4 + + + True + False + + + + + + False + False + 0 + + + + + True + False + + + True + False + 4 + 4 + + + True + False + 8 + + + True + False + Show: + + + False + False + 0 + + + + + A_ll + True + True + False + False + True + True + True + + + False + False + 1 + + + + + _Selected + True + True + False + False + True + True + show_all + + + False + False + 2 + + + + + _Changed + True + True + False + False + True + True + show_all + + + False + False + 3 + + + + + True + False + liststore1 + + + + 0 + + + + + False + False + end + 4 + + + + + False + False + 0 + + + + + True + False + 20 + + + Select _All + True + True + True + False + True + + + False + False + 0 + + + + + Select _None + True + True + True + False + True + + + False + False + 1 + + + + + Show _Details + True + True + True + False + True + + + False + False + end + 2 + + + + + False + False + 1 + + + + + True + True + automatic + automatic + + + True + True + False + False + + + column + + + + 1 + + + + + + + column + + + + 0 + + + + + + + + + True + True + 2 + + + + + True + False + + + True + False + 4 + strings to search for (use ▼/▲): + + + False + False + 0 + + + + + True + True + + True + False + False + True + True + + + True + True + 1 + + + + + False + False + 3 + + + + + True + False + 4 + 20 + end + + + gtk-help + True + True + True + False + True + + + False + False + 0 + True + + + + + gtk-cancel + True + True + True + False + True + + + False + False + 1 + + + + + gtk-apply + True + True + True + False + True + + + False + False + 2 + + + + + gtk-save + True + True + True + False + True + + + False + False + 3 + + + + + False + False + 4 + + + + + False + False + 0 + + + + + False + 4 + 8 + + + True + False + 6 + 2 + 4 + + + True + False + 0 + Short Name + right + + + GTK_FILL + + + + + + True + False + 0 + Category + + + 1 + 2 + GTK_FILL + + + + + + True + True + + True + False + False + True + True + + + 1 + 2 + + + + + + True + False + liststore2 + 7 + + + + 0 + + + + + 1 + 2 + 1 + 2 + + + + + + True + False + 0 + LADSPA Category + + + 2 + 3 + GTK_FILL + + + + + + True + True + False + False + + True + False + False + True + True + + + 1 + 2 + 2 + 3 + + + + + True + False + 0 + LADSPA Author + + + 3 + 4 + GTK_FILL + + + + + + True + True + False + False + + True + False + False + True + True + + + 1 + 2 + 3 + 4 + + + + + True + False + 0 + LADSPA ID / Path + + + 4 + 5 + GTK_FILL + + + + + + True + True + False + False + + True + False + False + True + True + + + 1 + 2 + 4 + 5 + + + + + True + False + 0 + Master Slider (idx) + + + 5 + 6 + GTK_FILL + + + + + + True + False + + + True + False + + + + 0 + + + + + False + False + 0 + + + + + True + True + + True + False + False + True + True + + + True + True + 1 + + + + + 1 + 2 + 5 + 6 + + + + + False + False + 0 + + + + + True + False + + + _Restore Defaults + True + True + True + False + True + + + False + False + 0 + + + + + use dry/wet Box + True + True + True + False + + + False + False + 1 + + + + + True + False + 1 + Quirks: + + + True + True + 2 + + + + + True + False + liststore4 + 0 + + + + 0 + + + + + False + False + 3 + + + + + False + False + 1 + + + + + True + True + never + automatic + + + True + True + False + True + False + + + Idx + + + + 0 + + + + + + + autosize + Name + True + + + True + word + 150 + + + 1 + + + + + + + SR + + + + 10 + + + + + + + autosize + Default + + + True + + + 2 + + + + + + + autosize + lower + + + True + + + 3 + + + + + + + autosize + upper + + + True + + + 4 + + + + + + + autosize + step + + + True + False + liststore3 + 0 + + + 5 + + + + + + + C + + + + 11 + + + + + + + autosize + Type + + + True + False + 0 + + + 6 + 7 + + + + + + + autosize + N + + + + 9 + + + + + + + + + True + True + 2 + + + + + 150 + True + True + never + automatic + + + True + True + False + + + value + + + + 0 + + + + + + + label + + + True + + + 1 + + + + + + + + + False + False + 3 + + + + + True + True + 1 + + + + + True + True + 1 + + + + + + diff -Nru guitarix-0.22.4/src/gx_head/builder/mainpanel.glade guitarix-0.24.2/src/gx_head/builder/mainpanel.glade --- guitarix-0.22.4/src/gx_head/builder/mainpanel.glade 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/src/gx_head/builder/mainpanel.glade 2012-10-20 03:56:02.000000000 +0000 @@ -1108,9 +1108,11 @@ True False - + True False + vertical + cab_expose True @@ -1884,8 +1886,8 @@ 18 18 True - False - False + True + True False @@ -3301,7 +3303,7 @@ 1 True - False + True False False True @@ -3317,7 +3319,7 @@ 2 True - False + True False False True @@ -3333,7 +3335,7 @@ 3 True - False + True False False True @@ -3638,8 +3640,8 @@ 18 18 True - False - False + True + True False @@ -3761,19 +3763,32 @@ True False - + True False + vertical + cab_expose - + True False - stereo rack, horiz. mode - 270 + + + True + False + stereo rack, horiz. mode + 270 + + + False + True + 0 + + False - True + False 0 @@ -3816,7 +3831,7 @@ False 8 10 - rectangle_expose + cab_expose True @@ -3921,7 +3936,7 @@ 2 3 - + @@ -4101,7 +4116,7 @@ - + @@ -4281,12 +4296,6 @@ - - - - - - diff -Nru guitarix-0.22.4/src/gx_head/builder/menudef.xml guitarix-0.24.2/src/gx_head/builder/menudef.xml --- guitarix-0.22.4/src/gx_head/builder/menudef.xml 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/src/gx_head/builder/menudef.xml 2012-10-20 03:56:02.000000000 +0000 @@ -28,6 +28,7 @@ + diff -Nru guitarix-0.22.4/src/gx_head/engine/gx_cabinet_data.cc guitarix-0.24.2/src/gx_head/engine/gx_cabinet_data.cc --- guitarix-0.22.4/src/gx_head/engine/gx_cabinet_data.cc 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/src/gx_head/engine/gx_cabinet_data.cc 2012-10-20 03:56:02.000000000 +0000 @@ -738,6 +738,33 @@ } }; +CabDesc_imp<133> cab_data_vitalize = { + 133, 48000, + {0.000488281, -0.0020752, 0.000561523, -0.00231934, 0.000634766, -0.00247803, 0.000512695, -0.00247803, 0.000146484, -0.00219727, -0.000622559, -0.00145264, -0.00202637, + -2.44141e-05, -0.00438232, 0.00247803, -0.00822754, 0.00706787, -0.0159546, 0.0202148, -0.0471558, 0.0953003, -0.208582, 0.312427, 0.75, -0.26803, + 0.399963, 0.200696, -0.146655, -0.29303, -0.222168, -0.113098, 0.0267334, 0.0312134, 0.164685, 0.0443481, 0.186621, 0.0540039, 0.123303, + 0.0805054, 0.0739868, 0.0591797, 0.0661743, 0.0400391, 0.0429932, 0.0339844, 0.0320557, 0.02323, 0.0217285, 0.0182007, 0.0157227, 0.0130005, + 0.0103882, 0.00942383, 0.00718994, 0.0067749, 0.00458984, 0.00455322, 0.00272217, 0.00294189, 0.00140381, 0.00170898, 0.000402832, 0.000720215, -0.000354004, + -2.44141e-05, -0.000915527, -0.000610352, -0.00134277, -0.0010498, -0.00166016, -0.0013916, -0.0019043, -0.00166016, -0.0020874, -0.00187988, -0.00224609, -0.00203857, + -0.00235596, -0.00217285, -0.0024292, -0.0022583, -0.00247803, -0.00233154, -0.00252686, -0.00238037, -0.00256348, -0.0024292, 0.75, -0.00246582, -0.0026001, + -0.00247803, -0.0026001, -0.00249023, -0.0026001, -0.00250244, -0.0026001, -0.00251465, -0.0026001, -0.00251465, -0.0026001, -0.00251465, -0.0026001, -0.00252686, + -0.00258789, -0.00252686, -0.00258789, -0.00251465, -0.00257568, -0.00251465, -0.00256348, -0.00251465, -0.00256348, -0.00251465, -0.00256348, -0.00251465, -0.00256348, + -0.00251465, -0.00256348, -0.00251465, -0.00256348, -0.00252686, -0.00256348, -0.00252686, -0.00255127, -0.00252686, -0.00255127, -0.00252686, -0.00255127, -0.00252686, + -0.00255127, -0.00252686, -0.00256348 + } +}; + +CabDesc_imp<68> cab_data_charisma = { + 68, 48000, + {-0.0041626, 0.000817871, -0.00541992, 0.00203857, -0.00721436, 0.00386963, -0.00977783, 0.00655518, -0.0135254, 0.0107056, -0.019397, 0.0179687, -0.0306763, + 0.0349365, -0.060791, 0.0839355, -0.121387, 0.0738403, 0, -0.399963, 0.177356, 0.284045, 0.041626, -0.2479, -0.224634, -0.212317, + -0.0146851, -0.028186, 0.13606, 0.0628052, 0.142847, 0.111206, 0.0892456, 0.113098, 0.0713745, 0.0726318, 0.0624023, 0.0565918, 0.0397461, + 0.0431152, 0.0320679, 0.0316284, 0.0222412, 0.0241821, 0.0174805, 0.0184692, 0.0128052, 0.0139893, 0.0098999, 0.0109619, 0.00759277, 0.00843506, + 0.00577393, 0.00654297, 0.00443115, 0.00511475, 0.00335693, 0.00395508, 0.00250244, 0.00305176, 0.00181885, 0.00230713, 0.00124512, 0.00170898, 0.000805664, + 0.0012207, 0.000427246, 0.000805664 + } +}; + CabDesc_imp<192> contrast_ir_desc = { 192, 48000, { 0.147081, 0.208808, 0.208996, 0.163228, 0.0858905, -0.0119104, -0.0932825, -0.121011, -0.0999426, -0.071073, -0.0403973, -0.00214844, 0.0287018, diff -Nru guitarix-0.22.4/src/gx_head/engine/gx_convolver.cpp guitarix-0.24.2/src/gx_head/engine/gx_convolver.cpp --- guitarix-0.22.4/src/gx_head/engine/gx_convolver.cpp 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/src/gx_head/engine/gx_convolver.cpp 2012-10-20 03:56:02.000000000 +0000 @@ -359,25 +359,16 @@ return false; } if (audio.open_read(fname)) { - gx_system::gx_print_error("convolver", "Unable to open '" + fname + "'"); + gx_system::gx_print_error("convolver", Glib::ustring::compose("Unable to open '%1'", fname)); return false; } if (audio.chan() > 2) { - ostringstream buf; - buf << "only taking 2 of " << audio.chan() << " channels in impulse response"; - gx_system::gx_print_error("convolver", buf.str()); + gx_system::gx_print_error( + "convolver", + Glib::ustring::compose("only taking first 2 of %1 channels in impulse response", audio.chan())); return false; } adjust_values(audio.size(), buffersize, offset, delay, ldelay, length, size, bufsize); - /* FIXME remove - cout << "state=" << state() << ", ready=" << ready << endl; - cout << "fname=" << fname << ", size=" << audio.size() - << ", channels=" << audio.chan() << endl; - cout << "convolver: size=" << size << ", count=" << buffersize << ", bufsize=" - << bufsize << ", offset=" << offset << ", delay=" << delay - << ", ldelay=" << ldelay << ", length=" << length << ", gain" << gain - << ", lgain" << lgain << endl; - */ if (samplerate != static_cast(audio.rate())) { float f = float(samplerate) / audio.rate(); @@ -422,6 +413,63 @@ return flags == 0; } +bool GxConvolver::configure(string fname, float gain, unsigned int delay, unsigned int offset, + unsigned int length, unsigned int size, unsigned int bufsize, + const Gainline& points) { + Audiofile audio; + cleanup(); + if (fname.empty()) { + return false; + } + if (audio.open_read(fname)) { + gx_system::gx_print_error("convolver", Glib::ustring::compose("Unable to open '%1'", fname)); + return false; + } + if (audio.chan() > 1) { + gx_system::gx_print_error( + "convolver", + Glib::ustring::compose("only taking first channel of %1 channels in impulse response", audio.chan())); + return false; + } + unsigned int ldelay = delay; + adjust_values(audio.size(), buffersize, offset, delay, ldelay, length, size, bufsize); + + if (samplerate != static_cast(audio.rate())) { + float f = float(samplerate) / audio.rate(); + size = round(size * f) + 2; // 2 is safety margin for rounding differences + delay = round(delay * f); + } + if (Convproc::configure(1, 1, size, buffersize, bufsize, Convproc::MAXPART)) { + gx_system::gx_print_error("convolver", "error in Convproc::configure "); + return false; + } + + float gain_a[1] = {gain}; + unsigned int delay_a[1] = {delay}; + return read_sndfile(audio, 1, samplerate, gain_a, delay_a, offset, length, points); +} + +bool GxConvolver::compute(int count, float* input, float *output) { + if (state() != Convproc::ST_PROC) { + if (input != output) { + memcpy(output, input, count * sizeof(float)); + } + if (state() == Convproc::ST_WAIT) { + check_stop(); + } + if (state() == ST_STOP) { + ready = false; + } + return true; + } + memcpy(inpdata(0), input, count * sizeof(float)); + + int flags = process(sync); + + memcpy(output, outdata(0), count * sizeof(float)); + return flags == 0; +} + /**************************************************************** ** GxSimpleConvolver diff -Nru guitarix-0.22.4/src/gx_head/engine/gx_engine.cpp guitarix-0.24.2/src/gx_head/engine/gx_engine.cpp --- guitarix-0.22.4/src/gx_head/engine/gx_engine.cpp 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/src/gx_head/engine/gx_engine.cpp 2012-10-20 03:56:02.000000000 +0000 @@ -25,6 +25,7 @@ */ #include "engine.h" +#include "valve.h" #include "gx_faust_plugins.h" #include "../plugins/pluginlib.h" @@ -94,6 +95,9 @@ gx_amps::gxamp8::plugin, gx_amps::gxamp16::plugin, gx_amps::gxamp6::plugin, + + gx_amps::gxnoamp::plugin, // keep last position (UI switches controls) + 0 }; @@ -110,14 +114,14 @@ resamp(), // ModuleSelector's crybaby( - *this, ui, "crybaby", N_("Crybaby"), builtin_crybaby_plugins, + *this, ui, "crybaby", N_("Crybaby"), N_("Guitar Effects"), builtin_crybaby_plugins, "crybaby.autowah", _("select"), 0, PGN_POST_PRE), tonestack( - *this, ui, "amp.tonestack", N_("Tonestack"), + *this, ui, "amp.tonestack", N_("Tonestack"), N_("Tone control"), builtin_tonestack_plugins, "amp.tonestack.select", _("select"), 0, PGN_POST_PRE), ampstack( - *this, ui, "ampstack", _("Amp"), builtin_amp_plugins, + *this, ui, "ampstack", _("Amp"), "", builtin_amp_plugins, "tube.select", _("select"), ampstack_groups), // internal audio modules noisegate(), @@ -127,21 +131,31 @@ midiaudiobuffer(tuner), maxlevel(), oscilloscope(&ui, *this), - convolver(*this, sigc::mem_fun(stereo_chain, &StereoModuleChain::sync), - param, options.get_IR_pathlist(), options.get_sys_IR_dir()), + mono_convolver(*this, sigc::mem_fun(mono_chain, &MonoModuleChain::sync), + param, options.get_IR_pathlist(), options.get_sys_IR_dir()), + stereo_convolver(*this, sigc::mem_fun(stereo_chain, &StereoModuleChain::sync), + param, options.get_IR_pathlist(), options.get_sys_IR_dir()), cabinet(*this, sigc::mem_fun(mono_chain, &MonoModuleChain::sync), resamp), - contrast(*this, sigc::mem_fun(mono_chain, &MonoModuleChain::sync), resamp) { + preamp(*this, sigc::mem_fun(mono_chain, &MonoModuleChain::sync), resamp), + contrast(*this, sigc::mem_fun(mono_chain, &MonoModuleChain::sync), resamp), + ladspaloader(options) { #ifdef USE_MIDI_OUT tuner.set_dep_module(&midiaudiobuffer.plugin); #endif load_static_plugins(); - // loaded from shared libs if (!plugin_dir.empty()) { pluginlist.load_from_path(plugin_dir, PLUGIN_POS_RACK); } + for (unsigned int i = 0; i < ladspaloader.size(); ++i) { + PluginDef *p = ladspaloader.create(i); + if (p) { + pluginlist.add(p); + } + } + // selector objects to switch "alternative" modules add_selector(ampstack); add_selector(crybaby); @@ -202,14 +216,18 @@ // mono pl.add(gx_effects::low_high_pass::plugin(), PLUGIN_POS_RACK, PGN_GUI); + pl.add(gx_effects::highbooster::plugin(), PLUGIN_POS_RACK, PGN_GUI); pl.add(gx_effects::selecteq::plugin(), PLUGIN_POS_RACK, PGN_GUI); pl.add(&crybaby.plugin, PLUGIN_POS_RACK, PGN_GUI); pl.add(gx_effects::gx_distortion::plugin(), PLUGIN_POS_RACK, PGN_GUI); + pl.add(pluginlib::ts9sim::plugin(), PLUGIN_POS_RACK, PGN_GUI); pl.add(gx_effects::impulseresponse::plugin(), PLUGIN_POS_RACK, PGN_GUI); pl.add(gx_effects::compressor::plugin(), PLUGIN_POS_RACK, PGN_GUI); + pl.add(gx_effects::expander::plugin(), PLUGIN_POS_RACK, PGN_GUI); pl.add(gx_effects::overdrive::plugin(), PLUGIN_POS_RACK, PGN_GUI); pl.add(gx_effects::echo::plugin(), PLUGIN_POS_RACK, PGN_GUI); pl.add(gx_effects::delay::plugin(), PLUGIN_POS_RACK, PGN_GUI); + pl.add(&mono_convolver.plugin, PLUGIN_POS_RACK, PGN_GUI); pl.add(gx_effects::freeverb::plugin(), PLUGIN_POS_RACK, PGN_GUI); pl.add(&oscilloscope.plugin, PLUGIN_POS_RACK, PGN_GUI); pl.add(gx_effects::biquad::plugin(), PLUGIN_POS_RACK, PGN_GUI); @@ -217,9 +235,11 @@ pl.add(gx_effects::phaser_mono::plugin(), PLUGIN_POS_RACK, PGN_GUI); pl.add(gx_effects::chorus_mono::plugin(), PLUGIN_POS_RACK, PGN_GUI); pl.add(gx_effects::flanger_mono::plugin(), PLUGIN_POS_RACK, PGN_GUI); + pl.add(pluginlib::flanger_gx::plugin(), PLUGIN_POS_RACK, PGN_GUI); pl.add(gx_effects::gx_feedback::plugin(), PLUGIN_POS_RACK, PGN_GUI); pl.add(&tonestack.plugin, PLUGIN_POS_RACK, PGN_GUI); pl.add(&cabinet.plugin, PLUGIN_POS_RACK, PGN_GUI); + pl.add(&preamp.plugin, PLUGIN_POS_RACK, PGN_GUI); pl.add(pluginlib::abgate::plugin(), PLUGIN_POS_RACK); pl.add(pluginlib::vibe::plugin_mono(), PLUGIN_POS_RACK); // stereo @@ -231,7 +251,7 @@ pl.add(gx_effects::moog::plugin(), PLUGIN_POS_RACK, PGN_GUI); pl.add(gx_amps::gx_ampmodul::plugin(), PLUGIN_POS_RACK, PGN_GUI); pl.add(gx_effects::tonecontroll::plugin(), PLUGIN_POS_RACK, PGN_GUI); - pl.add(&convolver.plugin, PLUGIN_POS_RACK, PGN_GUI); + pl.add(&stereo_convolver.plugin, PLUGIN_POS_RACK, PGN_GUI); pl.add(gx_effects::stereoverb::plugin(), PLUGIN_POS_RACK, PGN_GUI); pl.add(pluginlib::zita_rev1::plugin(), PLUGIN_POS_RACK); pl.add(pluginlib::vibe::plugin_stereo(), PLUGIN_POS_RACK); diff -Nru guitarix-0.22.4/src/gx_head/engine/gx_engine_audio.cpp guitarix-0.24.2/src/gx_head/engine/gx_engine_audio.cpp --- guitarix-0.22.4/src/gx_head/engine/gx_engine_audio.cpp 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/src/gx_head/engine/gx_engine_audio.cpp 2012-10-20 03:56:02.000000000 +0000 @@ -386,7 +386,7 @@ ModuleSelectorFromList::ModuleSelectorFromList( EngineControl& seq_, gx_ui::GxUI& ui, const char* id_, const char* name_, - plugindef_creator plugins[], const char* select_id_, + const char* category_, plugindef_creator plugins[], const char* select_id_, const char* select_name_, const char** groups_, int flags_) : ModuleSelector(seq_), PluginDef(), @@ -408,6 +408,7 @@ } id = id_; name = name_; + category = category_; groups = groups_; flags = flags_; plugin = this; @@ -481,7 +482,7 @@ void EngineControl::registerParameter(ParamMap& param, ParameterGroups& groups) { - pluginlist.registerParameter(param, groups); + pluginlist.registerAllPlugins(param, groups); } void EngineControl::get_sched_priority(int &policy_, int &priority_, int prio_dim) { diff -Nru guitarix-0.22.4/src/gx_head/engine/gx_faust_plugins.cpp guitarix-0.24.2/src/gx_head/engine/gx_faust_plugins.cpp --- guitarix-0.22.4/src/gx_head/engine/gx_faust_plugins.cpp 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/src/gx_head/engine/gx_faust_plugins.cpp 2012-10-20 03:56:02.000000000 +0000 @@ -46,6 +46,7 @@ #include "faust/gxamp16.cc" #include "faust/gxamp17.cc" #include "faust/gxamp18.cc" +#include "faust/gxnoamp.cc" #include "faust/gx_ampmodul.cc" } @@ -80,12 +81,14 @@ namespace gx_effects { #include "faust/bassbooster.cc" +#include "faust/highbooster.cc" #include "faust/gxfeed.cc" #include "faust/gx_feedback.cc" #include "faust/gx_outputlevel.cc" #include "faust/gx_ampout.cc" #include "faust/overdrive.cc" #include "faust/compressor.cc" +#include "faust/expander.cc" #include "faust/crybaby.cc" #include "faust/autowah.cc" #include "faust/echo.cc" diff -Nru guitarix-0.22.4/src/gx_head/engine/gx_internal_plugins.cpp guitarix-0.24.2/src/gx_head/engine/gx_internal_plugins.cpp --- guitarix-0.22.4/src/gx_head/engine/gx_internal_plugins.cpp 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/src/gx_head/engine/gx_internal_plugins.cpp 2012-10-20 03:56:02.000000000 +0000 @@ -332,6 +332,7 @@ */ #include "faust/jconv_post.cc" +#include "faust/jconv_post_mono.cc" ConvolverAdapter::ConvolverAdapter( EngineControl& engine_, sigc::slot sync_, ParamMap& param_, @@ -345,18 +346,12 @@ pathlist(pathlist_), sys_ir_dir(sys_ir_dir_), activated(false), - jc_post(), settings_changed(), jcset(), jcp(0), plugin() { version = PLUGINDEF_VERSION; - id = "jconv"; - name = N_("Convolver"); - stereo_audio = convolver; - set_samplerate = convolver_init; - activate_plugin = activate; - register_params = convolver_register; + category = N_("Reverb"); //FIXME: add clear_state plugin = this; engine.signal_buffersize_change().connect( @@ -436,30 +431,56 @@ return conv.start(policy, priority); } -void ConvolverAdapter::convolver(int count, float *input0, float *input1, + +/**************************************************************** + ** class ConvolverStereoAdapter + */ + +ConvolverStereoAdapter::ConvolverStereoAdapter( + EngineControl& engine_, sigc::slot sync_, ParamMap& param_, + const gx_system::PathList& pathlist_, const std::string& sys_ir_dir_) + : ConvolverAdapter(engine_, sync_, param_, pathlist_, sys_ir_dir_) { + id = "jconv"; + name = N_("Convolver"); + register_params = convolver_register; + set_samplerate = convolver_init; + activate_plugin = activate; + stereo_audio = convolver; +} + +ConvolverStereoAdapter::~ConvolverStereoAdapter() { +} + +void ConvolverStereoAdapter::convolver(int count, float *input0, float *input1, float *output0, float *output1, PluginDef* plugin) { - ConvolverAdapter& self = *static_cast(plugin); + ConvolverStereoAdapter& self = *static_cast(plugin); if (self.conv.is_runnable()) { float conv_out0[count]; float conv_out1[count]; - if (!self.conv.compute(count, output0, output1, conv_out0, conv_out1)) { - self.plugin.on_off = false; - gx_system::gx_print_error("Convolver", "overload"); - } else { - self.jc_post.compute(count, output0, output1, - conv_out0, conv_out1, output0, output1); + if (self.conv.compute(count, input0, input1, conv_out0, conv_out1)) { + self.jc_post.compute(count, input0, input1, + conv_out0, conv_out1, output0, output1); + return; } + self.plugin.on_off = false; + gx_system::gx_print_error("Convolver", "overload"); + } + if (input0 != output0) { + memcpy(output0, input0, count * sizeof(float)); + } + if (input1 != output1) { + memcpy(output1, input1, count * sizeof(float)); } } -int ConvolverAdapter::convolver_register(const ParamReg& reg) { - ConvolverAdapter& self = *static_cast(reg.plugin); +int ConvolverStereoAdapter::convolver_register(const ParamReg& reg) { + ConvolverStereoAdapter& self = *static_cast(reg.plugin); self.jcp = JConvParameter::insert_param(self.param, "jconv.convolver", self, &self.jcset); return self.jc_post.register_par(reg); } -void ConvolverAdapter::convolver_init(unsigned int samplingFreq, PluginDef *p) { - ConvolverAdapter& self = *static_cast(p); +void ConvolverStereoAdapter::convolver_init(unsigned int samplingFreq, PluginDef *p) { + ConvolverStereoAdapter& self = *static_cast(p); boost::mutex::scoped_lock lock(self.activate_mutex); if (self.activated) { self.conv.stop_process(); @@ -475,8 +496,8 @@ } } -int ConvolverAdapter::activate(bool start, PluginDef *p) { - ConvolverAdapter& self = *static_cast(p); +int ConvolverStereoAdapter::activate(bool start, PluginDef *p) { + ConvolverStereoAdapter& self = *static_cast(p); boost::mutex::scoped_lock lock(self.activate_mutex); if (start) { if (self.activated && self.conv.is_runnable()) { @@ -505,6 +526,85 @@ /**************************************************************** + ** class ConvolverMonoAdapter + */ + +ConvolverMonoAdapter::ConvolverMonoAdapter( + EngineControl& engine_, sigc::slot sync_, ParamMap& param_, + const gx_system::PathList& pathlist_, const std::string& sys_ir_dir_) + : ConvolverAdapter(engine_, sync_, param_, pathlist_, sys_ir_dir_) { + id = "jconv_mono"; + name = N_("Convolver"); + register_params = convolver_register; + set_samplerate = convolver_init; + activate_plugin = activate; + mono_audio = convolver; +} + +ConvolverMonoAdapter::~ConvolverMonoAdapter() { +} + +void ConvolverMonoAdapter::convolver(int count, float *input, float *output, PluginDef* plugin) { + ConvolverMonoAdapter& self = *static_cast(plugin); + if (self.conv.is_runnable()) { + float conv_out[count]; + if (self.conv.compute(count, input, conv_out)) { + self.jc_post_mono.compute(count, output, conv_out, output); + return; + } + self.plugin.on_off = false; + gx_system::gx_print_error("Convolver", "overload"); + } + if (input != output) { + memcpy(output, input, count * sizeof(float)); + } +} + +int ConvolverMonoAdapter::convolver_register(const ParamReg& reg) { + ConvolverMonoAdapter& self = *static_cast(reg.plugin); + self.jcp = JConvParameter::insert_param(self.param, "jconv_mono.convolver", self, &self.jcset); + return self.jc_post_mono.register_par(reg);; +} + +void ConvolverMonoAdapter::convolver_init(unsigned int samplingFreq, PluginDef *p) { + ConvolverMonoAdapter& self = *static_cast(p); + boost::mutex::scoped_lock lock(self.activate_mutex); + if (self.activated) { + self.conv.stop_process(); + self.conv.set_samplerate(samplingFreq); + while (self.conv.is_runnable()) { + self.conv.checkstate(); + } + self.conv_start(); + } else { + self.conv.set_samplerate(samplingFreq); + } +} + +int ConvolverMonoAdapter::activate(bool start, PluginDef *p) { + ConvolverMonoAdapter& self = *static_cast(p); + boost::mutex::scoped_lock lock(self.activate_mutex); + if (start) { + if (self.activated && self.conv.is_runnable()) { + return 0; + } + } else { + if (!self.activated) { + return 0; + } + } + self.activated = start; + if (start) { + if (!self.conv_start()) { + return -1; + } + } else { + self.conv.stop_process(); + } + return 0; +} + +/**************************************************************** ** class BaseConvolver */ @@ -628,6 +728,8 @@ { "1x15", N_("1x15"), &static_cast(cab_data_1x15) }, { "Mesa Boogie", N_("Mesa Boogie"), &static_cast(cab_data_mesa) }, { "Briliant", N_("Briliant"), &static_cast(cab_data_briliant) }, + { "Vitalize", N_("Vitalize"), &static_cast(cab_data_vitalize) }, + { "Charisma", N_("Charisma"), &static_cast(cab_data_charisma) }, }; static const unsigned int cab_table_size = sizeof(cab_table) / sizeof(cab_table[0]); @@ -661,6 +763,7 @@ cab_names[cab_table_size].value_label = 0; id = "cab"; name = N_("Cabinet"); + category = N_("Tone control"); mono_audio = run_cab_conf; register_params = register_cab; } @@ -736,6 +839,147 @@ return 0; } +/**************************************************************** + ** class PreampConvolver + */ + +struct PreDesc { + int ir_count; + int ir_sr; + float ir_data[]; +}; + +template +struct PreDesc_imp { + int ir_count; + int ir_sr; + float ir_data[tab_size]; + operator PreDesc&() { return *(PreDesc*)this; } +}; + +#include "gx_preamp_data.cc" + +struct PreEntry { + const char *value_id; + const char *value_label; + PreDesc *data; +} pre_table[] = { + { "AC30", N_("AC30"), &static_cast(pre_data_ac30) }, + { "Bassman", N_("Bassman"), &static_cast(pre_data_bassman) }, + { "Tube", N_("Tube"), &static_cast(pre_data_tube) }, + { "Fender", N_("Fender"), &static_cast(pre_data_fender) }, + { "JCM800", N_("JCM800"), &static_cast(pre_data_jcm800) }, + { "JTM45", N_("JTM45"), &static_cast(pre_data_jtm45) }, + { "Mesa Boogie", N_("Mesa Boogie"), &static_cast(pre_data_mesaboogie) }, + { "Boutique", N_("Boutique"), &static_cast(pre_data_boutique) }, + { "Ampeg", N_("Ampeg"), &static_cast(pre_data_ampeg) }, + { "Rectifier", N_("Rectifier"), &static_cast(pre_data_rectifier) }, +}; +static const unsigned int pre_table_size = sizeof(pre_table) / sizeof(pre_table[0]); + +static PreEntry& getPreEntry(unsigned int n) { + if (n >= pre_table_size) { + n = pre_table_size - 1; + } + return pre_table[n]; +} + +#include "faust/preamp_impulse_former.cc" + +PreampConvolver::PreampConvolver(EngineControl& engine, sigc::slot sync, gx_resample::BufferResampler& resamp): + BaseConvolver(engine, sync, resamp), + current_pre(-1), + level(0), + preamp(0), + bass(0), + treble(0), + sum(no_sum), + pre_names(new value_pair[pre_table_size+1]), + impf() { + for (unsigned int i = 0; i < pre_table_size; ++i) { + PreEntry& pre = getPreEntry(i); + pre_names[i].value_id = pre.value_id; + pre_names[i].value_label = pre.value_label; + } + pre_names[pre_table_size].value_id = 0; + pre_names[pre_table_size].value_label = 0; + id = "pre"; + name = N_("Amp impulse"); + category = N_("Tone control"); + mono_audio = run_pre_conf; + register_params = register_pre; +} + +PreampConvolver::~PreampConvolver() { + delete[] pre_names; +} + +bool PreampConvolver::do_update() { + bool configure = preamp_changed(); + if (conv.is_runnable()) { + conv.set_not_runnable(); + sync(); + conv.stop_process(); + } + PreDesc& pre = *getPreEntry(preamp).data; + if (current_pre == -1) { + impf.init(pre.ir_sr); + } + float pre_irdata_c[pre.ir_count]; + impf.compute(pre.ir_count,pre.ir_data,pre_irdata_c); + while (!conv.checkstate()); + if (configure) { + if (!conv.configure(pre.ir_count, pre_irdata_c, pre.ir_sr)) { + return false; + } + } else { + if (!conv.update(pre.ir_count, pre_irdata_c, pre.ir_sr)) { + return false; + } + } + update_preamp(); + update_sum(); + return conv_start(); +} + +bool PreampConvolver::start(bool force) { + if (force) { + current_pre = -1; + } + if (preamp_changed() || sum_changed()) { + return do_update(); + } else { + while (!conv.checkstate()); + if (!conv.is_runnable()) { + return conv_start(); + } + return true; + } +} + +void PreampConvolver::check_update() { + if (preamp_changed() || sum_changed()) { + do_update(); + } +} + +void PreampConvolver::run_pre_conf(int count, float *input0, float *output0, PluginDef *p) { + PreampConvolver& self = *static_cast(p); + if (!self.conv.compute(count, output0)) { + self.plugin.on_off = false; + gx_system::gx_print_error("Convolver", "preamp overload"); + } +} + +int PreampConvolver::register_pre(const ParamReg& reg) { + PreampConvolver& pre = *static_cast(reg.plugin); + reg.registerIEnumVar("pre.select", "select", "B", "", pre.pre_names, &pre.preamp, 0); + reg.registerVar("pre.Level", "", "S", "", &pre.level, 1.0, 0.1, 2.1, 0.1); + reg.registerVar("pre.bass", "", "S", "", &pre.bass, 0.0, -10.0, 10.0, 0.5); + reg.registerVar("pre.treble", "", "S", "", &pre.treble, 0.0, -10.0, 10.0, 0.5); + pre.impf.register_par(reg); + return 0; +} /**************************************************************** ** class ContrastConvolver diff -Nru guitarix-0.22.4/src/gx_head/engine/gx_internal_ui_plugins.cpp guitarix-0.24.2/src/gx_head/engine/gx_internal_ui_plugins.cpp --- guitarix-0.22.4/src/gx_head/engine/gx_internal_ui_plugins.cpp 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/src/gx_head/engine/gx_internal_ui_plugins.cpp 2012-10-20 03:56:02.000000000 +0000 @@ -170,6 +170,7 @@ OscilloscopeAdapter::OscilloscopeAdapter( gx_ui::GxUI *ui, ModuleSequencer& engine) : PluginDef(), + mul_buffer(1), plugin(), activation(), size_change(), @@ -181,6 +182,7 @@ flags = PGN_SNOOP | PGN_NO_PRESETS; id = "oscilloscope"; name = N_("Oscilloscope"); + category = N_("Misc"); mono_audio = fill_buffer; activate_plugin = activate; plugin.pdef = this; @@ -188,14 +190,21 @@ sigc::mem_fun(*this, &OscilloscopeAdapter::change_buffersize)); } +int OscilloscopeAdapter::osc_register(const ParamReg& reg) { + + return 0; +} + void OscilloscopeAdapter::change_buffersize(unsigned int size_) { //FIXME waveview display needs mutex size_change(0); float *b = buffer; - buffer = new float[size_]; - size = size_; + unsigned int d = mul_buffer; + if (size_ > 1023) d = 1; + buffer = new float[size_ * d]; + size = size_* d; clear_buffer(); - size_change(size_); + size_change(size_* d); delete b; } @@ -203,9 +212,13 @@ unsigned int OscilloscopeAdapter::size = 0; // rt process function -void OscilloscopeAdapter::fill_buffer(int count, float *input0, float *output0, PluginDef*) { - assert(count == static_cast(size)); - (void)memcpy(buffer, output0, sizeof(float)*count); +void OscilloscopeAdapter::fill_buffer(int count, float *input0, float *output0, PluginDef *p) { + OscilloscopeAdapter& self = *static_cast(p); + if(count*self.mul_buffer != static_cast(size)) return; + if(self.mul_buffer > 1) { + (void)memmove(buffer, &buffer[count], sizeof(float)*count*(self.mul_buffer-1)); + } + (void)memcpy(&buffer[count*(self.mul_buffer-1)], output0, sizeof(float)*count); } int OscilloscopeAdapter::activate(bool start, PluginDef *plugin) { diff -Nru guitarix-0.22.4/src/gx_head/engine/gx_jack.cpp guitarix-0.24.2/src/gx_head/engine/gx_jack.cpp --- guitarix-0.22.4/src/gx_head/engine/gx_jack.cpp 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/src/gx_head/engine/gx_jack.cpp 2012-10-20 03:56:02.000000000 +0000 @@ -185,6 +185,8 @@ jackopt |= JackUseExactName; } + std::string ServerName = opt.get_jack_servername(); + set_jack_down(false); set_jack_exit(true); engine.set_stateflag(gx_engine::GxEngine::SF_INITIALIZING); @@ -201,10 +203,20 @@ client_name.c_str(), JackOptions(jackopt | JackSessionID), &jackstat, opt.get_jack_uuid().c_str()); } else { + if (ServerName.empty()) { client = jack_client_open(client_name.c_str(), JackOptions(jackopt), &jackstat); + } else { + client = jack_client_open(client_name.c_str(), JackOptions(jackopt | JackServerName), + &jackstat, ServerName.c_str()); + } } #else + if (ServerName.empty()) { client = jack_client_open(client_name.c_str(), JackOptions(jackopt), &jackstat); + } else { + client = jack_client_open(client_name.c_str(), JackOptions(jackopt | JackServerName), + &jackstat, ServerName.c_str()); + } #endif // ----- only start the insert gxjack.client when the amp gxjack.client is true if (client) { @@ -224,14 +236,28 @@ JackOptions(jackopt | JackSessionID | JackUseExactName), &jackstat, opt.get_jack_uuid2().c_str()); } else { + if (ServerName.empty()) { client_insert = jack_client_open( client_insert_name.c_str(), - JackOptions(jackopt | JackUseExactName), &jackstat); + JackOptions(jackopt | JackUseExactName ), &jackstat); + } else { + client_insert = jack_client_open( + client_insert_name.c_str(), + JackOptions(jackopt | JackUseExactName | JackServerName), + &jackstat, ServerName.c_str()); + } } #else + if (ServerName.empty()) { client_insert = jack_client_open( client_insert_name.c_str(), JackOptions(jackopt | JackUseExactName), &jackstat); + } else { + client_insert = jack_client_open( + client_insert_name.c_str(), + JackOptions(jackopt | JackUseExactName | JackServerName), + &jackstat, ServerName.c_str()); + } #endif if (!client_insert) { jack_client_close(client); @@ -274,7 +300,7 @@ gx_jack_callbacks(); client_change(); // might load port connection definitions - if (opt.get_jack_uuid().empty()) { + if (opt.get_jack_uuid().empty() && !opt.get_jack_noconnect()) { // when not loaded by session manager gx_jack_init_port_connection(); } diff -Nru guitarix-0.22.4/src/gx_head/engine/gx_paramtable.cpp guitarix-0.24.2/src/gx_head/engine/gx_paramtable.cpp --- guitarix-0.22.4/src/gx_head/engine/gx_paramtable.cpp 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/src/gx_head/engine/gx_paramtable.cpp 2012-10-20 03:56:02.000000000 +0000 @@ -490,6 +490,7 @@ ParameterGroups::ParameterGroups() { insert("system", N_("System")); insert("ui", N_("User Interface")); + insert("ui.amp", N_("User Interface")); // FIXME (ui.amp.tonestack) insert("engine", N_("Audio Engine")); } @@ -744,7 +745,8 @@ void FloatParameter::readJSON_value(gx_system::JsonParser& jp) { jp.next(gx_system::JsonParser::value_number); json_value = jp.current_value_float(); - if (json_value < lower || json_value > upper) { + const float eps = 1e-6; + if (json_value < lower-abs(eps*lower) || json_value > upper+abs(eps*upper)) { range_warning(json_value, lower, upper); } } @@ -781,8 +783,8 @@ /* FloatEnumParameter */ FloatEnumParameter::FloatEnumParameter(const string& id, const string& name, const value_pair* vn, bool preset, - float *v, int sv, bool ctrl): - FloatParameter(id, name, Enum, preset, v, sv, 0, get_upper(vn), 1, ctrl), + float *v, int sv, int low, bool ctrl, bool no_init): + FloatParameter(id, name, Enum, preset, v, sv, low, low+get_upper(vn), 1, ctrl, no_init), value_names(vn) {} const value_pair *FloatEnumParameter::getValueNames() const { @@ -791,7 +793,7 @@ void FloatEnumParameter::writeJSON(gx_system::JsonWriter& jw) { jw.write_key(_id.c_str()); - jw.write(value_names[static_cast(round(*value))].value_id); + jw.write(value_names[static_cast(round(*value-lower))].value_id); } void FloatEnumParameter::readJSON_value(gx_system::JsonParser& jp) { @@ -803,17 +805,19 @@ } jp.check_expect(gx_system::JsonParser::value_string); int up = static_cast(round(upper)); + int low = static_cast(round(lower)); int n = 0; - for (; n <= up; n++) { + for (; n <= up-low; n++) { if (jp.current_value() == value_names[n].value_id) { break; } } + n += low; if (n > up) { gx_system::gx_print_warning( _("read parameter"), (boost::format(_("parameter %1%: unknown enum value: %2%")) % _id % jp.current_value()).str()); - n = 0; + n = low; } json_value = n; } @@ -1297,7 +1301,8 @@ ParamMap::ParamMap() : id_map(), - addr_map() { + addr_map(), + replace_mode(false) { } ParamMap::~ParamMap() { @@ -1414,12 +1419,32 @@ #endif void ParamMap::insert(Parameter* param) { + if (replace_mode) { + map::iterator ia = addr_map.find(param->zone()); + assert(ia != addr_map.end()); + map::iterator ii = id_map.find(param->id()); + assert(ii != id_map.end()); + assert(ii->second == ia->second); + Parameter *p = ii->second; + addr_map.erase(ia); + id_map.erase(ii); + delete p; + } debug_check(unique_zone, param); addr_map.insert(pair(param->zone(), param)); debug_check(unique_id, param); id_map.insert(pair(param->id(), param)); } +void ParamMap::unregister(const string& id) { + Parameter *p = &(*this)[id]; + gx_ui::GxUI::zapZone(p->zone()); //FIXME + assert(gx_ui::GxUI::zoneCount(p->zone()) == 0); + addr_map.erase(p->zone()); + id_map.erase(id); + delete p; +} + void ParamMap::set_init_values() { for (iterator i = id_map.begin(); i != id_map.end(); ++i) { i->second->stdJSON_value(); diff -Nru guitarix-0.22.4/src/gx_head/engine/gx_pluginloader.cpp guitarix-0.24.2/src/gx_head/engine/gx_pluginloader.cpp --- guitarix-0.22.4/src/gx_head/engine/gx_pluginloader.cpp 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/src/gx_head/engine/gx_pluginloader.cpp 2012-10-20 03:56:02.000000000 +0000 @@ -27,27 +27,6 @@ ** class ParamRegImpl */ -class ParamRegImpl: public ParamReg { -private: - static gx_engine::ParamMap *pmap; - static float *registerVar_(const char* id, const char* name, const char* tp, - const char* tooltip, float* var, float val, - float low, float up, float step); - static void registerBoolVar_(const char* id, const char* name, const char* tp, - const char* tooltip, bool* var, bool val); - static void registerNonMidiVar_(const char * id, bool*var, bool preset, bool nosave); - static void registerEnumVar_(const char *id, const char* name, const char* tp, - const char* tooltip, const value_pair* values, float *var, float val, - float low, float up, float step); - static void registerIEnumVar_(const char *id, const char* name, const char* tp, - const char* tooltip, const value_pair* values, int *var, int val); - static void registerUEnumVar_(const char *id, const char* name, const char* tp, - const char* tooltip, const value_pair* values, - unsigned int *var, unsigned int std); -public: - ParamRegImpl(gx_engine::ParamMap* pm); -}; - gx_engine::ParamMap *ParamRegImpl::pmap = 0; ParamRegImpl::ParamRegImpl(gx_engine::ParamMap* pm): ParamReg() { @@ -64,6 +43,8 @@ float *ParamRegImpl::registerVar_(const char* id, const char* name, const char* tp, const char* tooltip, float* var, float val, float low, float up, float step) { + assert(step > 0); + assert(up > low); if (!name[0]) { assert(strrchr(id, '.')); name = strrchr(id, '.')+1; @@ -74,15 +55,33 @@ gx_engine::Parameter& p = (*pmap)[id]; #ifndef NDEBUG gx_engine::FloatParameter p2( - id, name, gx_engine::Parameter::Continuous, true, - &p.getFloat().get_value(), val, low, up, step, true); + id, name, (tp[0] == 'B' ? Parameter::Switch : gx_engine::Parameter::Continuous), + true, &p.getFloat().get_value(), val, low, up, step, true, false); p2.set_desc(tooltip); gx_engine::compare_parameter("Alias Parameter", &p, &p2); #endif return &p.getFloat().get_value(); } } - gx_engine::Parameter *p = pmap->reg_par(id, name, var, val, low, up, step); + gx_engine::Parameter *p = 0; + int i = 0; + if (tp[0] == 'S') { + i = 1; + p = pmap->reg_par(id, name, var, val, low, up, step); + if (tp[1] == 'L') { + assert(step > 1); + p->set_log_display(); + i = 2; + } + } else if (tp[0] == 'B') { + i = 1; + p = pmap->reg_par(id, name, var, val); + } else { + assert(false); + } + if (tp[i] == 'O') { + p->setSavable(false); + } if (tooltip && tooltip[0]) { p->set_desc(tooltip); } @@ -104,8 +103,11 @@ assert(strrchr(id, '.')); name = strrchr(id, '.')+1; } - assert(low == 0.0 && step == 1.0); - pmap->reg_enum_par(id, name, values, var, val); + assert(step == 1.0); + gx_engine::Parameter *p = pmap->reg_enum_par(id, name, values, var, val, low); + if (tooltip && tooltip[0]) { + p->set_desc(tooltip); + } } void ParamRegImpl::registerIEnumVar_(const char *id, const char* name, const char* tp, @@ -115,7 +117,10 @@ assert(strrchr(id, '.')); name = strrchr(id, '.')+1; } - pmap->reg_enum_par(id, name, values, var, val); + gx_engine::Parameter *p = pmap->reg_enum_par(id, name, values, var, val); + if (tooltip && tooltip[0]) { + p->set_desc(tooltip); + } } void ParamRegImpl::registerNonMidiVar_(const char * id, bool*var, bool preset, bool nosave) { @@ -132,7 +137,10 @@ assert(strrchr(id, '.')); name = strrchr(id, '.')+1; } - pmap->reg_uenum_par(id, name, values, var, std); + gx_engine::Parameter *p = pmap->reg_uenum_par(id, name, values, var, std); + if (tooltip && tooltip[0]) { + p->set_desc(tooltip); + } } @@ -162,7 +170,7 @@ }; PluginList::~PluginList() { - for (list::iterator i = rackchanger.begin(); i != rackchanger.end(); ++i) { + for (list::iterator i = rackchanger.begin(); i != rackchanger.end(); ++i) { delete(*i); } for (pluginmap::iterator p = pmap.begin(); p != pmap.end(); ++p) { @@ -250,9 +258,9 @@ if (get_gx_plugin(i, &p) < 0) { continue; } - if (!add(&p[i], pos)) { + if (!add(p, pos)) { cnt++; - gx_system::gx_print_info(_("Plugin Loader"), Glib::ustring::compose("loaded[%1]: %2", path, p[i].id)); + gx_system::gx_print_info(_("Plugin Loader"), Glib::ustring::compose("loaded[%1]: %2", path, p->id)); } } return cnt; @@ -292,6 +300,23 @@ return 0; } +void PluginList::delete_module(Plugin *pl, ParamMap& param, ParameterGroups& groups) { + unregisterPlugin(pl, param, groups); + PluginDef *p = pl->pdef; +#ifndef NDEBUG // avoid unused variable compiler warning + size_t n = pmap.erase(p->id); + assert(n == 1); +#else + pmap.erase(p->id); +#endif + if (!(p->flags & PGNI_NOT_OWN)) { + if (p->delete_instance) { + p->delete_instance(p); + } + delete pl; + } +} + int PluginList::add_module(Plugin *pvars, PluginPos pos, int flags) { const int mode_mask = (PGN_MODE_NORMAL|PGN_MODE_BYPASS|PGN_MODE_MUTE); // all mode bits PluginDef *p = pvars->pdef; @@ -381,7 +406,7 @@ } template -class RackChangerUiItem: public gx_ui::GxUiItem { +class RackChangerUiItem: public RackChangerUiItemBase { private: PluginList& pluginlist; T *fZone; @@ -391,6 +416,7 @@ ~RackChangerUiItem(); virtual bool hasChanged(); virtual void reflectZone(); + virtual void *zone(); }; template @@ -406,6 +432,11 @@ } template +void *RackChangerUiItem::zone() { + return fZone; +} + +template bool RackChangerUiItem::hasChanged() { return *fZone != fCache; } @@ -416,62 +447,142 @@ pluginlist.seq.set_rack_changed(); } -void PluginList::registerParameter(ParamMap& param, ParameterGroups& groups) { - for (pluginmap::iterator p = pmap.begin(); p != pmap.end(); p++) { - PluginDef *pd = p->second->pdef; - groups.insert(pd->id, tr_name(pd->name)); - const char **gp = pd->groups; - if (gp) { - while (*gp) { - string id = *gp++; - const char *name = *gp++; - if (!name) { - break; - } - if (id[0] == '.') { - id = id.substr(1); +void PluginList::registerGroup(PluginDef *pd, ParameterGroups& groups) { + groups.insert(pd->id, tr_name(pd->name)); + const char **gp = pd->groups; + if (gp) { + while (*gp) { + string id = *gp++; + const char *name = *gp++; + if (!name) { + break; + } + if (id[0] == '.') { + id = id.substr(1); + } else { + id = string(pd->id) + "." + id; + } + groups.insert(id, tr_name(name)); + } + } +} + +void PluginList::unregisterGroup(PluginDef *pd, ParameterGroups& groups) { + groups.erase(pd->id); + const char **gp = pd->groups; + if (gp) { + while (*gp) { + string id = *gp++; + const char *name = *gp++; + if (!name) { + break; + } + if (id[0] == '.') { + id = id.substr(1); + } else { + id = string(pd->id) + "." + id; + } + groups.erase(id); + } + } +} + +void PluginList::registerParameter(Plugin *pl, ParamMap& param, ParamRegImpl& preg) { + PluginDef *pd = pl->pdef; + if (pd->load_ui || (pd->flags & PGN_GUI)) { + string s = pd->id; + param.reg_par((s+".on_off").c_str(),N_("on/off"), &pl->on_off, 0); + new RackChangerUiItem(*this, &pl->on_off); + if (pd->flags & PGNI_DYN_POSITION || !(pd->flags & PGN_FIXED_GUI)) { + param.reg_non_midi_par("ui."+s, &pl->box_visible, true); + param.reg_non_midi_par(s+".s_h", &pl->plug_visible, false); + } + if (pd->flags & PGNI_DYN_POSITION) { + // PLUGIN_POS_RACK .. PLUGIN_POS_POST_START-1 + param.reg_non_midi_par(s+".position", &pl->position, true, + pl->position, 0, 999); + if (pd->mono_audio || (pd->flags & PGN_POST_PRE)) { + if (pd->flags & PGN_PRE) { + pl->effect_post_pre = 1; + } else if (pd->flags & PGN_POST) { + pl->effect_post_pre = 0; } else { - id = string(pd->id) + "." + id; + static const value_pair post_pre[] = {{N_("post")}, {N_("pre")}, {0}}; + param.reg_uenum_par((s+".pp").c_str(), "select", post_pre, + &(pl->effect_post_pre), 0); + new RackChangerUiItem(*this, &pl->effect_post_pre); } - groups.insert(id, tr_name(name)); } } } - ParamRegImpl preg(¶m); - for (pluginmap::iterator p = pmap.begin(); p != pmap.end(); p++) { - Plugin *pl = p->second; - PluginDef *pd = pl->pdef; - if (pd->load_ui || (pd->flags & PGN_GUI)) { - string s = pd->id; - param.reg_par((s+".on_off").c_str(),N_("on/off"), &pl->on_off, 0); - new RackChangerUiItem(*this, &pl->on_off); - if (pd->flags & PGNI_DYN_POSITION || !(pd->flags & PGN_FIXED_GUI)) { - param.reg_non_midi_par(string("ui.")+pd->name, &pl->box_visible, true); - param.reg_non_midi_par(s+".s_h", &pl->plug_visible, false); - } - if (pd->flags & PGNI_DYN_POSITION) { - // PLUGIN_POS_RACK .. PLUGIN_POS_POST_START-1 - param.reg_non_midi_par(s+".position", &pl->position, true, - pl->position, 0, 999); - if (pd->mono_audio || (pd->flags & PGN_POST_PRE)) { - if (pd->flags & PGN_PRE) { - pl->effect_post_pre = 1; - } else if (pd->flags & PGN_POST) { - pl->effect_post_pre = 0; - } else { - static const value_pair post_pre[] = {{N_("post")}, {N_("pre")}, {0}}; - param.reg_uenum_par((s+".pp").c_str(), "select", post_pre, - &(pl->effect_post_pre), 0); - new RackChangerUiItem(*this, &pl->effect_post_pre); + if (pd->register_params) { + preg.plugin = pd; + pd->register_params(preg); + } +} + +void PluginList::unregisterParameter(Plugin *pl, ParamMap& param) { + PluginDef *pd = pl->pdef; + string s = pd->id; + if (pd->load_ui || (pd->flags & PGN_GUI)) { + param.unregister(s+".on_off"); + if (pd->flags & PGNI_DYN_POSITION || !(pd->flags & PGN_FIXED_GUI)) { + param.unregister("ui."+s); + param.unregister(s+".s_h"); + } + if (pd->flags & PGNI_DYN_POSITION) { + param.unregister(s+".position"); + if (pd->mono_audio || (pd->flags & PGN_POST_PRE)) { + if (!(pd->flags & (PGN_PRE|PGN_POST))) { + param.unregister(s+".pp"); + for (list::iterator i = rackchanger.begin(); i != rackchanger.end(); ) { + if ((*i)->zone() == &pl->on_off || (*i)->zone() == &pl->effect_post_pre) { + list::iterator j = i; + ++i; + rackchanger.erase(j); + } else { + ++i; + } } } } } - if (pd->register_params) { - preg.plugin = pd; - pd->register_params(preg); + } + std::vector l; + if (pd->register_params) { + s += "."; + for (ParamMap::iterator i = param.begin(); i != param.end(); ++i) { + if (i->first.compare(0, s.size(), s) == 0) { + assert(i->second->isInPreset()); + l.push_back(&i->first); + } } } + for (std::vector::iterator i = l.begin(); i != l.end(); ++i) { + param.unregister(**i); + } +} + +void PluginList::registerPlugin(Plugin *pl, ParamMap& param, ParameterGroups& groups) { + registerGroup(pl->pdef, groups); + ParamRegImpl preg(¶m); + registerParameter(pl, param, preg); +} + +void PluginList::unregisterPlugin(Plugin *pl, ParamMap& param, ParameterGroups& groups) { + ParamRegImpl preg(¶m); + unregisterParameter(pl, param); + unregisterGroup(pl->pdef, groups); +} + +void PluginList::registerAllPlugins(ParamMap& param, ParameterGroups& groups) { + for (pluginmap::iterator p = pmap.begin(); p != pmap.end(); p++) { + registerGroup(p->second->pdef, groups); + } + ParamRegImpl preg(¶m); + for (pluginmap::iterator p = pmap.begin(); p != pmap.end(); p++) { + registerParameter(p->second, param, preg); + } } void PluginList::append_rack(UiBuilderBase& ui) { diff -Nru guitarix-0.22.4/src/gx_head/engine/gx_preamp_data.cc guitarix-0.24.2/src/gx_head/engine/gx_preamp_data.cc --- guitarix-0.22.4/src/gx_head/engine/gx_preamp_data.cc 1970-01-01 00:00:00.000000000 +0000 +++ guitarix-0.24.2/src/gx_head/engine/gx_preamp_data.cc 2012-10-20 03:56:02.000000000 +0000 @@ -0,0 +1,155 @@ +/* + * Copyright (C) 2009, 2010 Hermann Meyer, James Warden, Andreas Degert + * Copyright (C) 2011 Pete Shorthose + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + * --------------------------------------------------------------------------- + * + * This is the gx_head preamp impulse response data file + * + * ---------------------------------------------------------------------------- + */ + + +/**----------------------------- preamp impulse response data --------------------------------**/ +PreDesc_imp<128> pre_data_ac30 = { + 128, 48000, + { 0.00393066, -0.00275879, -0.0107056, -0.0186523, -0.021814, -0.0177856, -0.0113037, -0.00405273, -0.00921631, -0.0147461, -0.0227173, -0.024646, -0.0230713, + -0.0261353, -0.027417, -0.0293945, -0.0291382, -0.030481, -0.0371338, -0.0451782, -0.0536865, -0.0595215, -0.0629395, -0.0588989, -0.0539307, -0.053186, + -0.0653442, -0.0828857, -0.0994751, -0.107874, -0.106995, -0.0981201, -0.0919067, -0.0903198, -0.0974731, -0.106653, -0.116455, -0.124146, -0.126135, + -0.114941, -0.0956421, -0.0729492, -0.0572998, -0.0453003, -0.033374, -0.00854492, 0.0289063, 0.0814697, 0.130652, 0.170825, 0.202832, 0.235889, + 0.276648, 0.313464, 0.333203, 0.319739, 0.268335, 0.18291, 0.0634033, -0.0798462, -0.22821, -0.331702, -0.328626, -0.18291, 0.0696533, + 0.307117, 0.399951, 0.287476, 0.0474854, -0.154529, -0.192651, -0.0657959, 0.09823, 0.179211, 0.144958, 0.0553711, -0.0102051, -0.0203369, + 0.014624, 0.0598267, 0.087793, 0.085022, 0.0638306, 0.0387329, 0.0314209, 0.0392456, 0.0560425, 0.068689, 0.0671753, 0.0565918, 0.0387695, + 0.0280273, 0.0268066, 0.0389526, 0.0519897, 0.0639526, 0.0689575, 0.0678711, 0.0637085, 0.0591309, 0.0532959, 0.0495117, 0.046228, 0.0443359, + 0.042395, -0.0729492, -0.0572998, -0.0453003, -0.033374, -0.00854492, 0.0289063, 0.0814697, 0.130652, 0.170825, 0.202832, 0.235889, 0.276648, + 0.313464, 0.333203, 0.319739, 0.268335, 0.18291, 0.0634033, -0.0798462, -0.22821, -0.331702, -0.328626, -0.18291 + } +}; + +PreDesc_imp<128> pre_data_bassman = { + 128, 48000, + { 0.000488281, -0.000378418, -0.00321045, -0.00650635, -0.00511475, 0.00673828, 0.0290527, 0.053894, 0.0719116, 0.0805786, 0.0863525, 0.0949829, 0.108655, + 0.122083, 0.130762, 0.13269, 0.128613, 0.119299, 0.102869, 0.0820557, 0.0596191, 0.0385864, 0.0161621, -0.0170776, -0.0638428, -0.123486, + -0.185584, -0.230908, -0.245093, -0.218103, -0.143518, -0.0282349, 0.111316, 0.246362, 0.323035, 0.263818, 0.0418091, -0.247791, -0.399951, + -0.245801, 0.130835, 0.372144, 0.217542, -0.121814, -0.222314, -0.0390137, 0.103052, 0.0520996, -0.0181641, 0.0101318, 0.0483154, 0.0265869, + -0.00666504, -0.00996094, -0.00302734, -0.000610352, 0.00522461, 0.0172119, 0.027063, 0.0286743, 0.025415, 0.0218018, 0.0203979, 0.0170776, 0.0137329, + 0.0106445, 0.00473633, -0.00032959, -0.00130615, 0.00222168, 0.00529785, 0.00579834, 0.00633545, 0.00717773, 0.0081543, 0.00645752, 0.00487061, 0.00588379, + 0.00864258, 0.00938721, 0.00789795, 0.00598145, 0.00288086, -0.00213623, -0.00666504, -0.00614014, -0.0032959, -0.00314941, -0.00595703, -0.00964355, -0.0100464, + -0.00727539, -0.00544434, -0.0034668, -0.143518, -0.0282349, 0.111316, 0.246362, 0.323035, 0.263818, 0.0418091, -0.247791, -0.399951, -0.245801, + 0.130835, 0.372144, 0.217542, -0.121814, -0.222314, -0.0390137, 0.103052, 0.0520996, -0.0181641, 0.0101318, 0.0483154, 0.0265869, -0.00666504, + -0.00996094, -0.00302734, -0.000610352, 0.00522461, 0.0172119, 0.027063, 0.0286743, 0.025415, 0.0218018, 0.0203979, 0.0170776 + } +}; + +PreDesc_imp<128> pre_data_tube = { + 128, 48000, + {-0.0245605, -0.0253174, -0.0260986, -0.0286377, -0.031604, -0.033606, -0.0339966, -0.036499, -0.0418579, -0.0461304, -0.04823, -0.0494751, -0.0528564, + -0.057312, -0.0626343, -0.0658691, -0.0683105, -0.0714844, -0.0766602, -0.0819824, -0.0854736, -0.0869263, -0.0892944, -0.091687, -0.0937378, -0.0932617, + -0.0877075, -0.0789307, -0.0695679, -0.0598022, -0.0466553, -0.0248901, 0.00413818, 0.0353516, 0.0682861, 0.105908, 0.150488, 0.198853, 0.241895, + 0.271985, 0.283386, 0.275623, 0.243127, 0.177686, 0.0702881, -0.0701538, -0.216687, -0.325879, -0.354602, -0.272156, -0.0790894, 0.169556, + 0.364709, 0.378906, 0.167236, -0.147705, -0.326514, -0.206458, 0.0912231, 0.242468, 0.107129, -0.0874878, -0.0894409, 0.028479, 0.0609253, + 0.00385742, -0.0260986, -0.0286377, -0.031604, -0.033606, -0.0339966, -0.036499, -0.0418579, -0.0461304, -0.04823, -0.0494751, -0.0528564, -0.057312, + -0.0626343, -0.0658691, -0.0683105, -0.0714844, -0.0766602, -0.0819824, -0.0854736, -0.0869263, -0.0892944, -0.091687, -0.0937378, -0.0932617, -0.0877075, + -0.0789307, -0.0695679, -0.0598022, -0.0466553, -0.0248901, 0.00413818, 0.0353516, 0.0682861, 0.105908, 0.150488, 0.198853, 0.241895, 0.271985, + 0.283386, 0.275623, 0.243127, 0.177686, 0.0702881, -0.0701538, -0.216687, -0.325879, -0.354602, -0.272156, -0.0790894, 0.169556, 0.364709, + 0.378906, 0.167236, -0.147705, -0.326514, -0.206458, 0.0912231, 0.242468, 0.107129, -0.0874878, -0.0894409, 0.028479 + } +}; + +PreDesc_imp<128> pre_data_fender = { + 128, 48000, + {-0.0116211, 0.00537109, 0.00996094, 0.00367432, 0.0297974, 0.0516968, 0.0670532, 0.061377, 0.0676147, 0.0970459, 0.133569, 0.146338, 0.130823, + 0.137866, 0.165503, 0.174207, 0.157825, 0.133142, 0.115955, 0.102698, 0.0799072, 0.0361084, -0.0414185, -0.11261, -0.160596, -0.183008, + -0.179309, -0.164636, -0.123999, -0.0490479, 0.05, 0.170764, 0.256372, 0.293835, 0.248767, 0.124622, -0.04646, -0.215698, -0.316101, + -0.26665, -0.0455322, 0.248218, 0.399951, 0.25116, -0.0908081, -0.319226, -0.186597, 0.120093, 0.233057, 0.0499023, -0.100122, -0.0296265, + 0.0689697, 0.0411621, -0.0216309, 0.00196533, 0.0372559, 0.0129639, -0.0108154, -0.00200195, 0.0161255, 0.0209961, 0.0179932, 0.0248291, 0.0217163, + 0.00469971, -0.00819092, -0.00952148, 0.00715332, 0.0289551, 0.0293945, 0.0170044, 0.00500488, -0.00257568, -0.000463867, 0.0072876, 0.0129028, 0.0176636, + 0.0216187, 0.0243164, 0.0015625, -0.0165649, -0.0194458, 0.0024292, 0.0309326, 0.0379272, 0.0205811, 0.0104248, -0.00147705, -0.00760498, -0.0174927, + -0.00527344, 0.0196899, 0.0338135, 0.0261719, 0.00256348, -0.00771484, -0.00799561, -0.00317383, -0.00292969, 0.0136841, 0.0227539, 0.0214478, 0.000671387, + -0.01604, 0.248218, 0.399951, 0.25116, -0.0908081, -0.319226, -0.186597, 0.120093, 0.233057, 0.0499023, -0.100122, -0.0296265, 0.0689697, + 0.0411621, -0.0216309, 0.00196533, 0.0372559, 0.0129639, -0.0108154, -0.00200195, 0.0161255 + } +}; + +PreDesc_imp<128> pre_data_jcm800 = { + 128, 48000, + {0.000439453, 0.00429688, 0.00175781, 0.00196533, 0.00533447, 0.00778809, 0.00926514, 0.0117065, 0.020166, 0.0301514, 0.0398437, 0.0490234, 0.0564209, + 0.0589844, 0.0675171, 0.0864258, 0.0965454, 0.102051, 0.115271, 0.126477, 0.118262, 0.089563, 0.0595825, 0.0301636, -0.0140869, -0.0776489, + -0.150586, -0.217993, -0.246912, -0.202112, -0.082605, 0.0856689, 0.270557, 0.399951, 0.343542, 0.0719238, -0.254639, -0.369421, -0.134888, + 0.22063, 0.291199, 0.0318115, -0.164673, -0.0643921, 0.0991211, 0.0802246, -0.00705566, -0.00765381, 0.0236328, 0.0121826, 0.0012085, 0.0198975, + 0.0295776, 0.0245361, 0.0183838, 0.012561, 0.005896, 0.00584717, 0.017395, 0.0233643, 0.013501, 0.00489502, 0.0097168, 0.0224487, 0.0200195, + 0.0150757, 0.0125, 0.00881348, 0.00986328, 0.0144043, 0.0143311, 0.00706787, 0.00874023, 0.0185303, 0.0203613, 0.00797119, 0.000744629, 0.0103027, + 0.0264282, 0.0213989, 0.00159912, 0.102051, 0.115271, 0.126477, 0.118262, 0.089563, 0.0595825, 0.0301636, -0.0140869, -0.0776489, -0.150586, + -0.217993, -0.246912, -0.202112, -0.082605, 0.0856689, 0.270557, 0.399951, 0.343542, 0.0719238, -0.254639, -0.369421, -0.134888, 0.22063, + 0.291199, 0.0318115, -0.164673, -0.0643921, 0.0991211, 0.0802246, -0.00705566, -0.00765381, 0.0236328, 0.0121826, 0.0012085, 0.0198975, 0.0295776, + 0.0245361, 0.0183838, 0.012561, 0.005896, 0.00584717, 0.017395, 0.0233643, 0.013501, 0.00489502, 0.0097168, 0.0224487 + } +}; + +PreDesc_imp<64> pre_data_jtm45 = { + 64, 48000, + {-0.00424805, 0.0186279, 0.0564453, 0.0822876, 0.0890381, 0.106787, 0.151208, 0.186194, 0.189404, 0.186902, 0.195264, 0.181775, 0.130627, + 0.0626709, -0.0112671, -0.121802, -0.266382, -0.371594, -0.361304, -0.212549, 0.0317261, 0.276929, 0.399951, 0.306494, 0.0298096, -0.22655, + -0.226782, 0.00374756, 0.171716, 0.101611, -0.0349487, -0.0384155, 0.0296997, 0.0264771, -0.0113403, 0.00616455, 0.0444702, 0.0356689, 0.00285645, + -0.00860596, 0.00100098, 0.0141846, 0.0238525, 0.0202881, 0.00688477, 0.00476074, 0.0190552, 0.0286133, 0.0125488, -0.010144, -0.00372314, 0.0260864, + 0.040625, 0.015332, -0.0156372, 0, 0, 0, 0, 0, 0, 0, 0, 0 + } +}; + +PreDesc_imp<64> pre_data_mesaboogie = { + 64, 48000, + { 0.0117493, 0.0395203, 0.100708, 0.164703, 0.210175, 0.235229, 0.246826, 0.252838, 0.263702, 0.28244, 0.299255, 0.291962, 0.250641, + 0.18454, 0.102966, -0.00238037, -0.138214, -0.296509, -0.448486, -0.547943, -0.555908, -0.451202, -0.244598, 0.0221252, 0.305664, 0.575653, + 0.766541, 0.733307, 0.341339, -0.345123, -0.936401, -0.891785, -0.0845642, 0.799438, 0.854553, 0.097168, -0.501892, -0.34967, 0.0797119, + 0.172302, 0.0288696, 0.0067749, 0.0860291, 0.0831909, 0.0121765, -0.0234375, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -0.125061, 0, 0, -0.125061, 0, 0 + } +}; + +PreDesc_imp<64> pre_data_boutique = { + 64, 48000, + {0.00469971, 0.0158081, 0.0402832, 0.0658813, 0.0840698, 0.0940918, 0.0987305, 0.101135, 0.105481, 0.112976, 0.119702, 0.116785, 0.100256, + 0.0738159, 0.0411865, -0.000952148, -0.0552856, -0.118604, -0.179395, -0.219177, -0.222363, -0.180481, -0.0978394, 0.0088501, 0.122266, 0.230261, + 0.306616, 0.293323, 0.136536, -0.138049, -0.374561, -0.356714, -0.0338257, 0.319775, 0.341821, 0.0388672, -0.200757, -0.139868, 0.0318848, + 0.0689209, 0.0115479, 0.00270996, 0.0344116, 0.0332764, 0.00487061, -0.009375, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -0.0500244, 0, 0, -0.0500244, 0, 0 + } +}; + +PreDesc_imp<64> pre_data_ampeg = { + 64, 48000, + {0.376916, 0.399988, 0.351416, 0.257043, 0.130933, -0.0336914, -0.144531, -0.157996, -0.172644, -0.116333, -0.0712891, -0.112268, -0.113647, + -0.0861938, -0.0596802, 0.0151367, 0.125342, 0.217004, 0.23717, 0.207117, 0.140686, 0.0196777, -0.0640503, -0.0810303, -0.0605713, -0.0167114, + 0.0118652, -0.00550537, -0.0471436, -0.0363281, 0.00446777, 0.0364014, 0.0814819, 0.115894, 0.121606, 0.0971802, 0.0432373, -0.0343506, -0.0949463, + -0.101904, -0.0881104, -0.0647095, -0.0311768, -0.0188232, -0.0287476, -0.0381836, -0.0307007, -0.0019043, 0.0474487, 0.0888916, 0.0936279, 0.0749878, + 0.037854, -0.000158691, -0.0143188, -0.00498047, 0.00410156, -0.00371094, -0.00367432, 0.0041626, -0.00980225, -0.0265137, -0.0301392, 0 + } +}; + +PreDesc_imp<128> pre_data_rectifier = { + 128, 48000, + {0.000415039, 0.000708008, 0.000842285, 0.000708008, 0.000427246, 6.10352e-05, 0.00020752, 0.00356445, 0.019873, 0.0684448, 0.171387, 0.309338, 0.399988, + 0.372913, 0.231567, 0.0299438, -0.158643, -0.269348, -0.289026, -0.242139, -0.154285, -0.0580444, 0.00939941, 0.0348145, 0.0287231, 0.00861816, + -0.00637207, -0.0074585, 0.00616455, 0.028772, 0.045459, 0.0450317, 0.025415, -0.000878906, -0.01521, -0.0193359, -0.0251831, -0.0307739, -0.0307251, + -0.0346802, -0.0551025, -0.0812134, -0.08927, -0.0733276, -0.0498169, -0.0314575, -0.0176147, -0.00771484, 0.00100098, 0.0110474, 0.0145874, 0.00759277, + -0.00129395, -0.00842285, -0.0231079, -0.0463745, -0.0635986, -0.0686523, -0.0694946, -0.0690796, -0.0635498, -0.0541382, -0.0402588, 1.4013e-44, 0.016394, + 0.0429443, 0.0556885, 0.0480225, 0.021582, -0.00991211, -0.0330811, -0.0422852, -0.0404175, -0.0348755, -0.0315063, -0.0310547, -0.0306396, -0.0261963, + -0.0164307, -0.00701904, -0.00411377, -0.00596924, -0.00959473, -0.0180176, -0.0307983, -0.0412109, -0.0429321, -0.0339355, -0.0175293, 0.000976562, 0.0182007, + 0.0319336, 0.0391846, 0.0374146, 0.0278442, 0.0142456, -0.000561523, -0.0143311, -0.0251221, -0.0328613, -0.0399902, -0.0474243, -0.0514771, -0.0478638, + -0.0363892, -0.0198853, -0.00266113, 0.0115356, 0.0209961, 0.0262817, 0.0294556, 0.0317749, 0.0327759, 0.0296265, 0.0199097, 0.00577393, -0.00692139, + -0.0128296, -0.0125, -0.0112915, -0.0134399, -0.018811, -0.0228516, -0.02052, -0.0106689, 0.00302734, 0.0149292, 1.4013e-44 + } +}; diff -Nru guitarix-0.22.4/src/gx_head/engine/gx_preset.cpp guitarix-0.24.2/src/gx_head/engine/gx_preset.cpp --- guitarix-0.22.4/src/gx_head/engine/gx_preset.cpp 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/src/gx_head/engine/gx_preset.cpp 2012-10-20 03:56:02.000000000 +0000 @@ -97,6 +97,44 @@ { "beat_detector.atack_gain", "midi_out.beat_detector.atack_gain" }, { "beat_detector.beat_gain", "midi_out.beat_detector.beat_gain" }, { "beat_detector.midi_gain", "midi_out.beat_detector.midi_gain" }, + // begin ui.* + // ui. -> ui. (rack unit visible) + { "ui.3 Band EQ", "ui.tonemodul" }, + { "ui.BiQuad Filter", "ui.biquad" }, + { "ui.Cabinet", "ui.cab" }, + { "ui.Preamp", "ui.pre" }, + { "ui.Chorus", "ui.chorus" }, + { "ui.Chorus Mono", "ui.chorus_mono" }, + { "ui.Compressor", "ui.compressor" }, + { "ui.Convolver", "ui.jconv" }, + { "ui.Crybaby", "ui.crybaby" }, + { "ui.Delay", "ui.delay" }, + { "ui.Echo", "ui.echo" }, + { "ui.Feedback", "ui.feedback" }, + { "ui.Flanger", "ui.flanger" }, + { "ui.Flanger Mono", "ui.flanger_mono" }, + { "ui.Freeverb", "ui.freeverb" }, + { "ui.ImpulseResponse", "ui.IR" }, + { "ui.Midi Out", "ui.midi_out" }, + { "ui.Moog Filter", "ui.moog" }, + { "ui.Multi Band Distortion", "ui.gx_distortion" }, + { "ui.Oscilloscope", "ui.oscilloscope" }, + { "ui.Overdrive", "ui.overdrive" }, + { "ui.Phaser", "ui.phaser" }, + { "ui.Phaser Mono", "ui.phaser_mono" }, + { "ui.Postamp", "ui.ampmodul" }, + { "ui.Scaleable EQ", "ui.eqs" }, + { "ui.Stereo Delay", "ui.stereodelay" }, + { "ui.Stereo Echo", "ui.stereoecho" }, + { "ui.Stereo Verb", "ui.stereoverb" }, + { "ui.Tonestack", "ui.amp.tonestack" }, + { "ui.Tremolo", "ui.tremolo" }, + { "ui.Vibe", "ui.univibe" }, + { "ui.Vibe Mono", "ui.univibe_mono" }, + { "ui.Zita Rev1", "ui.zita_rev1" }, + { "ui.abGate", "ui.abgate" }, + { "ui.low high pass", "ui.low_highpass" }, + // end ui.* {0} }; for (const char *(*p)[2] = old_new; (*p)[0]; ++p) { @@ -169,7 +207,7 @@ jp.next(gx_system::JsonParser::value_key); if (jp.current_value() == "engine") { read_parameters(jp, true); - } else if (jp.current_value() == "jconv") { + } else if (jp.current_value() == "jconv") { // for backwards compatibility jcset = new gx_engine::GxJConvSettings(); jcset->readJSON(jp, opt.get_IR_pathlist()); } else if (jp.current_value() == "midi_controller") { diff -Nru guitarix-0.22.4/src/gx_head/engine/gx_system.cpp guitarix-0.24.2/src/gx_head/engine/gx_system.cpp --- guitarix-0.22.4/src/gx_head/engine/gx_system.cpp 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/src/gx_head/engine/gx_system.cpp 2012-10-20 03:56:02.000000000 +0000 @@ -204,6 +204,31 @@ return false; } +PathList::PathList(const char *env_name): dirs() { + if (!env_name) { + return; + } + const char *p = getenv(env_name); + if (!p) { + return; + } + while (true) { + const char *q = strchr(p, ':'); + if (q) { + int n = q - p; + if (n) { + add(std::string(p, n)); + } + p = q+1; + } else { + if (*p) { + add(p); + } + break; + } + } +} + bool PathList::contains(const string& d) const { Glib::RefPtr f = Gio::File::create_for_path(d); for (pathlist::const_iterator i = dirs.begin(); @@ -251,6 +276,8 @@ jack_outputs(), jack_uuid(), jack_uuid2(), + jack_noconnect(false), + jack_servername(), load_file(shellvar("GUITARIX_LOAD_FILE")), builder_dir(GX_BUILDER_DIR), style_dir(GX_STYLE_DIR), @@ -265,6 +292,7 @@ IR_pathlist(), rcset(shellvar("GUITARIX_RC_STYLE")), lterminal(false), + a_save(false), #ifndef NDEBUG dump_parameter(false), #endif @@ -328,6 +356,10 @@ opt_jack_midi.set_long_name("jack-midi"); opt_jack_midi.set_description("Guitarix JACK midi control"); opt_jack_midi.set_arg_description("PORT"); + Glib::OptionEntry opt_jack_noconnect; + opt_jack_noconnect.set_short_name('J'); + opt_jack_noconnect.set_long_name("jack-no-conect"); + opt_jack_noconnect.set_description("dissable self-connect JACK ports"); Glib::OptionEntry opt_jack_instance; opt_jack_instance.set_short_name('n'); opt_jack_instance.set_long_name("name"); @@ -341,12 +373,19 @@ opt_jack_uuid2.set_short_name('A'); opt_jack_uuid2.set_long_name("jack-uuid2"); opt_jack_uuid2.set_description("JackSession ID"); + Glib::OptionEntry opt_jack_servername; + opt_jack_servername.set_short_name('s'); + opt_jack_servername.set_long_name("server-name"); + opt_jack_servername.set_description("JACK server name to connect to"); + opt_jack_servername.set_arg_description("NAME"); optgroup_jack.add_entry(opt_jack_input, jack_input); optgroup_jack.add_entry(opt_jack_output, jack_outputs); optgroup_jack.add_entry(opt_jack_midi, jack_midi); + optgroup_jack.add_entry(opt_jack_noconnect, jack_noconnect); optgroup_jack.add_entry(opt_jack_instance, jack_instance); optgroup_jack.add_entry(opt_jack_uuid, jack_uuid); optgroup_jack.add_entry(opt_jack_uuid2, jack_uuid2); + optgroup_jack.add_entry(opt_jack_servername, jack_servername); // FILE options @@ -362,6 +401,11 @@ opt_plugin_dir.set_description(_("directory with guitarix plugins (.so files)")); opt_plugin_dir.set_arg_description("DIR"); optgroup_file.add_entry_filename(opt_plugin_dir, plugin_dir); + Glib::OptionEntry opt_auto_save; + opt_auto_save.set_short_name('K'); + opt_auto_save.set_long_name("dissable-auto-save"); + opt_auto_save.set_description(_("dissable auto save to state file when quit")); + optgroup_file.add_entry(opt_auto_save, a_save); // DEBUG options Glib::OptionEntry opt_builder_dir; @@ -714,4 +758,16 @@ return rc; } +void strip(Glib::ustring& s) { + size_t n = s.find_first_not_of(' '); + if (n == Glib::ustring::npos) { + s.erase(); + return; + } + if (n != 0) { + s.erase(0, n); + } + s.erase(s.find_last_not_of(' ')+1); +} + } /* end of gx_system namespace */ diff -Nru guitarix-0.22.4/src/gx_head/engine/gx_ui.cpp guitarix-0.24.2/src/gx_head/engine/gx_ui.cpp --- guitarix-0.22.4/src/gx_head/engine/gx_ui.cpp 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/src/gx_head/engine/gx_ui.cpp 2012-10-20 03:56:02.000000000 +0000 @@ -61,6 +61,22 @@ i->second->remove(c); } +#ifndef NDEBUG +size_t GxUI::zoneCount(void *zone) { + size_t n = 0; + for (list::iterator g = fGuiList.begin(); g != fGuiList.end(); ++g) { + n += (*g)->fZoneMap.count(zone); + } + return n; +} +#endif + +void GxUI::zapZone(void *zone) { + for (list::iterator g = fGuiList.begin(); g != fGuiList.end(); ++g) { + (*g)->fZoneMap.erase(zone); + } +} + void GxUI::updateAllGuis(bool force) { if (in_updateAll) { return; diff -Nru guitarix-0.22.4/src/gx_head/engine/ladspaplugin.cpp guitarix-0.24.2/src/gx_head/engine/ladspaplugin.cpp --- guitarix-0.22.4/src/gx_head/engine/ladspaplugin.cpp 1970-01-01 00:00:00.000000000 +0000 +++ guitarix-0.24.2/src/gx_head/engine/ladspaplugin.cpp 2012-10-20 03:56:02.000000000 +0000 @@ -0,0 +1,647 @@ +/* + * Copyright (C) 2012 Andreas Degert, Hermann Meyer + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#include +#include + +#include "engine.h" + +using gx_system::JsonException; +using gx_system::JsonParser; +using gx_system::to_string; +using gx_system::gx_print_error; +using Glib::ustring; + +namespace gx_engine { + +/**************************************************************** + ** class LadspaDsp + */ + +class LadspaDsp: public PluginDef { +private: + static void init(unsigned int samplingFreq, PluginDef *plugin); + static void mono_process(int count, float *input, float *output, PluginDef *plugin); + static void stereo_process(int count, float *input1, float *input2, float *output1, float *output2, PluginDef *plugin); + static int activate(bool start, PluginDef *plugin); + static int registerparam(const ParamReg& reg); + static int uiloader(const UiBuilder& builder); + static void del_instance(PluginDef *plugin); + // + const LADSPA_Descriptor *desc; + void *handle; + LADSPA_Handle instance; + LADSPA_Data *ports; + Glib::ustring name_str; + const plugdesc *pd; + bool is_activated; + void connect(int tp, int i, float *v); + inline void cleanup(); + void set_shortname(); + float dry_wet; + std::string idd; + inline void mono_dry_wet(int count, float *input0, float *input1, float *output0); + inline void stereo_dry_wet(int count, float *input0, float *input1, float *input2, float *input3, float *output0, float *output1); + std::string make_id(const paradesc& p); + LadspaDsp(const plugdesc *plug, void *handle_, const LADSPA_Descriptor *desc_, bool mono); + ~LadspaDsp(); +public: + static LadspaDsp *create(const plugdesc *plug); + void set_plugdesc(const plugdesc* pd_); +}; + +LadspaDsp *LadspaDsp::create(const plugdesc *plug) { + void *handle; + handle = dlopen(plug->path.c_str(), RTLD_LOCAL|RTLD_NOW); + if (!handle) { + gx_print_error("ladspaloader",ustring::compose(_("Cannot open plugin: %1 [%2]"), plug->path, dlerror())); + return NULL; + } + LADSPA_Descriptor_Function ladspa_descriptor = (LADSPA_Descriptor_Function)dlsym(handle, "ladspa_descriptor"); + const char *dlsym_error = dlerror(); + if (dlsym_error) { + gx_print_error("ladspaloader",ustring::compose(_("Cannot load symbol 'ladspa_descriptor': %1"), dlsym_error)); + dlclose(handle); + handle = 0; + return NULL; + } + const LADSPA_Descriptor *desc = ladspa_descriptor(plug->index); + if (!desc) { + gx_print_error("ladspaloader",ustring::compose(_("Cannot load ladspa descriptor #%1 from %2"), plug->index, plug->path)); + dlclose(handle); + handle = 0; + return NULL; + } + if (desc->UniqueID == 4069 || desc->UniqueID == 4070) { + gx_print_error("ladspaloader",_("ladspa_guitarix not loaded")); + dlclose(handle); + handle = 0; + return NULL; + } + int num_inputs = 0; + int num_outputs = 0; + for (unsigned int i = 0; i < desc->PortCount; ++i) { + if (LADSPA_IS_PORT_AUDIO(desc->PortDescriptors[i])) { + if (LADSPA_IS_PORT_INPUT(desc->PortDescriptors[i])) { + num_inputs += 1; + } else { // LADSPA_IS_PORT_OUTPUT(desc->PortDescriptors[i]) + num_outputs += 1; + } + } + } + bool mono; + if (num_inputs == 1 && num_outputs == 1) { + mono = true; + } else if (num_inputs == 2 && num_outputs == 2) { + mono = false; + } else { + gx_print_error( + "ladspaloader",ustring::compose( + _("cannot use ladspa plugin %1 with %2 inputs and %3 outputs"), + desc->Label, num_inputs, num_outputs)); + dlclose(handle); + handle = 0; + return NULL; + } + return new LadspaDsp(plug, handle, desc, mono); +} + +LadspaDsp::LadspaDsp(const plugdesc *plug, void *handle_, const LADSPA_Descriptor *desc_, bool mono) + : PluginDef(), desc(desc_), handle(handle_), instance(), + ports(new LADSPA_Data[desc->PortCount]), name_str(), pd(plug), is_activated(false) { + version = PLUGINDEF_VERSION; + id = pd->id_str.c_str(); + category = pd->category.c_str(); + description = desc->Name; + name = desc->Name; + set_shortname(); + set_samplerate = init; + if (mono) { + mono_audio = mono_process; + } else { + stereo_audio = stereo_process; + } + activate_plugin = activate; + register_params = registerparam; + load_ui = uiloader; + delete_instance = del_instance; +} + +inline void LadspaDsp::cleanup() { + if (instance) { + if (pd->quirks & need_activate) { + activate(true, this); + } + activate(false, this); + if (!(pd->quirks & no_cleanup)) { + desc->cleanup(instance); + } + instance = 0; + } +} + +plugdesc::~plugdesc() { + for (std::vector::const_iterator it = names.begin(); it != names.end(); ++it) { + delete *it; + } +} + +LadspaDsp::~LadspaDsp() { + cleanup(); + if (handle && !(pd->quirks & no_cleanup)) { + dlclose(handle); + } + delete[] ports; +} + +int LadspaDsp::activate(bool start, PluginDef *plugin) { + LadspaDsp& self = *static_cast(plugin); + if (start == self.is_activated) { + return 0; + } + self.is_activated = start; + if (start) { + if (self.desc->activate) { + self.desc->activate(self.instance); + } + } else { + if (self.desc->deactivate) { + self.desc->deactivate(self.instance); + } + } + return 0; +} + +void LadspaDsp::connect(int tp, int i, float *v) { + for (unsigned int n = 0; n < desc->PortCount; ++n) { + if (!LADSPA_IS_PORT_AUDIO(desc->PortDescriptors[n])) { + continue; + } + if (desc->PortDescriptors[n] & tp) { + if (i == 0) { + desc->connect_port(instance, n, v); + return; + } + i -= 1; + } + } + gx_print_error("ladspaloader", _("audio port not found")); +} + +void LadspaDsp::set_plugdesc(const plugdesc* pd_) { + pd = pd_; + category = pd->category.c_str(); + set_shortname(); +} + +void LadspaDsp::set_shortname() { + if (!pd->shortname.empty()) { + shortname = pd->shortname.c_str(); + } else { + name_str = desc->Name; + if (name_str.size() > 15) { + name_str.erase(15); + } + shortname = name_str.c_str(); + } +} + +void LadspaDsp::init(unsigned int samplingFreq, PluginDef *plugin) { + LadspaDsp& self = *static_cast(plugin); + self.cleanup(); + if (samplingFreq == 0) { + return; + } + self.instance = self.desc->instantiate(self.desc, samplingFreq); + int n = 0; + for (std::vector::const_iterator it = self.pd->names.begin(); it != self.pd->names.end(); ++it, ++n) { + self.desc->connect_port(self.instance, (*it)->index, &self.ports[(*it)->index]); + } +} + +inline void LadspaDsp::mono_dry_wet(int count, float *input0, float *input1, float *output0) +{ + double fSlow0 = (0.01 * dry_wet); + double fSlow1 = (1 - fSlow0); + for (int i=0; i(plugin); + assert(self.is_activated); + if (self.pd->add_wet_dry) { + float wet_out[count]; + self.connect(LADSPA_PORT_INPUT, 0, input); + self.connect(LADSPA_PORT_OUTPUT, 0, wet_out); + self.desc->run(self.instance, count); + self.mono_dry_wet(count, input, wet_out, output); + } else { + self.connect(LADSPA_PORT_INPUT, 0, input); + self.connect(LADSPA_PORT_OUTPUT, 0, output); + self.desc->run(self.instance, count); + } +} + +inline void LadspaDsp::stereo_dry_wet(int count, float *input0, float *input1, float *input2, float *input3, float *output0, float *output1) +{ + double fSlow0 = (0.01 * dry_wet); + double fSlow1 = (1 - fSlow0); + for (int i=0; i(plugin); + assert(self.is_activated); + if (self.pd->add_wet_dry) { + float wet_out1[count]; + float wet_out2[count]; + self.connect(LADSPA_PORT_INPUT, 0, input1); + self.connect(LADSPA_PORT_INPUT, 1, input2); + self.connect(LADSPA_PORT_OUTPUT, 0, wet_out1); + self.connect(LADSPA_PORT_OUTPUT, 1, wet_out2); + self.desc->run(self.instance, count); + self.stereo_dry_wet(count, input1, input2, wet_out1, wet_out2, output1, output2); + } else { + self.connect(LADSPA_PORT_INPUT, 0, input1); + self.connect(LADSPA_PORT_INPUT, 1, input2); + self.connect(LADSPA_PORT_OUTPUT, 0, output1); + self.connect(LADSPA_PORT_OUTPUT, 1, output2); + self.desc->run(self.instance, count); + } +} + +static Glib::ustring TrimLabel(const char *label, int cnt_in_row) { + const size_t minlen = 60 / cnt_in_row - 1; + const size_t maxlen = minlen + 10; + const size_t cutlen = (maxlen + minlen) / 2; + Glib::ustring pn(label); + size_t rem = pn.find_first_of("(["); + if(rem != Glib::ustring::npos) { + pn.erase(rem); + } + while ((rem = pn.find_last_of(" ")) == pn.size()-1) { + pn.erase(rem); + } + rem = 0; + size_t rem1 = 0; + size_t lastpos = 0; + while (true) { + rem1 = pn.find_first_of(" ", rem1); + if (rem1 == Glib::ustring::npos) { + rem1 = pn.size(); + } + while (rem1 > rem + minlen) { + if (lastpos > rem) { + rem = lastpos; + pn.replace(lastpos, 1, 1, '\n'); + } else if (rem1 < rem + maxlen) { + if (rem1 == pn.size()) { + break; + } + rem = rem1; + pn.replace(rem1, 1, 1, '\n'); + } else { + rem += cutlen; + pn.insert(rem, "\n"); + } + rem += 1; + } + lastpos = rem1; + rem1 += 1; + if (rem1 >= pn.size()) { + break; + } + } + return pn; +} + +std::string LadspaDsp::make_id(const paradesc& p) { + return pd->id_str + "." + to_string(p.index); +} + +int LadspaDsp::registerparam(const ParamReg& reg) { + LadspaDsp& self = *static_cast(reg.plugin); + int n = 0; + int cnt_in_row = 0; + int left = 0; + for (std::vector::const_iterator it = self.pd->names.begin(); it != self.pd->names.end(); ++it, ++n) { + paradesc *d = *it; + if (d->tp != tp_none) { + left -= 1; + if (left < 0) { + cnt_in_row = 1; + std::vector::const_iterator it2 = it+1; + while (it2 != self.pd->names.end() && !(*it2)->newrow) { + if ((*it2)->tp != tp_none) { + ++cnt_in_row; + } + ++it2; + } + left = cnt_in_row; + } + } + const char *nm = self.desc->PortNames[d->index]; + Glib::ustring snm(d->name); + if (snm.empty() && d->tp != tp_none) { + snm = TrimLabel(nm, cnt_in_row); + } + if (d->tp == tp_enum) { + reg.registerEnumVar(self.make_id(*d).c_str(), snm.c_str(), "S", nm, d->values, &self.ports[d->index], + d->dflt, d->low, d->up, d->step); + } else { + const char *tp = 0; + switch (d->tp) { + case tp_none: tp = "S"; break; + case tp_int: tp = "S"; break; + case tp_scale: tp = "S"; break; + case tp_scale_log: tp = "SL"; break; + case tp_toggle: tp = "B"; break; + case tp_display: tp = "SO"; break; + case tp_display_toggle: tp = "BO"; break; + default: assert(false); + } + reg.registerVar(self.make_id(*d).c_str(), snm.c_str(), tp, nm, &self.ports[d->index], + d->dflt, d->low, d->up, d->step); + } + } + self.idd = self.pd->id_str + ".dry_wet"; + reg.registerVar(self.idd.c_str(),"","S","dry/wet",&self.dry_wet, 100, 0, 100, 1); + return 0; +} + +int LadspaDsp::uiloader(const UiBuilder& b) { + LadspaDsp& self = *static_cast(b.plugin); + b.openHorizontalhideBox(""); + if (self.pd->master_idx >= 0) { + int n = 0; + for (std::vector::const_iterator it = self.pd->names.begin(); it != self.pd->names.end(); ++it, ++n) { + if ((n)==self.pd->master_idx) { + switch ((*it)->tp) { + case tp_enum: + b.create_selector_no_caption(self.make_id(*self.pd->names[self.pd->master_idx]).c_str()); + break; + default: + const char *p = self.pd->master_label.c_str(); + if (!*p) { + p = 0; + } + b.create_master_slider(self.make_id(*self.pd->names[self.pd->master_idx]).c_str(), p); + break; + } + } + } + } + b.closeBox(); + b.openVerticalBox(""); + b.openHorizontalBox(""); + int n = 0; + for (std::vector::const_iterator it = self.pd->names.begin(); it != self.pd->names.end(); ++it, ++n) { + if ((*it)->newrow) { + b.closeBox(); + b.openHorizontalBox(""); + } + const char *p = 0; + std::string id = self.make_id(**it); + switch ((*it)->tp) { + case tp_scale: + case tp_scale_log: + if (!(*it)->has_caption) { + p = ""; + } + b.create_small_rackknob(id.c_str(), p); + break; + case tp_toggle: + if ((*it)->has_caption) { + b.create_switch("switch",id.c_str(), 0); + } else { + b.create_switch_no_caption("switchit",id.c_str()); + } + break; + case tp_display: + if (!(*it)->has_caption) { + p = ""; + } + b.create_port_display(id.c_str(), p); + break; + case tp_display_toggle: + if ((*it)->has_caption) { + b.create_switch("led",id.c_str(), 0); + } else { + b.create_switch_no_caption("led",id.c_str()); + } + break; + case tp_int: + b.create_spin_value(id.c_str(), 0); + break; + case tp_enum: + if ((*it)->has_caption) { + b.create_selector(id.c_str(), 0); + } else { + b.create_selector_no_caption(id.c_str()); + } + break; + case tp_none: + break; + default: + assert(false); + } + } + if (self.pd->add_wet_dry) { + b.create_small_rackknob(self.idd.c_str(), "dry/wet"); + } + b.closeBox(); + b.closeBox(); + return 0; +} + +void LadspaDsp::del_instance(PluginDef *plugin) { + delete static_cast(plugin); +} + + +/**************************************************************** + ** class LadspaLoader + */ + +PluginDef *LadspaLoader::create(plugdesc *p) { + return LadspaDsp::create(p); +} + +LadspaLoader::LadspaLoader(const gx_system::CmdlineOptions& options) + : plugins() { + load(options, plugins); +} + +LadspaLoader::~LadspaLoader() { + for (pluginarray::iterator i = plugins.begin(); i != plugins.end(); ++i) { + delete *i; + } +} + +bool LadspaLoader::load(const gx_system::CmdlineOptions& options, pluginarray& ml) { + try { + read_module_list(options, ml); + } catch (JsonException &e) { + gx_print_error("ladspaloader",ustring::compose(_("Exception in LADSPA list reader: %1"), e.what())); + return false; + } + return true; +} + +LadspaLoader::pluginarray::iterator LadspaLoader::find(unsigned long uniqueid) { + for (pluginarray::iterator i = begin(); i != end(); ++i) { + if ((*i)->UniqueID == uniqueid) { + return i; + } + } + return end(); +} + +void LadspaLoader::update_instance(PluginDef *pdef, plugdesc *pdesc) { + static_cast(pdef)->set_plugdesc(pdesc); +} + +paradesc::~paradesc() { + for (value_pair *p = values; p->value_id; ++p) { + g_free(const_cast(p->value_id)); + } + delete[] values; +} + +void paradesc::set_valuelist(const std::vector& v) { + values = new value_pair[v.size()+1]; + int n = 0; + for (std::vector::const_iterator i = v.begin(); i != v.end(); ++i, ++n) { + const char *p = g_strdup(i->c_str()); + values[n].value_id = p; + values[n].value_label = p; + } + values[n].value_id = 0; + values[n].value_label = 0; +} + +void LadspaLoader::read_module_config(const std::string& filename, plugdesc *p) { + std::ifstream ifs(filename.c_str()); + if (ifs.fail()) { + gx_print_error("ladspaloader", ustring::compose(_("can't open %1"), filename)); + return; + } + gx_system::JsonParser jp(&ifs); + jp.next(gx_system::JsonParser::begin_array); + jp.next(gx_system::JsonParser::value_number); + jp.current_value_int(); // int version + jp.next(gx_system::JsonParser::value_string); + p->shortname = jp.current_value(); + jp.next(gx_system::JsonParser::value_string); + p->category = jp.current_value(); + jp.next(gx_system::JsonParser::value_number); + p->master_idx = jp.current_value_int(); + jp.next(gx_system::JsonParser::value_string); + p->master_label = jp.current_value(); + jp.next(gx_system::JsonParser::value_number); + p->quirks = jp.current_value_int(); + jp.next(gx_system::JsonParser::value_number); + p->add_wet_dry= jp.current_value_int(); + jp.next(gx_system::JsonParser::begin_array); + while (jp.peek() != gx_system::JsonParser::end_array) { + paradesc *para = new paradesc; + jp.next(gx_system::JsonParser::begin_array); + jp.next(gx_system::JsonParser::value_number); + para->index = jp.current_value_int(); + jp.skip_object(); // meta data + jp.next(gx_system::JsonParser::value_string); + para->name = jp.current_value(); + jp.next(gx_system::JsonParser::value_number); // use_sr + jp.next(gx_system::JsonParser::value_number); + para->dflt = jp.current_value_float(); + jp.next(gx_system::JsonParser::value_number); + para->low = jp.current_value_float(); + jp.next(gx_system::JsonParser::value_number); + para->up = jp.current_value_float(); + jp.next(gx_system::JsonParser::value_number); + para->step = jp.current_value_float(); + jp.next(gx_system::JsonParser::value_number); + para->tp = static_cast(jp.current_value_int()); //FIXME (check valid) + jp.next(gx_system::JsonParser::value_number); + para->newrow = jp.current_value_int(); + jp.next(gx_system::JsonParser::value_number); + para->has_caption = jp.current_value_int(); + jp.next(gx_system::JsonParser::begin_array); + std::vector v; + while (jp.peek() != gx_system::JsonParser::end_array) { + jp.next(gx_system::JsonParser::value_string); + v.push_back(jp.current_value()); + } + jp.next(gx_system::JsonParser::end_array); + para->set_valuelist(v); + jp.next(gx_system::JsonParser::end_array); + p->names.push_back(para); + } + jp.next(gx_system::JsonParser::end_array); + jp.close(); + ifs.close(); +} + +void LadspaLoader::read_module_list(const gx_system::CmdlineOptions& options, pluginarray& ml) { + std::ifstream ifs(options.get_user_filepath("ladspa_defs.js").c_str()); + if (ifs.fail()) { + return; + } + gx_system::JsonParser jp(&ifs); + jp.next(gx_system::JsonParser::begin_array); + while (jp.peek() != gx_system::JsonParser::end_array) { + jp.next(gx_system::JsonParser::begin_array); + jp.next(gx_system::JsonParser::value_string); + plugdesc *p = new plugdesc; + p->path = jp.current_value(); + jp.next(gx_system::JsonParser::value_number); + p->index = jp.current_value_int(); + jp.next(gx_system::JsonParser::value_number); + p->UniqueID = jp.current_value_int(); + jp.next(gx_system::JsonParser::value_string); + p->Label = jp.current_value(); + jp.next(gx_system::JsonParser::end_array); + std::string s = get_ladspa_filename(p->UniqueID); + std::string fname = options.get_plugin_filepath(s); + if (access(fname.c_str(), F_OK) != 0) { + fname = options.get_factory_filepath(s); + if (access(fname.c_str(), F_OK) != 0) { + fname = ""; + } + } + if (!fname.empty()) { + try { + read_module_config(fname, p); + } catch (JsonException &e) { + gx_print_error("ladspaloader",ustring::compose(_("read error in file %1: %2"), s, e.what())); + } + } + p->id_str = "ladspa_"; + p->id_str += to_string(p->UniqueID); + ml.push_back(p); + } + jp.close(); + ifs.close(); +} + +} // namespace gx_engine diff -Nru guitarix-0.22.4/src/gx_head/gui/gx_child_process.cpp guitarix-0.24.2/src/gx_head/gui/gx_child_process.cpp --- guitarix-0.22.4/src/gx_head/gui/gx_child_process.cpp 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/src/gx_head/gui/gx_child_process.cpp 2012-10-20 03:56:02.000000000 +0000 @@ -25,7 +25,7 @@ #include "guitarix.h" #include - +#include #include #include #include @@ -37,7 +37,13 @@ */ bool GxChild::kill() { + if (m_killsignal == SIGKILL) { + Glib::signal_timeout().connect_once( + sigc::hide_return(sigc::bind(sigc::ptr_fun(::kill), m_pid, SIGKILL)), 100); + return ::kill(m_pid, SIGTERM) != -1; + } else { return ::kill(m_pid, m_killsignal) != -1; + } } GxChildProcs::~GxChildProcs() { @@ -54,6 +60,13 @@ ret = false; } } + if (!ret) { + return ret; + } + Glib::RefPtr ctx = Glib::MainContext::get_default(); + while (children.size() > 0) { + ctx->iteration(true); + } return ret; } @@ -388,7 +401,7 @@ (jack.client_insert_name+":out_0").c_str(), (jack.client_insert_name+":out_1").c_str(), 0 }; - GxChild *meterbridge = childprocs.launch(app_name, args, SIGTERM); + GxChild *meterbridge = childprocs.launch(app_name, args, SIGKILL); if (meterbridge) { new Meterbridge(meterbridge, action); } else { diff -Nru guitarix-0.22.4/src/gx_head/gui/gx_gui_helpers.cpp guitarix-0.24.2/src/gx_head/gui/gx_gui_helpers.cpp --- guitarix-0.22.4/src/gx_head/gui/gx_gui_helpers.cpp 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/src/gx_head/gui/gx_gui_helpers.cpp 2012-10-20 03:56:02.000000000 +0000 @@ -43,6 +43,28 @@ gtk_container_child_set_property(container.gobj(), child.gobj(), property_name, &v); } +Glib::ustring logarithmic_format_value(double v, int prec) { + if (v < -4) { + return Glib::ustring::format(std::setprecision(prec+1), pow(10.0,v)); + } else { + return Glib::ustring::format(std::fixed, std::setprecision(prec-floor(v)), pow(10.0,v)); + } +} + +int logarithmic_input_value(gpointer obj, gpointer nv) +{ + GtkEntry *entry = GTK_ENTRY(obj); + double *new_val = static_cast(nv); + gchar *err = NULL; + *new_val = g_strtod(gtk_entry_get_text(entry), &err); + if (*err) + return GTK_INPUT_ERROR; + else { + *new_val = log10(*new_val); + return TRUE; + } +} + /**************************************************************** ** message boxes */ diff -Nru guitarix-0.22.4/src/gx_head/gui/gx_jconv_settings.cpp guitarix-0.24.2/src/gx_head/gui/gx_jconv_settings.cpp --- guitarix-0.22.4/src/gx_head/gui/gx_jconv_settings.cpp 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/src/gx_head/gui/gx_jconv_settings.cpp 2012-10-20 03:56:02.000000000 +0000 @@ -30,17 +30,12 @@ ** static class variables and functions */ -IRWindow *IRWindow::instance = 0; - IRWindow *IRWindow::create(gx_ui::GxUI& ui, gx_engine::ConvolverAdapter& convolver, Glib::RefPtr icon, const gx_preset::GxSettings& gx_settings, - Glib::RefPtr accels) { - if (!instance) { - Glib::RefPtr bld = gx_gui::GxBuilder::create_from_file( - gx_system::get_options().get_builder_filepath("iredit.glade"), &ui); - instance = new IRWindow(bld, convolver, icon, gx_settings, accels); - } - return instance; + Glib::RefPtr accels, int nchan) { + Glib::RefPtr bld = gx_gui::GxBuilder::create_from_file( + gx_settings.get_options().get_builder_filepath(nchan == 1 ? "iredit_mono.glade" : "iredit.glade"), &ui); + return new IRWindow(bld, convolver, icon, gx_settings, accels, nchan); } /* @@ -65,13 +60,17 @@ sigc::mem_fun(*this, &IRWindow::on_combo_changed)); wcombo->set_model(model); - builder->find_widget("left", wLeft); - wLeft->signal_toggled().connect(sigc::mem_fun(*this, &IRWindow::on_left)); - builder->find_widget("right", wRight); - wRight->signal_toggled().connect(sigc::mem_fun(*this, &IRWindow::on_right)); - builder->find_widget("sum", wSum); - wSum->set_active(true); - wSum->signal_toggled().connect(sigc::mem_fun(*this, &IRWindow::on_sum)); + if (nchan != 1) { + builder->find_widget("left", wLeft); + wLeft->signal_toggled().connect(sigc::mem_fun(*this, &IRWindow::on_left)); + builder->find_widget("right", wRight); + wRight->signal_toggled().connect(sigc::mem_fun(*this, &IRWindow::on_right)); + builder->find_widget("sum", wSum); + wSum->set_active(true); + wSum->signal_toggled().connect(sigc::mem_fun(*this, &IRWindow::on_sum)); + } else { + wLeft = wRight = wSum = 0; + } builder->find_widget("log", wLog); wLog->set_active(true); @@ -97,9 +96,11 @@ wLength_ms->signal_value_changed().connect(sigc::mem_fun(*this, &IRWindow::on_ms_length_changed)); - builder->find_widget("delay_delta", wDelay_delta); - wDelay_delta->signal_format_value().connect(sigc::mem_fun(*this, - &IRWindow::on_delay_delta_format_value)); + if (nchan != 1) { + builder->find_widget("delay_delta", wDelay_delta); + wDelay_delta->signal_format_value().connect(sigc::mem_fun(*this, + &IRWindow::on_delay_delta_format_value)); + } builder->find_widget("home", wHome); wHome->signal_clicked().connect(sigc::mem_fun(*this, &IRWindow::on_home)); @@ -134,10 +135,14 @@ builder->find_widget("length", wSamples); builder->find_widget("samplerate", wSampleRate); builder->find_widget("format", wFormat); + builder->find_widget("channels", wChan); builder->find_widget("filename", wFilename); - builder->find_widget("channelbox", wChannelbox); - + if (nchan == 1) { + wChannelbox = 0; + } else { + builder->find_widget("channelbox", wChannelbox); + } Gtk::Button* button; builder->find_widget("help_button", button); button->signal_clicked().connect(sigc::mem_fun(*this, &IRWindow::on_help_clicked)); @@ -157,7 +162,7 @@ IRWindow::IRWindow(const Glib::RefPtr& bld, gx_engine::ConvolverAdapter& convolver_, Glib::RefPtr icon, const gx_preset::GxSettings& gx_settings, - Glib::RefPtr accels) + Glib::RefPtr accels, int nchan_) : builder(bld), filename(), ms(0.0), @@ -167,6 +172,7 @@ convolver(convolver_), gtk_window(0), autogain_conn(), + nchan(nchan_), //skipped all gtk widget pointers, will be set in init_connect() columns(), model(Gtk::TreeStore::create(columns)), @@ -227,11 +233,15 @@ wLength_ms->set_range(0, (length)*1000.0/rate); s_length = (boost::format("%1%") % length).str(); s_rate = (boost::format("%1%") % rate).str(); + s_channels = (boost::format("%1%") % channels).str(); } wSamples->set_text(s_length); wSampleRate->set_text(s_rate); wFormat->set_text(format); - wChannelbox->set_sensitive(channels >= 2); + wChan->set_text(s_channels); + if (nchan != 1) { + wChannelbox->set_sensitive(channels >= 2); + } wFilename->set_text(Glib::path_get_dirname(filename)); } @@ -306,7 +316,9 @@ length = audio_size; } wIredit->set_state(audio_buffer, audio_chan, audio_size, audio.rate(), offset, offset+length, delay-offset, gain); - wSum->set_active(true); + if (wSum) { + wSum->set_active(true); + } wLog->set_active(true); return true; } @@ -599,7 +611,6 @@ void IRWindow::destroy_self() { delete this; - instance = 0; } void IRWindow::on_window_hide() { @@ -623,7 +634,7 @@ name.erase(n); } save_state(); - new PluginPresetPopup("jconv", gx_settings, name); + new PluginPresetPopup(nchan == 1 ? "jconv_mono" : "jconv", gx_settings, name); } void IRWindow::on_help_clicked() { diff -Nru guitarix-0.22.4/src/gx_head/gui/gx_main.cpp guitarix-0.24.2/src/gx_head/gui/gx_main.cpp --- guitarix-0.22.4/src/gx_head/gui/gx_main.cpp 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/src/gx_head/gui/gx_main.cpp 2012-10-20 03:56:02.000000000 +0000 @@ -42,20 +42,22 @@ private: sigset_t waitset; Glib::Thread *thread; + pthread_t pthr; volatile bool exit; void signal_helper_thread(); void quit_slot(); void gx_ladi_handler(); void create_thread(); + static void relay_sigchld(int); public: PosixSignals(); ~PosixSignals(); }; - PosixSignals::PosixSignals() : waitset(), thread(), + pthr(), exit(false) { sigemptyset(&waitset); /* ----- block signal USR1 --------- @@ -76,12 +78,13 @@ sigprocmask(SIG_BLOCK, &waitset, NULL); create_thread(); + signal(SIGCHLD, relay_sigchld); } PosixSignals::~PosixSignals() { if (thread) { exit = true; - kill(getpid(), SIGINT); + pthread_kill(pthr, SIGINT); thread->join(); } sigprocmask(SIG_UNBLOCK, &waitset, NULL); @@ -105,13 +108,20 @@ gx_system::gx_print_warning( _("signal_handler"), _("signal USR1 received, save settings")); if (gx_preset::GxSettings::instance) { + bool cur_state = gx_preset::GxSettings::instance->get_auto_save_state(); + gx_preset::GxSettings::instance->disable_autosave(false); gx_preset::GxSettings::instance->auto_save_state(); + gx_preset::GxSettings::instance->disable_autosave(cur_state); } } +void PosixSignals::relay_sigchld(int) { + kill(getpid(), SIGCHLD); +} // --- wait for USR1 signal to arrive and invoke ladi handler via mainloop void PosixSignals::signal_helper_thread() { + pthr = pthread_self(); const char *signame; guint source_id_usr1 = 0; pthread_sigmask(SIG_BLOCK, &waitset, NULL); @@ -275,14 +285,13 @@ GxSplashBox::~GxSplashBox() {} GxSplashBox::GxSplashBox() - : Gtk::Window(Gtk::WINDOW_TOPLEVEL) { + : Gtk::Window(Gtk::WINDOW_POPUP) { set_redraw_on_allocate(true); set_app_paintable(); signal_expose_event().connect( sigc::group(&gx_cairo::splash_expose, GTK_WIDGET(gobj()), sigc::_1, (void*)0), false); set_decorated(false); - set_auto_startup_notification(false); set_type_hint(Gdk::WINDOW_TYPE_HINT_SPLASHSCREEN); set_position(Gtk::WIN_POS_CENTER ); set_default_size(280,80); @@ -336,7 +345,11 @@ try { // ----------------------- init basic subsystems ---------------------- - Glib::thread_init(); +#ifndef G_DISABLE_DEPRECATED + if (!g_thread_supported ()) { + Glib::thread_init(); + } +#endif Glib::init(); Gxw::init(); @@ -391,6 +404,7 @@ // ----------------------- run GTK main loop ---------------------- delete Splash; gui.run(); + gx_child_process::childprocs.killall(); #ifndef NDEBUG if (options.dump_parameter) { gx_engine::parameter_map.dump("json"); diff -Nru guitarix-0.22.4/src/gx_head/gui/gx_main_window.cpp guitarix-0.24.2/src/gx_head/gui/gx_main_window.cpp --- guitarix-0.22.4/src/gx_head/gui/gx_main_window.cpp 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/src/gx_head/gui/gx_main_window.cpp 2012-10-20 03:56:02.000000000 +0000 @@ -685,7 +685,7 @@ w->show(); monoampcontainer->show(); monorackcontainer.show_entries(); - vrack_scrolledbox->set_policy(Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC); + vrack_scrolledbox->set_policy(Gtk::POLICY_NEVER, Gtk::POLICY_ALWAYS); vrack_scrolledbox->set_size_request(scrl_size_x, scrl_size_y); if (preset_scrolledbox->get_parent() != main_vpaned) { preset_box_no_rack->remove(*preset_scrolledbox); @@ -757,6 +757,7 @@ monobox->size_request(req); stereorackcontainer.set_config_mode(v); monorackcontainer.set_config_mode(v); + szg_rack_units->set_ignore_hidden(v); bool plugin_bar = actions.show_plugin_bar->get_active(); if (v) { pre_act = actions.presets->get_active(); @@ -773,23 +774,27 @@ if (rackbox_stacked_vertical()) { width -= req2.width; } else { + if (req2.width & 1) { + req2.width += 1; + } width -= req2.width/2; } } + effects_frame_paintbox->set_size_request(req2.width, -1); monobox->set_size_request(width,-1); } else { if (!plugin_bar) { effects_frame_paintbox->hide(); } upper_rackbox->show(); + effects_frame_paintbox->set_size_request(-1,-1); monobox->set_size_request(-1,-1); if (pre_act) { actions.presets->set_active(true); } } if (!plugin_bar) { - update_scrolled_window(*vrack_scrolledbox); - update_scrolled_window(*stereorackbox); + update_width(); maybe_shrink_horizontally(); } } @@ -876,13 +881,19 @@ } } +void MainWindow::update_width() { + update_scrolled_window(*vrack_scrolledbox); + update_scrolled_window(*stereorackbox); +} + RackBox *MainWindow::add_rackbox_internal(PluginUI& plugin, Gtk::Widget *mainwidget, Gtk::Widget *miniwidget, bool mini, int pos, bool animate, Gtk::Widget *bare) { RackBox *r = new RackBox(plugin, *this, bare); if (mini) { r->swtch(true); } - r->pack(mainwidget, miniwidget); + r->pack(mainwidget, miniwidget, szg_rack_units); + update_width(); if (plugin.get_type() == PLUGIN_TYPE_MONO) { monorackcontainer.add(*manage(r), pos); } else { @@ -894,40 +905,6 @@ return r; } -class UiBuilderImplNew: public gx_gui::UiBuilderImpl { -private: - MainWindow& main; - std::vector *pluginlist; -public: - virtual bool load(gx_engine::Plugin *p); - bool load_unit(PluginUI &pl); - UiBuilderImplNew(MainWindow *i, gx_gui::StackBoxBuilder *b, std::vector *pl=0); -}; - -UiBuilderImplNew::UiBuilderImplNew(MainWindow *i, gx_gui::StackBoxBuilder *b, std::vector *pl) - : gx_gui::UiBuilderImpl(b), main(*i), pluginlist(pl) { -} - -bool UiBuilderImplNew::load(gx_engine::Plugin *p) { - PluginDef *pd = p->pdef; - if (!pd->load_ui) { - return false; - } - main.add_plugin(pluginlist, pd->id, "", ""); - return true; -} - -bool UiBuilderImplNew::load_unit(PluginUI &pl) { - PluginDef *pd = pl.plugin->pdef; - if (!pd->load_ui) { - return false; - } - dynamic_cast(intf)->prepare(); - plugin = pd; - pd->load_ui(*this); - return true; -} - void load_rack_ui(const std::string& fname, gx_ui::GxUI& ui, Gtk::Widget*& mainwidget, Gtk::Widget*& miniwidget) { const char *id_list[] = {"rackbox", "minibox", 0}; Glib::RefPtr bld = gx_gui::GxBuilder::create_from_file(fname, &ui, id_list); @@ -948,18 +925,18 @@ boxbuilder.get_box(pl.get_id(), mainwidget, miniwidget); } if (!mainwidget) { - UiBuilderImplNew builder(this, &boxbuilder); - if (builder.load_unit(pl)) { - boxbuilder.fetch(mainwidget, miniwidget); - } - } - if (!mainwidget) { std::string gladefile = options.get_builder_filepath( std::string(pl.get_id())+"_ui.glade"); if (access(gladefile.c_str(), R_OK) == 0) { load_rack_ui(gladefile, ui, mainwidget, miniwidget); } } + if (!mainwidget) { + gx_gui::UiBuilderImpl builder(this, &boxbuilder); + if (builder.load_unit(pl)) { + boxbuilder.fetch(mainwidget, miniwidget); + } + } return add_rackbox_internal(pl, mainwidget, miniwidget, mini, pos, animate); } @@ -1036,6 +1013,7 @@ img->set_tooltip_text(pl.tooltip); } tb->add(*manage(img)); + tb->show_all(); pl.toolitem = tb; gw->add(*manage(tb)); pl.group = gw; @@ -1301,6 +1279,8 @@ if (n > 0) { actions.latency->set_current_value(n); } + if (n > 1023) actions.osc_buffer_menu->set_sensitive(false); + else actions.osc_buffer_menu->set_sensitive(true); } void gx_show_help() { @@ -1433,6 +1413,8 @@ actions.group->add(Gtk::Action::create("EngineMenu",_("_Engine"))); actions.jack_latency_menu = Gtk::Action::create("JackLatency",_("_Latency")); actions.group->add(actions.jack_latency_menu); + actions.osc_buffer_menu = Gtk::Action::create("OscBuffer",_("Osc. Buffer-size")); + actions.group->add(actions.osc_buffer_menu); actions.group->add(Gtk::Action::create("PresetsMenu",_("_Presets"))); actions.group->add(Gtk::Action::create("PresetListMenu","--")); actions.group->add(Gtk::Action::create("PluginsMenu",_("P_lugins"))); @@ -1472,7 +1454,9 @@ sigc::mem_fun(*this, &MainWindow::on_engine_toggled)); actions.quit = Gtk::Action::create("Quit",_("_Quit")); - actions.group->add(actions.quit, sigc::ptr_fun(Gtk::Main::quit)); + actions.group->add( + actions.quit, + sigc::hide_return(sigc::mem_fun(this, &MainWindow::on_quit))); /* ** actions to open other (sub)windows @@ -1511,7 +1495,7 @@ ui, *pmap.reg_par("ui.racktuner", N_("Tuner on/off"), (bool*)0, true, false), "LiveTuner", "??"); actions.midi_out = UiBoolToggleAction::create( - ui, gx_engine::parameter_map["ui.Midi Out"].getBool(), "MidiOut", _("M_idi Out")); + ui, gx_engine::parameter_map["ui.midi_out"].getBool(), "MidiOut", _("M_idi Out")); actions.group->add( actions.midi_out, sigc::mem_fun(this, &MainWindow::on_show_midi_out)); @@ -1571,6 +1555,11 @@ actions.jackstartup, sigc::mem_fun(*this, &MainWindow::on_select_jack_control)); + actions.loadladspa = Gtk::Action::create("LoadLADSPA", _("LADSPA Pl_ugins")); + actions.group->add( + actions.loadladspa, + sigc::mem_fun(this, &MainWindow::on_load_ladspa)); + actions.group->add(Gtk::Action::create("ResetAll", _("Reset _All Parameters")), sigc::mem_fun(pmap, &gx_engine::ParamMap::set_init_values)); @@ -1653,7 +1642,7 @@ } } -void MainWindow::make_icons() { +void MainWindow::make_icons(bool force) { Gtk::OffscreenWindow w; w.set_type_hint(Gdk::WINDOW_TYPE_HINT_DOCK); // circumvent canberra-gtk-module bug on AV Linux Glib::RefPtr screen = w.get_screen(); @@ -1666,6 +1655,9 @@ Glib::RefPtr sz = Gtk::SizeGroup::create(Gtk::SIZE_GROUP_BOTH); std::vector > l; for (std::map::iterator i = plugin_dict.begin(); i != plugin_dict.end(); ++i) { + if (!force && i->second->icon) { + continue; + } Gtk::Widget *r = RackBox::create_icon_widget(*i->second, options); r->hide(); r->set_no_show_all(true); @@ -1673,45 +1665,151 @@ sz->add_widget(*r); l.push_back(std::pair(i->second, r)); } + //FIXME hack to set a minimum size + l.begin()->second->show(); + if (vb.size_request().width < 110) { + vb.set_size_request(110, -1); + } w.show_all(); for (std::vector >::iterator i = l.begin(); i != l.end(); ++i) { i->second->show(); - while (Gtk::Main::events_pending()) { - Gtk::Main::iteration(); - } - //w.get_window()->process_updates(true); // not needed (part of event loop) + w.show(); + w.get_window()->process_updates(true); i->first->icon = w.get_pixbuf(); if (i->first->toolitem) { dynamic_cast(i->first->toolitem->get_child())->set(i->first->icon); } + w.hide(); i->second->hide(); } } class JConvPluginUI: public PluginUI { private: + gx_engine::ConvolverAdapter& conv; virtual void on_plugin_preset_popup(); public: JConvPluginUI(MainWindow& main, const gx_engine::PluginList& pl, const char* id, - const Glib::ustring& fname="", const Glib::ustring& tooltip="") - : PluginUI(main, pl, id, fname, tooltip) {} + gx_engine::ConvolverAdapter& conv_, const Glib::ustring& fname="", + const Glib::ustring& tooltip="") + : PluginUI(main, pl, id, fname, tooltip), conv(conv_) { + } }; void JConvPluginUI::on_plugin_preset_popup() { - Glib::ustring name = Glib::path_get_basename(main.get_engine().convolver.getIRFile()); + Glib::ustring name = Glib::path_get_basename(conv.getIRFile()); Glib::ustring::size_type n = name.find_last_of('.'); if (n != Glib::ustring::npos) { name.erase(n); } - main.plugin_preset_popup(get_id(), name); } -void MainWindow::add_plugin(std::vector *p, const char *id, const Glib::ustring& fname, const Glib::ustring& tooltip) { +static gx_engine::LadspaLoader::pluginarray::iterator find_plugin(gx_engine::LadspaLoader::pluginarray& ml, gx_engine::plugdesc *pl) { + for (gx_engine::LadspaLoader::pluginarray::iterator i = ml.begin(); i != ml.end(); ++i) { + if ((*i)->UniqueID == pl->UniqueID) { + return i; + } + } + return ml.end(); +} + +void MainWindow::on_ladspa_finished(bool reload, bool quit) { + if (reload) { + typedef gx_engine::LadspaLoader::pluginarray pluginarray; + pluginarray ml; + // load plugindesc list + engine.ladspaloader.load(options, ml); + // look for removed and changed plugins + std::vector to_remove; + for (pluginarray::iterator i = engine.ladspaloader.begin(); i != engine.ladspaloader.end(); ++i) { + PluginUI *pui = plugin_dict[(*i)->id_str]; + pluginarray::iterator j = find_plugin(ml, *i); + if (j == ml.end()) { + plugin_dict.remove(pui); + pui->unset_ui_merge_id(uimanager); + actions.group->remove(pui->get_action()); + delete pui; + pui->plugin->on_off = false; + to_remove.push_back(pui->plugin); + } else { + engine.ladspaloader.update_instance(pui->plugin->pdef, *j); + PluginDef *pd = pui->plugin->pdef; + if (pd->register_params) { + pmap.set_replace_mode(true); + gx_engine::ParamRegImpl preg(&pmap); + preg.plugin = pd; + pd->register_params(preg); + pmap.set_replace_mode(false); + } + pui->update_rackbox(); + if ((*j)->category != (*i)->category) { + pui->unset_ui_merge_id(uimanager); + pui->group = add_plugin_category(pui->get_category()); + pui->toolitem->reparent(*pui->group); + add_plugin_menu_entry(pui); + } + } + } + // update engine for plugins to be removed + engine.update_module_lists(); + engine.mono_chain.release(); + engine.stereo_chain.release(); + // remove plugins + for (std::vector::iterator i = to_remove.begin(); i != to_remove.end(); ++i) { + engine.pluginlist.delete_module(*i, pmap, gx_engine::get_group_table()); + } + // add new plugins (engine) + std::vector pv; + for (pluginarray::iterator i = ml.begin(); i != ml.end(); ++i) { + if (engine.ladspaloader.find((*i)->UniqueID) == engine.ladspaloader.end()) { + PluginDef *plugin = engine.ladspaloader.create(*i); + if (plugin) { + engine.pluginlist.add(plugin); + pv.push_back(plugin); + } + } + } + // update ladspaloader with new list + engine.ladspaloader.set_plugins(ml); + // add new plugins (UI) + std::vector p; + gx_gui::UiBuilderImpl builder(this, &boxbuilder, &p); + engine.pluginlist.append_rack(builder); + std::sort(p.begin(), p.end(), plugins_by_name_less); + for (std::vector::iterator v = p.begin(); v != p.end(); ++v) { + register_plugin(*v); + engine.pluginlist.registerPlugin((*v)->plugin, pmap, gx_engine::get_group_table()); + } + for (std::vector::iterator i = pv.begin(); i != pv.end(); ++i) { + (*i)->set_samplerate(engine.get_samplerate(), *i); + } + make_icons(true); // re-create all icons, width might have changed + } + if (quit) { + Glib::signal_idle().connect(sigc::mem_fun(this, &MainWindow::delete_ladspalist_window)); + } +} + +bool MainWindow::delete_ladspalist_window() { + delete ladspalist_window; + ladspalist_window = 0; + return false; +} + +void MainWindow::on_load_ladspa() { + if (ladspalist_window) { + ladspalist_window->present(); + } else { + ladspalist_window = new ladspa::PluginDisplay(options, gx_head_icon, sigc::mem_fun(this, &MainWindow::on_ladspa_finished)); + } +} + +void MainWindow::add_plugin(std::vector& p, const char *id, const Glib::ustring& fname, const Glib::ustring& tooltip) { if (PluginUI::is_registered(engine.pluginlist, id)) { return; } - p->push_back(new PluginUI(*this, engine.pluginlist, id, fname, tooltip)); + p.push_back(new PluginUI(*this, engine.pluginlist, id, fname, tooltip)); } #ifdef accel_keys_for_plugins @@ -1753,116 +1851,78 @@ : group(g), plugins(p) {} }; -void MainWindow::fill_pluginlist() { - std::vector l; - std::vector *p; - - p = new std::vector; - add_plugin(p, "low_highpass"); - add_plugin(p, "eqs"); - add_plugin(p, "IR"); - add_plugin(p, "biquad"); - add_plugin(p, "feedback"); - add_plugin(p, "amp.tonestack"); - add_plugin(p, "cab"); - add_plugin(p, "moog"); - add_plugin(p, "tonemodul"); - l.push_back(new PluginDesc("Tone control", p)); - - p = new std::vector; - add_plugin(p, "gx_distortion"); - add_plugin(p, "overdrive"); - add_plugin(p, "ampmodul"); - l.push_back(new PluginDesc("Distortion", p)); - - p = new std::vector; - add_plugin(p, "freeverb"); - p->push_back(new JConvPluginUI(*this, engine.pluginlist, "jconv")); - add_plugin(p, "stereoverb"); - add_plugin(p, "zita_rev1", "", "High Quality Reverb"); - l.push_back(new PluginDesc("Reverb", p)); - - p = new std::vector; - add_plugin(p, "echo"); - add_plugin(p, "delay"); - add_plugin(p, "stereodelay"); - add_plugin(p, "stereoecho"); - l.push_back(new PluginDesc("Echo / Delay", p)); - - p = new std::vector; - add_plugin(p, "tremolo"); - add_plugin(p, "chorus_mono"); - add_plugin(p, "flanger_mono"); - add_plugin(p, "univibe_mono"); - add_plugin(p, "phaser_mono"); - add_plugin(p, "chorus"); - add_plugin(p, "flanger"); - add_plugin(p, "univibe"); - add_plugin(p, "phaser"); - l.push_back(new PluginDesc("Modulation", p)); - - p = new std::vector; - add_plugin(p, "crybaby"); - //add_plugin(p, PLUGIN_TYPE_MONO, "crybaby2"); - add_plugin(p, "compressor"); - l.push_back(new PluginDesc("Guitar Effects", p)); - - p = new std::vector; - add_plugin(p, "abgate"); - add_plugin(p, "oscilloscope"); - //add_plugin(p, "midi_out"); - l.push_back(new PluginDesc("Misc", p)); - - p = new std::vector; - UiBuilderImplNew builder(this, &boxbuilder, p); - engine.pluginlist.append_rack(builder); - if (p->size()) { - l.push_back(new PluginDesc("External", p)); +Gtk::ToolItemGroup *MainWindow::add_plugin_category(const char *group, bool collapse) { + std::map::iterator it = groupmap.find(group); + if (it != groupmap.end()) { + return it->second; } + Glib::ustring ui_template = + "" + ""; + Glib::ustring groupname = Glib::ustring::compose("PluginCategory_%1", group); + uimanager->add_ui_from_string(Glib::ustring::compose(ui_template, "Mono", groupname)); + uimanager->add_ui_from_string(Glib::ustring::compose(ui_template, "Stereo", groupname)); + actions.group->add(Gtk::Action::create(groupname, group)); + Gtk::ToolItemGroup *gw = new Gtk::ToolItemGroup(group); + groupmap[group] = gw; + gw->set_collapsed(collapse); + effects_toolpalette->add(*manage(gw)); + effects_toolpalette->set_exclusive(*gw, true); + effects_toolpalette->set_expand(*gw, true); + return gw; +} +Glib::ustring MainWindow::add_plugin_menu_entry(PluginUI *pui) { Glib::ustring ui_template = "" "" ""; + const char *group = pui->get_category(); + Glib::ustring groupname = Glib::ustring::compose("PluginCategory_%1", group); + Glib::ustring actionname = Glib::ustring::compose("Plugin_%1", pui->get_id()); + const char *tp = (pui->get_type() == PLUGIN_TYPE_MONO ? "Mono" : "Stereo"); + pui->set_ui_merge_id(uimanager->add_ui_from_string(Glib::ustring::compose(ui_template, tp, groupname, actionname))); + return actionname; +} + +void MainWindow::register_plugin(PluginUI *pui) { + plugin_dict.add(pui); + Gtk::ToolItemGroup *gw = add_plugin_category(pui->get_category()); + Glib::ustring actionname = add_plugin_menu_entry(pui); + add_toolitem(*pui, gw); + Glib::RefPtr act = Gtk::ToggleAction::create(actionname, pui->get_name()); + actions.group->add(act); #ifdef accel_keys_for_plugins unsigned int key = GDK_a; -#endif - for (std::vector::iterator i = l.begin(); i != l.end(); ++i) { - int idx = 0; - for (std::vector::iterator v = (*i)->plugins->begin(); v != (*i)->plugins->end(); ++v) { - PluginUI *pui = *v; - plugin_dict.add(pui); - const char *tp = (pui->get_type() == PLUGIN_TYPE_MONO ? "Mono" : "Stereo"); - Glib::ustring groupname = Glib::ustring::compose("PluginCategory_%1", (*i)->group); - Glib::ustring actionname = Glib::ustring::compose("Plugin_%1", pui->get_id()); - pui->set_ui_merge_id(uimanager->add_ui_from_string(Glib::ustring::compose(ui_template, tp, groupname, actionname))); - if (idx++ == 0) { - actions.group->add(Gtk::Action::create(groupname, (*i)->group)); - } - Glib::RefPtr act = Gtk::ToggleAction::create(actionname, pui->get_name()); - actions.group->add(act); -#ifdef accel_keys_for_plugins - if (accel_map_next_key(&key)) { - Gtk::AccelMap::add_entry(act->get_accel_path(), key, Gdk::ModifierType(0)); - ++key; - } -#endif - pui->set_action(act); - } + if (accel_map_next_key(&key)) { + Gtk::AccelMap::add_entry(act->get_accel_path(), key, Gdk::ModifierType(0)); + ++key; } - bool collapse = false; - for (std::vector::iterator i = l.begin(); i != l.end(); ++i) { - Gtk::ToolItemGroup *gw = new Gtk::ToolItemGroup((*i)->group); - gw->set_collapsed(collapse); - collapse = true; - for (std::vector::iterator v = (*i)->plugins->begin(); v != (*i)->plugins->end(); ++v) { - add_toolitem(**v, gw); - } - effects_toolpalette->add(*manage(gw)); - effects_toolpalette->set_exclusive(*gw, true); - effects_toolpalette->set_expand(*gw, true); - delete (*i)->plugins; - delete *i; +#endif + pui->set_action(act); +} + +void MainWindow::fill_pluginlist() { + // define order of categories by registering + // them first + add_plugin_category("Tone control", false); + add_plugin_category("Distortion"); + add_plugin_category("Reverb"); + add_plugin_category("Echo / Delay"); + add_plugin_category("Modulation"); + add_plugin_category("Guitar Effects"); + add_plugin_category("Misc"); + + std::vector p; + p.push_back(new JConvPluginUI(*this, engine.pluginlist, "jconv", engine.stereo_convolver)); + p.push_back(new JConvPluginUI(*this, engine.pluginlist, "jconv_mono", engine.mono_convolver)); + + gx_gui::UiBuilderImpl builder(this, &boxbuilder, &p); + engine.pluginlist.append_rack(builder); + + std::sort(p.begin(), p.end(), plugins_by_name_less); + for (std::vector::iterator v = p.begin(); v != p.end(); ++v) { + register_plugin(*v); } } @@ -2079,6 +2139,46 @@ ** oscilloscope handling */ +void MainWindow::set_osc_size() { + //int osc_size = engine.oscilloscope.get_mul_buffer(); + if (mul_buffer > 0) { + actions.osc_buffer_size->set_current_value(mul_buffer); + } +} + +void MainWindow::change_osc_buffer(Glib::RefPtr action) { + if (jack.client) { + mul_buffer = action->get_current_value(); + on_oscilloscope_activate(false); + engine.oscilloscope.set_mul_buffer(mul_buffer, jack.get_jack_bs()); + on_oscilloscope_activate(true); + } else { + set_osc_size(); + } +} + +void MainWindow::add_osc_size_menu() { + Glib::ustring s = ""; + Gtk::RadioButtonGroup group; + int osc_buffer_size = 1; + for (int i = 1; i <= 6; ++i) { + Glib::ustring name = "*" + gx_system::to_string(osc_buffer_size); + Glib::ustring actname = Glib::ustring::compose("buffer size %1", name); + s += Glib::ustring::compose("", actname); + Glib::RefPtr action = Gtk::RadioAction::create(group, actname, name); + actions.group->add(action); + if (i == 1) { + action->signal_changed().connect( + sigc::mem_fun(*this, &MainWindow::change_osc_buffer)); + actions.osc_buffer_size = action; + } + action->property_value().set_value(osc_buffer_size); + osc_buffer_size++; + } + s.append(""); + uimanager->add_ui_from_string(s); +} + void MainWindow::on_show_oscilloscope(bool v) { if (v) { // FIXME G_PRIORITY_DEFAULT_IDLE?? @@ -2302,6 +2402,7 @@ & (Gdk::WINDOW_STATE_ICONIFIED|Gdk::WINDOW_STATE_WITHDRAWN))) { window->move(mainwin_x, mainwin_y); window->present(); + //window->deiconify(); } else { window->hide(); //window->iconify(); @@ -2346,6 +2447,25 @@ return false; } +bool MainWindow::on_quit() { + if (ladspalist_window && !ladspalist_window->check_exit()) { + return true; + } + Gtk::Main::quit(); + return false; +} + +void MainWindow::amp_controls_visible(Gtk::Range *rr) { + //FIXME + bool v = abs(rr->get_value() - pmap["tube.select"].getUpperAsFloat()) < 0.5; + const char *knobs[] = {"gxbigknob1","gxbigknob2","gxbigknob3"}; + for (unsigned int i = 0; i < sizeof(knobs)/sizeof(knobs[0]); ++i) { + Gtk::Widget *w; + bld->find_widget(knobs[i], w); + w->set_visible(!v); + } +} + int MainWindow::skin = -1; bool MainWindow::no_warn_latency = false; int MainWindow::mainwin_x = -1; @@ -2353,6 +2473,7 @@ int MainWindow::mainwin_height = -1; int MainWindow::window_height = 0; int MainWindow::preset_window_height = 0; +int MainWindow::mul_buffer = 1; MainWindow::MainWindow(gx_engine::GxEngine& engine_, gx_system::CmdlineOptions& options_, gx_engine::ParamMap& pmap_, Gtk::Window *splash) @@ -2377,13 +2498,14 @@ pmap(pmap_), engine(engine_), jack(engine), - gx_settings(options, jack, engine.convolver, gx_engine::midi_std_ctr, gx_engine::controller_map, engine, pmap_), + gx_settings(options, jack, engine.stereo_convolver, gx_engine::midi_std_ctr, gx_engine::controller_map, engine, pmap_), live_play(), preset_window(), fWaveView(), convolver_filename_label(), + convolver_mono_filename_label(), gx_head_icon(Gdk::Pixbuf::create_from_file(options.get_pixmap_filepath("gx_head.png"))), - boxbuilder(engine_, gx_settings, fWaveView, convolver_filename_label, ui, gx_head_icon), + boxbuilder(engine_, gx_settings, fWaveView, convolver_filename_label, convolver_mono_filename_label, ui, gx_head_icon), portmap_window(0), skin_changed(&ui, &skin), select_jack_control(0), @@ -2405,9 +2527,13 @@ gx_head_midi(Gdk::Pixbuf::create_from_file(options.get_pixmap_filepath("gx_head-midi.png"))), gx_head_warn(Gdk::Pixbuf::create_from_file(options.get_pixmap_filepath("gx_head-warn.png"))), actions(), - keyswitch(gx_settings, sigc::mem_fun(this, &MainWindow::display_preset_msg)) { + keyswitch(gx_settings, sigc::mem_fun(this, &MainWindow::display_preset_msg)), + groupmap(), + ladspalist_window(), + szg_rack_units(Gtk::SizeGroup::create(Gtk::SIZE_GROUP_HORIZONTAL)) { convolver_filename_label.set_ellipsize(Pango::ELLIPSIZE_END); + convolver_mono_filename_label.set_ellipsize(Pango::ELLIPSIZE_END); /* ** setup parameters @@ -2429,7 +2555,7 @@ pmap.reg_par_non_preset("racktuner.scale_lim", "Limit", 0, 3.0, 1.0, 10.0, 1.0); pmap.reg_par_non_preset("ui.tuner_reference_pitch", "?Tuner Reference Pitch", 0, 440, 427, 453, 0.1); //pmap.reg_par("racktuner.scale_lim", "Limit", &scale_lim, 3.0, 1.0, 10.0, 1.0); FIXME add in detail view? - + pmap.reg_non_midi_par("oscilloscope.bufferset",&mul_buffer,false,1,1,6); /* ** create actions and some parameters */ @@ -2443,10 +2569,12 @@ Gtk::AccelMap::load(options.get_builder_filepath("accels_rc")); const char *id_list[] = { "MainWindow", "amp_background:ampbox", "bank_liststore", "target_liststore", - "bank_combo_liststore", "ampdetail_sizegroup", 0 }; + "bank_combo_liststore", 0 }; bld = gx_gui::GxBuilder::create_from_file(options_.get_builder_filepath("mainpanel.glade"), &ui, id_list); load_widget_pointers(); rackcontainer->set_homogeneous(true); // setting it in glade is awkward to use with glade tool + szg_rack_units->add_widget(*ampdetail_mini); + szg_rack_units->add_widget(*ampdetail_normal); // remove marker labels from boxes (used in glade to make display clearer) clear_box(*monocontainer); @@ -2465,6 +2593,7 @@ // add dynamic submenus add_skin_menu(); add_latency_menu(); + add_osc_size_menu(); amp_radio_menu.setup("","",uimanager,actions.group); // add menubar, accelgroup and icon to main window @@ -2481,11 +2610,9 @@ window->signal_window_state_event().connect( sigc::mem_fun(*this, &MainWindow::on_window_state_changed)); window->signal_delete_event().connect( - sigc::bind_return( - sigc::hide( - sigc::ptr_fun(Gtk::Main::quit)), - true)); - window->signal_configure_event().connect_notify(sigc::mem_fun(*this, &MainWindow::on_configure_event)); + sigc::hide(sigc::mem_fun(this, &MainWindow::on_quit))); + window->signal_configure_event().connect_notify( + sigc::mem_fun(*this, &MainWindow::on_configure_event)); window->signal_visibility_notify_event().connect( sigc::mem_fun(*this, &MainWindow::on_visibility_notify)); window->signal_key_press_event().connect( @@ -2700,29 +2827,10 @@ ** UI definitions will be loaded on demand */ fill_pluginlist(); - plugin_dict["gx_distortion"]->shortname = _("Distortion"); - plugin_dict["stereodelay"]->shortname = _("Delay"); - plugin_dict["stereoecho"]->shortname = _("Echo"); - plugin_dict["stereoverb"]->shortname = _("Verb"); - plugin_dict["phaser_mono"]->shortname = _("Phaser"); - plugin_dict["flanger_mono"]->shortname = _("Flanger"); - plugin_dict["chorus_mono"]->shortname = _("Chorus"); - plugin_dict["univibe_mono"]->shortname = _("Vibe"); - plugin_dict["IR"]->shortname = _("IR"); - plugin_dict["low_highpass"]->shortname = _("L/H/Filter"); - plugin_dict["eqs"]->shortname = _("EQ"); - plugin_dict["compressor"]->shortname = _("Compr."); - plugin_dict["biquad"]->shortname = _("BiQuad"); - plugin_dict["moog"]->shortname = _("Moog"); - plugin_dict["ampmodul"]->shortname = _("Amp"); - plugin_dict["tonemodul"]->shortname = _("Tone"); - plugin_dict["oscilloscope"]->shortname = _("Osc"); - plugin_dict["jconv"]->shortname = _("Conv."); - plugin_dict["zita_rev1"]->shortname = _("Zita R1"); PluginUI *mainamp_plugin = new PluginUI(*this, engine.pluginlist, "ampstack"); plugin_dict.add(mainamp_plugin); mainamp_plugin->rackbox = add_rackbox_internal(*mainamp_plugin, 0, 0, false, -1, false, amp_background); - effects_toolpalette->show_all(); + effects_toolpalette->show(); // call some action functions to sync state // with settings defined in create_actions() @@ -2743,12 +2851,15 @@ // state file, which means that the jack starter options are read from the // standard state file (gx_head_rc or similar if -n is used) gx_settings.loadstate(); + if (!in_session) { + gx_settings.disable_autosave(gx_system::get_options().get_opt_auto_save()); + } if (!connect_jack(true, splash)) { // not connected, must synthesize signal for initialization jack.signal_client_change()(); } set_latency(); // make sure latency menu is updated - + set_osc_size(); // we set the skin at this late point to avoid calling make_icons more // than once if (actions.skin->get_current_value() != skin) { @@ -2768,10 +2879,16 @@ window->move(mainwin_x, mainwin_y); } - window->show(); - Glib::signal_timeout().connect( sigc::mem_fun(*this, &MainWindow::update_all_gui), 40); + + Gtk::Range *rr; + bld->find_widget("gxselector1:amp_selector", rr); + rr->signal_value_changed().connect( + sigc::bind( + sigc::mem_fun(this, &MainWindow::amp_controls_visible), + rr)); + amp_controls_visible(rr); } MainWindow::~MainWindow() { @@ -2795,7 +2912,7 @@ if (actions.presets->get_active()) { preset_window_height = preset_scrolledbox->get_allocation().get_height(); } - + plugin_dict.cleanup(); delete live_play; delete preset_window; delete window; diff -Nru guitarix-0.22.4/src/gx_head/gui/gx_mono_rack_builder.cpp guitarix-0.24.2/src/gx_head/gui/gx_mono_rack_builder.cpp --- guitarix-0.22.4/src/gx_head/gui/gx_mono_rack_builder.cpp 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/src/gx_head/gui/gx_mono_rack_builder.cpp 2012-10-20 03:56:02.000000000 +0000 @@ -33,185 +33,169 @@ void StackBoxBuilder::make_rackbox_low_highpass() { // low high pass filter - openMonoRackBox(_("l/h/filter"), engine.pluginlist.pos_var("low_highpass"), "low_highpass.on_off","low_highpass.pp","ui.low high pass"); + openHorizontalhideBox(""); + closeBox(); + openHorizontalBox(""); { - openHorizontalhideBox(""); + openHorizontalBox(""); + { + create_small_rackknob("low_high_pass.lhp.high_freq", _("high-pass ")); + create_small_rackknob("low_high_pass.lhp.low_freq", _(" low-pass ")); + create_switch_no_caption(sw_switchit, "low_high_pass.lhp.on_off"); + } + closeBox(); + openSpaceBox(""); closeBox(); openHorizontalBox(""); { - openHorizontalBox(""); - { - create_small_rackknob("low_high_pass.lhp.high_freq", _("high-pass ")); - create_small_rackknob("low_high_pass.lhp.low_freq", _(" low-pass ")); - create_switch_no_caption(sw_switchit, "low_high_pass.lhp.on_off"); - } - closeBox(); - openSpaceBox(""); - closeBox(); - openHorizontalBox(""); - { - create_small_rackknob("low_high_pass.lhc.low_freq", _("low-cut ")); - create_small_rackknob("low_high_pass.lhc.high_freq", _("high-cut ")); - create_switch_no_caption(sw_switchit, "low_high_pass.lhc.on_off"); - } - closeBox(); + create_small_rackknob("low_high_pass.lhc.low_freq", _("low-cut ")); + create_small_rackknob("low_high_pass.lhc.high_freq", _("high-cut ")); + create_switch_no_caption(sw_switchit, "low_high_pass.lhc.on_off"); } closeBox(); } - closeMonoRackBox(); + closeBox(); } void StackBoxBuilder::make_rackbox_eqs() { // EQ - openMonoRackBox(_("EQ"), engine.pluginlist.pos_var("eqs"), "eqs.on_off", "eqs.pp","ui.Scaleable EQ"); + openHorizontalhideBox(""); + closeBox(); + openVerticalBox(""); { - openHorizontalhideBox(""); + openHorizontalTableBox(""); + { + create_simple_spin_value("eqs.freq31_25"); + create_simple_spin_value("eqs.freq62_5"); + create_simple_spin_value("eqs.freq125"); + create_simple_spin_value("eqs.freq250"); + create_simple_spin_value("eqs.freq500"); + create_simple_spin_value("eqs.freq1k"); + create_simple_spin_value("eqs.freq2k"); + create_simple_spin_value("eqs.freq4k"); + create_simple_spin_value("eqs.freq8k"); + create_simple_spin_value("eqs.freq16k"); + } closeBox(); - openVerticalBox(""); + openHorizontalTableBox(""); { - openHorizontalTableBox(""); - { - create_simple_spin_value("eqs.freq31_25"); - create_simple_spin_value("eqs.freq62_5"); - create_simple_spin_value("eqs.freq125"); - create_simple_spin_value("eqs.freq250"); - create_simple_spin_value("eqs.freq500"); - create_simple_spin_value("eqs.freq1k"); - create_simple_spin_value("eqs.freq2k"); - create_simple_spin_value("eqs.freq4k"); - create_simple_spin_value("eqs.freq8k"); - create_simple_spin_value("eqs.freq16k"); - } - closeBox(); - openHorizontalTableBox(""); - { - create_eq_rackslider_no_caption("eqs.fs31_25"); - create_eq_rackslider_no_caption("eqs.fs62_5"); - create_eq_rackslider_no_caption("eqs.fs125"); - create_eq_rackslider_no_caption("eqs.fs250"); - create_eq_rackslider_no_caption("eqs.fs500"); - create_eq_rackslider_no_caption("eqs.fs1k"); - create_eq_rackslider_no_caption("eqs.fs2k"); - create_eq_rackslider_no_caption("eqs.fs4k"); - create_eq_rackslider_no_caption("eqs.fs8k"); - create_eq_rackslider_no_caption("eqs.fs16k"); - } - closeBox(); - openHorizontalTableBox(""); - { - create_small_rackknob("eqs.Qs31_25", "Q"); - create_small_rackknob("eqs.Qs62_5", "Q"); - create_small_rackknob("eqs.Qs125", "Q"); - create_small_rackknob("eqs.Qs250", "Q"); - create_small_rackknob("eqs.Qs500", "Q"); - create_small_rackknob("eqs.Qs1k", "Q"); - create_small_rackknob("eqs.Qs2k", "Q"); - create_small_rackknob("eqs.Qs4k", "Q"); - create_small_rackknob("eqs.Qs8k", "Q"); - create_small_rackknob("eqs.Qs16k", "Q"); - } - closeBox(); + create_eq_rackslider_no_caption("eqs.fs31_25"); + create_eq_rackslider_no_caption("eqs.fs62_5"); + create_eq_rackslider_no_caption("eqs.fs125"); + create_eq_rackslider_no_caption("eqs.fs250"); + create_eq_rackslider_no_caption("eqs.fs500"); + create_eq_rackslider_no_caption("eqs.fs1k"); + create_eq_rackslider_no_caption("eqs.fs2k"); + create_eq_rackslider_no_caption("eqs.fs4k"); + create_eq_rackslider_no_caption("eqs.fs8k"); + create_eq_rackslider_no_caption("eqs.fs16k"); + } + closeBox(); + openHorizontalTableBox(""); + { + create_small_rackknob("eqs.Qs31_25", "Q"); + create_small_rackknob("eqs.Qs62_5", "Q"); + create_small_rackknob("eqs.Qs125", "Q"); + create_small_rackknob("eqs.Qs250", "Q"); + create_small_rackknob("eqs.Qs500", "Q"); + create_small_rackknob("eqs.Qs1k", "Q"); + create_small_rackknob("eqs.Qs2k", "Q"); + create_small_rackknob("eqs.Qs4k", "Q"); + create_small_rackknob("eqs.Qs8k", "Q"); + create_small_rackknob("eqs.Qs16k", "Q"); } closeBox(); } - closeMonoRackBox(); + closeBox(); } void StackBoxBuilder::make_rackbox_crybaby() { // ----- crybaby - openMonoRackBox(_("crybaby"), engine.pluginlist.pos_var("crybaby"), "crybaby.on_off", "crybaby.pp", "ui.Crybaby"); + openHorizontalhideBox(""); + create_master_slider("crybaby.level", _(" level ")); + closeBox(); + openHorizontalBox(""); { - openHorizontalhideBox(""); - create_master_slider("crybaby.level", _(" level ")); + openSpaceBox(""); closeBox(); - openHorizontalBox(""); + create_selector("crybaby.autowah"); + openSpaceBox(""); + closeBox(); + openSpaceBox(""); + closeBox(); + openHorizontalTableBox(""); { - openSpaceBox(""); - closeBox(); - create_selector("crybaby.autowah"); - openSpaceBox(""); - closeBox(); - openSpaceBox(""); - closeBox(); - openHorizontalTableBox(""); - { - create_small_rackknobr("crybaby.wah", _(" wah ")); - create_small_rackknob("crybaby.level", _(" level ")); - create_small_rackknob("crybaby.wet_dry", _(" dry/wet ")); - } - closeBox(); - openSpaceBox(""); - closeBox(); + create_small_rackknobr("crybaby.wah", _(" wah ")); + create_small_rackknob("crybaby.level", _(" level ")); + create_small_rackknob("crybaby.wet_dry", _(" dry/wet ")); } closeBox(); + openSpaceBox(""); + closeBox(); } - closeMonoRackBox(); + closeBox(); } void StackBoxBuilder::make_rackbox_gx_distortion() { // ----- distortion - openMonoRackBox(_("distortion"), engine.pluginlist.pos_var("gx_distortion"), "gx_distortion.on_off", "gx_distortion.pp", "ui.Multi Band Distortion"); + openHorizontalhideBox(""); + create_master_slider("gx_distortion.drive", _("drive")); + closeBox(); + openHorizontalBox(""); { - openHorizontalhideBox(""); - create_master_slider("gx_distortion.drive", _("drive")); - closeBox(); - openHorizontalBox(""); + openVerticalBox(""); { openVerticalBox(""); { - openVerticalBox(""); + openFlipLabelBox(_(" drive ")); { - openFlipLabelBox(_(" drive ")); + openHorizontalBox(""); { - openHorizontalBox(""); - { - create_small_rackknobr("gx_distortion.drive", _(" drive ")); - create_small_rackknobr("gx_distortion.low_drive", _(" low ")); - create_small_rackknobr("gx_distortion.middle_l_drive", _(" middle l. ")); - create_small_rackknobr("gx_distortion.middle_h_drive", _(" middle h. ")); - create_small_rackknobr("gx_distortion.high_drive", _(" high ")); - } - closeBox(); + create_small_rackknobr("gx_distortion.drive", _(" drive ")); + create_small_rackknobr("gx_distortion.low_drive", _(" low ")); + create_small_rackknobr("gx_distortion.middle_l_drive", _(" middle l. ")); + create_small_rackknobr("gx_distortion.middle_h_drive", _(" middle h. ")); + create_small_rackknobr("gx_distortion.high_drive", _(" high ")); } closeBox(); - openFlipLabelBox(_(" gain ")); + } + closeBox(); + openFlipLabelBox(_(" gain ")); + { + openHorizontalBox(""); { - openHorizontalBox(""); - { - create_small_rackknob("gx_distortion.gain", _(" gain ")); - create_small_rackknob("gx_distortion.low_gain", _(" low ")); - create_small_rackknob("gx_distortion.middle_l_gain", _(" middle l. ")); - create_small_rackknob("gx_distortion.middle_h_gain", _(" middle h. ")); - create_small_rackknob("gx_distortion.high_gain", _(" high ")); - } - closeBox(); + create_small_rackknob("gx_distortion.gain", _(" gain ")); + create_small_rackknob("gx_distortion.low_gain", _(" low ")); + create_small_rackknob("gx_distortion.middle_l_gain", _(" middle l. ")); + create_small_rackknob("gx_distortion.middle_h_gain", _(" middle h. ")); + create_small_rackknob("gx_distortion.high_gain", _(" high ")); } closeBox(); } closeBox(); + } + closeBox(); - openHorizontalBox(""); + openHorizontalBox(""); + { + create_small_rackknob("gx_distortion.wet_dry", _("dry/wet")); + create_small_rackknob("gx_distortion.level", _(" level ")); + openVerticalBox(_("frequency split Hz")); { - create_small_rackknob("gx_distortion.wet_dry", _("dry/wet")); - create_small_rackknob("gx_distortion.level", _(" level ")); - openVerticalBox(_("frequency split Hz")); + openpaintampBox(""); { - openpaintampBox(""); + openHorizontalBox(""); { - openHorizontalBox(""); - { - openSpaceBox(""); - closeBox(); - create_wheel("gx_distortion.split_low_freq", _("split low freq")); - openSpaceBox(""); - closeBox(); - create_wheel("gx_distortion.split_middle_freq", _("split m. freq")); - openSpaceBox(""); - closeBox(); - create_wheel("gx_distortion.split_high_freq", _("split high freq")); - openSpaceBox(""); - closeBox(); - } + openSpaceBox(""); + closeBox(); + create_wheel("gx_distortion.split_low_freq", _("split low freq")); + openSpaceBox(""); + closeBox(); + create_wheel("gx_distortion.split_middle_freq", _("split m. freq")); + openSpaceBox(""); + closeBox(); + create_wheel("gx_distortion.split_high_freq", _("split high freq")); + openSpaceBox(""); closeBox(); } closeBox(); @@ -221,379 +205,404 @@ closeBox(); } closeBox(); + } + closeBox(); - openVerticalBox(_("resonator")); - { - create_small_rackknob("gx_distortion.trigger", _("trigger ")); - create_small_rackknob("gx_distortion.vibrato", _(" vibrato ")); - create_switch_no_caption(sw_switchit, "gx_distortion.resonator.on_off"); - } - closeBox(); + openVerticalBox(_("resonator")); + { + create_small_rackknob("gx_distortion.trigger", _("trigger ")); + create_small_rackknob("gx_distortion.vibrato", _(" vibrato ")); + create_switch_no_caption(sw_switchit, "gx_distortion.resonator.on_off"); } closeBox(); } - closeMonoRackBox(); + closeBox(); } void StackBoxBuilder::make_rackbox_IR() { // ----- IR - openMonoRackBox(_("IR"), engine.pluginlist.pos_var("IR"), "IR.on_off", "IR.pp" ,"ui.ImpulseResponse"); + openHorizontalhideBox(""); + create_master_slider("IR.peak", _("peak")); + closeBox(); + openVerticalBox1(""); { - openHorizontalhideBox(""); - create_master_slider("IR.peak", _("peak")); - closeBox(); - openVerticalBox1(""); + openHorizontalBox(""); { - openHorizontalBox(""); - { - openSpaceBox(""); - closeBox(); - create_selector("IR.auto_freq"); - openSpaceBox(""); - closeBox(); + openSpaceBox(""); + closeBox(); + create_selector("IR.auto_freq"); + openSpaceBox(""); + closeBox(); - openHorizontalTableBox(""); - { - create_small_rackknob("IR.freq", _(" freq ")); - create_small_rackknob("IR.peak", _(" peak ")); - create_small_rackknob("IR.bandwidth", _(" bandwidth ")); - } - closeBox(); + openHorizontalTableBox(""); + { + create_small_rackknob("IR.freq", _(" freq ")); + create_small_rackknob("IR.peak", _(" peak ")); + create_small_rackknob("IR.bandwidth", _(" bandwidth ")); } closeBox(); } closeBox(); } - closeMonoRackBox(); + closeBox(); } void StackBoxBuilder::make_rackbox_compressor() { // ----- the compressor - openMonoRackBox(_("Compr."), engine.pluginlist.pos_var("compressor"), "compressor.on_off", "compressor.pp", "ui.Compressor"); + openHorizontalhideBox(""); + create_master_slider("compressor.ratio", _("ratio")); + closeBox(); + openHorizontalTableBox(""); { - openHorizontalhideBox(""); - create_master_slider("compressor.ratio", _("ratio")); - closeBox(); - openHorizontalTableBox(""); - { - create_small_rackknob("compressor.knee", _("knee")); - create_small_rackknobr("compressor.ratio", _("ratio")); - create_small_rackknob("compressor.threshold", _("threshold")); + create_small_rackknob("compressor.knee", _("knee")); + create_small_rackknobr("compressor.ratio", _("ratio")); + create_small_rackknob("compressor.threshold", _("threshold")); - create_small_rackknob("compressor.attack", _("attack")); - create_small_rackknob("compressor.release", _("release")); - } - closeBox(); + create_small_rackknob("compressor.attack", _("attack")); + create_small_rackknob("compressor.release", _("release")); + } + closeBox(); +} + +void StackBoxBuilder::make_rackbox_expander() { + // ----- the expander + openHorizontalhideBox(""); + create_master_slider("expander.ratio", _("ratio")); + closeBox(); + openHorizontalTableBox(""); + { + create_small_rackknob("expander.knee", _("knee")); + create_small_rackknobr("expander.ratio", _("ratio")); + create_small_rackknob("expander.threshold", _("threshold")); + + + create_small_rackknob("expander.attack", _("attack")); + create_small_rackknob("expander.release", _("release")); } - closeMonoRackBox(); + closeBox(); } void StackBoxBuilder::make_rackbox_overdrive() { // -----overdrive - openMonoRackBox(_("overdrive"), engine.pluginlist.pos_var("overdrive"), "overdrive.on_off", "overdrive.pp", "ui.Overdrive"); + openHorizontalhideBox(""); + create_master_slider("overdrive.drive", _("Drive")); + closeBox(); + openHorizontalTableBox(""); { - openHorizontalhideBox(""); - create_master_slider("overdrive.drive", _("drive")); + openSpaceBox(""); closeBox(); - openHorizontalTableBox(""); - { - openSpaceBox(""); - closeBox(); - create_small_rackknobr("overdrive.drive", _(" drive ")); - create_small_rackknob("overdrive.wet_dry", _("dry/wet")); - openSpaceBox(""); - closeBox(); - } + create_small_rackknobr("overdrive.drive", _(" Drive ")); + create_small_rackknob("overdrive.wet_dry", _("Dry/Wet")); + openSpaceBox(""); closeBox(); } - closeMonoRackBox(); + closeBox(); } void StackBoxBuilder::make_rackbox_echo() { // ----- echo - openMonoRackBox(_("echo"), engine.pluginlist.pos_var("echo"), "echo.on_off", "echo.pp", "ui.Echo"); + openHorizontalhideBox(""); + create_master_slider("echo.percent", _("%")); + closeBox(); + openVerticalBox(""); { - openHorizontalhideBox(""); - create_master_slider("echo.percent", _("%")); - closeBox(); - openVerticalBox(""); + openHorizontalTableBox(""); { - openHorizontalTableBox(""); - { - create_small_rackknobr("echo.time", _(" time ")); + create_small_rackknobr("echo.time", _(" time ")); - create_small_rackknob("echo.percent", _(" % ")); - } - closeBox(); + create_small_rackknob("echo.percent", _(" % ")); } closeBox(); } - closeMonoRackBox(); + closeBox(); } void StackBoxBuilder::make_rackbox_delay() { // -----delay - openMonoRackBox(_("delay"), engine.pluginlist.pos_var("delay"), "delay.on_off", "delay.pp", "ui.Delay"); + openHorizontalhideBox(""); + create_master_slider("delay.delay", _(" delay ")); + closeBox(); + openVerticalBox(""); { - openHorizontalhideBox(""); - create_master_slider("delay.delay", _(" delay ")); - closeBox(); - openVerticalBox(""); + openHorizontalTableBox(""); { - openHorizontalTableBox(""); - { - create_small_rackknobr("delay.delay", _(" delay ")); + create_small_rackknobr("delay.delay", _(" delay ")); - create_small_rackknob("delay.gain", _(" gain ")); - } - closeBox(); + create_small_rackknob("delay.gain", _(" gain ")); } closeBox(); } - closeMonoRackBox(); + closeBox(); } void StackBoxBuilder::make_rackbox_freeverb() { // ----- freeverb - openMonoRackBox(_("freeverb"), engine.pluginlist.pos_var("freeverb"), "freeverb.on_off", "freeverb.pp", "ui.Freeverb"); + openHorizontalhideBox(""); + create_master_slider("freeverb.RoomSize", _("RoomSize")); + closeBox(); + openHorizontalBox(""); { - openHorizontalhideBox(""); - create_master_slider("freeverb.RoomSize", _("RoomSize")); + openFrameBox(""); closeBox(); - openHorizontalBox(""); + openFrameBox(""); + closeBox(); + openHorizontalTableBox(""); { - openFrameBox(""); - closeBox(); - openFrameBox(""); - closeBox(); - openHorizontalTableBox(""); - { - create_small_rackknobr("freeverb.RoomSize", _("RoomSize")); - create_small_rackknob("freeverb.damp", _("damp")); - create_small_rackknob("freeverb.wet_dry", _("dry/wet")); - } - closeBox(); - openFrameBox(""); - closeBox(); - openFrameBox(""); - closeBox(); + create_small_rackknobr("freeverb.RoomSize", _("RoomSize")); + create_small_rackknob("freeverb.damp", _("damp")); + create_small_rackknob("freeverb.wet_dry", _("dry/wet")); } closeBox(); + openFrameBox(""); + closeBox(); + openFrameBox(""); + closeBox(); } - closeMonoRackBox(); + closeBox(); } void StackBoxBuilder::make_rackbox_oscilloscope() { // -----osc - openMonoRackBox(_("osc"), engine.pluginlist.pos_var("oscilloscope"), "oscilloscope.on_off", "oscilloscope.pp", "ui.Oscilloscope"); + openHorizontalhideBox(""); + closeBox(); + openVerticalBox(""); { - openHorizontalhideBox(""); + openFrameBox(""); closeBox(); - openVerticalBox(""); + openHorizontalBox(""); { openFrameBox(""); closeBox(); - openHorizontalBox(""); - { - openFrameBox(""); - closeBox(); - addLiveWaveDisplay(" "); - openFrameBox(""); - closeBox(); - } - closeBox(); + addLiveWaveDisplay(" "); openFrameBox(""); closeBox(); } closeBox(); + openFrameBox(""); + closeBox(); } - closeMonoRackBox(); + closeBox(); } void StackBoxBuilder::make_rackbox_biquad() { - openMonoRackBox(_("biquad"), engine.pluginlist.pos_var("biquad"), "biquad.on_off", "biquad.pp", "ui.BiQuad Filter"); + openHorizontalhideBox(""); + create_master_slider("biquad.Freq", _("Freq")); + closeBox(); + openVerticalBox(""); { - openHorizontalhideBox(""); - create_master_slider("biquad.Freq", _("Freq")); - closeBox(); - openVerticalBox(""); + openHorizontalBox(""); { - openHorizontalBox(""); - { - create_small_rackknobr("biquad.Freq", _("Freq")); - } - closeBox(); + create_small_rackknobr("biquad.Freq", _("Freq")); } closeBox(); } - closeMonoRackBox(); + closeBox(); } void StackBoxBuilder::make_rackbox_tremolo() { - openMonoRackBox(_("tremolo"), engine.pluginlist.pos_var("tremolo"), "tremolo.on_off", "tremolo.pp", "ui.Tremolo"); + openHorizontalhideBox(""); + create_master_slider("tremolo.freq", _("Freq")); + closeBox(); + openVerticalBox(""); { - openHorizontalhideBox(""); - create_master_slider("tremolo.freq", _("Freq")); - closeBox(); - openVerticalBox(""); + openHorizontalBox(""); { - openHorizontalBox(""); + openSpaceBox(""); + closeBox(); + create_selector("tremolo.SINE"); + openSpaceBox(""); + closeBox(); + openSpaceBox(""); + closeBox(); + openHorizontalTableBox(""); { + create_small_rackknobr("tremolo.freq", _("Freq")); openSpaceBox(""); closeBox(); - create_selector("tremolo.SINE"); + create_small_rackknobr("tremolo.depth", _("Depth")); openSpaceBox(""); closeBox(); - openSpaceBox(""); - closeBox(); - openHorizontalTableBox(""); - { - create_small_rackknobr("tremolo.freq", _("Freq")); - openSpaceBox(""); - closeBox(); - create_small_rackknobr("tremolo.depth", _("Depth")); - openSpaceBox(""); - closeBox(); - create_small_rackknob("tremolo.wet_dry", _("dry/wet")); - } - closeBox(); + create_small_rackknob("tremolo.wet_dry", _("dry/wet")); } closeBox(); } closeBox(); } - closeMonoRackBox(); + closeBox(); } void StackBoxBuilder::make_rackbox_phaser_mono() { - openMonoRackBox(_("phaser"), engine.pluginlist.pos_var("phaser"), "phaser_mono.on_off", "phaser_mono.pp", "ui.Phaser Mono"); + openHorizontalhideBox(""); + create_master_slider("phaser_mono.level", _("level")); + closeBox(); + openVerticalBox(""); { - openHorizontalhideBox(""); - create_master_slider("phaser_mono.level", _("level")); - closeBox(); - openVerticalBox(""); + openHorizontalBox(""); { - openHorizontalBox(""); - { - create_small_rackknobr("phaser_mono.level", _("level")); - create_small_rackknob("phaser_mono.Speed", _("speed")); - create_small_rackknob("phaser_mono.wet_dry", _("dry/wet")); - } - closeBox(); + create_small_rackknobr("phaser_mono.level", _("level")); + create_small_rackknob("phaser_mono.Speed", _("speed")); + create_small_rackknob("phaser_mono.wet_dry", _("dry/wet")); } closeBox(); } - closeMonoRackBox(); + closeBox(); } void StackBoxBuilder::make_rackbox_chorus_mono() { - openMonoRackBox(_("chorus"), engine.pluginlist.pos_var("chorus"), "chorus_mono.on_off", "chorus_mono.pp", "ui.Chorus Mono"); + openHorizontalhideBox(""); + create_master_slider("chorus_mono.level", _("level")); + closeBox(); + openVerticalBox(""); { - openHorizontalhideBox(""); - create_master_slider("chorus_mono.level", _("level")); - closeBox(); - openVerticalBox(""); + openHorizontalBox(""); { - openHorizontalBox(""); - { - create_small_rackknobr("chorus_mono.level", _("level")); - create_small_rackknob("chorus_mono.freq", _("speed")); - create_small_rackknob("chorus_mono.wet_dry", _("dry/wet")); - } - closeBox(); + create_small_rackknobr("chorus_mono.level", _("level")); + create_small_rackknob("chorus_mono.freq", _("speed")); + create_small_rackknob("chorus_mono.wet_dry", _("dry/wet")); } closeBox(); } - closeMonoRackBox(); + closeBox(); } void StackBoxBuilder::make_rackbox_flanger_mono() { - openMonoRackBox(_("flanger"), engine.pluginlist.pos_var("flanger_mono"), "flanger_mono.on_off", "flanger_mono.pp", "ui.Flanger Mono"); + openHorizontalhideBox(""); + create_master_slider("flanger_mono.level", _("level")); + closeBox(); + openVerticalBox(""); { - openHorizontalhideBox(""); - create_master_slider("flanger_mono.level", _("level")); - closeBox(); - openVerticalBox(""); + openHorizontalBox(""); { - openHorizontalBox(""); - { - create_small_rackknobr("flanger_mono.level", _("level")); - create_small_rackknob("flanger_mono.freq", _("speed")); - create_small_rackknob("flanger_mono.wet_dry", _("dry/wet")); - } - closeBox(); + create_small_rackknobr("flanger_mono.level", _("level")); + create_small_rackknob("flanger_mono.freq", _("speed")); + create_small_rackknob("flanger_mono.wet_dry", _("dry/wet")); } closeBox(); } - closeMonoRackBox(); + closeBox(); } void StackBoxBuilder::make_rackbox_feedback() { - openMonoRackBox(_("feedback"), engine.pluginlist.pos_var("feedback"), "feedback.on_off", "feedback.pp", "ui.Feedback"); + openHorizontalhideBox(""); + create_master_slider("feedback.feedback", _("feedback")); + closeBox(); + openVerticalBox(""); { - openHorizontalhideBox(""); - create_master_slider("feedback.feedback", _("feedback")); - closeBox(); - openVerticalBox(""); + openHorizontalBox(""); { - openHorizontalBox(""); - { - create_small_rackknobr("feedback.feedback", _("feedback")); - create_small_rackknob("feedback.wet_dry", _("dry/wet")); - } - closeBox(); + create_small_rackknobr("feedback.feedback", _("feedback")); + create_small_rackknob("feedback.wet_dry", _("dry/wet")); } closeBox(); } - closeMonoRackBox(); + closeBox(); } void StackBoxBuilder::make_rackbox_amp_tonestack() { - openMonoRackBox(_("tonestack"), engine.pluginlist.pos_var("amp.tonestack"), "amp.tonestack.on_off", "amp.tonestack.pp", "ui.Tonestack"); + openHorizontalhideBox(""); + create_selector("amp.tonestack.select"); + closeBox(); + openVerticalBox(""); { - openHorizontalhideBox(""); - create_selector("amp.tonestack.select"); - closeBox(); - openVerticalBox(""); + openHorizontalBox(""); { - openHorizontalBox(""); - { - create_selector("amp.tonestack.select"); + create_selector("amp.tonestack.select"); - create_small_rackknob("amp.tonestack.Bass", _("bass")); + create_small_rackknob("amp.tonestack.Bass", _("bass")); - create_small_rackknob("amp.tonestack.Middle", _("middle")); + create_small_rackknob("amp.tonestack.Middle", _("middle")); - create_small_rackknob("amp.tonestack.Treble", _("treble")); - } - closeBox(); + create_small_rackknob("amp.tonestack.Treble", _("treble")); } closeBox(); } - closeMonoRackBox(); + closeBox(); } void StackBoxBuilder::make_rackbox_cab() { - openMonoRackBox(_("cabinet"), engine.pluginlist.pos_var("cab"), "cab.on_off", "cab.pp", "ui.Cabinet"); + openHorizontalhideBox(""); + create_selector("cab.select"); + closeBox(); + openVerticalBox(""); { - openHorizontalhideBox(""); - create_selector("cab.select"); + openHorizontalBox(""); + { + create_selector("cab.select"); + create_small_rackknob("cab.bass", "bass"); + create_small_rackknob("cab.treble", "treble"); + create_small_rackknobr("cab.Level", "level"); + } closeBox(); - openVerticalBox(""); + } + closeBox(); +} + +void StackBoxBuilder::make_rackbox_pre() { + openHorizontalhideBox(""); + create_selector("pre.select"); + closeBox(); + openVerticalBox(""); + { + openHorizontalBox(""); { - openHorizontalBox(""); - { - create_selector("cab.select"); - create_small_rackknob("cab.bass", "bass"); - create_small_rackknob("cab.treble", "treble"); - create_small_rackknobr("cab.Level", "level"); - } + create_selector("pre.select"); + create_small_rackknob("pre.bass", "bass"); + create_small_rackknob("pre.treble", "treble"); + create_small_rackknobr("pre.Level", "level"); + } + closeBox(); + } + closeBox(); +} +void StackBoxBuilder::make_rackbox_jconv_mono() { + static gx_jconv::IRWindow *irw = gx_jconv::IRWindow::create(ui, engine.mono_convolver, window_icon, gx_settings, accels, 1); + openHorizontalhideBox(""); + create_master_slider("jconv_mono.wet_dry", _("Dry/Wet")); + openSpaceBox(""); + closeBox(); + openSpaceBox(""); + closeBox(); + addSmallJConvFavButton(_("S"), irw); + closeBox(); + openVerticalBox(""); + { + openSetMonoLabelBox(); + closeBox(); + openSpaceBox(""); + closeBox(); + openHorizontalBox(""); + { + openSpaceBox(""); + closeBox(); + create_small_rackknobr("jconv_mono.gain", _("Gain")); + openSpaceBox(""); + closeBox(); + create_small_rackknobr("jconv_mono.wet_dry", _("Dry/Wet")); + openSpaceBox(""); + closeBox(); + addJConvButton(_("Setup"), irw); + openSpaceBox(""); closeBox(); } closeBox(); } - closeMonoRackBox(); + closeBox(); +} + +void StackBoxBuilder::make_rackbox_highbooster() { + openHorizontalhideBox(""); + create_master_slider("highbooster.Level", _("Level")); + closeBox(); + openVerticalBox(""); + { + openHorizontalBox(""); + { + create_small_rackknobr("highbooster.Level", _("Level")); + } + closeBox(); + } + closeBox(); } void StackBoxBuilder::make_rackbox_midi_out() { diff -Nru guitarix-0.22.4/src/gx_head/gui/gx_preset_window.cpp guitarix-0.24.2/src/gx_head/gui/gx_preset_window.cpp --- guitarix-0.22.4/src/gx_head/gui/gx_preset_window.cpp 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/src/gx_head/gui/gx_preset_window.cpp 2012-10-20 03:56:02.000000000 +0000 @@ -385,6 +385,10 @@ } Glib::ustring src_bank = get_current_bank(); gx_system::PresetFile& pf = *gx_settings.banks.get_file(src_bank); + if (src_bank == bank) { + gx_system::gx_print_error("preset", "can't copy inside the same bank"); + return; + } Gtk::TreeModel::Path pt; Gtk::TreeViewDropPosition dst; if (!presets_target_treeview->get_dest_row_at_pos(x, y, pt, dst)) { @@ -646,23 +650,11 @@ return false; } -static void strip(Glib::ustring& s) { - size_t n = s.find_first_not_of(' '); - if (n == Glib::ustring::npos) { - s.erase(); - return; - } - if (n != 0) { - s.erase(0, n); - } - s.erase(s.find_last_not_of(' ')+1); -} - void PresetWindow::on_bank_edited(const Glib::ustring& path, const Glib::ustring& newtext, Gtk::TreeView* w) { Gtk::TreeIter sel = w->get_model()->get_iter(path); Glib::ustring oldname = sel->get_value(bank_col.name); Glib::ustring newname = newtext; - strip(newname); + gx_system::strip(newname); if (newname.empty() || newname == oldname) { Gtk::TreeViewColumn *p = w->get_column(1); reset_edit(*p); @@ -930,7 +922,7 @@ Gtk::TreeIter it = pstore->get_iter(path); Glib::ustring oldname = it->get_value(pstore->col.name); Glib::ustring newname = newtext; - strip(newname); + gx_system::strip(newname); if (newname.empty() || newname == oldname) { reset_edit(*preset_treeview->get_column(0)); return; diff -Nru guitarix-0.22.4/src/gx_head/gui/gx_stackbox_builder.cpp guitarix-0.24.2/src/gx_head/gui/gx_stackbox_builder.cpp --- guitarix-0.22.4/src/gx_head/gui/gx_stackbox_builder.cpp 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/src/gx_head/gui/gx_stackbox_builder.cpp 2012-10-20 03:56:02.000000000 +0000 @@ -129,19 +129,115 @@ */ StackBoxBuilder::StackBoxBuilder( - int& fTop_, GtkWidget*(&fBox_)[stackSize], gx_engine::GxEngine& engine_, - gx_preset::GxSettings& gx_settings_, int (&fMode_)[stackSize], - Gxw::WaveView &fWaveView_, Gtk::Label &convolver_filename_label_, gx_ui::GxUI& ui_, + gx_engine::GxEngine& engine_, gx_preset::GxSettings& gx_settings_, + Gxw::WaveView &fWaveView_, Gtk::Label &convolver_filename_label_, + Gtk::Label &convolver_mono_filename_label_, gx_ui::GxUI& ui_, Glib::RefPtr window_icon_) - : fTop(fTop_), fBox(fBox_), engine(engine_), gx_settings(gx_settings_), - fMode(fMode_), fWaveView(fWaveView_), - convolver_filename_label(convolver_filename_label_), ui(ui_), accels(), - window_icon(window_icon_) { + : fTop(0), fBox(), fMode(), engine(engine_), gx_settings(gx_settings_), + fWaveView(fWaveView_), convolver_filename_label(convolver_filename_label_), + convolver_mono_filename_label(convolver_mono_filename_label_), + widget(), ui(ui_), accels(), window_icon(window_icon_) { } StackBoxBuilder::~StackBoxBuilder() { } +/**************************************************************** + ** class StackBoxBuilder + */ + +void StackBoxBuilder::openVerticalMidiBox(const char* label) { + openVerticalBox(label); +} + +void StackBoxBuilder::prepare() { + fTop = 0; + widget = new Gtk::HBox(); + widget->show(); + fBox[fTop] = GTK_WIDGET(widget->gobj()); + fMode[fTop] = kBoxMode; +} + +#ifndef NDEBUG +void wnotify(gpointer data, GObject *where_the_object_was) { + printf("WN %p %p\n", where_the_object_was, data); +} + +// check if object will be finalized +void trace_finalize(Glib::Object *o, int n) { + g_object_weak_ref(o->gobj(), wnotify, (gpointer)n); +} +#endif + +void StackBoxBuilder::fetch(Gtk::Widget*& mainbox, Gtk::Widget*& minibox) { + assert(fTop == 0); + mainbox = widget; + Glib::ListHandle l = widget->get_children(); + if (l.size() == 2) { + Glib::ListHandle::iterator i = l.begin(); + minibox = new Gtk::VBox(); + minibox->show(); + (*i)->show(); + (*i)->reference(); //FIXME can't unmanage widget, reparent unrefs + (*i)->reparent(*minibox); + } else { + minibox = 0; + } +} + +void StackBoxBuilder::get_box(const std::string& name, Gtk::Widget*& mainbox, Gtk::Widget*& minibox) { + struct { + const char *name; + void (StackBoxBuilder::*func)(); + } mapping[] = { + // mono + //{ "ampdetail", &StackBoxBuilder::make_rackbox_ampdetail }, + { "overdrive", &StackBoxBuilder::make_rackbox_overdrive }, + { "echo", &StackBoxBuilder::make_rackbox_echo }, + { "delay", &StackBoxBuilder::make_rackbox_delay }, + { "freeverb", &StackBoxBuilder::make_rackbox_freeverb }, + { "oscilloscope", &StackBoxBuilder::make_rackbox_oscilloscope }, + { "low_highpass", &StackBoxBuilder::make_rackbox_low_highpass }, + { "eqs", &StackBoxBuilder::make_rackbox_eqs }, + //{ "crybaby", &StackBoxBuilder::make_rackbox_crybaby }, + //{ "gx_distortion", &StackBoxBuilder::make_rackbox_gx_distortion }, + { "IR", &StackBoxBuilder::make_rackbox_IR }, + { "compressor", &StackBoxBuilder::make_rackbox_compressor }, + { "expander", &StackBoxBuilder::make_rackbox_expander }, + { "biquad", &StackBoxBuilder::make_rackbox_biquad }, + //{ "tremolo", &StackBoxBuilder::make_rackbox_tremolo }, + { "phaser_mono", &StackBoxBuilder::make_rackbox_phaser_mono }, + { "chorus_mono", &StackBoxBuilder::make_rackbox_chorus_mono }, + { "flanger_mono", &StackBoxBuilder::make_rackbox_flanger_mono }, + { "feedback", &StackBoxBuilder::make_rackbox_feedback }, + //{ "amp.tonestack", &StackBoxBuilder::make_rackbox_amp_tonestack }, + { "cab", &StackBoxBuilder::make_rackbox_cab }, + { "pre", &StackBoxBuilder::make_rackbox_pre }, + { "highbooster", &StackBoxBuilder::make_rackbox_highbooster }, + { "jconv_mono", &StackBoxBuilder::make_rackbox_jconv_mono }, + { "midi_out", &StackBoxBuilder::make_rackbox_midi_out }, + // stereo + { "chorus", &StackBoxBuilder::make_rackbox_chorus }, + { "flanger", &StackBoxBuilder::make_rackbox_flanger }, + { "phaser", &StackBoxBuilder::make_rackbox_phaser }, + { "stereodelay", &StackBoxBuilder::make_rackbox_stereodelay }, + { "stereoecho", &StackBoxBuilder::make_rackbox_stereoecho }, + { "moog", &StackBoxBuilder::make_rackbox_moog }, + { "ampmodul", &StackBoxBuilder::make_rackbox_ampmodul }, + { "tonemodul", &StackBoxBuilder::make_rackbox_tonemodul }, + { "jconv", &StackBoxBuilder::make_rackbox_jconv }, + { "stereoverb", &StackBoxBuilder::make_rackbox_stereoverb } + }; + mainbox = minibox = 0; + for (unsigned int i = 0; i < sizeof(mapping) / sizeof(mapping[0]); ++i) { + if (name == mapping[i].name) { + prepare(); + (this->*mapping[i].func)(); + fetch(mainbox, minibox); + } + } +} + void StackBoxBuilder::loadRackFromGladeData(const char *xmldesc) { const char *ids[] = { "rackbox", "minibox", 0 }; Glib::RefPtr bld = GxBuilder::create_from_string(xmldesc, &ui, ids); @@ -199,7 +295,11 @@ } void StackBoxBuilder::set_convolver_filename() { - convolver_filename_label.set_label(engine.convolver.getIRFile()); + convolver_filename_label.set_label(engine.stereo_convolver.getIRFile()); +} + +void StackBoxBuilder::set_convolver_mono_filename() { + convolver_mono_filename_label.set_label(engine.mono_convolver.getIRFile()); } void StackBoxBuilder::openSetLabelBox() { @@ -214,12 +314,32 @@ convolver_filename_label.modify_font(font); box->pack_start(convolver_filename_label, false, false, 0); box->show_all(); - convolver_filename_label.set_label(engine.convolver.getIRFile()); - engine.convolver.signal_settings_changed().connect( + convolver_filename_label.set_label(engine.stereo_convolver.getIRFile()); + engine.stereo_convolver.signal_settings_changed().connect( sigc::mem_fun(*this, &StackBoxBuilder::set_convolver_filename)); gtk_box_pack_start(GTK_BOX(fBox[fTop]), GTK_WIDGET(box->gobj()), false, fill, 0); pushBox(kBoxMode, GTK_WIDGET(box->gobj())); } + +void StackBoxBuilder::openSetMonoLabelBox() { + Gtk::VBox *box = new Gtk::VBox(); + box->set_homogeneous(false); + box->set_spacing(0); + box->set_border_width(0); + convolver_mono_filename_label.set_name("beffect_label"); + Pango::FontDescription font = convolver_mono_filename_label.get_style()->get_font(); + font.set_size(8*Pango::SCALE); + font.set_weight(Pango::WEIGHT_BOLD); + convolver_mono_filename_label.modify_font(font); + box->pack_start(convolver_mono_filename_label, true, false, 0); + box->show_all(); + convolver_mono_filename_label.set_label(engine.mono_convolver.getIRFile()); + engine.mono_convolver.signal_settings_changed().connect( + sigc::mem_fun(*this, &StackBoxBuilder::set_convolver_mono_filename)); + gtk_box_pack_start(GTK_BOX(fBox[fTop]), GTK_WIDGET(box->gobj()), true, true, 0); + pushBox(kBoxMode, GTK_WIDGET(box->gobj())); +} + void StackBoxBuilder::addJConvButton(const char* label, gx_jconv::IRWindow *irw) { Gtk::Button *button = new Gtk::Button(); button->set_can_default(false); @@ -234,7 +354,7 @@ Gtk::Alignment *al = new Gtk::Alignment(0.0, 0.5, 0.0, 0.0); al->add(*manage(button)); al->show_all(); - addWidget(label, GTK_WIDGET(al->gobj())); + gtk_box_pack_start(GTK_BOX(fBox[fTop]), GTK_WIDGET(al->gobj()), false, fill, 0); button->signal_clicked().connect( sigc::mem_fun(*irw, &gx_jconv::IRWindow::reload_and_show)); } @@ -255,6 +375,19 @@ addwidget(s->get_widget()); } +void StackBoxBuilder::create_selector_with_caption(string id, const char *label) { + gx_engine::Parameter& p = gx_settings.get_param()[id]; + UiSelectorBase *s; + if (p.isFloat()) { + s = new UiSelectorWithCaption(ui, p.getFloat(), label); + } else if (p.isInt()) { + s = new UiSelectorWithCaption(ui, p.getInt(), label); + } else { + s = new UiSelectorWithCaption(ui, p.getUInt(), label); + } + addwidget(s->get_widget()); +} + void StackBoxBuilder::openSpaceBox(const char* label) { GxVBox * box = new GxVBox(ui); box->m_box.set_homogeneous(true); @@ -309,6 +442,25 @@ } } +void StackBoxBuilder::openVerticalBox2(const char* label) { + GxVBox * box = new GxVBox(ui); + box->m_box.set_homogeneous(false); + box->m_box.set_spacing(0); + box->m_box.set_border_width(0); + + if (fMode[fTop] != kTabMode && label[0] != 0) { + box->m_label.set_text(label); + box->m_label.set_name("rack_label"); + box->m_box.pack_start(box->m_label, false, false, 0 ); + gtk_box_pack_start(GTK_BOX(fBox[fTop]), GTK_WIDGET(box->m_box.gobj()), expand, fill, 0); + box->m_box.show(); + box->m_label.show(); + pushBox(kBoxMode, GTK_WIDGET(box->m_box.gobj())); + } else { + pushBox(kBoxMode, addWidget(label, GTK_WIDGET(box->m_box.gobj()))); + } +} + void StackBoxBuilder::openFlipLabelBox(const char* label) { GxVBox * box = new GxVBox(ui); box->m_box.set_homogeneous(false); diff -Nru guitarix-0.22.4/src/gx_head/gui/gx_stereo_rack_builder.cpp guitarix-0.24.2/src/gx_head/gui/gx_stereo_rack_builder.cpp --- guitarix-0.22.4/src/gx_head/gui/gx_stereo_rack_builder.cpp 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/src/gx_head/gui/gx_stereo_rack_builder.cpp 2012-10-20 03:56:02.000000000 +0000 @@ -35,316 +35,334 @@ void StackBoxBuilder::make_rackbox_chorus() { // ----- chorus - openStereoRackBox(_("chorus"), engine.pluginlist.pos_var("chorus"), "chorus.on_off", "ui.Chorus"); + openHorizontalhideBox(""); + create_master_slider("chorus.level", _("level")); + closeBox(); + openHorizontalBox(""); { - openHorizontalhideBox(""); - create_master_slider("chorus.level", _("level")); - closeBox(); - openHorizontalBox(""); - { - create_small_rackknobr("chorus.level", _(" level ")); - create_small_rackknob("chorus.delay", _(" delay ")); - create_small_rackknob("chorus.depth", _(" depth ")); - create_small_rackknob("chorus.freq", _(" freq ")); - } - closeBox(); + create_small_rackknobr("chorus.level", _(" level ")); + create_small_rackknob("chorus.delay", _(" delay ")); + create_small_rackknob("chorus.depth", _(" depth ")); + create_small_rackknob("chorus.freq", _(" freq ")); } - closeStereoRackBox(); + closeBox(); } void StackBoxBuilder::make_rackbox_flanger() { // flanger - openStereoRackBox(_("flanger"), engine.pluginlist.pos_var("flanger"), "flanger.on_off", "ui.Flanger"); + openHorizontalhideBox(""); + create_master_slider("flanger.level", _("level")); + closeBox(); + openHorizontalBox(""); { - openHorizontalhideBox(""); - create_master_slider("flanger.level", _("level")); - closeBox(); openHorizontalBox(""); { + create_small_rackknobr("flanger.level", _(" level ")); + } + closeBox(); + openVerticalBox(""); + { openHorizontalBox(""); { - create_small_rackknobr("flanger.level", _(" level ")); + create_small_rackknob("flanger.feedback gain", _(" feedback ")); + create_small_rackknob("flanger.depth", _(" depth ")); + create_small_rackknob("flanger.flange delay", _(" delay ")); + create_small_rackknob("flanger.flange delay offset", _(" delay offset")); + create_small_rackknob("flanger.LFO freq", _(" LFO ")); } closeBox(); - openVerticalBox(""); + openSpaceBox(""); + closeBox(); + openHorizontalBox(""); { - openHorizontalBox(""); - { - create_small_rackknob("flanger.feedback gain", _(" feedback ")); - create_small_rackknob("flanger.depth", _(" depth ")); - create_small_rackknob("flanger.flange delay", _(" delay ")); - create_small_rackknob("flanger.flange delay offset", _(" delay offset")); - create_small_rackknob("flanger.LFO freq", _(" LFO ")); - } + openSpaceBox(""); closeBox(); + create_selector("flanger.invert"); openSpaceBox(""); closeBox(); - openHorizontalBox(""); - { - openSpaceBox(""); - closeBox(); - create_selector("flanger.invert"); - openSpaceBox(""); - closeBox(); - openSpaceBox(""); - closeBox(); - openSpaceBox(""); - closeBox(); - openSpaceBox(""); - closeBox(); - openSpaceBox(""); - closeBox(); - openSpaceBox(""); - closeBox(); - } + openSpaceBox(""); closeBox(); - openFrameBox(""); + openSpaceBox(""); + closeBox(); + openSpaceBox(""); + closeBox(); + openSpaceBox(""); + closeBox(); + openSpaceBox(""); closeBox(); } closeBox(); + openFrameBox(""); + closeBox(); } closeBox(); } - closeStereoRackBox(); + closeBox(); } void StackBoxBuilder::make_rackbox_phaser() { // phaser - openStereoRackBox(_("phaser"), engine.pluginlist.pos_var("phaser"), "phaser.on_off", "ui.Phaser"); + openHorizontalhideBox(""); + create_master_slider("phaser.level", _("level")); + closeBox(); + openHorizontalBox(""); { - openHorizontalhideBox(""); - create_master_slider("phaser.level", _("level")); - closeBox(); openHorizontalBox(""); { + create_small_rackknobr("phaser.level", _(" level ")); + } + closeBox(); + openVerticalBox(""); + { openHorizontalBox(""); { - create_small_rackknobr("phaser.level", _(" level ")); + create_small_rackknob("phaser.feedback gain", _(" feedback ")); + create_small_rackknob("phaser.depth", _("depth")); + create_small_rackknob("phaser.Notch width", _("width")); + create_small_rackknob("phaser.NotchFreq", _("freq")); + create_small_rackknob("phaser.MaxNotch1Freq", _("max Hz")); + create_small_rackknob("phaser.MinNotch1Freq", _("min Hz")); + create_small_rackknob("phaser.Speed", _("speed")); } closeBox(); - openVerticalBox(""); + openSpaceBox(""); + closeBox(); + openHorizontalBox(""); { - openHorizontalBox(""); - { - create_small_rackknob("phaser.feedback gain", _(" feedback ")); - create_small_rackknob("phaser.depth", _("depth")); - create_small_rackknob("phaser.Notch width", _("width")); - create_small_rackknob("phaser.NotchFreq", _("freq")); - create_small_rackknob("phaser.MaxNotch1Freq", _("max Hz")); - create_small_rackknob("phaser.MinNotch1Freq", _("min Hz")); - create_small_rackknob("phaser.Speed", _("speed")); - } + openSpaceBox(""); + closeBox(); + create_selector("phaser.invert"); + openSpaceBox(""); + closeBox(); + create_selector("phaser.VibratoMode"); + openSpaceBox(""); + closeBox(); + openSpaceBox(""); closeBox(); openSpaceBox(""); closeBox(); - openHorizontalBox(""); - { - openSpaceBox(""); - closeBox(); - create_selector("phaser.invert"); - openSpaceBox(""); - closeBox(); - create_selector("phaser.VibratoMode"); - openSpaceBox(""); - closeBox(); - openSpaceBox(""); - closeBox(); - openSpaceBox(""); - closeBox(); - openSpaceBox(""); - closeBox(); - openSpaceBox(""); - closeBox(); - } + openSpaceBox(""); closeBox(); - openFrameBox(""); + openSpaceBox(""); closeBox(); } closeBox(); + openFrameBox(""); + closeBox(); } closeBox(); } - closeStereoRackBox(); + closeBox(); } void StackBoxBuilder::make_rackbox_stereodelay() { // stereo delay - openStereoRackBox(_("delay"), engine.pluginlist.pos_var("stereodelay"), "stereodelay.on_off", "ui.Stereo Delay"); + openHorizontalhideBox(""); + closeBox(); + openHorizontalBox(""); { - openHorizontalhideBox(""); - closeBox(); - openHorizontalBox(""); + create_small_rackknob("stereodelay.l_gain", _("left gain")); + create_small_rackknob("stereodelay.l_delay", _("left delay")); + openVerticalBox(""); { - create_small_rackknob("stereodelay.l_gain", _("left gain")); - create_small_rackknob("stereodelay.l_delay", _("left delay")); - openVerticalBox(""); - { - create_small_rackknobr("stereodelay.LFO freq", _("LFO")); - openSpaceBox(""); - closeBox(); - create_selector("stereodelay.invert"); - openFrameBox(""); - closeBox(); - } + create_small_rackknobr("stereodelay.LFO freq", _("LFO")); + openSpaceBox(""); + closeBox(); + create_selector("stereodelay.invert"); + openFrameBox(""); closeBox(); - create_small_rackknob("stereodelay.r_gain", _("right gain")); - create_small_rackknob("stereodelay.r_delay", _("right delay")); } closeBox(); + create_small_rackknob("stereodelay.r_gain", _("right gain")); + create_small_rackknob("stereodelay.r_delay", _("right delay")); } - closeStereoRackBox(); + closeBox(); } void StackBoxBuilder::make_rackbox_stereoecho() { // echo - openStereoRackBox(_("echo"), engine.pluginlist.pos_var("stereoecho"), "stereoecho.on_off", "ui.Stereo Echo"); + openHorizontalhideBox(""); + closeBox(); + openHorizontalBox(""); { - openHorizontalhideBox(""); - closeBox(); - openHorizontalBox(""); + openVerticalBox(""); { create_small_rackknob("stereoecho.percent_l", _("left %")); + openSpaceBox(""); + closeBox(); + } + closeBox(); + openVerticalBox(""); + { create_small_rackknob("stereoecho.time_l", _("left time")); + openSpaceBox(""); + closeBox(); + } + closeBox(); + openVerticalBox(""); + { + create_small_rackknobr("stereoecho.LFO freq", _("LFO")); + openSpaceBox(""); + closeBox(); + create_selector("stereoecho.invert"); + openFrameBox(""); + closeBox(); + } + closeBox(); + openVerticalBox(""); + { create_small_rackknob("stereoecho.percent_r", _("right %")); + openSpaceBox(""); + closeBox(); + } + closeBox(); + openVerticalBox(""); + { create_small_rackknob("stereoecho.time_r", _("right time")); - } + openSpaceBox(""); + closeBox(); + } closeBox(); } - closeStereoRackBox(); + closeBox(); } void StackBoxBuilder::make_rackbox_moog() { // moog filter - openStereoRackBox(_("moog"), engine.pluginlist.pos_var("moog"), "moog.on_off", "ui.Moog Filter"); + openHorizontalhideBox(""); + create_master_slider("moog.Q", _("Q")); + closeBox(); + openHorizontalTableBox(""); { - openHorizontalhideBox(""); - create_master_slider("moog.Q", _("Q")); - closeBox(); - openHorizontalTableBox(""); - { - create_small_rackknob("moog.Q", _(" Q ")); - create_small_rackknob("moog.fr", _(" Hz ")); - } - closeBox(); + create_small_rackknob("moog.Q", _(" Q ")); + create_small_rackknob("moog.fr", _(" Hz ")); } - closeStereoRackBox(); + closeBox(); } void StackBoxBuilder::make_rackbox_ampmodul() { // postamp - openStereoRackBox(_("amp"), engine.pluginlist.pos_var("ampmodul"), "ampmodul.on_off", "ui.Postamp"); + openHorizontalhideBox(""); + create_master_slider("ampmodul.level", _("level")); + closeBox(); + openHorizontalBox(""); { - openHorizontalhideBox(""); - create_master_slider("ampmodul.level", _("level")); + openSpaceBox(""); closeBox(); - openHorizontalBox(""); - { - openSpaceBox(""); - closeBox(); - create_small_rackknobr("ampmodul.feedbac", _("dry/feedback ")); - create_small_rackknob("ampmodul.wet_dry", _("dry/wet")); - create_small_rackknob("ampmodul.level", _("level")); - create_small_rackknob("ampmodul.amp2.stage1.tube1", _("tube1")); - create_small_rackknob("ampmodul.amp2.stage2.tube2", _("tube2")); - create_small_rackknobr("ampmodul.feedback", _(" wet/feedback")); - openSpaceBox(""); - closeBox(); - } + create_small_rackknobr("ampmodul.feedbac", _("dry/feedback ")); + create_small_rackknob("ampmodul.wet_dry", _("dry/wet")); + create_small_rackknob("ampmodul.level", _("level")); + create_small_rackknob("ampmodul.amp2.stage1.tube1", _("tube1")); + create_small_rackknob("ampmodul.amp2.stage2.tube2", _("tube2")); + create_small_rackknobr("ampmodul.feedback", _(" wet/feedback")); + openSpaceBox(""); closeBox(); } - closeStereoRackBox(); + closeBox(); } void StackBoxBuilder::make_rackbox_tonemodul() { // 3 band eq - openStereoRackBox(_("tone"), engine.pluginlist.pos_var("tonemodul"), "tonemodul.on_off", "ui.3 Band EQ"); + openHorizontalhideBox(""); + closeBox(); + openHorizontalBox(""); { - openHorizontalhideBox(""); - closeBox(); - openHorizontalBox(""); - { - create_small_rackknob("tonemodul.Bass", _("bass")); - create_small_rackknob("tonemodul.Middle", _("middle")); - create_small_rackknob("tonemodul.Treble", _("treble")); - openSpaceBox(""); - closeBox(); - create_switch_no_caption(sw_switchit, "tonemodul.ON"); - create_small_rackknob("tonemodul.sharper", _("sharp")); - } + create_small_rackknob("tonemodul.Bass", _("bass")); + create_small_rackknob("tonemodul.Middle", _("middle")); + create_small_rackknob("tonemodul.Treble", _("treble")); + openSpaceBox(""); closeBox(); + create_switch_no_caption(sw_switchit, "tonemodul.ON"); + create_small_rackknob("tonemodul.sharper", _("sharp")); } - closeStereoRackBox(); + closeBox(); } void StackBoxBuilder::make_rackbox_jconv() { - gx_jconv::IRWindow *irw = gx_jconv::IRWindow::create(ui, engine.convolver, window_icon, gx_settings, accels); - openStereoRackBox(_("convolver"), engine.pluginlist.pos_var("jconv"), "jconv.on_off", "ui.Convolver"); + static gx_jconv::IRWindow *irw = gx_jconv::IRWindow::create(ui, engine.stereo_convolver, window_icon, gx_settings, accels, 2); + openHorizontalhideBox(""); + create_master_slider("jconv.wet_dry", _("Dry/Wet")); + openSpaceBox(""); + closeBox(); + openSpaceBox(""); + closeBox(); + addSmallJConvFavButton(_("S"), irw); + closeBox(); + openVerticalBox(""); { - openHorizontalhideBox(""); + openSetLabelBox(); { - create_master_slider("jconv.gain", _("gain")); - openSpaceBox(""); - closeBox(); - openSpaceBox(""); - closeBox(); - addSmallJConvFavButton(_("setup"), irw); } closeBox(); + openSpaceBox(""); + closeBox(); openHorizontalBox(""); { - openVerticalBox(""); - { - openSetLabelBox(); - { - } - closeBox(); - openHorizontalBox(""); - { - openSpaceBox(""); - closeBox(); - openSpaceBox(""); - closeBox(); - create_small_rackknobr("jconv.gain", _("gain")); - openSpaceBox(""); - closeBox(); - create_small_rackknob("jconv.diff_delay", _("delta delay")); - openSpaceBox(""); - closeBox(); - create_small_rackknob("jconv.balance", _("balance")); - openSpaceBox(""); - closeBox(); - create_small_rackknobr("jconv.wet_dry", _("dry/wet")); - openSpaceBox(""); - closeBox(); - addJConvButton(_("setup"), irw); - openSpaceBox(""); - closeBox(); - } - closeBox(); - } + openSpaceBox(""); + closeBox(); + openSpaceBox(""); + closeBox(); + create_small_rackknobr("jconv.gain", _("Gain")); + openSpaceBox(""); + closeBox(); + create_small_rackknob("jconv.diff_delay", _("Delta Delay")); + openSpaceBox(""); + closeBox(); + create_small_rackknob("jconv.balance", _("Balance")); + openSpaceBox(""); + closeBox(); + create_small_rackknobr("jconv.wet_dry", _("Dry/Wet")); + openSpaceBox(""); + closeBox(); + addJConvButton(_("Setup"), irw); + openSpaceBox(""); closeBox(); } closeBox(); } - closeStereoRackBox(); + closeBox(); } void StackBoxBuilder::make_rackbox_stereoverb() { //stereoverb - openStereoRackBox(_("stereoverb"), engine.pluginlist.pos_var("stereoverb"), "stereoverb.on_off", "ui.Stereo Verb"); + openHorizontalhideBox(""); + create_master_slider("stereoverb.RoomSize", _("RoomSize")); + closeBox(); + openHorizontalBox(""); { - openHorizontalhideBox(""); - create_master_slider("stereoverb.RoomSize", _("RoomSize")); - closeBox(); - openHorizontalBox(""); + openVerticalBox(""); { create_small_rackknobr("stereoverb.RoomSize", _("RoomSize")); + openSpaceBox(""); + closeBox(); + } + closeBox(); + openVerticalBox(""); + { create_small_rackknob("stereoverb.damp", _("damp")); + openSpaceBox(""); + closeBox(); + } + closeBox(); + openVerticalBox(""); + { create_small_rackknob("stereoverb.wet_dry", _("dry/wet")); + openSpaceBox(""); + closeBox(); + } + closeBox(); + openVerticalBox(""); + { + create_small_rackknobr("stereoverb.LFO freq", _("LFO")); + openSpaceBox(""); + closeBox(); + create_selector("stereoverb.invert"); + openFrameBox(""); + closeBox(); } - closeBox(); + closeBox(); } - closeStereoRackBox(); + closeBox(); } } // end namespace gx_gui diff -Nru guitarix-0.22.4/src/gx_head/gui/gx_ui_builder.cpp guitarix-0.24.2/src/gx_head/gui/gx_ui_builder.cpp --- guitarix-0.22.4/src/gx_head/gui/gx_ui_builder.cpp 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/src/gx_head/gui/gx_ui_builder.cpp 2012-10-20 03:56:02.000000000 +0000 @@ -58,23 +58,51 @@ StackBoxBuilder *UiBuilderImpl::intf = 0; -UiBuilderImpl::UiBuilderImpl(StackBoxBuilder *i) - : UiBuilderBase() { - intf = i; +UiBuilderImpl::UiBuilderImpl(MainWindow *i, gx_gui::StackBoxBuilder *b, std::vector *pl) + : UiBuilderBase(), main(*i), pluginlist(pl) { + intf = b; openVerticalBox = openVerticalBox_; + openVerticalBox1 = openVerticalBox1_; + openVerticalBox2 = openVerticalBox2_; openHorizontalBox = openHorizontalBox_; openHorizontalhideBox = openHorizontalhideBox_; closeBox = closeBox_; load_glade = load_glade_; create_master_slider = create_master_slider_; create_small_rackknob = create_small_rackknob_; + create_small_rackknobr = create_small_rackknobr_; + create_spin_value = create_spin_value_; + create_switch = create_switch_; + create_switch_no_caption = create_switch_no_caption_; create_selector = create_selector_; + create_selector_no_caption = create_selector_no_caption_; + create_port_display = create_port_display_; + insertSpacer = insertSpacer_; }; +bool UiBuilderImpl::load_unit(PluginUI &pl) { + PluginDef *pd = pl.plugin->pdef; + if (!pd->load_ui) { + return false; + } + intf->prepare(); + plugin = pd; + pd->load_ui(*this); + return true; +} + void UiBuilderImpl::openVerticalBox_(const char* label) { intf->openVerticalBox(label); } +void UiBuilderImpl::openVerticalBox1_(const char* label) { + intf->openVerticalBox1(label); +} + +void UiBuilderImpl::openVerticalBox2_(const char* label) { + intf->openVerticalBox2(label); +} + void UiBuilderImpl::openHorizontalhideBox_(const char* label) { intf->openHorizontalhideBox(label); } @@ -83,6 +111,11 @@ intf->openHorizontalBox(label); } +void UiBuilderImpl::insertSpacer_() { + intf->openSpaceBox(""); + intf->closeBox(); +} + void UiBuilderImpl::create_small_rackknob_(const char *id, const char *label) { if (label) { intf->create_small_rackknob(id, label); @@ -91,6 +124,14 @@ } } +void UiBuilderImpl::create_small_rackknobr_(const char *id, const char *label) { + if (label) { + intf->create_small_rackknobr(id, label); + } else { + intf->create_small_rackknobr(id); + } +} + void UiBuilderImpl::create_master_slider_(const char *id, const char *label) { if (label) { intf->create_master_slider(id, label); @@ -99,10 +140,30 @@ } } -void UiBuilderImpl::create_selector_(const char *id) { +void UiBuilderImpl::create_selector_no_caption_(const char *id) { intf->create_selector(id, ""); } +void UiBuilderImpl::create_selector_(const char *id, const char *label) { + intf->create_selector_with_caption(id, label); +} + +void UiBuilderImpl::create_spin_value_(const char *id, const char *label) { + intf->create_spin_value(id, label); +} + +void UiBuilderImpl::create_switch_no_caption_(const char *sw_type, const char * id) { + intf->create_switch_no_caption(sw_type, id); +} + +void UiBuilderImpl::create_switch_(const char *sw_type, const char * id, const char *label) { + intf->create_switch(sw_type, id, label, Gtk::POS_TOP); +} + +void UiBuilderImpl::create_port_display_(const char *id, const char *label) { + intf->create_port_display(id, label); +} + void UiBuilderImpl::closeBox_() { intf->closeBox(); } @@ -113,29 +174,13 @@ bool UiBuilderImpl::load(gx_engine::Plugin *p) { PluginDef *pd = p->pdef; - if (!pd->load_ui) { + if (!(pd->flags & PGN_GUI) || !(pd->flags & gx_engine::PGNI_DYN_POSITION)) { return false; } - plugin = pd; - string s = pd->id; - string id_on_off = s + ".on_off"; - string id_dialog = string("ui.") + pd->name; - const char *name = pd->name; - if (name && name[0]) { - name = gettext(name); - } - if (pd->flags & PGN_STEREO) { - intf->openStereoRackBox(name, &(p->position), id_on_off.c_str(), id_dialog.c_str()); - pd->load_ui(*this); - intf->closeStereoRackBox(); - } else { - string id_pre_post = s+".pp"; - intf->openMonoRackBox(name, &(p->position), id_on_off.c_str(), id_pre_post.c_str(), id_dialog.c_str()); - pd->load_ui(*this); - intf->closeMonoRackBox(); - } + main.add_plugin(*pluginlist, pd->id, "", ""); return true; } + } /* end of gx_gui namespace */ /**************************************************************** @@ -341,8 +386,25 @@ } } +struct uiAdjustmentLog : public gx_ui::GxUiItemFloat { + GtkAdjustment* fAdj; + uiAdjustmentLog(gx_ui::GxUI* ui, float* zone, GtkAdjustment* adj) : + gx_ui::GxUiItemFloat(ui, zone), fAdj(adj) { + gtk_adjustment_set_value(fAdj, log10(*zone)); + } + static void changed(GtkAdjustment *adj, gpointer data) { + float v = adj->value; + ((gx_ui::GxUiItemFloat*)data)->modifyZone(pow(10.0,v)); + } + virtual void reflectZone() { + float v = *fZone; + fCache = v; + gtk_adjustment_set_value(fAdj, log10(v)); + } +}; + static void make_continuous_controller(gx_ui::GxUI& ui, Glib::RefPtr& w, gx_engine::Parameter& p) { - Glib::RefPtr r = Glib::RefPtr::cast_dynamic(w); + Glib::RefPtr r = Glib::RefPtr::cast_dynamic(w); if (!r) { make_switch_controller(ui, w, p); return; @@ -353,17 +415,47 @@ Glib::ustring::compose("Continuous Parameter variable %1: type not handled", p.id())); return; } - gx_engine::FloatParameter &fp = p.getFloat(); - w->cp_configure(p.l_group(), p.l_name(), fp.lower, fp.upper, fp.step); - w->cp_set_value(fp.get_value()); Gtk::Adjustment *adj = r->get_adjustment(); - gx_gui::uiAdjustment* c = new gx_gui::uiAdjustment(&ui, &fp.get_value(), adj->gobj()); - destroy_with_widget(r.operator->(), c); - adj->signal_value_changed().connect( - sigc::bind( - sigc::bind( - sigc::ptr_fun(gx_gui::uiAdjustment::changed), - (gpointer)c), adj->gobj())); + gx_engine::FloatParameter &fp = p.getFloat(); + if (fp.is_log_display()) { + double up = log10(fp.upper); + double step = log10(fp.step); + w->cp_configure(fp.l_group(), fp.l_name(), log10(fp.lower), up, step); + int prec = 0; + float d = log10((fp.step-1)*fp.upper); + if (up > 0) { + prec = up; + if (d < 0) { + prec -= floor(d); + } + } else if (d < 0) { + prec = -floor(d); + } + r->signal_format_value().connect( + sigc::bind( + sigc::ptr_fun(logarithmic_format_value), + prec)); + r->signal_input_value().connect( + sigc::ptr_fun(logarithmic_input_value)); + w->cp_set_value(log10(fp.get_value())); + gx_gui::uiAdjustmentLog* c = new gx_gui::uiAdjustmentLog(&ui, &fp.get_value(), adj->gobj()); + adj->signal_value_changed().connect( + sigc::bind( + sigc::bind( + sigc::ptr_fun(gx_gui::uiAdjustmentLog::changed), + (gpointer)c), adj->gobj())); + destroy_with_widget(r.operator->(), c); + } else { + w->cp_configure(p.l_group(), p.l_name(), fp.lower, fp.upper, fp.step); + w->cp_set_value(fp.get_value()); + gx_gui::uiAdjustment* c = new gx_gui::uiAdjustment(&ui, &fp.get_value(), adj->gobj()); + adj->signal_value_changed().connect( + sigc::bind( + sigc::bind( + sigc::ptr_fun(gx_gui::uiAdjustment::changed), + (gpointer)c), adj->gobj())); + destroy_with_widget(r.operator->(), c); + } } static void make_enum_controller(gx_ui::GxUI& ui, Glib::RefPtr& w, gx_engine::Parameter& p) { @@ -380,6 +472,7 @@ ls->append()->set_value(0, Glib::ustring(p.value_label(*vp))); } t->set_model(ls); + w->cp_configure(p.l_group(), p.l_name(), p.getLowerAsFloat(), p.getUpperAsFloat(), 1.0); if (p.isInt()) { int& val = p.getInt().get_value(); destroy_with_widget(t, new uiSelector(ui, t, &val)); diff -Nru guitarix-0.22.4/src/gx_head/gui/gxw_mm_controllers.cpp guitarix-0.24.2/src/gx_head/gui/gxw_mm_controllers.cpp --- guitarix-0.22.4/src/gx_head/gui/gxw_mm_controllers.cpp 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/src/gx_head/gui/gxw_mm_controllers.cpp 2012-10-20 03:56:02.000000000 +0000 @@ -63,13 +63,21 @@ */ void UiRegler::on_value_changed() { - modifyZone(get_value()); + if (log_display) { + modifyZone(pow(10.0,get_value())); + } else { + modifyZone(get_value()); + } } void UiRegler::reflectZone() { float v = *fZone; fCache = v; - set_value(v); + if (log_display) { + set_value(log10(v)); + } else { + set_value(v); + } } static bool hasId(string id) { @@ -89,8 +97,30 @@ UiRegler::UiRegler(gx_ui::GxUI &ui, gx_engine::FloatParameter ¶m, Gxw::Regler *regler, bool show_value): gx_ui::GxUiItemFloat(&ui, ¶m.get_value()), - Gtk::Adjustment(param.std_value, param.lower, param.upper, param.step, 10*param.step, 0), - m_regler(regler) { + Gtk::Adjustment(param.get_value(), param.lower, param.upper, param.step, 10*param.step, 0), + m_regler(regler), + log_display(param.is_log_display()) { + if (log_display) { + double up = log10(param.upper); + double step = log10(param.step); + configure(log10(param.get_value()), log10(param.lower), up, step, 10*step, 0); + int prec = 0; + float d = log10((param.step-1)*param.upper); + if (up > 0) { + prec = up; + if (d < 0) { + prec -= floor(d); + } + } else if (d < 0) { + prec = -floor(d); + } + m_regler->signal_format_value().connect( + sigc::bind( + sigc::ptr_fun(logarithmic_format_value), + prec)); + m_regler->signal_input_value().connect( + sigc::ptr_fun(logarithmic_input_value)); + } m_regler->set_show_value(show_value); m_regler->set_name("regler"); m_regler->set_has_tooltip(); @@ -101,7 +131,11 @@ m_regler->set_tooltip_text(tip); m_regler->cp_set_var(param.id()); m_regler->set_adjustment(*this); - set_value(param.get_value()); + if (log_display) { + set_value(log10(param.get_value())); + } else { + set_value(param.get_value()); + } m_regler->show(); m_regler->get_accessible()->set_description (param.id().c_str()); m_regler->get_accessible()->set_name (param.id().substr( param.id().find_last_of(".")+1).c_str()); @@ -124,6 +158,12 @@ ls->append()->set_value(0, Glib::ustring(param.value_label(*p))); } m_selector.set_model(ls); + m_selector.set_has_tooltip(); + string tip = param.desc(); + if (param.desc().empty()) { + tip = param.id().substr(param.id().find_last_of(".")+1); + } + m_selector.set_tooltip_text(tip); m_selector.get_accessible()->set_description (param.id().c_str()); m_selector.get_accessible()->set_name (param.id().substr( param.id().find_last_of(".")+1).c_str()); } @@ -159,10 +199,6 @@ } template -UiSelector::~UiSelector() { -} - -template void UiSelector::on_value_changed() { this->modifyZone(get_value()); } @@ -255,9 +291,16 @@ : UiRegler(ui, param, regler, true) { m_label.set_text(label); m_label.set_name("rack_label"); + m_label.set_justify(Gtk::JUSTIFY_CENTER); m_box.set_name(param.id()); m_box.pack_start(m_label, Gtk::PACK_SHRINK); - m_box.pack_start(*m_regler, Gtk::PACK_SHRINK); + if (typeid(*m_regler) == typeid(Gxw::ValueDisplay) || typeid(*m_regler) == typeid(Gxw::SimpleValueDisplay)) { // FIXME + Gtk::HBox *h = new Gtk::HBox(); + h->pack_start(*m_regler, Gtk::PACK_EXPAND_PADDING); + m_box.pack_start(*manage(h), Gtk::PACK_EXPAND_PADDING); + } else { + m_box.pack_end(*m_regler, Gtk::PACK_SHRINK); + } set_accessible(GTK_WIDGET(m_regler->gobj()),m_label.gobj()); m_box.show_all(); } @@ -316,7 +359,12 @@ gx_ui::GxUiItemFloat(&ui, ¶m.get_value()) { set_active(param.get_value() != 0.0); cp_set_var(param.id()); - this->set_tooltip_text(param.id().substr( param.id().find_last_of(".")+1).c_str()); + this->set_has_tooltip(); + string tip = param.desc(); + if (param.desc().empty()) { + tip = param.id().substr(param.id().find_last_of(".")+1); + } + this->set_tooltip_text(tip); this->get_accessible()->set_description (param.id().c_str()); this->get_accessible()->set_name (param.id().substr( param.id().find_last_of(".")+1).c_str()); @@ -339,9 +387,12 @@ gx_ui::GxUiItemBool(&ui, ¶m.get_value()) { set_active(param.get_value()); cp_set_var(param.id()); - char s[64]; - snprintf(s, 63, _("%s on/off"),param.l_group().c_str()); - this->set_tooltip_text(s); + this->set_has_tooltip(); + string tip = param.desc(); + if (param.desc().empty()) { + tip = param.id().substr(param.id().find_last_of(".")+1); + } + this->set_tooltip_text(tip); this->get_accessible()->set_description (param.id().c_str()); this->get_accessible()->set_name (param.id().substr( param.id().find_last_of(".")+1).c_str()); @@ -372,17 +423,18 @@ Glib::ustring label, Gtk::PositionType pos): m_switch(UiSwitch::new_switch(ui, sw_type, param)) { m_label.set_text(label); - m_label.set_name("effekt_label"); + m_label.set_name("rack_label"); if (pos == Gtk::POS_LEFT || pos == Gtk::POS_RIGHT) { m_box = new Gtk::HBox(); } else { + m_label.set_justify(Gtk::JUSTIFY_CENTER); m_box = new Gtk::VBox(); } if (pos == Gtk::POS_LEFT || pos == Gtk::POS_TOP) { m_box->pack_start(m_label, Gtk::PACK_SHRINK); - m_box->pack_start(*m_switch, Gtk::PACK_SHRINK); + m_box->pack_start(*m_switch, Gtk::PACK_EXPAND_PADDING); } else { - m_box->pack_start(*m_switch, Gtk::PACK_SHRINK); + m_box->pack_start(*m_switch, Gtk::PACK_EXPAND_PADDING); m_box->pack_start(m_label, Gtk::PACK_SHRINK); } m_box->set_name(param.id()); diff -Nru guitarix-0.22.4/src/gx_head/gui/ladspalist.cpp guitarix-0.24.2/src/gx_head/gui/ladspalist.cpp --- guitarix-0.22.4/src/gx_head/gui/ladspalist.cpp 1970-01-01 00:00:00.000000000 +0000 +++ guitarix-0.24.2/src/gx_head/gui/ladspalist.cpp 2012-10-20 03:56:02.000000000 +0000 @@ -0,0 +1,2336 @@ +/* + * Copyright (C) 2012 Andreas Degert, Hermann Meyer + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#include +#include +#include + +#include "guitarix.h" + +using Glib::ustring; +using gx_system::JsonParser; +using gx_system::JsonWriter; +using gx_system::JsonException; + +namespace ladspa { + +//#define HARD_RT_ONLY + +static int SR = 44100; + +static const unsigned long blacklist[] = { + 4069, 4070, // ladspa_guitarix + 1912, // jamincont (crashes on unload?) + //1044, 1045, 1046, 1047, // sine +}; + +static bool lib_is_blacklisted(const std::string& name) { + static const char *blacklist[] = { + "dssi-vst.so", + }; + for (unsigned int i = 0; i < sizeof(blacklist) / sizeof(blacklist[0]); i++) { + if (name == blacklist[i]) { + return true; + } + } + return false; +} + +static const unsigned long quirklist_no_cleanup[] = { 1912, 0 }; +static const unsigned long quirklist_activate[] = { 1890, 1891, 1893, 1894, 1892, 1903, 1904, 0 }; +static const struct { + int flag; + const unsigned long *ids; +} quirk_list[] = { + {1, quirklist_no_cleanup}, + {2, quirklist_activate}, + {0, 0} +}; + +#define unknown_category "External" + +static const char *cat_subst[][2] = { + {"Reverbs", "Reverb"}, + {"Filters", "Tone control"}, + {"EQs", "Tone control"}, + {"Compressors", "Guitar Effects"}, + {"Utilities", "Misc"}, + {"Delays", "Echo / Delay"}, + {"Phasers", "Modulation"}, + {"Chorus", "Modulation"}, + {"Flangers", "Modulation"}, + {"Modulators", "Modulation"}, + {"Distortions", "Distortion"}, + {"Waveshapers", "Distortion"}, + {"Amplifiers", "Distortion"}, + {0, 0} +}; + +const char *step_type_names[] = { "coarse", "normal", "fine" }; + +/**************************************************************** + ** PluginDesc, PortDesc + */ + +static inline bool float_eq(float v1, float v2) { + return abs(v1 - v2) <= 1e-5 * abs(v1); +} + +const char *display_type_names[] = { "Scale", "Log. Scale", "Toggle", "Enum", "Display", "Led", "Hide", "Int" }; + + +bool operator!=(const ChangeableValues& v1, const ChangeableValues& v2) { + if (v1.set_flags != v2.set_flags) { + return true; + } + if (v1.is_set(ChangeableValues::name_set) && v1.name != v2.name) { + return true; + } + if (v1.is_set(ChangeableValues::dflt_set) && !float_eq(v1.dflt, v2.dflt)) { + return true; + } + if (v1.is_set(ChangeableValues::low_set) && !float_eq(v1.low, v2.low)) { + return true; + } + if (v1.is_set(ChangeableValues::up_set) && !float_eq(v1.up, v2.up)) { + return true; + } + if (v1.is_set(ChangeableValues::tp_set) && v1.tp != v2.tp) { + return true; + } + if (v1.is_set(ChangeableValues::newrow_set) && v1.newrow != v2.newrow) { + return true; + } + if (v1.enumdict.size() != v2.enumdict.size()) { + return true; + } + for (std::map::const_iterator i = v1.enumdict.begin(); i != v1.enumdict.end(); ++i) { + std::map::const_iterator j = v2.enumdict.find(i->first); + if (j == v2.enumdict.end() || j->second != i->second) { + return true; + } + } + return false; +} + +int ChangeableValues::get_excl_flags(DisplayType t) const { + switch (t) { + case tp_toggle: return low_set|up_set; + case tp_display: return dflt_set; + case tp_display_toggle: return dflt_set|low_set|up_set; + case tp_none: return dflt_set|low_set|up_set; + default: return 0; + } +} + +bool ChangeableValues::has_settings(DisplayType t) const { + if ((set_flags & ~get_excl_flags(t)) || enumdict.size()) { + return true; + } + return false; +} + +PortDesc::PortDesc(int idx_, int pos_, bool is_output_, ustring name, const LADSPA_PortRangeHint& hint) + : idx(idx_), pos(pos_), is_output(is_output_), hint_desc(hint.HintDescriptor), + fake_low(false), fake_up(false), fake_dflt(false), + step(stp_normal), use_sr(false), has_sr(LADSPA_IS_HINT_SAMPLE_RATE(hint_desc)), + has_caption(true), factory(), user() { + factory.set_name(name); + set_range_default(hint, factory); + set_default_value(hint, factory); + set_tp_default(hint, factory); +} + +void PortDesc::set_default_value(const LADSPA_PortRangeHint& h, ChangeableValues& store) { + if (!LADSPA_IS_HINT_HAS_DEFAULT(h.HintDescriptor)) { + store.unset(ChangeableValues::dflt_set); + } else if (LADSPA_IS_HINT_DEFAULT_0(h.HintDescriptor)) { + store.set_dflt(0); + } else if (LADSPA_IS_HINT_DEFAULT_1(h.HintDescriptor)) { + store.set_dflt(1); + } else if (LADSPA_IS_HINT_DEFAULT_100(h.HintDescriptor)) { + store.set_dflt(100); + } else if (LADSPA_IS_HINT_DEFAULT_440(h.HintDescriptor)) { + store.set_dflt(440); + } else if (LADSPA_IS_HINT_DEFAULT_MINIMUM(h.HintDescriptor)) { + store.set_dflt(get_low()); + } else if (LADSPA_IS_HINT_DEFAULT_MAXIMUM(h.HintDescriptor)) { + store.set_dflt(get_up()); + } else { + float low = get_low(); + float up = get_up(); + if (!factory.is_set(ChangeableValues::low_set) || !factory.is_set(ChangeableValues::up_set)) { + store.unset(ChangeableValues::dflt_set); + } else if (LADSPA_IS_HINT_LOGARITHMIC(hint_desc)) { + if (low > 0) { + if (LADSPA_IS_HINT_DEFAULT_LOW(h.HintDescriptor)) { + store.set_dflt(exp(log(low)*0.75 + log(up)*0.25)); + } else if (LADSPA_IS_HINT_DEFAULT_MIDDLE(h.HintDescriptor)) { + store.set_dflt(exp(log(low)*0.5 + log(up)*0.5)); + } else if (LADSPA_IS_HINT_DEFAULT_HIGH(h.HintDescriptor)) { + store.set_dflt(exp(log(low)*0.25 + log(up)*0.75)); + } + } else { + store.unset(ChangeableValues::dflt_set); + } + } else { + if (LADSPA_IS_HINT_DEFAULT_LOW(h.HintDescriptor)) { + store.set_dflt(low * 0.75 + up * 0.25); + } else if (LADSPA_IS_HINT_DEFAULT_MIDDLE(h.HintDescriptor)) { + store.set_dflt(low * 0.5 + up * 0.5); + } else if (LADSPA_IS_HINT_DEFAULT_HIGH(h.HintDescriptor)) { + store.set_dflt(low * 0.25 + up * 0.75); + } + } + } +} + +void PortDesc::set_range_default(const LADSPA_PortRangeHint& h, ChangeableValues& store) { + if (LADSPA_IS_HINT_TOGGLED(h.HintDescriptor)) { + store.set_low(0); + store.set_up(1); + } else { + if (LADSPA_IS_HINT_BOUNDED_BELOW(h.HintDescriptor)) { + store.set_low(h.LowerBound); + } else { + store.unset(ChangeableValues::low_set); + } + if (LADSPA_IS_HINT_BOUNDED_ABOVE(h.HintDescriptor)) { + store.set_up(h.UpperBound); + } else { + store.unset(ChangeableValues::up_set); + } + } +} + +void PortDesc::reset() { + step = stp_normal; + use_sr = false; + has_sr = LADSPA_IS_HINT_SAMPLE_RATE(hint_desc); + has_caption = true; + user = ChangeableValues(); +} + +void PortDesc::set_low(float v) { + if (!fake_low && float_eq(v, factory.get_low())) { + user.unset(ChangeableValues::low_set); + } else { + user.set_low(v); + } +} + +void PortDesc::set_up(float v) { + if (!fake_up && float_eq(v, factory.get_up())) { + user.unset(ChangeableValues::up_set); + } else { + user.set_up(v); + } +} + +void PortDesc::set_dflt(float v) { + if (!fake_dflt && float_eq(v, factory.get_dflt())) { + user.unset(ChangeableValues::dflt_set); + } else { + user.set_dflt(v); + } +} + +void PortDesc::set_tp(DisplayType v) { + if (v == factory.get_tp()) { + user.unset(ChangeableValues::tp_set); + } else { + user.set_tp(v); + } +} + +void PortDesc::set_newrow(bool v) { + if (v == factory.get_newrow()) { + user.unset(ChangeableValues::newrow_set); + } else { + user.set_newrow(v); + } +} + +ustring PortDesc::get_enum(int idx) { + std::map::iterator i; + i = user.find_enum(idx); + if (i != user.enum_end()) { + return i->second; + } + i = factory.find_enum(idx); + if (i != factory.enum_end()) { + return i->second; + } + return ""; +} + +bool PortDesc::check_changed(const PortDesc& vp) const { + if (pos != vp.pos) { + return true; + } + if (fake_low != vp.fake_low) { + return true; + } + if (fake_up != vp.fake_up) { + return true; + } + if (fake_dflt != vp.fake_dflt) { + return true; + } + if (step != vp.step) { + return true; + } + if (use_sr != vp.use_sr) { + return true; + } + if (has_sr != vp.has_sr) { + return true; + } + if (has_caption != vp.has_caption) { + return true; + } + if (factory != vp.factory) { + return true; + } + if (user != vp.user) { + return true; + } + return false; +} + +bool PortDesc::has_settings() { + return !has_caption || step != stp_normal || use_sr || user.has_settings(get_tp()); +} + +void PortDesc::fixup(bool newrow) { + ChangeableValues& f = factory; + f.set_newrow(newrow); + if (LADSPA_IS_HINT_LOGARITHMIC(hint_desc)) { + if (!f.is_set(ChangeableValues::low_set) && !f.is_set(ChangeableValues::up_set)) { + if (!f.is_set(ChangeableValues::dflt_set)) { + f.set_up(1.0); + f.set_low(1.0/1000.0); + f.set_dflt(sqrt(f.get_low()*f.get_up())); + fake_dflt = true; + } else if (f.get_dflt() <= 0) { + f.set_dflt(1.0); + fake_dflt = true; + f.set_low(f.get_dflt()/100.0); + f.set_up(f.get_dflt()*100.0); + } else { + f.set_low(f.get_dflt()/100.0); + f.set_up(f.get_dflt()*100.0); + } + fake_low = fake_up = true; + } else if (!f.is_set(ChangeableValues::low_set)) { + if (!f.is_set(ChangeableValues::dflt_set)) { + f.set_low(f.get_up()/1000.0); + f.set_dflt(f.get_low()); + fake_dflt = true; + } else { + if (f.get_dflt() >= f.get_up()) { + f.set_dflt(f.get_up()); + f.set_low(f.get_up() / 1000.0); + } else { + f.set_low(f.get_dflt()); + } + } + fake_low = true; + } else if (!f.is_set(ChangeableValues::up_set)) { + if (f.get_low() == 0) { + f.set_low(1e-1); + fake_low = true; + } + if (!f.is_set(ChangeableValues::dflt_set)) { + f.set_up(f.get_low() * 1000.0); + f.set_dflt(f.get_low()); + fake_dflt = true; + } else { + if (f.get_dflt() <= f.get_low()) { + f.set_dflt(f.get_low()); + f.set_up(f.get_low() * 1000.0); + } else { + f.set_up(f.get_dflt()); + } + } + fake_up = true; + } else if (f.get_low() <= 0) { + f.set_low(1e-7); + fake_low = true; + } + } else { + if (!f.is_set(ChangeableValues::low_set) && !f.is_set(ChangeableValues::up_set)) { + if (!f.is_set(ChangeableValues::dflt_set)) { + f.set_low(-1000); + f.set_up(1000); + f.set_dflt(0); + fake_dflt = true; + } else { + f.set_low(f.get_dflt() - 100); + f.set_up(f.get_dflt() + 100); + } + fake_low = fake_up = true; + } else if (!f.is_set(ChangeableValues::low_set)) { + if (!f.is_set(ChangeableValues::dflt_set)) { + f.set_low(f.get_up() - 1000); + f.set_dflt(f.get_low()); + fake_dflt = true; + } else { + if (f.get_dflt() >= f.get_up()) { + f.set_dflt(f.get_up()); + f.set_low(f.get_up() - 1000); + } else { + f.set_low(f.get_dflt()); + } + } + fake_low = true; + } else if (!f.is_set(ChangeableValues::up_set)) { + if (!f.is_set(ChangeableValues::dflt_set)) { + f.set_up(f.get_low() + 1000); + f.set_dflt(f.get_low()); + fake_dflt = true; + } else { + if (f.get_dflt() <= f.get_low()) { + f.set_dflt(f.get_low()); + f.set_up(f.get_low() + 1000); + } else { + f.set_up(f.get_dflt()); + } + } + fake_up = true; + } + } + if (!f.is_set(ChangeableValues::dflt_set)) { + fake_dflt = true; + f.set_dflt(f.get_low()); + } + if (f.get_tp() == tp_enum) { + for (int k = int(f.get_low()); k < int(f.get_up()+1); k++) { + if (!f.has_enumkey(k)) { + f.set_enumvalue(k, gx_system::to_string(k)); + } + } + } +} + +float PortDesc::calc_step() { + if (get_tp() == tp_toggle || get_tp() == tp_enum || get_tp() == tp_int) { + return 1.0; + } + float up = get_up(); + float low = get_low(); + if (get_tp() == tp_scale_log) { + if (step == stp_coarse) { + return pow(up/low, 1.0/50); + } + if (step == stp_normal) { + return pow(up/low, 1.0/100); + } + if (step == stp_fine) { + return pow(up/low, 1.0/500); + } + assert(false); + return 1.0; + } else { + float s = 1.0; + if (step == stp_coarse) { + s = (up - low) / 30.0; + } + if (step == stp_normal) { + s = (up - low) / 300.0; + } + if (step == stp_fine) { + s = (up - low) / 3000.0; + } + if (has_sr && !use_sr) { + s *= SR; + } + return pow(10.0, round(log10(s))); + } +} + +void PortDesc::set_tp_default(const LADSPA_PortRangeHint& h, ChangeableValues& store) { + if (is_output) { + if (LADSPA_IS_HINT_TOGGLED(h.HintDescriptor)) { + store.set_tp(tp_display_toggle); + } else if (get_name() == "latency") { + store.set_tp(tp_none); + } else { + store.set_tp(tp_display); + } + } else if (LADSPA_IS_HINT_TOGGLED(h.HintDescriptor)) { + store.set_tp(tp_toggle); + } else if (LADSPA_IS_HINT_LOGARITHMIC(hint_desc)) { + store.set_tp(tp_scale_log); + } else if (LADSPA_IS_HINT_INTEGER(h.HintDescriptor)) { + store.set_tp(tp_int); + } else { + store.set_tp(tp_scale); + } +} + +void PortDesc::set_default(float value, ustring label) { + if (!factory.is_set(ChangeableValues::dflt_set)) { + factory.set_dflt(value); + } +} + +void PortDesc::output(JsonWriter& jw) { + float dflt = get_dflt(); + float low = get_low(); + float up = get_up(); + if (has_sr && !use_sr) { + if (factory.is_set(ChangeableValues::dflt_set)) { + dflt *= SR; + } + if (factory.is_set(ChangeableValues::low_set)) { + low *= SR; + } + if (factory.is_set(ChangeableValues::up_set)) { + up *= SR; + } + } + jw.begin_array(); + jw.write(idx); + jw.begin_array(); jw.write(step); jw.end_array(); + if (user.is_set(ChangeableValues::name_set)) { + jw.write(user.get_name()); + } else { + jw.write(""); + } + jw.write(use_sr); + jw.write(dflt); + jw.write(low); + jw.write(up); + jw.write(calc_step()); + jw.write(get_tp()); + jw.write(get_newrow()); + jw.write(has_caption); + jw.begin_array(); + if (get_tp() == tp_enum) { + int iup = int(round(up)); + for (int i = int(round(low)); i < iup+1; ++i) { + jw.write(get_enum(i)); + } + } + jw.end_array(); + jw.end_array(true); +} + +void PortDesc::set_state(JsonParser& jp, int version) { + jp.next(JsonParser::begin_array); + jp.next(JsonParser::value_number); + step = static_cast(jp.current_value_int()); + jp.next(JsonParser::end_array); + jp.next(JsonParser::value_string); + if (!jp.current_value().empty()) { + user.set_name(jp.current_value()); + } + jp.next(JsonParser::value_number); + use_sr = jp.current_value_int(); + jp.next(JsonParser::value_number); + float dflt = jp.current_value_float(); + jp.next(JsonParser::value_number); + float low = jp.current_value_float(); + jp.next(JsonParser::value_number); + float up = jp.current_value_float(); + jp.next(JsonParser::value_number); + jp.current_value_float(); // step value, ignored + jp.next(JsonParser::value_number); + DisplayType tp = DisplayType(jp.current_value_int()); + if (tp != factory.get_tp()) { + user.set_tp(tp); + } + if (has_sr && !use_sr) { + dflt /= SR; + low /= SR; + up /= SR; + } + if (!float_eq(dflt, factory.get_dflt())) { + user.set_dflt(dflt); + } + if (!float_eq(low, factory.get_low())) { + user.set_low(low); + } + if (!float_eq(up, factory.get_up())) { + user.set_up(up); + } + jp.next(JsonParser::value_number); + bool b = bool(jp.current_value_int()); + if (b != factory.get_newrow()) { + user.set_newrow(b); + } + jp.next(JsonParser::value_number); + b = bool(jp.current_value_int()); + has_caption = b; + jp.next(JsonParser::begin_array); + int s = int(low); + while (jp.peek() != JsonParser::end_array) { + jp.next(JsonParser::value_string); + std::map::iterator it = factory.find_enum(s); + if (it != factory.enum_end() && jp.current_value() != it->second) { + user.set_enumvalue(s, jp.current_value()); + } + s += 1; + } + jp.next(JsonParser::end_array); +} + +PluginDesc::PluginDesc(const LADSPA_Descriptor& desc, int tp_, std::vector& ctrl_ports_, const std::string path_, int index_) + : UniqueID(desc.UniqueID), Label(desc.Label), Name(desc.Name), shortname(desc.Name), Maker(desc.Maker), + MasterIdx(-1), MasterLabel(), tp(tp_), ctrl_ports(ctrl_ports_), path(path_), index(index_), + category(unknown_category), deduced_category(unknown_category), quirks(), quirks_default(), + ladspa_category(), active(false), active_set(false), has_settings(false), add_wet_dry(0), old(0) { + quirks = quirks_default = quirks_get(); +} + +PluginDesc::~PluginDesc() { + delete old; + for (std::vector::iterator i = ctrl_ports.begin(); i != ctrl_ports.end(); ++i) { + delete *i; + } +} + +int PluginDesc::quirks_get() { + int flag = 0; + for (int i = 0; quirk_list[i].flag; i++) { + for (int j = 0; quirk_list[i].ids[j]; j++) { + if (UniqueID == quirk_list[i].ids[j]) { + flag |= quirk_list[i].flag; + } + } + } + return flag; +} + +bool cmp_ctrl_ports(const PortDesc *a, const PortDesc *b) { + return a->pos < b->pos; +} + +void PluginDesc::reset() { + shortname = Name; + MasterIdx = -1; + MasterLabel = ""; + add_wet_dry = 0; + category = deduced_category; + quirks = quirks_default; + has_settings = false; + std::sort(ctrl_ports.begin(), ctrl_ports.end(), cmp_ctrl_ports); + for (std::vector::iterator p = ctrl_ports.begin(); p != ctrl_ports.end(); ++p) { + (*p)->reset(); + } +} + +void PluginDesc::copy_ports(PluginDesc *p) { + assert(ctrl_ports.size() == 0); + for (std::vector::iterator i = p->ctrl_ports.begin(); i != p->ctrl_ports.end(); ++i) { + ctrl_ports.push_back(new PortDesc(**i)); + } +} + +static void ladspa_add_plugin(const LADSPA_Descriptor& desc, std::map& d, const std::string& path, int index) { + for (unsigned int j = 0; j < sizeof(blacklist)/sizeof(blacklist[0]); j++) { + if (desc.UniqueID == blacklist[j]) { + return; + } + } +#ifdef HARD_RT_ONLY + if (!LADSPA_IS_HARD_RT_CAPABLE(desc.Properties)) { + return; + } +#endif + int n_in = 0; + int n_out = 0; + std::vector ctrl_ports; + int pos = 0; + for (unsigned int n = 0; n < desc.PortCount; n++) { + LADSPA_PortDescriptor pd = desc.PortDescriptors[n]; + if (LADSPA_IS_PORT_AUDIO(pd)) { + if (LADSPA_IS_PORT_INPUT(pd)) { + n_in += 1; + } else { + n_out += 1; + } + } else { + ctrl_ports.push_back(new PortDesc(n, pos, LADSPA_IS_PORT_OUTPUT(pd), desc.PortNames[n], desc.PortRangeHints[n])); + pos += 1; + } + } + int tp; + if (n_in == 1 && n_out == 1) { + tp = 0; + } else if (n_in == 2 && n_out == 2) { + tp = 1; + } else { + return; + } + d[desc.UniqueID] = new PluginDesc(desc, tp, ctrl_ports, path, index); +} + +static void load_ladspa_defs(const std::string& path, std::map& d) { + void *handle; + handle = dlopen(path.c_str(), RTLD_LOCAL|RTLD_NOW); + if (!handle) { + gx_system::gx_print_warning( + "ladspalist", + ustring::compose(_("Cannot open plugin: %1\n"), dlerror())); + return; + } + LADSPA_Descriptor_Function ladspa_descriptor = (LADSPA_Descriptor_Function)dlsym(handle, "ladspa_descriptor"); + const char *dlsym_error = dlerror(); + if (dlsym_error) { + gx_system::gx_print_warning("ladspalist", dlsym_error); + dlclose(handle); + handle = 0; + return; + } + int i = 0; + while (true) { + const LADSPA_Descriptor *desc = ladspa_descriptor(i); + if (!desc) { + break; + } + ladspa_add_plugin(*desc, d, path, i); + i += 1; + } + dlclose(handle); +} + +bool PluginDesc::check_changed() { + if (!old) { + return false; + } + if (UniqueID != old->UniqueID) { + return true; + } + if (Label != old->Label) { + return true; + } + if (Name != old->Name) { + return true; + } + if (shortname != old->shortname) { + return true; + } + if (Maker != old->Maker) { + return true; + } + if (MasterIdx != old->MasterIdx) { + return true; + } + if (MasterIdx > -1 && MasterLabel != old->MasterLabel) { + return true; + } + if (add_wet_dry != old->add_wet_dry) { + return true; + } + if (tp != old->tp) { + return true; + } + if (path != old->path) { + return true; + } + if (index != old->index) { + return true; + } + if (category != old->category) { + return true; + } + if (deduced_category != old->deduced_category) { + return true; + } + if (quirks != old->quirks) { + return true; + } + if (quirks_default != old->quirks_default) { + return true; + } + if (ladspa_category != old->ladspa_category) { + return true; + } + for (unsigned int i = 0; i < ctrl_ports.size(); ++i) { + if (ctrl_ports[i]->check_changed(*old->ctrl_ports[i])) { + return true; + } + } + return false; +} + +bool PluginDesc::_i_check_has_settings() { + if (shortname != Name) { + return true; + } + if (category != deduced_category) { + return true; + } + if (quirks != quirks_default) { + return true; + } + if (MasterIdx != -1) { + return true; + } + for (int i = 0; i < static_cast(ctrl_ports.size()); ++i) { + if (i != ctrl_ports[i]->get_pos()) { + return true; + } + if (ctrl_ports[i]->has_settings()) { + return true; + } + } + return false; +} + +void PluginDesc::check_has_settings() { + has_settings = _i_check_has_settings(); +} + +int PluginDesc::set_active(bool v) { + if (v == active) { + return 0; + } + active = v; + if (v == active_set) { + return -1; + } + return 1; +} + +void PluginDesc::set_add_wet_dry_controller(bool v) { + if (v) { + add_wet_dry = 1; + } else { + add_wet_dry = 0; + } +} + +void PluginDesc::fixup() { + int i = 0; + for (unsigned int n = 0; n < ctrl_ports.size(); ++n) { + bool newrow = false; + if (ctrl_ports[n]->get_tp() != tp_none) { + newrow = (i % 4 == 0 && i != 0); + i += 1; + } + ctrl_ports[n]->fixup(newrow); + } +} + +void PluginDesc::set_category(const std::vector& s) { + bool found = false; + ustring t = ""; + for (std::vector::const_iterator i = s.begin(); i != s.end(); ++i) { + if (!t.empty()) { + t += "/"; + } + t += *i; + if (!found) { + for (const char *(*p)[2] = cat_subst; (*p)[0]; ++p) { + if (*i == (*p)[0]) { + category = deduced_category = (*p)[1]; + found = true; + break; + } + } + } + } + ladspa_category = t; +} + +void PluginDesc::set_default(int idx, float value, const ustring& label) { + for (std::vector::iterator p = ctrl_ports.begin(); p != ctrl_ports.end(); ++p) { + if ((*p)->idx == idx) { + (*p)->set_default(value, label); + return; + } + } +} + +void PluginDesc::output(JsonWriter& jw) { + ustring s = shortname; + if (s == Name) { + s = ""; + } + int idx = -1; + ustring sm = ""; + if (MasterIdx >= 0) { + for (std::vector::iterator p = ctrl_ports.begin(); p != ctrl_ports.end(); ++p) { + ++idx; + if ((*p)->pos == MasterIdx) { + sm = MasterLabel; + if (sm == (*p)->get_name()) { + sm = ""; + } + break; + } + } + } + jw.begin_array(); + jw.write(3); // version + jw.write(s); + jw.write(category); + jw.write(idx); + jw.write(sm); + jw.write(quirks); + jw.write(add_wet_dry); + jw.begin_array(true); + for (std::vector::iterator p = ctrl_ports.begin(); p != ctrl_ports.end(); ++p) { + (*p)->output(jw); + } + jw.end_array(true); + jw.end_array(true); +} + +void PluginDesc::output_entry(JsonWriter& jw) { + jw.begin_array(); + jw.write(path); + jw.write(index); + jw.write(uint(UniqueID)); + jw.write(Label); + jw.end_array(true); +} + +void PluginDesc::set_state(const ustring& fname) { + ifstream is(fname.c_str()); + if (is.fail()) { + gx_system::gx_print_error("ladspalist", ustring::compose(_("can't open %1"), fname)); + return; + } + try { + JsonParser jp(&is); + jp.next(JsonParser::begin_array); + jp.next(JsonParser::value_number); + int version = jp.current_value_int(); + jp.next(JsonParser::value_string); + shortname = jp.current_value(); + if (shortname.empty()) { + shortname = Name; + } + jp.next(JsonParser::value_string); + category = jp.current_value(); + jp.next(JsonParser::value_number); + MasterIdx = jp.current_value_int(); + jp.next(JsonParser::value_string); + MasterLabel = jp.current_value(); + jp.next(JsonParser::value_number); + quirks = jp.current_value_int(); + jp.next(JsonParser::value_number); + add_wet_dry = jp.current_value_int(); + std::vector ports; + jp.next(JsonParser::begin_array); + int n = 0; + int m_idx = MasterIdx; + while (jp.peek() != JsonParser::end_array) { + jp.next(JsonParser::begin_array); + jp.next(JsonParser::value_number); + int idx = jp.current_value_int(); + for (std::vector::iterator p = ctrl_ports.begin(); p != ctrl_ports.end(); ++p) { + if ((*p)->idx == idx) { + if (m_idx == n) { + MasterIdx = (*p)->pos; + } + (*p)->set_state(jp, version); + ports.push_back((*p)); + break; + } + } + n++; + jp.next(JsonParser::end_array); + } + jp.next(JsonParser::end_array); + assert(ctrl_ports.size() == ports.size()); + ctrl_ports = ports; + jp.next(JsonParser::end_array); + jp.next(JsonParser::end_token); + jp.close(); + } catch(JsonException& e) { + gx_system::gx_print_error( + "ladspalist", + ustring::compose(_("error parsing LADSPA plugin config file %1: %2"), fname, e.what())); + return; + } + is.close(); + check_has_settings(); +} + + +/**************************************************************** + ** class PluginDisplay + */ + +static const char *menudef = "\ +\n\ + \n\ + \n\ + \n\ + \n\ + \n\ + \n\ + \n\ + \n\ + \n\ + \n\ + \n\ + \n\ +\n\ +"; + +static void append_displaytype(Glib::RefPtr ls, DisplayType tp) { + Gtk::TreeIter it = ls->append(); + it->set_value(0, ustring(display_type_names[tp])); + it->set_value(1, tp); +} + +class CellRendererComboDerived : public Gtk::CellRendererCombo { +public: + CellRendererComboDerived() : Glib::ObjectBase (0), Gtk::CellRendererCombo() { } + CellRendererComboDerived(BaseObjectType* castitem) : Glib::ObjectBase (0), Gtk::CellRendererCombo((GtkCellRendererCombo*)(castitem)) { } + virtual ~CellRendererComboDerived() { } + static CellRendererComboDerived* create_from_builder(BaseObjectType* cobject) { + return new CellRendererComboDerived(cobject); + } +}; + +PluginDisplay::PluginDisplay(const gx_system::CmdlineOptions& options_, Glib::RefPtr icon, sigc::slot finished_callback_) + : options(options_), pluginlist(), current_plugin(0), old_state(0), bld(), change_count(0), + actiongroup(Gtk::ActionGroup::create("ladspa_window")), uimanager(), + enum_liststore(new EnumListStore), port_liststore(new PortListStore), + plugin_liststore(new PluginListStore), masteridx_liststore(new MasterIdxListStore), + on_reordered_conn(), display_type_list(), display_type_list_sr(), output_type_list(), + finished_callback(finished_callback_) +{ + std::vector old_not_found; + load_ladspalist(old_not_found, pluginlist); + bld = gx_gui::GxBuilder::create_from_file(options.get_builder_filepath("ladspaliste.glade")); + bld->get_toplevel("window1", window); + bld->find_widget("treeview1", treeview1); + bld->find_widget("treeview2", treeview2); + bld->find_widget("treeview3", treeview3); + bld->find_widget("ladspa_category", ladspa_category); + bld->find_widget("ladspa_maker", ladspa_maker); + bld->find_widget("ladspa_uniqueid", ladspa_uniqueid); + bld->find_widget("search_entry", search_entry); + bld->find_widget("combobox_mono_stereo", combobox_mono_stereo); + bld->find_widget("selected_only", selected_only); + bld->find_widget("changed_only", changed_only); + bld->find_widget("show_all", show_all); + bld->find_widget("details_box", details_box); + bld->find_widget("plugin_name", plugin_name); + bld->find_widget("plugin_category", plugin_category); + bld->find_widget("plugin_quirks", plugin_quirks); + bld->find_widget("master_slider_idx", master_slider_idx); + bld->find_widget("master_slider_name", master_slider_name); + bld->find_widget("cellrenderer_master", cellrenderer_master); + bld->find_widget("cellrenderer_newrow", cellrenderer_newrow); + bld->find_widget("cellrenderer_caption", cellrenderer_caption); + bld->find_widget("cellrenderer_active", cellrenderer_active); + bld->find_widget("cellrenderer_category", cellrenderer_category); + bld->find_widget("cellrenderer_quirks", cellrenderer_quirks); + + set_title(); + actiongroup->add(Gtk::Action::create("FileMenuAction",_("_File"))); + save_action = Gtk::Action::create("SaveAction", _("_Ok")); + actiongroup->add(save_action, sigc::mem_fun(this, &PluginDisplay::on_save)); + apply_action = Gtk::Action::create("ApplyAction", _("_Apply")); + actiongroup->add(apply_action, sigc::mem_fun(this, &PluginDisplay::on_apply)); + quit_action = Gtk::Action::create("QuitAction", _("_Quit")); + actiongroup->add(quit_action, sigc::mem_fun(this, &PluginDisplay::on_quit)); + select_all_action = Gtk::Action::create("SelectAllAction", _("_Select All")); + actiongroup->add(select_all_action, sigc::bind(sigc::mem_fun(this, &PluginDisplay::on_select_all), true)); + select_none_action = Gtk::Action::create("SelectNoneAction", _("Select _None")); + actiongroup->add(select_none_action, sigc::bind(sigc::mem_fun(this, &PluginDisplay::on_select_all), false)); + actiongroup->add(Gtk::Action::create("ViewMenuAction", _("_View"))); + Glib::RefPtr act = Gtk::Action::create("FindAction", _("_Find")); + actiongroup->add(act, sigc::mem_fun(this, &PluginDisplay::on_find)); + + uimanager = Gtk::UIManager::create(); + uimanager->insert_action_group(actiongroup, 0); + uimanager->add_ui_from_string(menudef); + //uimanager->get_widget("/ladspalist"); + //Gtk::HBox *ww; bld->find_widget("menubox", ww); ww->pack_start(*uimanager->get_widget("/ladspalist")); + window->add_accel_group(uimanager->get_accel_group()); + + window->signal_delete_event().connect(sigc::mem_fun(this, &PluginDisplay::on_delete_event)); + bld->find_widget("show_details", show_details); + show_details->signal_clicked().connect(sigc::mem_fun(this, &PluginDisplay::on_show_details)); + treeview3->get_selection()->set_mode(Gtk::SELECTION_BROWSE); + treeview3->set_model(enum_liststore); + Gtk::CellRendererText *r; + bld->find_widget("cellrenderer_label", r); + r->signal_edited().connect(sigc::mem_fun(this, &PluginDisplay::on_label_edited)); + Gtk::TreeViewColumn *c; + bld->find_widget("treeviewcolumn_label", c); + c->set_cell_data_func(*r, sigc::mem_fun(this, &PluginDisplay::display_label)); + + bld->find_widget("dry_wet_button", dry_wet_button); + dry_wet_button->signal_clicked().connect(sigc::mem_fun(this, &PluginDisplay::on_add_dry_wet_controller)); + // dry_wet_button->set_active(current_plugin->add_wet_dry); + + Glib::RefPtr sel = treeview2->get_selection(); + sel->set_mode(Gtk::SELECTION_BROWSE); + sel->signal_changed().connect(sigc::mem_fun(this, &PluginDisplay::on_parameter_selection_changed)); + on_reordered_conn = port_liststore->signal_row_deleted().connect(sigc::mem_fun(this, &PluginDisplay::on_reordered)); + treeview2->set_model(port_liststore); + + CellRendererComboDerived *rd; + bld->find_widget_derived("cellrenderer_type", rd, sigc::ptr_fun(CellRendererComboDerived::create_from_builder)); + rd->signal_edited().connect(sigc::mem_fun(this, &PluginDisplay::on_type_edited)); + bld->find_widget("treeviewcolumn_type", c); + c->set_cell_data_func(*rd, sigc::mem_fun(this, &PluginDisplay::display_type)); + + bld->find_widget_derived("cellrenderer_step", rd, sigc::ptr_fun(CellRendererComboDerived::create_from_builder)); + rd->signal_edited().connect(sigc::mem_fun(this, &PluginDisplay::on_step_edited)); + bld->find_widget("treeviewcolumn_step", c); + c->set_cell_data_func(*rd, sigc::mem_fun(this, &PluginDisplay::display_step)); + + cellrenderer_newrow->signal_toggled().connect(sigc::mem_fun(this, &PluginDisplay::on_newrow_toggled)); + Gtk::Label *label = new Gtk::Label("N"); + label->set_tooltip_text(_("start a new row of controls in the rackbox unit")); + label->show(); + bld->find_widget("treeviewcolumn_newrow", c); + c->set_widget(*manage(label)); + c->set_cell_data_func(*cellrenderer_newrow, sigc::mem_fun(this, &PluginDisplay::display_newrow)); + cellrenderer_caption->signal_toggled().connect(sigc::mem_fun(this, &PluginDisplay::on_caption_toggled)); + label = new Gtk::Label("C"); + label->set_tooltip_text(_("display the name as caption above the control")); + label->show(); + bld->find_widget("treeviewcolumn_caption", c); + c->set_widget(*manage(label)); + c->set_cell_data_func(*cellrenderer_caption, sigc::mem_fun(this, &PluginDisplay::display_caption)); + + bld->find_widget("cellrenderer_name", r); + r->signal_edited().connect(sigc::mem_fun(this, &PluginDisplay::on_name_edited)); + bld->find_widget("treeviewcolumn_name", c); + c->set_cell_data_func(*r, sigc::mem_fun(this, &PluginDisplay::display_name)); + bld->find_widget("cellrenderer_dflt", r); + r->signal_edited().connect(sigc::mem_fun(this, &PluginDisplay::on_dflt_edited)); + bld->find_widget("treeviewcolumn_dflt", c); + c->set_cell_data_func(*r, sigc::mem_fun(this, &PluginDisplay::display_default)); + bld->find_widget("cellrenderer_low", r); + r->signal_edited().connect(sigc::mem_fun(this, &PluginDisplay::on_low_edited)); + bld->find_widget("treeviewcolumn_low", c); + c->set_cell_data_func(*r, sigc::mem_fun(this, &PluginDisplay::display_lower)); + bld->find_widget("cellrenderer_up", r); + r->signal_edited().connect(sigc::mem_fun(this, &PluginDisplay::on_up_edited)); + bld->find_widget("treeviewcolumn_up", c); + c->set_cell_data_func(*r, sigc::mem_fun(this, &PluginDisplay::display_upper)); + bld->find_widget("cellrenderer_idx", r); + bld->find_widget("treeviewcolumn_idx", c); + c->set_cell_data_func(*r, sigc::mem_fun(this, &PluginDisplay::display_idx)); + + bld->find_widget("treeviewcolumn_SR", c); + label = new Gtk::Label("SR"); + label->set_tooltip_text(_("marked rows: range depends on samplerate; using 44100 as fixed value")); + label->show(); + c->set_widget(*manage(label)); + Gtk::CellRendererToggle *t; + bld->find_widget("cellrenderer_SR", t); + c->set_cell_data_func(*t, sigc::mem_fun(this, &PluginDisplay::display_SR)); + + Gtk::TreeModelColumnRecord recdef; + Gtk::TreeModelColumn strcol; + Gtk::TreeModelColumn intcol; + recdef.add(strcol); + recdef.add(intcol); + display_type_list = Gtk::ListStore::create(recdef); + append_displaytype(display_type_list, tp_scale); + append_displaytype(display_type_list, tp_scale_log); + append_displaytype(display_type_list, tp_toggle); + append_displaytype(display_type_list, tp_int); + append_displaytype(display_type_list, tp_enum); + append_displaytype(display_type_list, tp_none); + display_type_list_sr = Gtk::ListStore::create(recdef); + append_displaytype(display_type_list_sr, tp_scale); + append_displaytype(display_type_list_sr, tp_scale_log); + append_displaytype(display_type_list_sr, tp_none); + output_type_list = Gtk::ListStore::create(recdef); + append_displaytype(output_type_list, tp_display); + append_displaytype(output_type_list, tp_display_toggle); + append_displaytype(output_type_list, tp_none); + + treeview1->signal_row_activated().connect(sigc::mem_fun(this, &PluginDisplay::on_row_activated)); + treeview1->set_search_equal_func(sigc::mem_fun(this,&PluginDisplay::search_equal)); + Gtk::Entry *e; + bld->find_widget("search_entry", e); + e->signal_activate().connect(sigc::mem_fun(this, &PluginDisplay::on_search_entry_activate)); + treeview1->set_search_entry(*e); + sel = treeview1->get_selection(); + sel->set_mode(Gtk::SELECTION_BROWSE); + sel->signal_changed().connect(sigc::mem_fun(this, &PluginDisplay::selection_changed)); + treeview1->set_model(plugin_liststore); + cellrenderer_active->signal_toggled().connect(sigc::mem_fun(this, &PluginDisplay::on_active_toggled)); + bld->find_widget("cellrenderer_ladspa", r); + bld->find_widget("treeviewcolumn_ladspa", c); + c->set_cell_data_func(*r, sigc::mem_fun(this, &PluginDisplay::display_ladspa)); + + Gtk::ComboBox *cb; + bld->find_widget("plugin_category", cb); + cb->set_cell_data_func(*cellrenderer_category, sigc::mem_fun(this, &PluginDisplay::display_category)); + bld->find_widget("plugin_quirks", cb); + cb->set_cell_data_func(*cellrenderer_quirks, sigc::mem_fun(this, &PluginDisplay::display_quirks)); + + master_slider_idx->set_cell_data_func(*cellrenderer_master, sigc::mem_fun(this, &PluginDisplay::display_master_idx)); + master_slider_idx->signal_changed().connect(sigc::mem_fun(this, &PluginDisplay::set_master_text)); + + selected_only->signal_toggled().connect(sigc::bind(sigc::mem_fun(this, &PluginDisplay::on_view_changed), selected_only)); + changed_only->signal_toggled().connect(sigc::bind(sigc::mem_fun(this, &PluginDisplay::on_view_changed), changed_only)); + show_all->signal_toggled().connect(sigc::bind(sigc::mem_fun(this, &PluginDisplay::on_view_changed), show_all)); + + bld->find_widget("combobox_mono_stereo", cb); + cb->signal_changed().connect(sigc::mem_fun(this, &PluginDisplay::on_mono_stereo_changed)); + cb->set_active(0); + Gtk::Button *b; + bld->find_widget("reset_changes", b); + b->signal_clicked().connect(sigc::mem_fun(this, &PluginDisplay::on_delete_changes)); + + bld->find_widget("master_slider_idx", cb); + cb->set_model(masteridx_liststore); + + bld->find_widget("button_cancel", b); + gtk_activatable_set_related_action(GTK_ACTIVATABLE(b->gobj()), actiongroup->get_action("QuitAction")->gobj()); + bld->find_widget("button_apply", b); + gtk_activatable_set_related_action(GTK_ACTIVATABLE(b->gobj()), actiongroup->get_action("ApplyAction")->gobj()); + bld->find_widget("button_save", b); + gtk_activatable_set_related_action(GTK_ACTIVATABLE(b->gobj()), actiongroup->get_action("SaveAction")->gobj()); + bld->find_widget("select_all", b); + gtk_activatable_set_related_action(GTK_ACTIVATABLE(b->gobj()), actiongroup->get_action("SelectAllAction")->gobj()); + bld->find_widget("select_none", b); + gtk_activatable_set_related_action(GTK_ACTIVATABLE(b->gobj()), actiongroup->get_action("SelectNoneAction")->gobj()); + + window->set_icon(icon); + window->show(); +} + +PluginDisplay::~PluginDisplay() { + delete window; + for (std::vector::iterator i = pluginlist.begin(); i != pluginlist.end(); ++i) { + delete *i; + } +} + +static void split(std::vector& strvec, const ustring& str) { + size_t start = 0, np = ustring::npos; + while (true) { + size_t end = str.find_first_of(' ', start); + size_t len = (end == np) ? np : end - start; + if (len > 0) { + strvec.push_back(str.substr(start, len)); + } + if (end == np) { + return; + } + start = end + 1; + } +} + +bool PluginDisplay::search_equal(const Glib::RefPtr& model, int column, const ustring& key, const Gtk::TreeIter& iter) { + PluginDesc *p = iter->get_value(plugin_liststore->col.pdesc); + ustring txt(gx_system::to_string(p->UniqueID)); + if (txt.compare(0, ustring::npos, key, 0, key.size()) == 0) { + return false; + } + txt = iter->get_value(plugin_liststore->col.name).lowercase(); + std::vector keyvec; + split(keyvec, key); + for (std::vector::iterator i = keyvec.begin(); i != keyvec.end(); ++i) { + if (txt.find(*i) == ustring::npos) { + return true; + } + } + return false; +} + +void PluginDisplay::display_step(Gtk::CellRenderer *cell, const Gtk::TreeIter& it) { + PortDesc *q = it->get_value(port_liststore->col.port); + DisplayType tp = q->get_tp(); + cell->property_visible().set_value(tp == tp_scale || tp == tp_scale_log); + if (q->step != stp_normal) { + dynamic_cast(cell)->property_foreground().set_value("red"); + } else { + dynamic_cast(cell)->property_foreground_set().set_value(false); + } +} + +void PluginDisplay::display_ladspa(Gtk::CellRenderer *cell, const Gtk::TreeIter& iter) { + PluginDesc *p = iter->get_value(plugin_liststore->col.pdesc); + if (p->has_settings) { + dynamic_cast(cell)->property_foreground().set_value("red"); + } else { + dynamic_cast(cell)->property_foreground_set().set_value(false); + } +} + +void PluginDisplay::display_label(Gtk::CellRenderer *cell, const Gtk::TreeIter& it) { + PortDesc *q = it->get_value(enum_liststore->col.port); + if (q->enumkey_changed(int(it->get_value(enum_liststore->col.value)))) { + dynamic_cast(cell)->property_foreground().set_value("red"); + } else { + dynamic_cast(cell)->property_foreground_set().set_value(false); + } +} + +void PluginDisplay::display_idx(Gtk::CellRenderer *cell, const Gtk::TreeIter& it) { + PortDesc *q = it->get_value(port_liststore->col.port); + if (int(port_liststore->get_path(it)[0]) != q->get_pos()) { + dynamic_cast(cell)->property_foreground().set_value("red"); + } else { + dynamic_cast(cell)->property_foreground_set().set_value(false); + } +} + +void PluginDisplay::display_name(Gtk::CellRenderer *cell, const Gtk::TreeIter& it) { + PortDesc *q = it->get_value(port_liststore->col.port); + if (q->is_set(ChangeableValues::name_set)) { + dynamic_cast(cell)->property_foreground().set_value("red"); + } else { + dynamic_cast(cell)->property_foreground_set().set_value(false); + } +} + +void PluginDisplay::display_default(Gtk::CellRenderer *cell, const Gtk::TreeIter& it) { + PortDesc *q = it->get_value(port_liststore->col.port); + Gtk::CellRendererText *tcell = dynamic_cast(cell); + tcell->property_foreground_set().set_value(false); + tcell->property_background_set().set_value(false); + DisplayType tp = q->get_tp(); + if (tp == tp_display || tp == tp_display_toggle || tp == tp_none) { + cell->property_visible().set_value(false); + return; + } + cell->property_visible().set_value(true); + if (q->is_set(ChangeableValues::dflt_set)) { + tcell->property_foreground().set_value("red"); + } else if (q->fake_dflt) { + tcell->property_background().set_value("grey"); + } +} + +void PluginDisplay::display_lower(Gtk::CellRenderer *cell, const Gtk::TreeIter& it) { + PortDesc *q = it->get_value(port_liststore->col.port); + Gtk::CellRendererText *tcell = dynamic_cast(cell); + tcell->property_foreground_set().set_value(false); + tcell->property_background_set().set_value(false); + DisplayType tp = q->get_tp(); + if (tp == tp_toggle || tp == tp_display_toggle || tp == tp_none) { + cell->property_visible().set_value(false); + return; + } + cell->property_visible().set_value(true); + if (q->is_set(ChangeableValues::low_set)) { + tcell->property_foreground().set_value("red"); + } else if (q->fake_low) { + tcell->property_background().set_value("grey"); + } +} + +void PluginDisplay::display_upper(Gtk::CellRenderer *cell, const Gtk::TreeIter& it) { + PortDesc *q = it->get_value(port_liststore->col.port); + Gtk::CellRendererText *tcell = dynamic_cast(cell); + tcell->property_foreground_set().set_value(false); + tcell->property_background_set().set_value(false); + DisplayType tp = q->get_tp(); + if (tp == tp_toggle || tp == tp_display_toggle || tp == tp_none) { + cell->property_visible().set_value(false); + return; + } + cell->property_visible().set_value(true); + if (q->is_set(ChangeableValues::up_set)) { + tcell->property_foreground().set_value("red"); + } else if (q->fake_up) { + tcell->property_background().set_value("grey"); + } +} + +void PluginDisplay::display_SR(Gtk::CellRenderer *cell, const Gtk::TreeIter& it) { + cell->property_visible().set_value(it->get_value(port_liststore->col.port)->has_sr); +} + +void PluginDisplay::display_type(Gtk::CellRenderer *cell, const Gtk::TreeIter& it) { + PortDesc *q = it->get_value(port_liststore->col.port); + Gtk::CellRendererText *tcell = dynamic_cast(cell); + if (q->is_set(ChangeableValues::tp_set)) { + tcell->property_foreground().set_value("red"); + } else { + tcell->property_foreground_set().set_value(false); + } +} + +void PluginDisplay::display_newrow(Gtk::CellRenderer *cell, const Gtk::TreeIter& it) { + PortDesc *q = it->get_value(port_liststore->col.port); + if (q->is_set(ChangeableValues::newrow_set)) { + cell->property_cell_background().set_value("red"); + } else { + cell->property_cell_background_set().set_value(false); + } +} + +void PluginDisplay::display_caption(Gtk::CellRenderer *cell, const Gtk::TreeIter& it) { + PortDesc *q = it->get_value(port_liststore->col.port); + if (!q->has_caption) { + cell->property_cell_background().set_value("red"); + } else { + cell->property_cell_background_set().set_value(false); + } +} + +void PluginDisplay::on_delete_changes() { + if (!current_plugin) { + return; + } + current_plugin->reset(); + int changed = current_plugin->check_changed(); + int change_diff = changed - old_state; + if (change_diff) { + change_count += change_diff; + set_title(); + } + if (!changed) { + delete current_plugin->old; + current_plugin->old = 0; + } + current_plugin = 0; + selection_changed(); +} + +void PluginDisplay::on_search_entry_activate() { + Gtk::TreeIter it = treeview1->get_selection()->get_selected(); + if (it) { + bool v = !it->get_value(plugin_liststore->col.active); + it->set_value(plugin_liststore->col.active, v); + change_count += it->get_value(plugin_liststore->col.pdesc)->set_active(v); + set_title(); + } +} + +bool PluginDisplay::check_for_changes() { + PluginDesc *cur = current_plugin; + save_current(); + bool ret = false; + for (std::vector::iterator p = pluginlist.begin(); p != pluginlist.end(); ++p) { + if ((*p)->active != (*p)->active_set) { + ret = true; + break; + } + if ((*p)->old) { + ret = true; + break; + } + } + if (cur) { + set_old_state(cur); + } + return ret; +} + +int PluginDisplay::ask_discard() { + Gtk::MessageDialog d(*window, _("Discard changes to plugin definitions?"), false, Gtk::MESSAGE_QUESTION, Gtk::BUTTONS_YES_NO, true); + return d.run(); +} + +bool PluginDisplay::check_exit() { + if (check_for_changes()) { + int ret = ask_discard(); + if (ret != Gtk::RESPONSE_YES) { + return false; + } + } + return true; +} + +bool PluginDisplay::on_delete_event(GdkEventAny *) { + return !check_exit(); +} + +void PluginDisplay::on_quit() { + if (check_exit()) { + finished_callback(false, true); + } +} + +void PluginDisplay::on_find() { + search_entry->grab_focus(); +} + +void PluginDisplay::display_quirks(const Gtk::TreeIter& it) { + if (!current_plugin) { + cellrenderer_quirks->property_foreground_set().set_value(false); + } else { + int quirks; + it->get_value(1, quirks); + if (quirks == current_plugin->quirks_default) { + cellrenderer_quirks->property_foreground_set().set_value(false); + } else { + cellrenderer_quirks->property_foreground().set_value("red"); + } + } +} + +void PluginDisplay::display_category(const Gtk::TreeIter& it) { + if (!current_plugin) { + cellrenderer_category->property_foreground_set().set_value(false); + } else { + ustring cat; + it->get_value(0, cat); + if (cat == current_plugin->deduced_category) { + cellrenderer_category->property_foreground_set().set_value(false); + } else { + cellrenderer_category->property_foreground().set_value("red"); + } + } +} + +void PluginDisplay::load() { + int a = combobox_mono_stereo->get_model()->get_path(combobox_mono_stereo->get_active())[0]; + bool s = selected_only->get_active(); + bool c = changed_only->get_active(); + plugin_liststore->clear(); + for (std::vector::iterator v = pluginlist.begin(); v != pluginlist.end(); ++v) { + if (s && !(*v)->active) { + continue; + } + if (c && !(*v)->has_settings) { + continue; + } + if ((a == 1 && (*v)->tp != 0) || (a == 2 && (*v)->tp != 1)) { + continue; + } + Gtk::TreeIter it = plugin_liststore->append(); + it->set_value(plugin_liststore->col.name, ustring((*v)->Name)); + it->set_value(plugin_liststore->col.active, (*v)->active); + it->set_value(plugin_liststore->col.pdesc, *v); + } +} + +void PluginDisplay::on_save() { + finished_callback(do_save(), true); +} + +void PluginDisplay::on_apply() { + if (do_save()) { + finished_callback(true, false); + } + selection_changed(); +} + +bool PluginDisplay::do_save() { + bool changed = check_for_changes(); + std::string fname = get_config_filename(); + std::string tfname = fname + ".tmp"; + ofstream tfile(tfname.c_str()); + JsonWriter jw(&tfile); + jw.begin_array(true); + for (std::vector::iterator p = pluginlist.begin(); p != pluginlist.end(); ++p) { + if ((*p)->active) { + (*p)->output_entry(jw); + } + } + jw.end_array(true); + jw.close(); + tfile.close(); + std::vector > fl; + for (std::vector::iterator p = pluginlist.begin(); p != pluginlist.end(); ++p) { + std::string cname = options.get_plugin_filepath( + gx_engine::LadspaLoader::get_ladspa_filename((*p)->UniqueID)); + if ((*p)->active || (*p)->has_settings) { + std::string tcname = cname + ".tmp"; + ofstream tcfile(tcname.c_str()); + JsonWriter jw2(&tcfile); + (*p)->output(jw2); + jw2.close(); + tcfile.close(); + fl.push_back(std::pair(tcname, cname)); + } else { + fl.push_back(std::pair("", cname)); + } + } + if (rename(tfname.c_str(), fname.c_str()) != 0) { + char buf[100]; + char *p = strerror_r(errno, buf, sizeof(buf)); + gx_system::gx_print_error( + "ladspalist",ustring::compose(_("error renaming LADSPA config file '%1': %2\n"), fname, p)); + return false; + } + for (std::vector >::iterator i = fl.begin(); i != fl.end(); ++i) { + if (i->first.empty()) { + unlink(i->second.c_str()); + } else { + if (rename(i->first.c_str(), i->second.c_str()) != 0) { + char buf[100]; + char *p = strerror_r(errno, buf, sizeof(buf)); + gx_system::gx_print_error( + "ladspalist", + ustring::compose("error renaming %1 to %2: %3\n", i->first, i->second, p)); + } + } + } + for (std::vector::iterator p = pluginlist.begin(); p != pluginlist.end(); ++p) { + (*p)->active_set = (*p)->active; + delete (*p)->old; + (*p)->old = 0; + } + old_state = 0; + change_count = 0; + set_title(); + current_plugin = 0; + return changed; +} + +void PluginDisplay::on_select_all(bool v) { + int d = 0; + Gtk::TreeNodeChildren ch = plugin_liststore->children(); + for (Gtk::TreeIter it = ch.begin(); it != ch.end(); ++it) { + it->set_value(plugin_liststore->col.active, v); + d += it->get_value(plugin_liststore->col.pdesc)->set_active(v); + } + if (d) { + change_count += d; + set_title(); + } +} + +void PluginDisplay::on_show_details() { + details_box->set_visible(show_details->get_active()); + int w, h; + window->get_size(w, h); + window->resize(1, h); +} + +void PluginDisplay::on_add_dry_wet_controller() { + if (!current_plugin) { + return; + } + current_plugin->set_add_wet_dry_controller(dry_wet_button->get_active()); +} + +void PluginDisplay::on_row_activated(const Gtk::TreePath& path, Gtk::TreeViewColumn* column) { + show_details->clicked(); +} + +void PluginDisplay::on_mono_stereo_changed() { + load(); +} + +void PluginDisplay::on_view_changed(const Gtk::ToggleButton *b) { + if (b->get_active()) { + load(); + } +} + +void PluginDisplay::save_current() { + if (!current_plugin) { + return; + } + ustring s = plugin_name->get_text(); + gx_system::strip(s); + if (s.empty()) { + current_plugin->shortname = current_plugin->Name; + } else { + current_plugin->shortname = s; + } + plugin_category->get_active()->get_value(0, current_plugin->category); + plugin_quirks->get_active()->get_value(1, current_plugin->quirks); + Gtk::TreeIter it = master_slider_idx->get_active(); + if (it) { + it->get_value(0, current_plugin->MasterIdx); + } else { + current_plugin->MasterIdx = -1; + } + if (current_plugin->MasterIdx < 0) { + current_plugin->MasterLabel = ""; + } else { + current_plugin->MasterLabel = master_slider_name->get_text(); + } + current_plugin->check_has_settings(); + int changed = current_plugin->check_changed(); + int change_diff = changed - old_state; + if (change_diff) { + change_count += change_diff; + set_title(); + } + if (!changed) { + delete current_plugin->old; + current_plugin->old = 0; + } + current_plugin = 0; +} + +void PluginDisplay::set_title() { + ustring t = _("Select LADSPA plugins for Guitarix"); + if (change_count) { + window->set_title(t + _(" (*changed*)")); + } else { + window->set_title(t); + } +} + +void PluginDisplay::set_old_state(PluginDesc *p) { + current_plugin = p; + old_state = (p->old != 0); + if (!p->old) { + p->old = new PluginDesc(*p); + p->old->ctrl_ports.clear(); + p->old->copy_ports(p); + } +} + +void PluginDisplay::selection_changed() { + Gtk::TreeIter it = treeview1->get_selection()->get_selected(); + PluginDesc *p = 0; + if (it) { + p = it->get_value(plugin_liststore->col.pdesc); + if (current_plugin == p) { + return; + } + } + save_current(); + on_reordered_conn.block(); + port_liststore->clear(); + on_reordered_conn.unblock(); + ladspa_category->set_text(""); + ladspa_maker->set_text(""); + ladspa_uniqueid->set_text(""); + plugin_name->set_text(""); + plugin_category->set_active(-1); + plugin_quirks->set_active(-1); + if (!p) { + return; + } + set_old_state(p); + if (p->shortname != p->Name) { + plugin_name->modify_text(Gtk::STATE_NORMAL, Gdk::Color("red")); + } else { + plugin_name->unset_text(Gtk::STATE_NORMAL); + } + plugin_name->set_text(p->shortname); + Gtk::TreeNodeChildren ch = plugin_category->get_model()->children(); + int i = 0; + for (it = ch.begin(); it != ch.end(); ++it, ++i) { + ustring cat; + it->get_value(0, cat); + if (cat == p->category) { + plugin_category->set_active(i); + break; + } + } + ch = plugin_quirks->get_model()->children(); + for (i = 0, it = ch.begin(); it != ch.end(); ++it, ++i) { + int quirks; + it->get_value(1, quirks); + if (quirks == p->quirks) { + plugin_quirks->set_active(i); + break; + } + } + Glib::RefPtr ls_master = Glib::RefPtr::cast_dynamic(master_slider_idx->get_model()); + ls_master->clear(); + it = ls_master->append(); + i = -1; + it->set_value(0, i); + ustring ml(""); + for (unsigned int i = 0; i < p->ctrl_ports.size(); ++i) { + it = ls_master->append(); + it->set_value(0, int(i)); + if (p->ctrl_ports[i]->pos == p->MasterIdx) { + ml = p->ctrl_ports[i]->factory.get_name(); + } + } + master_slider_idx->set_active(p->MasterIdx+1); + master_slider_name->unset_text(Gtk::STATE_NORMAL); + if (!p->MasterLabel.empty()) { + master_slider_name->set_text(p->MasterLabel); + if (p->MasterLabel != ml) { + master_slider_name->modify_text(Gtk::STATE_NORMAL, Gdk::Color("red")); + } + } + dry_wet_button->set_active(current_plugin->add_wet_dry); + ladspa_category->set_text(p->ladspa_category); + ladspa_maker->set_text(p->Maker); + ladspa_uniqueid->set_text(ustring::compose("%1: %2[%3]", p->UniqueID, p->path, p->index)); + for (unsigned int i = 0; i < p->ctrl_ports.size(); ++i) { + PortDesc *q = p->ctrl_ports[i]; + Glib::RefPtr tls; + if (q->is_output) { + tls = output_type_list; + } else if (q->has_sr) { + tls = display_type_list_sr; + } else { + tls = display_type_list; + } + float dflt = q->get_dflt(); + float low = q->get_low(); + float up = q->get_up(); + if (q->has_sr && !q->use_sr) { + if (q->factory.is_set(ChangeableValues::dflt_set)) { + dflt *= SR; + } + if (q->factory.is_set(ChangeableValues::low_set)) { + low *= SR; + } + if (q->factory.is_set(ChangeableValues::up_set)) { + up *= SR; + } + } + it = port_liststore->append(); + it->set_value(port_liststore->col.pos, q->pos); + it->set_value(port_liststore->col.name, q->get_name()); + it->set_value(port_liststore->col.dflt, ustring::format(dflt)); + it->set_value(port_liststore->col.low, ustring::format(low)); + it->set_value(port_liststore->col.up, ustring::format(up)); + it->set_value(port_liststore->col.step, ustring(step_type_names[q->step])); + it->set_value(port_liststore->col.display, ustring(display_type_names[q->get_tp()])); + it->set_value(port_liststore->col.display_types, tls); + it->set_value(port_liststore->col.port, q); + it->set_value(port_liststore->col.newrow, q->get_newrow()); + it->set_value(port_liststore->col.use_sr, q->has_sr && !q->use_sr); + it->set_value(port_liststore->col.has_caption, q->has_caption); + } +} + +void PluginDisplay::display_master_idx(const Gtk::TreeIter& it) { + int i; + it->get_value(0, i); + if (i < 0) { + cellrenderer_master->property_text().set_value("--"); + cellrenderer_master->property_foreground_set().set_value(false); + } else { + cellrenderer_master->property_foreground().set_value("red"); + } +} + +void PluginDisplay::set_master_text() { + Gtk::TreeIter it = master_slider_idx->get_active(); + if (!it) { + master_slider_name->set_text(""); + master_slider_name->set_editable(false); + return; + } + int idx; + it->get_value(0, idx); + if (idx < 0) { + master_slider_name->set_text(""); + master_slider_name->set_editable(false); + } else { + for (std::vector::iterator q = current_plugin->ctrl_ports.begin(); q != current_plugin->ctrl_ports.end(); ++q) { + if ((*q)->pos == idx) { + master_slider_name->set_text((*q)->factory.get_name()); + break; + } + } + master_slider_name->set_editable(true); + } +} + +void PluginDisplay::on_parameter_selection_changed() { + Gtk::TreeIter it = treeview2->get_selection()->get_selected(); + enum_liststore->clear(); + if (it) { + PortDesc *q = it->get_value(port_liststore->col.port); + if (q->get_tp() == tp_enum) { + int up = int(q->get_up()); + for (int idx = int(q->get_low()); idx <= up; ++idx) { + it = enum_liststore->append(); + it->set_value(enum_liststore->col.value, idx); + it->set_value(enum_liststore->col.label, q->get_enum(idx)); + it->set_value(enum_liststore->col.port, q); + } + } + } +} + +void PluginDisplay::on_reordered(const Gtk::TreePath& path) { + assert(current_plugin); + std::map d; + for (unsigned int i = 0; i < current_plugin->ctrl_ports.size(); ++i) { + d[current_plugin->ctrl_ports[i]->pos] = i; + } + std::vector l; + Gtk::TreeNodeChildren ch = port_liststore->children(); + for (Gtk::TreeIter it = ch.begin(); it != ch.end(); ++it) { + l.push_back(current_plugin->ctrl_ports[d[it->get_value(port_liststore->col.pos)]]); + } + current_plugin->ctrl_ports = l; +} + +void PluginDisplay::on_type_edited(const ustring& path, const ustring& newtext) { + Gtk::TreeIter it = port_liststore->get_iter(path); + PortDesc *q = it->get_value(port_liststore->col.port); + DisplayType tp_old = q->user.get_tp(); + DisplayType tp = tp_scale; + for (unsigned int i = 0; i < sizeof(display_type_names)/sizeof(display_type_names[0]); i++) { + if (newtext == display_type_names[i]) { + tp = static_cast(i); + break; + } + } + q->set_tp(tp); + if (tp != tp_old) { + if (tp == tp_scale_log) { + if (q->get_low() <= 0) { + q->set_low(1e-7); + } + if (q->get_up() <= q->get_low()) { + q->set_up(q->get_low()*1000); + } + float dflt = q->get_dflt(); + if (!(q->get_low() <= dflt && dflt <= q->get_up())) { + q->set_dflt(q->get_low()); + } + } else if (tp == tp_toggle) { + q->set_dflt(int(q->get_dflt() != 0)); + q->set_low(0); + q->set_up(1); + } else if (tp == tp_enum || tp == tp_int) { + q->set_dflt(round(q->get_dflt())); + q->set_low(round(q->get_low())); + q->set_up(round(q->get_up())); + } + float dflt = q->get_dflt(); + float low = q->get_low(); + float up = q->get_up(); + if (q->has_sr && !q->use_sr) { + dflt *= SR; + low *= SR; + up *= SR; + } + it->set_value(port_liststore->col.dflt, ustring::format(dflt)); + it->set_value(port_liststore->col.low, ustring::format(low)); + it->set_value(port_liststore->col.up, ustring::format(up)); + } + it->set_value(port_liststore->col.display, newtext); + on_parameter_selection_changed(); +} + +void PluginDisplay::on_step_edited(const ustring& path, const ustring& newtext) { + Gtk::TreeIter it = port_liststore->get_iter(path); + step_mode m = stp_normal; + for (unsigned int i = 0; i < sizeof(step_type_names)/sizeof(step_type_names[0]); ++i) { + if (step_type_names[i] == newtext) { + m = static_cast(i); + break; + } + } + it->get_value(port_liststore->col.port)->step = m; + it->set_value(port_liststore->col.step, newtext); +} + +void PluginDisplay::on_label_edited(const ustring& path, const ustring& newtext) { + Gtk::TreeIter it = enum_liststore->get_iter(path); + PortDesc *q = it->get_value(enum_liststore->col.port); + ustring text(newtext); + gx_system::strip(text); + int idx = it->get_value(enum_liststore->col.value); + std::map::iterator i = q->factory.find_enum(idx); + if (text.empty() || (i != q->factory.enum_end() && i->second == text)) { + q->user.erase_enum(idx); + text = ""; + } + if (text.empty()) { + std::map::iterator i = q->factory.find_enum(idx); + if (i == q->factory.enum_end()) { + text = ustring::format(idx); + } else { + text = i->second; + } + } else { + q->user.set_enumvalue(idx, text); + } + it->set_value(enum_liststore->col.label, text); +} + +void PluginDisplay::on_name_edited(const ustring& path, const ustring& newtext) { + Gtk::TreeIter it = port_liststore->get_iter(path); + PortDesc *q = it->get_value(port_liststore->col.port); + ustring text(newtext); + gx_system::strip(text); + if (text.empty() || q->factory.get_name() == text) { + q->user.unset(ChangeableValues::name_set); + } else { + q->user.set_name(text); + } + it->set_value(port_liststore->col.name, q->get_name()); +} + +void PluginDisplay::on_dflt_edited(const ustring& path, const ustring& newtext) { + Gtk::TreeIter it = port_liststore->get_iter(path); + PortDesc *q = it->get_value(port_liststore->col.port); + ustring text(newtext); + gx_system::strip(text); + float val; + if (text.empty()) { + q->user.unset(ChangeableValues::dflt_set); + val = q->factory.get_dflt(); + if (val < q->get_low()) { + q->set_low(val); + } + if (val > q->get_up()) { + q->set_up(val); + } + if (q->has_sr && !q->use_sr) { + val *= SR; + } + } else { + char *p; + val = strtod(text.c_str(), &p); + if (p != text.c_str() + text.size()) { + return; + } + float val2; + if (q->has_sr && !q->use_sr) { + val2 = val / SR; + } else { + val2 = val; + } + if (!(q->get_low() <= val2 && val2 <= q->get_up())) { + return; + } + q->set_dflt(val2); + } + it->set_value(port_liststore->col.dflt, ustring::format(val)); +} + +void PluginDisplay::on_low_edited(const ustring& path, const ustring& newtext) { + Gtk::TreeIter it = port_liststore->get_iter(path); + PortDesc *q = it->get_value(port_liststore->col.port); + ustring text(newtext); + gx_system::strip(text); + float val; + if (text.empty()) { + q->user.unset(ChangeableValues::low_set); + val = q->factory.get_low(); + if (q->get_dflt() < val) { + q->set_dflt(val); + } + if (q->get_up() < val) { + q->set_up(min(q->get_up(),val+1)); + } + if (q->has_sr && !q->use_sr) { + val *= SR; + } + } else { + char *p; + val = strtod(text.c_str(), &p); + if (p != text.c_str() + text.size()) { + return; + } + float val2; + if (q->has_sr && !q->use_sr) { + val2 = val/SR; + } else { + val2 = val; + } + if (!(val2 < q->get_up())) { + return; + } + if (q->get_dflt() < val2) { + q->user.set_dflt(val2); + } + it->set_value(port_liststore->col.dflt, ustring::format(q->get_dflt())); + q->set_low(val2); + if (q->get_tp() == tp_enum) { + on_parameter_selection_changed(); + } + } + it->set_value(port_liststore->col.low, ustring::format(val)); +} + +void PluginDisplay::on_up_edited(const ustring& path, const ustring& newtext) { + Gtk::TreeIter it = port_liststore->get_iter(path); + PortDesc *q = it->get_value(port_liststore->col.port); + ustring text(newtext); + gx_system::strip(text); + float val; + if (text.empty()) { + q->user.unset(ChangeableValues::up_set); + val = q->factory.get_up(); + if (q->get_dflt() > val) { + q->set_dflt(val); + } + if (q->get_low() > val) { + q->set_low(max(q->get_low(),val-1)); + } + if (q->has_sr && !q->use_sr) { + val *= SR; + } + } else { + char *p; + val = strtod(text.c_str(), &p); + if (p != text.c_str() + text.size()) { + return; + } + float val2; + if (q->has_sr && !q->use_sr) { + val2 = val/SR; + } else { + val2 = val; + } + if (!(val2 > q->get_low())) { + return; + } + if (q->get_dflt() > val2) { + q->user.set_dflt(val2); + } + it->set_value(port_liststore->col.dflt, ustring::format(q->get_dflt())); + q->set_up(val2); + if (q->get_tp() == tp_enum) { + on_parameter_selection_changed(); + } + } + it->set_value(port_liststore->col.up, ustring::format(val)); +} + +void PluginDisplay::on_newrow_toggled(const ustring& path) { + Gtk::TreeIter it = port_liststore->get_iter(path); + PortDesc *q = it->get_value(port_liststore->col.port); + bool s = !cellrenderer_newrow->get_active(); + it->set_value(port_liststore->col.newrow, s); + if (s == q->factory.get_newrow()) { + q->user.unset(ChangeableValues::newrow_set); + } else { + q->user.set_newrow(s); + } +} + +void PluginDisplay::on_caption_toggled(const ustring& path) { + Gtk::TreeIter it = port_liststore->get_iter(path); + PortDesc *q = it->get_value(port_liststore->col.port); + bool s = !cellrenderer_caption->get_active(); + it->set_value(port_liststore->col.has_caption, s); + q->has_caption = s; +} + +void PluginDisplay::on_active_toggled(const ustring& path) { + Gtk::TreeIter it = plugin_liststore->get_iter(path); + bool s = !cellrenderer_active->get_active(); + it->set_value(plugin_liststore->col.active, s); + change_count += it->get_value(plugin_liststore->col.pdesc)->set_active(s); + set_title(); +} + + +static struct { + unsigned long from, to; +} ranges_1_based[] = { + // swh + {1181, 1440}, + {1605, 1605}, + {1881, 1922}, + // blop + {1641, 1680}, + {2021, 2038}, +}; + +static bool in_1_based_range(unsigned long uid) { + for (unsigned int i = 0; i < sizeof(ranges_1_based)/sizeof(ranges_1_based[0]); ++i) { + if (uid >= ranges_1_based[i].from && uid <= ranges_1_based[i].to) { + return true; + } + } + return false; +} + +static void set_instances(const char *uri, std::map& d, std::vector& label, + std::vector& not_found, std::set& seen) { + lrdf_uris *uris = lrdf_get_instances(uri); + if (uris) { + for (unsigned int i = 0; i < uris->count; ++i) { + const char *u = uris->items[i]; + unsigned long uid = lrdf_get_uid(u); + if (d.find(uid) == d.end()) { + not_found.push_back(uid); + seen.insert(uid); + continue; + } + if (seen.find(uid) == seen.end()) { + PluginDesc *pd = d[uid]; + pd->set_category(label); + for (unsigned int n = 0; n < pd->ctrl_ports.size(); n++) { + PortDesc *p = pd->ctrl_ports[n]; + lrdf_defaults *sval = lrdf_get_scale_values(uid, p->idx); + if (sval) { + for (unsigned int nn = 0; nn < sval[0].count; nn++) { + lrdf_portvalue& t = sval[0].items[nn]; + p->factory.set_enumvalue(t.value, t.label); + } + lrdf_free_setting_values(sval); + if (LADSPA_IS_HINT_INTEGER(p->hint_desc)) { + p->factory.set_tp(tp_enum); + } + } + } + uri = lrdf_get_default_uri(uid); + if (uri) { + lrdf_defaults *sval = lrdf_get_setting_values(uri); + if (sval) { + for (unsigned int nn = 0; nn < sval[0].count; nn++) { + lrdf_portvalue& t = sval[0].items[nn]; + int idx = t.pid; + if (in_1_based_range(uid)) { + idx -= 1; + } + pd->set_default(idx, t.value, t.label); + } + lrdf_free_setting_values(sval); + } + } + } + seen.insert(uid); + } + lrdf_free_uris(uris); + } +} + +static void descend(const char *uri, std::map& d, + std::vector& not_found, std::set& seen, + std::vector& base) { + lrdf_uris *uris = lrdf_get_subclasses(uri); + if (uris) { + for (unsigned int i = 0; i < uris->count; ++i) { + const char *u = uris->items[i]; + base.push_back(lrdf_get_label(u)); + set_instances(u, d, base, not_found, seen); + descend(u, d, not_found, seen, base); + base.pop_back(); + } + lrdf_free_uris(uris); + } +} + +std::string PluginDisplay::get_ladspa_plugin_config(unsigned long UniqueID) { + return options.get_plugin_filepath("ladspa"+gx_system::to_string(UniqueID)+".js"); +} + +static bool cmp_plugins(const PluginDesc *a, const PluginDesc *b) { + return ustring(a->Name) < ustring(b->Name); +} + +void PluginDisplay::load_ladspalist(std::vector& old_not_found, std::vector& l) { + gx_system::PathList pl("LADSPA_PATH"); + if (!pl.size()) { + pl.add("/usr/lib/ladspa"); + pl.add("/usr/local/lib/ladspa"); + } + std::map d; + for (gx_system::PathList::iterator it = pl.begin(); it != pl.end(); ++it) { + Glib::RefPtr file = *it; + if (!file->query_exists()) { + continue; + } + Glib::RefPtr child_enumeration = + file->enumerate_children(G_FILE_ATTRIBUTE_STANDARD_NAME + "," G_FILE_ATTRIBUTE_STANDARD_DISPLAY_NAME + "," G_FILE_ATTRIBUTE_STANDARD_FAST_CONTENT_TYPE); + Glib::RefPtr file_info; + + while ((file_info = child_enumeration->next_file()) != 0) { + if (file_info->get_attribute_string(G_FILE_ATTRIBUTE_STANDARD_FAST_CONTENT_TYPE) == "application/x-sharedlib") { + std::string nm = file_info->get_attribute_byte_string(G_FILE_ATTRIBUTE_STANDARD_NAME); + if (lib_is_blacklisted(nm)) { + continue; + } + //printf("opening %s/%s\n", file->get_path().c_str(), nm.c_str()); + load_ladspa_defs(Glib::build_filename(file->get_path(), nm), d); + } + } + } + gx_system::PathList rpl("LADSPA_RDF_PATH"); + if (!rpl.size()) { + rpl.add("/usr/share/ladspa/rdf"); + rpl.add("/usr/local/share/ladspa/rdf"); + } + lrdf_init(); + for (gx_system::PathList::iterator it = rpl.begin(); it != rpl.end(); ++it) { + Glib::RefPtr file = *it; + if (!file->query_exists()) { + continue; + } + Glib::RefPtr child_enumeration = + file->enumerate_children(G_FILE_ATTRIBUTE_STANDARD_NAME + "," G_FILE_ATTRIBUTE_STANDARD_DISPLAY_NAME + "," G_FILE_ATTRIBUTE_STANDARD_FAST_CONTENT_TYPE); + Glib::RefPtr file_info; + + while ((file_info = child_enumeration->next_file()) != 0) { + //if not f.endswith((".rdf",".rdfs")): + if (file_info->get_attribute_string(G_FILE_ATTRIBUTE_STANDARD_FAST_CONTENT_TYPE) == "application/rdf+xml") { + std::string nm = file_info->get_attribute_byte_string(G_FILE_ATTRIBUTE_STANDARD_NAME); + if (lib_is_blacklisted(nm)) { + continue; + } + lrdf_read_file(("file://"+Glib::build_filename(file->get_path(), nm)).c_str()); + } + } + } + std::vector not_found; + std::set seen; + std::vector base; + locale_t loc = newlocale(LC_ALL, "C", 0); + uselocale(loc); + descend(LADSPA_BASE "Plugin", d, not_found, seen, base); + uselocale(LC_GLOBAL_LOCALE); + freelocale(loc); + lrdf_cleanup(); + + ifstream is(get_config_filename().c_str()); + if (!is.fail()) { + try { + JsonParser jp(&is); + jp.next(JsonParser::begin_array); + while (jp.peek() == JsonParser::begin_array) { + jp.next(JsonParser::begin_array); + jp.next(JsonParser::value_string); // path + jp.next(JsonParser::value_number); // index + jp.next(JsonParser::value_number); // UniqueID + unsigned long uid = jp.current_value_uint(); + if (d.find(uid) == d.end()) { + old_not_found.push_back(uid); + } else { + d[uid]->set_active(true); + d[uid]->active_set = true; + } + jp.next(JsonParser::value_string); // Label + jp.next(JsonParser::end_array); + } + jp.close(); + } catch(JsonException& e) { + gx_system::gx_print_error( + "ladspalist", ustring::compose( + _("error loading ladspa plugin selection data from file %1"), + get_config_filename())); + } + is.close(); + } + for (std::map::iterator v = d.begin(); v != d.end(); ++v) { + v->second->fixup(); + std::string s = gx_engine::LadspaLoader::get_ladspa_filename(v->first); + std::string fname = options.get_plugin_filepath(s); + if (access(fname.c_str(), F_OK) != 0) { + fname = options.get_factory_filepath(s); + if (access(fname.c_str(), F_OK) != 0) { + fname = ""; + } + } + if (!fname.empty()) { + v->second->set_state(fname); + } + } + for (std::map::iterator i = d.begin(); i != d.end(); ++i) { + l.push_back(i->second); + } + std::sort(l.begin(), l.end(), cmp_plugins); +} + +} // namespace ladspa diff -Nru guitarix-0.22.4/src/gx_head/gui/rack.cpp guitarix-0.24.2/src/gx_head/gui/rack.cpp --- guitarix-0.22.4/src/gx_head/gui/rack.cpp 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/src/gx_head/gui/rack.cpp 2012-10-20 03:56:02.000000000 +0000 @@ -46,6 +46,9 @@ : GxUiItem(), merge_id(0), action(), plugin(pl.lookup_plugin(name)), fname(fname_), tooltip(tooltip_), shortname(), icon(), group(), toolitem(), main(main_), rackbox(), hidden(false), compressed(false) { + if (plugin->pdef->description && tooltip.empty()) { + tooltip = plugin->pdef->description; + } gx_ui::GxUI& ui = main.get_ui(); ui.registerZone(&plugin->box_visible, this); ui.registerZone(&plugin->position, this); @@ -54,6 +57,13 @@ } PluginUI::~PluginUI() { + delete rackbox; + if (toolitem) { + if (group) { + group->remove(*toolitem); + } + delete toolitem; + } plugin->pdef->flags &= ~gx_engine::PGNI_UI_REG; gx_ui::GxUI& ui = main.get_ui(); ui.unregisterZone(&plugin->box_visible, this); @@ -61,6 +71,13 @@ ui.unregisterZone(&plugin->effect_post_pre, this); } +void PluginUI::unset_ui_merge_id(Glib::RefPtr uimanager) { + if (merge_id) { + uimanager->remove_ui(merge_id); + merge_id = 0; + } +} + void PluginUI::on_plugin_preset_popup() { main.plugin_preset_popup(get_id()); } @@ -152,138 +169,70 @@ } void PluginUI::display_new(bool unordered) { - plugin->plug_visible = false; + plugin->plug_visible = compressed = false; + if (rackbox) { + rackbox->swtch(false); + } display(true, true); if (!unordered) { rackbox->get_parent()->reorder(get_id(), -1); } } -/**************************************************************** - ** class PluginDict - */ +void PluginUI::update_rackbox() { + if (!rackbox) { + return; + } + if (plugin->box_visible) { + RackContainer::rackbox_list l = rackbox->get_parent()->get_children(); + int n = 0; + for (RackContainer::rackbox_list::iterator i = l.begin(); i != l.end(); ++i, ++n) + if (*i == rackbox) { + break; + } + delete rackbox; + rackbox = main.add_rackbox(*this, compressed, n, false); + } else { + delete rackbox; + rackbox = 0; + } +} -PluginDict::~PluginDict() { - for (std::map::iterator i = begin(); i != end(); ++i) { - delete i->second; +bool plugins_by_name_less(PluginUI *a, PluginUI *b) { + int res = a->get_type() - b->get_type(); + if (res == 0) { + gchar *an = g_utf8_casefold(a->get_shortname(), 1); + gchar *bn = g_utf8_casefold(b->get_shortname(), 1); + res = g_utf8_collate(an, bn); + g_free(an); + g_free(bn); } + return res < 0; } /**************************************************************** - ** class StackBoxBuilderNew + ** class PluginDict */ -StackBoxBuilderNew::StackBoxBuilderNew( - gx_engine::GxEngine& engine_, gx_preset::GxSettings& gx_settings_, - Gxw::WaveView &fWaveView_, Gtk::Label &convolver_filename_label_, gx_ui::GxUI& ui_, - Glib::RefPtr window_icon) - : StackBoxBuilder(fTop, fBox, engine_, gx_settings_, fMode, fWaveView_, - convolver_filename_label_, ui_, window_icon), - engine(engine_), gx_settings(gx_settings_), fWaveView(fWaveView_), - convolver_filename_label(convolver_filename_label_), widget() { -} - -void StackBoxBuilderNew::openMonoRackBox(const char* label, int* posit, const char *id_on_off, const char *id_pre_post, const char *id_dialog) { -} - -void StackBoxBuilderNew::closeMonoRackBox() { -} - -void StackBoxBuilderNew::openStereoRackBox(const char* label, int* posit, const char *id_on_off, const char *id_dialog) { -} - -void StackBoxBuilderNew::closeStereoRackBox() { -} - -void StackBoxBuilderNew::openVerticalMidiBox(const char* label) { - openVerticalBox(label); +void PluginDict::remove(PluginUI *p) { + std::map::iterator i = find(p->get_id()); + assert(i != end()); + erase(i); } -void StackBoxBuilderNew::prepare() { - fTop = 0; - widget = new Gtk::HBox(); - widget->show(); - fBox[fTop] = GTK_WIDGET(widget->gobj()); - fMode[fTop] = kBoxMode; -} - -#ifndef NDEBUG -void wnotify(gpointer data, GObject *where_the_object_was) { - printf("WN %p %p\n", where_the_object_was, data); -} - -// check if object will be finalized -void trace_finalize(Glib::Object *o, int n) { - g_object_weak_ref(o->gobj(), wnotify, (gpointer)n); -} -#endif - -void StackBoxBuilderNew::fetch(Gtk::Widget*& mainbox, Gtk::Widget*& minibox) { - assert(fTop == 0); - mainbox = widget; - Glib::ListHandle l = widget->get_children(); - if (l.size() == 2) { - Glib::ListHandle::iterator i = l.begin(); - minibox = new Gtk::VBox(); - minibox->show(); - (*i)->show(); - (*i)->reference(); //FIXME can't unmanage widget, reparent unrefs - (*i)->reparent(*minibox); - } else { - minibox = 0; +void PluginDict::cleanup() { + for (std::map::iterator i = begin(); i != end(); ++i) { + delete i->second; } + clear(); } -void StackBoxBuilderNew::get_box(const std::string& name, Gtk::Widget*& mainbox, Gtk::Widget*& minibox) { - struct { - const char *name; - void (StackBoxBuilder::*func)(); - } mapping[] = { - // mono - //{ "ampdetail", &StackBoxBuilder::make_rackbox_ampdetail }, - { "overdrive", &StackBoxBuilder::make_rackbox_overdrive }, - { "echo", &StackBoxBuilder::make_rackbox_echo }, - { "delay", &StackBoxBuilder::make_rackbox_delay }, - { "freeverb", &StackBoxBuilder::make_rackbox_freeverb }, - { "oscilloscope", &StackBoxBuilder::make_rackbox_oscilloscope }, - { "low_highpass", &StackBoxBuilder::make_rackbox_low_highpass }, - { "eqs", &StackBoxBuilder::make_rackbox_eqs }, - //{ "crybaby", &StackBoxBuilder::make_rackbox_crybaby }, - //{ "gx_distortion", &StackBoxBuilder::make_rackbox_gx_distortion }, - { "IR", &StackBoxBuilder::make_rackbox_IR }, - { "compressor", &StackBoxBuilder::make_rackbox_compressor }, - { "biquad", &StackBoxBuilder::make_rackbox_biquad }, - //{ "tremolo", &StackBoxBuilder::make_rackbox_tremolo }, - { "phaser_mono", &StackBoxBuilder::make_rackbox_phaser_mono }, - { "chorus_mono", &StackBoxBuilder::make_rackbox_chorus_mono }, - { "flanger_mono", &StackBoxBuilder::make_rackbox_flanger_mono }, - { "feedback", &StackBoxBuilder::make_rackbox_feedback }, - //{ "amp.tonestack", &StackBoxBuilder::make_rackbox_amp_tonestack }, - { "cab", &StackBoxBuilder::make_rackbox_cab }, - { "midi_out", &StackBoxBuilder::make_rackbox_midi_out }, - // stereo - { "chorus", &StackBoxBuilder::make_rackbox_chorus }, - { "flanger", &StackBoxBuilder::make_rackbox_flanger }, - { "phaser", &StackBoxBuilder::make_rackbox_phaser }, - { "stereodelay", &StackBoxBuilder::make_rackbox_stereodelay }, - { "stereoecho", &StackBoxBuilder::make_rackbox_stereoecho }, - { "moog", &StackBoxBuilder::make_rackbox_moog }, - { "ampmodul", &StackBoxBuilder::make_rackbox_ampmodul }, - { "tonemodul", &StackBoxBuilder::make_rackbox_tonemodul }, - { "jconv", &StackBoxBuilder::make_rackbox_jconv }, - { "stereoverb", &StackBoxBuilder::make_rackbox_stereoverb } - }; - mainbox = minibox = 0; - for (unsigned int i = 0; i < sizeof(mapping) / sizeof(mapping[0]); ++i) { - if (name == mapping[i].name) { - prepare(); - (this->*mapping[i].func)(); - fetch(mainbox, minibox); - } - } +PluginDict::~PluginDict() { + cleanup(); } + /**************************************************************** ** class DragIcon */ @@ -497,16 +446,18 @@ evbox.set_above_child(mode); if (mode) { mconbox.hide(); - if (preset_button) - preset_button->hide(); + if (preset_button) { + preset_button->hide(); + } mb_expand_button->hide(); if (mb_delete_button) { mb_delete_button->show(); } } else { mconbox.show(); - if (preset_button) - preset_button->show(); + if (preset_button) { + preset_button->show(); + } mb_expand_button->show(); if (mb_delete_button) { mb_delete_button->hide(); @@ -796,15 +747,7 @@ } Gtk::Widget *RackBox::make_label(const PluginUI& plugin, gx_system::CmdlineOptions& options, bool useshort) { - const char *effect_name; - if (useshort) { - effect_name = plugin.shortname; - if (!effect_name) { - effect_name = plugin.get_name(); - } - } else { - effect_name = plugin.get_name(); - } + const char *effect_name = useshort ? plugin.get_shortname() : plugin.get_name(); Gtk::Label *effect_label = new Gtk::Label(effect_name); effect_label->set_alignment(0, 0.5); effect_label->set_name("rack_effect_label"); @@ -1160,21 +1103,29 @@ return p; } -void RackBox::pack(Gtk::Widget *main, Gtk::Widget *mini) { +void RackBox::pack(Gtk::Widget *main, Gtk::Widget *mini, const Glib::RefPtr& szg) { if (!main) { return; } box.pack_start(*manage(main)); minibox->pack(mini); + szg->add_widget(*fbox); + szg->add_widget(mbox); } Gtk::HBox *RackBox::make_full_box(gx_system::CmdlineOptions& options) { Gtk::HBox *bx = new Gtk::HBox(); - bx->pack_start(*manage(switcher_vbox(options)), Gtk::PACK_SHRINK); + Gtk::VBox *vx = new Gtk::VBox(); + bx->pack_start(*manage(vx)); + Gtk::Widget *effect_label = make_label(plugin, options, false); + vx->pack_start(*manage(effect_label), Gtk::PACK_SHRINK); + Gtk::HBox *bx2 = new Gtk::HBox(); + vx->pack_start(*manage(bx2)); + bx2->pack_start(*manage(switcher_vbox(options)), Gtk::PACK_SHRINK); box.set_name(plugin.get_id()); box.set_border_width(4); box.property_paint_func().set_value("RackBox_expose"); - bx->pack_start(box); + bx2->pack_start(box); Gtk::VBox *vbox = new Gtk::VBox(); vbox->pack_start(*manage(make_expand_button(false)), Gtk::PACK_SHRINK); if (!(plugin.plugin->pdef->flags & PGN_NO_PRESETS)) { @@ -1191,15 +1142,14 @@ Gtk::VBox *RackBox::switcher_vbox(gx_system::CmdlineOptions& options) { Gtk::VBox *vbox = new Gtk::VBox(); - Gtk::Widget *effect_label = make_label(plugin, options, true); - vbox->pack_start(*manage(effect_label), Gtk::PACK_SHRINK); + Gtk::HBox *hbox = new Gtk::HBox(); vbox->pack_start(*manage(hbox)); Gtk::HBox *hbox2 = new Gtk::HBox(); hbox->pack_start(*manage(hbox2), Gtk::PACK_SHRINK); Gtk::VBox *vbox2 = new Gtk::VBox(); hbox2->pack_start(*manage(vbox2)); - hbox2->pack_start(*manage(wrap_bar(4,13)), Gtk::PACK_SHRINK); + hbox2->pack_start(*manage(wrap_bar(4,4)), Gtk::PACK_SHRINK); #ifdef USE_SZG szg->add_widget(&on_off_switch); #endif diff -Nru guitarix-0.22.4/src/gx_head/wscript guitarix-0.24.2/src/gx_head/wscript --- guitarix-0.22.4/src/gx_head/wscript 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/src/gx_head/wscript 2012-10-20 03:56:02.000000000 +0000 @@ -1,11 +1,14 @@ #! /usr/bin/env python # encoding: utf-8 +import sys + def configure(conf): pass def build(bld): sources_engine = [ + './engine/ladspaplugin.cpp', './engine/gx_jack.cpp', './engine/gx_preset.cpp', './engine/gx_json.cpp', @@ -26,6 +29,7 @@ ] sources_gui = [ + './gui/ladspalist.cpp', './gui/gx_stackbox_builder.cpp', './gui/gx_main_window.cpp', './gui/liveplay.cpp', @@ -50,8 +54,10 @@ './builder/midi.glade', './builder/ports.glade', './builder/iredit.glade', + './builder/iredit_mono.glade', './builder/jackstarter.glade', './builder/mainpanel.glade', + './builder/ladspaliste.glade', './builder/crybaby_ui.glade', './builder/gx_distortion_ui.glade', './builder/amp.tonestack_ui.glade', @@ -66,10 +72,10 @@ incl = ['.','./engine','../..','..','../headers','../../libgxwmm','../../libgxw'] # need ".." for config.h libpath = [] lib = [] - if bld.env['IS_LINUX']: + if sys.platform.startswith("linux"): lib.append('dl') uselib = ['JACK', 'SNDFILE', 'GTHREAD', 'GMODULE_EXPORT', - 'GTK2', 'GTKMM', 'GIOMM', 'FFTW3'] + 'GTK2', 'GTKMM', 'GIOMM', 'FFTW3', 'LRDF', 'BOOST_SYSTEM'] uselib_local = [] if bld.env['ZITA_CONVOLVER']: uselib.append('ZITA_CONVOLVER') @@ -99,7 +105,7 @@ uselib_local = uselib_local, libpath = libpath, target = bld.env['BIN_NAME'], - chmod = 0755, + chmod = 0o755, install_path = bld.env['BINDIR'], ) - bld.install_files(bld.env['GX_BUILDER_DIR'], builder_files, chmod=0644) + bld.install_files(bld.env['GX_BUILDER_DIR'], builder_files, chmod=0o644) diff -Nru guitarix-0.22.4/src/headers/guitarix.h guitarix-0.24.2/src/headers/guitarix.h --- guitarix-0.22.4/src/headers/guitarix.h 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/src/headers/guitarix.h 2012-10-20 03:56:02.000000000 +0000 @@ -81,6 +81,7 @@ #include "gx_jconv_settings.h" #include "gx_stackbox_builder.h" #include "gx_preset_window.h" +#include "ladspalist.h" #include "gx_main_window.h" #endif // SRC_HEADERS_GUITARIX_H_ diff -Nru guitarix-0.22.4/src/headers/gx_convolver.h guitarix-0.24.2/src/headers/gx_convolver.h --- guitarix-0.22.4/src/headers/gx_convolver.h 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/src/headers/gx_convolver.h 2012-10-20 03:56:02.000000000 +0000 @@ -130,6 +130,10 @@ unsigned int length, unsigned int size, unsigned int bufsize, const Gainline& gainline); bool compute(int count, float* input1, float *input2, float *output1, float *output2); + bool configure(string fname, float gain, unsigned int delay, unsigned int offset, + unsigned int length, unsigned int size, unsigned int bufsize, + const Gainline& gainline); + bool compute(int count, float* input, float *output); static void compute_interpolation(double& fct, double& gp, unsigned int& idx, const Gainline& points, int offset); }; diff -Nru guitarix-0.22.4/src/headers/gx_engine.h guitarix-0.24.2/src/headers/gx_engine.h --- guitarix-0.22.4/src/headers/gx_engine.h 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/src/headers/gx_engine.h 2012-10-20 03:56:02.000000000 +0000 @@ -50,7 +50,7 @@ Plugin plugin; ModuleSelectorFromList( EngineControl& seq, gx_ui::GxUI& ui, const char* id, const char* name, - plugindef_creator module_ids[], const char* select_id, + const char *category, plugindef_creator module_ids[], const char* select_id, const char* select_name, const char** groups = 0, int flags = 0); ~ModuleSelectorFromList(); void set_module(); @@ -78,9 +78,13 @@ MidiAudioBuffer midiaudiobuffer; MaxLevel maxlevel; OscilloscopeAdapter oscilloscope; - ConvolverAdapter convolver; + ConvolverMonoAdapter mono_convolver; + ConvolverStereoAdapter stereo_convolver; CabinetConvolver cabinet; + PreampConvolver preamp; ContrastConvolver contrast; + // + LadspaLoader ladspaloader; public: GxEngine(const string& plugin_dir, ParamMap& param, ParameterGroups& groups, const gx_system::CmdlineOptions& options); ~GxEngine(); diff -Nru guitarix-0.22.4/src/headers/gx_faust_plugins.h guitarix-0.24.2/src/headers/gx_faust_plugins.h --- guitarix-0.22.4/src/headers/gx_faust_plugins.h 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/src/headers/gx_faust_plugins.h 2012-10-20 03:56:02.000000000 +0000 @@ -46,6 +46,7 @@ declare(gxamp16) declare(gxamp6) declare(gxamp18) +declare(gxnoamp) declare(gx_ampmodul) } @@ -84,6 +85,7 @@ declare(noise_shaper) declare(softclip) declare(bassbooster) +declare(highbooster) declare(gx_ampout) declare(gxfeed) declare(gx_outputlevel) @@ -92,6 +94,7 @@ declare(gx_distortion) declare(impulseresponse) declare(compressor) +declare(expander) declare(overdrive) declare(echo) declare(delay) diff -Nru guitarix-0.22.4/src/headers/gx_gui_helpers.h guitarix-0.24.2/src/headers/gx_gui_helpers.h --- guitarix-0.22.4/src/headers/gx_gui_helpers.h 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/src/headers/gx_gui_helpers.h 2012-10-20 03:56:02.000000000 +0000 @@ -41,6 +41,8 @@ int gx_message_popup(const char*); void show_error_msg(const string& msg); void child_set_property(Gtk::Container& container, Gtk::Widget& child, const char *property_name, bool value); +Glib::ustring logarithmic_format_value(double v, int prec); +int logarithmic_input_value(gpointer obj, gpointer nv); /* -------------------------------------------------------------------------- */ } /* end of gx_gui namespace */ diff -Nru guitarix-0.22.4/src/headers/gx_internal_plugins.h guitarix-0.24.2/src/headers/gx_internal_plugins.h --- guitarix-0.22.4/src/headers/gx_internal_plugins.h 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/src/headers/gx_internal_plugins.h 2012-10-20 03:56:02.000000000 +0000 @@ -224,8 +224,10 @@ static float* buffer; static unsigned int size; static void fill_buffer(int count, float *input0, float *output0, PluginDef*); + static int osc_register(const ParamReg& reg); static int activate(bool start, PluginDef *p); void change_buffersize(unsigned int); + int mul_buffer; public: Plugin plugin; sigc::signal activation; @@ -234,6 +236,8 @@ gx_ui::UiSignalBool visible; void clear_buffer(); inline float *get_buffer() { return buffer; } + int get_mul_buffer() { return mul_buffer; } + void set_mul_buffer(int a, unsigned int b) { mul_buffer = a; change_buffersize(b); } OscilloscopeAdapter(gx_ui::GxUI *ui, ModuleSequencer& engine); }; @@ -321,12 +325,8 @@ ** class ConvolverAdapter */ -#include "faust/jconv_post.h" -#include "faust/cabinet_impulse_former.h" -#include "faust/presence_level.h" - -class ConvolverAdapter: PluginDef { -private: +class ConvolverAdapter: protected PluginDef { +protected: GxConvolver conv; boost::mutex activate_mutex; EngineControl& engine; @@ -335,13 +335,7 @@ const gx_system::PathList& pathlist; std::string sys_ir_dir; bool activated; - jconv_post::Dsp jc_post; // wrapper for the rack order function pointers - static void convolver(int count, float *input0, float *input1, - float *output0, float *output1, PluginDef*); - static int activate(bool start, PluginDef *pdef); - static int convolver_register(const ParamReg& reg); - static void convolver_init(unsigned int samplingFreq, PluginDef *pdef); void change_buffersize(unsigned int size); sigc::signal settings_changed; GxJConvSettings jcset; @@ -368,6 +362,48 @@ /**************************************************************** + ** class ConvolverStereoAdapter + */ + +#include "faust/jconv_post.h" +#include "faust/jconv_post_mono.h" + +class ConvolverStereoAdapter: public ConvolverAdapter { +private: + jconv_post::Dsp jc_post; + // wrapper for the rack order function pointers + static void convolver_init(unsigned int samplingFreq, PluginDef *pdef); + static int activate(bool start, PluginDef *pdef); + static void convolver(int count, float *input0, float *input1, + float *output0, float *output1, PluginDef*); + static int convolver_register(const ParamReg& reg); +public: + ConvolverStereoAdapter(EngineControl& engine, sigc::slot sync, ParamMap& param, + const gx_system::PathList& pathlist, const std::string& sys_ir_dir); + ~ConvolverStereoAdapter(); +}; + + +/**************************************************************** + ** class ConvolverMonoAdapter + */ + +class ConvolverMonoAdapter: public ConvolverAdapter { +private: + jconv_post_mono::Dsp jc_post_mono; + // wrapper for the rack order function pointers + static void convolver_init(unsigned int samplingFreq, PluginDef *pdef); + static int activate(bool start, PluginDef *pdef); + static void convolver(int count, float *input, float *output, PluginDef*); + static int convolver_register(const ParamReg& reg); +public: + ConvolverMonoAdapter(EngineControl& engine, sigc::slot sync, ParamMap& param, + const gx_system::PathList& pathlist, const std::string& sys_ir_dir); + ~ConvolverMonoAdapter(); +}; + + +/**************************************************************** ** class BaseConvolver */ @@ -399,6 +435,8 @@ ** class CabinetConvolver */ +#include "faust/cabinet_impulse_former.h" + class CabinetConvolver: public BaseConvolver { private: int current_cab; @@ -425,9 +463,41 @@ /**************************************************************** + ** class PreampConvolver + */ + +#include "faust/preamp_impulse_former.h" + +class PreampConvolver: public BaseConvolver { +private: + int current_pre; + float level; + int preamp; + float bass; + float treble; + float sum; + value_pair *pre_names; + preamp_impulse_former::Dsp impf; + static void run_pre_conf(int count, float *input, float *output, PluginDef*); + static int register_pre(const ParamReg& reg); + bool do_update(); + virtual void check_update(); + virtual bool start(bool force = false); + bool preamp_changed() { return current_pre != preamp; } + void update_preamp() { current_pre = preamp; } + bool sum_changed() { return abs(sum - (level + bass + treble)) > 0.01; } + void update_sum() { sum = level + bass + treble; } +public: + PreampConvolver(EngineControl& engine, sigc::slot sync, gx_resample::BufferResampler& resamp); + ~PreampConvolver(); +}; + +/**************************************************************** ** class ContrastConvolver */ +#include "faust/presence_level.h" + class ContrastConvolver: public BaseConvolver { private: float level; @@ -445,4 +515,69 @@ ~ContrastConvolver(); }; + +/**************************************************************** + ** class LadspaLoader + */ + +enum widget_type { tp_scale, tp_scale_log, tp_toggle, tp_enum, tp_display, tp_display_toggle, tp_none, tp_int }; + +struct paradesc: boost::noncopyable { + int index; + std::string name; + float dflt; + float low; + float up; + float step; + widget_type tp; + bool newrow; + bool has_caption; + value_pair* values; + paradesc(): index(), name(), dflt(), low(), up(), step(), tp(), newrow(), has_caption(true), values() {} + ~paradesc(); + void set_valuelist(const std::vector& v); +}; + +enum quirkflag { need_activate = 1, no_cleanup = 2 }; + +struct plugdesc { + std::string path; + unsigned int index; + unsigned long UniqueID; + Glib::ustring Label; + Glib::ustring shortname; + Glib::ustring category; + int quirks; // quirkflag bits + int add_wet_dry; + int master_idx; + Glib::ustring master_label; + std::vector names; + std::string id_str; + ~plugdesc(); +}; + +class LadspaLoader { +public: + typedef std::vector pluginarray; +private: + pluginarray plugins; +private: + void read_module_config(const std::string& filename, plugdesc *p); + void read_module_list(const gx_system::CmdlineOptions& options, pluginarray& p); +public: + LadspaLoader(const gx_system::CmdlineOptions& options); + ~LadspaLoader(); + bool load(const gx_system::CmdlineOptions& options, pluginarray& p); + unsigned int size() { return plugins.size(); } + PluginDef *create(unsigned int idx) { return create(plugins[idx]); } + PluginDef *create(plugdesc *p); + pluginarray::iterator begin() { return plugins.begin(); } + pluginarray::iterator end() { return plugins.end(); } + pluginarray::iterator find(unsigned long uniqueid); + void set_plugins(pluginarray& new_plugins) { plugins = new_plugins; } + void update_instance(PluginDef *pdef, plugdesc *pdesc); + static std::string get_ladspa_filename(unsigned long uid) + { return "ladspa"+gx_system::to_string(uid)+".js"; } +}; + } // namespace gx_engine diff -Nru guitarix-0.22.4/src/headers/gx_jconv_settings.h guitarix-0.24.2/src/headers/gx_jconv_settings.h --- guitarix-0.22.4/src/headers/gx_jconv_settings.h 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/src/headers/gx_jconv_settings.h 2012-10-20 03:56:02.000000000 +0000 @@ -15,19 +15,6 @@ * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - * -------------------------------------------------------------------------- - * - * This is the JConv settings handler class used by guitarix - * There can only be one instance at all time. To get a pointer - * to the unique instance, simply call - * - * GxJConvSettings* jcset = GxJConvSettings::instance(); - * - * throughout the entire program. - * - * This class belongs to the gx_jconv namespace - * - * -------------------------------------------------------------------------- */ #pragma once @@ -58,7 +45,7 @@ gx_engine::ConvolverAdapter& convolver; Gtk::Window* gtk_window; sigc::connection autogain_conn; - static IRWindow *instance; + int nchan; // helper functions int set_val(Gxw::ControlParameter *sample_display, Gxw::ControlParameter *ms_display, @@ -124,7 +111,7 @@ Gtk::ToggleButton *wGain_correction; void on_gain_button_toggled(); - Gtk::Label *wSamples, *wSampleRate, *wFormat, *wFilename; + Gtk::Label *wSamples, *wSampleRate, *wFormat, *wChan, *wFilename; Gtk::Widget *wChannelbox; void on_help_clicked(); @@ -137,7 +124,7 @@ void init_connect(const gx_preset::GxSettings& gx_settings); IRWindow(const Glib::RefPtr& builder, gx_engine::ConvolverAdapter &convolver, Glib::RefPtr icon, const gx_preset::GxSettings& gx_settings, - Glib::RefPtr accels); + Glib::RefPtr accels, int nchan); ~IRWindow(); class ModelColumns : public Gtk::TreeModel::ColumnRecord { @@ -155,7 +142,7 @@ void reload_and_show(); static IRWindow *create(gx_ui::GxUI& ui, gx_engine::ConvolverAdapter& convolver, Glib::RefPtr icon, const gx_preset::GxSettings& settings, - Glib::RefPtr accels); + Glib::RefPtr accels, int nchan); friend class JConvPopup; }; diff -Nru guitarix-0.22.4/src/headers/gx_main_boxes.h guitarix-0.24.2/src/headers/gx_main_boxes.h --- guitarix-0.22.4/src/headers/gx_main_boxes.h 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/src/headers/gx_main_boxes.h 2012-10-20 03:56:02.000000000 +0000 @@ -47,6 +47,8 @@ namespace gx_gui { +void set_accessible(GtkWidget *widget,GtkLabel *label); + /****************************************************************/ class UiSwitch: public Gxw::Switch { diff -Nru guitarix-0.22.4/src/headers/gx_main_interface.h guitarix-0.24.2/src/headers/gx_main_interface.h --- guitarix-0.22.4/src/headers/gx_main_interface.h 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/src/headers/gx_main_interface.h 2012-10-20 03:56:02.000000000 +0000 @@ -47,6 +47,7 @@ #include #include #include +#include #include #include #include @@ -80,6 +81,7 @@ class UiRegler: gx_ui::GxUiItemFloat, protected Gtk::Adjustment { protected: Gxw::Regler *m_regler; + bool log_display; void on_value_changed(); virtual void reflectZone(); public: @@ -97,7 +99,7 @@ public: UiSelectorBase(gx_engine::Parameter& param); void set_name(Glib::ustring n) { m_selector.set_name(n); } - GtkWidget *get_widget() { return GTK_WIDGET(m_selector.gobj()); } + virtual GtkWidget *get_widget() { return GTK_WIDGET(m_selector.gobj()); } }; template @@ -110,6 +112,43 @@ ~UiSelector(); }; +template +UiSelector::~UiSelector() { +} + +template +class UiSelectorWithCaption: public UiSelector { +private: + Gtk::Label m_label; + Gtk::VBox m_box; +public: + static GtkWidget* create(gx_ui::GxUI& ui, string id, const char *label); + UiSelectorWithCaption(gx_ui::GxUI& ui, gx_engine::ParameterV ¶m, const char *label); + ~UiSelectorWithCaption(); + virtual GtkWidget *get_widget() { return GTK_WIDGET(m_box.gobj()); } +}; + +template +UiSelectorWithCaption::UiSelectorWithCaption(gx_ui::GxUI& ui, gx_engine::ParameterV ¶m, const char *label) + : UiSelector(ui, param) { + if (label) { + m_label.set_text(label); + } else { + m_label.set_text(param.l_name()); + } + m_label.set_name("rack_label"); + m_label.set_justify(Gtk::JUSTIFY_CENTER); + m_box.set_name(param.id()); + m_box.pack_start(m_label, Gtk::PACK_SHRINK); + m_box.pack_start(UiSelectorBase::m_selector, Gtk::PACK_EXPAND_PADDING); + set_accessible(GTK_WIDGET(UiSelectorBase::m_selector.gobj()),m_label.gobj()); + m_box.show_all(); +} + +template +UiSelectorWithCaption::~UiSelectorWithCaption() { +} + /****************************************************************/ class UiReglerWithCaption: public UiRegler { diff -Nru guitarix-0.22.4/src/headers/gx_main_window.h guitarix-0.24.2/src/headers/gx_main_window.h --- guitarix-0.22.4/src/headers/gx_main_window.h 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/src/headers/gx_main_window.h 2012-10-20 03:56:02.000000000 +0000 @@ -263,11 +263,30 @@ void display_new(bool unordered = false); inline bool is_displayed(); void set_ui_merge_id(Gtk::UIManager::ui_merge_id id) { merge_id = id; } + void unset_ui_merge_id(Glib::RefPtr uimanager); void set_action(Glib::RefPtr& act); + Glib::RefPtr get_action() { return action; } static bool is_registered(gx_engine::PluginList& pl, const char *name); virtual void on_plugin_preset_popup(); + inline const char *get_category() { + const char *cat = plugin->pdef->category; + return (cat && *cat) ? cat : "External"; + } + inline const char *get_shortname() const { + const char *name = shortname; + if (!name) { + name = plugin->pdef->shortname; + } + if (!name || !*name) { + name = get_name(); + } + return name; + } + void update_rackbox(); + friend bool plugins_by_name_less(PluginUI *a, PluginUI *b); }; +bool plugins_by_name_less(PluginUI *a, PluginUI *b); /**************************************************************** ** class PluginDict @@ -280,7 +299,9 @@ typedef std::map::iterator iterator; PluginDict(gx_ui::GxUI& ui_): std::map(), ui(ui_) {} ~PluginDict(); + void cleanup(); void add(PluginUI *p) { insert(pair(p->get_id(), p)); } + void remove(PluginUI *p); PluginUI *operator[](const std::string& s) { return find(s)->second; } using std::map::begin; using std::map::end; @@ -342,7 +363,7 @@ gx_gui::uiToggle toggle_on_off; private: static void set_paintbox(Gxw::PaintBox& pb, PluginType tp); - static Gtk::Widget *make_label(const PluginUI& plugin, gx_system::CmdlineOptions& options, bool useshort=false); + static Gtk::Widget *make_label(const PluginUI& plugin, gx_system::CmdlineOptions& options, bool useshort=true); static Gtk::Widget *make_bar(int left=4, int right=4, bool sens=false); Gtk::Widget *wrap_bar(int left=4, int right=4, bool sens=false); void init_dnd(); @@ -373,7 +394,7 @@ const char *get_id() const { return plugin.get_id(); } void set_config_mode(bool mode); void swtch(bool mini); - void pack(Gtk::Widget *mainbox, Gtk::Widget *minibox); + void pack(Gtk::Widget *mainbox, Gtk::Widget *minibox, const Glib::RefPtr& szg); void animate_insert(); static Gtk::Widget *create_icon_widget(const PluginUI& plugin, gx_system::CmdlineOptions& options); void setOrder(int pos, unsigned int post_pre) { @@ -472,37 +493,6 @@ /**************************************************************** - ** class StackBoxBuilderNew - */ - -class StackBoxBuilderNew: public gx_gui::StackBoxBuilder { -private: - int fTop; - GtkWidget* fBox[stackSize]; - int fMode[stackSize]; - gx_engine::GxEngine& engine; - gx_preset::GxSettings& gx_settings; - Gxw::WaveView& fWaveView; - Gtk::Label& convolver_filename_label; - Gtk::HBox *widget; -private: - virtual void openMonoRackBox(const char* label, int* posit, const char *id_on_off, const char *id_pre_post, const char *id_dialog); - virtual void closeMonoRackBox(); - virtual void openStereoRackBox(const char* label, int* posit, const char *id_on_off, const char *id_dialog); - virtual void closeStereoRackBox(); - virtual void openVerticalMidiBox(const char* label = ""); -public: - StackBoxBuilderNew(gx_engine::GxEngine& engine_, gx_preset::GxSettings& gx_settings_, - Gxw::WaveView &fWaveView_, Gtk::Label &convolver_filename_label_, gx_ui::GxUI& ui, - Glib::RefPtr window_icon); - void set_accelgroup(Glib::RefPtr accels_) { accels = accels_; } - void get_box(const std::string& name, Gtk::Widget*& mainbox, Gtk::Widget*& minibox); - void prepare(); - void fetch(Gtk::Widget*& mainbox, Gtk::Widget*& minibox); -}; - - -/**************************************************************** ** class TextLoggingBox */ @@ -612,7 +602,9 @@ Glib::RefPtr compress; Glib::RefPtr expand; Glib::RefPtr jack_latency_menu; + Glib::RefPtr osc_buffer_menu; Glib::RefPtr jackstartup; + Glib::RefPtr loadladspa; Glib::RefPtr rack_config; Glib::RefPtr live_play; @@ -639,6 +631,7 @@ Glib::RefPtr skin; Glib::RefPtr latency; + Glib::RefPtr osc_buffer_size; // preset window Glib::RefPtr new_bank; @@ -655,6 +648,7 @@ static int mainwin_height; static int window_height; static int preset_window_height; + static int mul_buffer; Freezer freezer; PluginDict plugin_dict; int oldpos; @@ -678,8 +672,9 @@ PresetWindow *preset_window; Gxw::WaveView fWaveView; Gtk::Label convolver_filename_label; + Gtk::Label convolver_mono_filename_label; Glib::RefPtr gx_head_icon; - StackBoxBuilderNew boxbuilder; + gx_gui::StackBoxBuilder boxbuilder; gx_portmap::PortMapWindow* portmap_window; static int skin; static bool no_warn_latency; @@ -704,6 +699,9 @@ Glib::RefPtr gx_head_warn; GxActions actions; KeySwitcher keyswitch; + std::map groupmap; + ladspa::PluginDisplay *ladspalist_window; + Glib::RefPtr szg_rack_units; // Widget pointers Gxw::PaintBox *tunerbox; @@ -796,7 +794,7 @@ bool on_ti_button_press(GdkEventButton *ev, const char *effect_id); void on_tp_drag_data_received(const Glib::RefPtr& context, int x, int y, const Gtk::SelectionData& data, int info, int timestamp); void fill_pluginlist(); - void make_icons(); + void make_icons(bool force=true); bool update_all_gui(); void jack_connection(); void on_miditable_toggle(); @@ -812,7 +810,11 @@ void user_disable_latency_warn(Gtk::CheckButton* disable_warn); int gx_wait_latency_warn(); void set_latency(); + void set_osc_size(); + void add_osc_size_menu(); + void change_osc_buffer(Glib::RefPtr action); void on_select_jack_control(); + void on_load_ladspa(); void delete_select_jack_control(); void on_log_activate(); void do_program_change(int pgm); @@ -850,6 +852,13 @@ void on_show_midi_out(); void on_show_midi_out_plug(); void on_midi_out_channel_toggled(Gtk::RadioButton *rb, Gtk::Container *c); + Gtk::ToolItemGroup *add_plugin_category(const char *cat, bool collapse = true); + Glib::ustring add_plugin_menu_entry(PluginUI *pui); + void register_plugin(PluginUI *pui); + void on_ladspa_finished(bool reload, bool quit); + bool delete_ladspalist_window(); + bool on_quit(); + void amp_controls_visible(Gtk::Range *rr); public: MainWindow(gx_engine::GxEngine& engine, gx_system::CmdlineOptions& options, gx_engine::ParamMap& pmap, Gtk::Window *splash); @@ -869,13 +878,14 @@ gx_engine::ParamMap& get_parametermap() { return pmap; } gx_engine::GxEngine& get_engine() { return engine; } bool is_loading() { return gx_settings.is_loading(); } - void add_plugin(std::vector *p, const char *id, const Glib::ustring& fname_="", const Glib::ustring& tooltip_=""); + void add_plugin(std::vector& p, const char *id, const Glib::ustring& fname_="", const Glib::ustring& tooltip_=""); void set_rackbox_expansion(); double stop_at_stereo_bottom(double off, double step_size, double pagesize); double stop_at_mono_top(double off, double step_size); bool use_animations() { return actions.animations->get_active(); } void create_default_scratch_preset() { gx_settings.create_default_scratch_preset(); } void resize_finished(RackContainer *ch); + void update_width(); }; inline bool RackContainer::check_if_animate(const RackBox& rackbox) { return main.use_animations(); } diff -Nru guitarix-0.22.4/src/headers/gx_parameter.h guitarix-0.24.2/src/headers/gx_parameter.h --- guitarix-0.22.4/src/headers/gx_parameter.h 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/src/headers/gx_parameter.h 2012-10-20 03:56:02.000000000 +0000 @@ -68,6 +68,14 @@ debug_check(group_is_new, id); groups.insert(pair(id, group)); } + inline void erase(const string& id) { +#ifndef NDEBUG // avoid unused variable warning in release mode + size_t n = groups.erase(id); + assert(n == 1); +#else + groups.erase(id); +#endif + } #ifndef NDEBUG void dump(); #endif @@ -102,10 +110,12 @@ enum ctrl_type { None, Continuous, Switch, Enum }; protected: enum value_type { tp_float, tp_int, tp_uint, tp_bool, tp_switch, tp_file, tp_string, tp_special }; + enum display_flags { dtp_normal, dtp_log = 1 }; string _id; string _name, _group, _desc; enum value_type v_type : 3; enum ctrl_type c_type : 3; + unsigned int d_flags : 2; bool save_in_preset : 1; bool controllable : 1; bool own_var : 1; @@ -121,6 +131,7 @@ _group(param_group(id)), v_type(vtp), c_type(ctp), + d_flags(0), save_in_preset(preset), controllable(ctrl), own_var(false), @@ -156,6 +167,8 @@ const string& desc() const { return _desc; } void set_desc(const string& desc) { _desc = desc; } string l_desc() const { return gettext(_desc.c_str()); } + void set_log_display() { d_flags |= dtp_log; } + bool is_log_display() { return d_flags & dtp_log; } bool operator==(const Parameter& p) const { return &p == this; } virtual void *zone() = 0; virtual void stdJSON_value() = 0; @@ -223,11 +236,11 @@ virtual float getUpperAsFloat() const; virtual float getStepAsFloat() const; ParameterV(const string& id, const string& name, ctrl_type ctp, bool preset, - float *v, float sv, float lv, float uv, float tv, bool ctrl): + float *v, float sv, float lv, float uv, float tv, bool ctrl, bool no_init): Parameter(id, name, tp_float, ctp, preset, ctrl), value(v ? v : new float()), std_value(sv),lower(lv),upper(uv),step(tv) { own_var = !v; - *value = sv; + set(no_init ? *value : sv); } #ifndef NDEBUG friend void compare_parameter(const char* title, Parameter* p1, @@ -236,7 +249,6 @@ ~ParameterV(); }; - /****************************************************************/ class FloatEnumParameter: public FloatParameter { @@ -247,7 +259,7 @@ virtual void readJSON_value(gx_system::JsonParser& jp); virtual const value_pair *getValueNames() const; FloatEnumParameter(const string& id, const string& name, const value_pair* vn, bool preset, float *v, - int sv, bool ctrl); + int sv, int low, bool ctrl, bool no_init); }; /****************************************************************/ @@ -527,6 +539,7 @@ private: map id_map; map addr_map; + bool replace_mode; #ifndef NDEBUG void unique_zone(Parameter* param); void unique_id(Parameter* param); @@ -546,6 +559,7 @@ bool hasZone(const void *p) const { return addr_map.find(p) != addr_map.end(); } bool hasId(const string& id) const { return id_map.find(id) != id_map.end(); } bool hasId(const char *p) const { return id_map.find(p) != id_map.end(); } + void set_replace_mode(bool mode) { replace_mode = mode; } Parameter& operator[](const void *p) { debug_check(check_addr, p); return *addr_map[p]; @@ -561,20 +575,21 @@ void set_init_values(); void reset_unit(Glib::ustring group_id) const; bool unit_has_std_values(Glib::ustring group_id) const; + void unregister(const string& id); inline FloatParameter *reg_par(const string& id, const string& name, float *var, float std, float lower, float upper, float step) { - FloatParameter *p = new FloatParameter(id, name, Parameter::Continuous, true, var, std, lower, upper, step, true); + FloatParameter *p = new FloatParameter(id, name, Parameter::Continuous, true, var, std, lower, upper, step, true, replace_mode); insert(p); return p; } inline FloatParameter *reg_par_non_preset( const string& id, const string& name, float *var, float std, float lower, float upper, float step) { - FloatParameter *p = new FloatParameter(id, name, Parameter::Continuous, false, var, std, lower, upper, step, false); + FloatParameter *p = new FloatParameter(id, name, Parameter::Continuous, false, var, std, lower, upper, step, false, replace_mode); insert(p); return p; } inline FloatParameter *reg_par(const string& id, const string& name, float *var, float std = 0) { - FloatParameter *p = new FloatParameter(id, name, Parameter::Switch, true, var, std, 0, 1, 1, true); + FloatParameter *p = new FloatParameter(id, name, Parameter::Switch, true, var, std, 0, 1, 1, true, replace_mode); insert(p); return p; } @@ -598,8 +613,8 @@ } inline FloatEnumParameter *reg_enum_par(const string& id, const string& name, const value_pair *vl, float *var, - int std = 0) { - FloatEnumParameter *p = new FloatEnumParameter(id, name, vl, true, var, std, true); + int std = 0, int low = 0) { + FloatEnumParameter *p = new FloatEnumParameter(id, name, vl, true, var, std, low, true, replace_mode); insert(p); return p; } @@ -621,7 +636,7 @@ } inline FloatParameter *reg_non_midi_par(const string& id, float *val, bool preset, float std = 0, float lower = 0, float upper = 1, float step = 0) { - FloatParameter *p = new FloatParameter(id, "", Parameter::None, preset, val, std, lower, upper, step, false); + FloatParameter *p = new FloatParameter(id, "", Parameter::None, preset, val, std, lower, upper, step, false, replace_mode); insert(p); return p; } diff -Nru guitarix-0.22.4/src/headers/gx_plugin.h guitarix-0.24.2/src/headers/gx_plugin.h --- guitarix-0.22.4/src/headers/gx_plugin.h 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/src/headers/gx_plugin.h 2012-10-20 03:56:02.000000000 +0000 @@ -28,7 +28,7 @@ #define _GX_PLUGIN_H // forward declarations (need not be resolved for plugin definition) -class PluginDef; +struct PluginDef; /* ** helper class for PluginDef::load_ui @@ -37,6 +37,8 @@ struct UiBuilder { PluginDef *plugin; void (*openVerticalBox)(const char* label); + void (*openVerticalBox1)(const char* label); + void (*openVerticalBox2)(const char* label); void (*openHorizontalBox)(const char* label); void (*openHorizontalhideBox)(const char* label); void (*closeBox)(); @@ -47,7 +49,14 @@ // prefix or change the checker void (*create_master_slider)(const char *id, const char *label); void (*create_small_rackknob)(const char *id, const char *label); - void (*create_selector)(const char *id); + void (*create_selector_no_caption)(const char *id); + void (*create_switch_no_caption)(const char *sw_type,const char * id); + void (*create_spin_value)(const char * id, const char *label); + void (*create_port_display)(const char * id, const char *label); + void (*create_switch)(const char *sw_type,const char * id, const char *label); + void (*create_selector)(const char *id, const char *label); + void (*create_small_rackknobr)(const char *id, const char *label); + void (*insertSpacer)(); //FIXME add missing functions }; @@ -114,7 +123,7 @@ }; #define PLUGINDEF_VERMAJOR_MASK 0xff00 -#define PLUGINDEF_VERSION 0x0400 +#define PLUGINDEF_VERSION 0x0500 struct PluginDef { int version; // = PLUGINDEF_VERSION @@ -124,6 +133,9 @@ const char* name; // displayed name (not translated) (may be 0) const char** groups; // list of alternating group_id, group_name (not translated) // may be 0 (else end with 0 entry) + const char* description; // description (tooltip) + const char* category; + const char* shortname; // maximal one of mono_audio, stereo_audio must be set // all function pointers in PluginDef can be independently set to 0 diff -Nru guitarix-0.22.4/src/headers/gx_pluginloader.h guitarix-0.24.2/src/headers/gx_pluginloader.h --- guitarix-0.22.4/src/headers/gx_pluginloader.h 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/src/headers/gx_pluginloader.h 2012-10-20 03:56:02.000000000 +0000 @@ -61,6 +61,31 @@ }; /**************************************************************** + ** class ParamRegImpl + */ + +class ParamRegImpl: public ParamReg { +private: + static gx_engine::ParamMap *pmap; + static float *registerVar_(const char* id, const char* name, const char* tp, + const char* tooltip, float* var, float val, + float low, float up, float step); + static void registerBoolVar_(const char* id, const char* name, const char* tp, + const char* tooltip, bool* var, bool val); + static void registerNonMidiVar_(const char * id, bool*var, bool preset, bool nosave); + static void registerEnumVar_(const char *id, const char* name, const char* tp, + const char* tooltip, const value_pair* values, float *var, float val, + float low, float up, float step); + static void registerIEnumVar_(const char *id, const char* name, const char* tp, + const char* tooltip, const value_pair* values, int *var, int val); + static void registerUEnumVar_(const char *id, const char* name, const char* tp, + const char* tooltip, const value_pair* values, + unsigned int *var, unsigned int std); +public: + ParamRegImpl(gx_engine::ParamMap* pm); +}; + +/**************************************************************** ** class PluginList ** container of plugins for all processing chains */ @@ -75,6 +100,11 @@ typedef PluginDef *(*plugindef_creator)(); +class RackChangerUiItemBase: public gx_ui::GxUiItem { +public : + virtual void *zone() = 0; +}; + class PluginList { public: typedef pair map_pair; @@ -87,13 +117,13 @@ pluginmap pmap; EngineControl& seq; gx_ui::GxUI& ui; - list rackchanger; + list rackchanger; int plugin_pos[PLUGIN_POS_COUNT]; - Plugin *find_plugin(const char *id) const; int add_module(Plugin *pl, PluginPos pos, int flags); public: PluginList(gx_ui::GxUI& ui, EngineControl& seq); ~PluginList(); + Plugin *find_plugin(const char *id) const; Plugin *lookup_plugin(const char *id) const; void set_samplerate(int samplerate); // call set_samplerate of all plugins int* pos_var(const char *id); // return the position of the plugin @@ -104,8 +134,15 @@ int add(PluginDef *p, PluginPos pos = PLUGIN_POS_RACK, int flags=0); int add(PluginDef **p, PluginPos pos = PLUGIN_POS_RACK, int flags=0); int add(plugindef_creator *p, PluginPos pos = PLUGIN_POS_RACK, int flags=0); + void delete_module(Plugin *pl, ParamMap& param, ParameterGroups& groups); int check_version(PluginDef *p); - void registerParameter(gx_engine::ParamMap& param, gx_engine::ParameterGroups& groups); + void registerGroup(PluginDef *pd, ParameterGroups& groups); + void registerParameter(Plugin *pl, ParamMap& param, ParamRegImpl& preg); + void registerPlugin(Plugin *pl, ParamMap& param, ParameterGroups& groups); + void unregisterGroup(PluginDef *pd, ParameterGroups& groups); + void unregisterParameter(Plugin *pl, ParamMap& param); + void unregisterPlugin(Plugin *pl, ParamMap& param, ParameterGroups& groups); + void registerAllPlugins(gx_engine::ParamMap& param, gx_engine::ParameterGroups& groups); void append_rack(UiBuilderBase& ui); void ordered_mono_list(list& mono, int mode); void ordered_stereo_list(list& stereo, int mode); diff -Nru guitarix-0.22.4/src/headers/gx_preset.h guitarix-0.24.2/src/headers/gx_preset.h --- guitarix-0.22.4/src/headers/gx_preset.h 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/src/headers/gx_preset.h 2012-10-20 03:56:02.000000000 +0000 @@ -119,6 +119,7 @@ inline gx_system::CmdlineOptions& get_options() const { return options; } static bool check_settings_dir(gx_system::CmdlineOptions& opt, bool *need_new_preset); void loadstate(); + bool get_auto_save_state() { return no_autosave;} void disable_autosave(bool v) { no_autosave = v; } void auto_save_state(); Glib::RefPtr load_plugin_preset_list(const Glib::ustring& id, bool factory) const; diff -Nru guitarix-0.22.4/src/headers/gx_preset_window.h guitarix-0.24.2/src/headers/gx_preset_window.h --- guitarix-0.22.4/src/headers/gx_preset_window.h 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/src/headers/gx_preset_window.h 2012-10-20 03:56:02.000000000 +0000 @@ -65,7 +65,7 @@ using Gtk::TreeView::on_drag_motion; }; -class GxActions; +struct GxActions; class PresetWindow: public sigc::trackable { private: diff -Nru guitarix-0.22.4/src/headers/gx_stackbox_builder.h guitarix-0.24.2/src/headers/gx_stackbox_builder.h --- guitarix-0.22.4/src/headers/gx_stackbox_builder.h 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/src/headers/gx_stackbox_builder.h 2012-10-20 03:56:02.000000000 +0000 @@ -1,3 +1,21 @@ +/* + * Copyright (C) 2011, 2012 Andreas Degert, Hermann Meyer + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + #include "guitarix.h" // NOLINT #include // NOLINT @@ -20,14 +38,16 @@ #define kTabMode 2 class StackBoxBuilder { -protected: - int& fTop; - GtkWidget* (&fBox)[stackSize]; - gx_engine::GxEngine& engine; - const gx_preset::GxSettings& gx_settings; - int (&fMode)[stackSize]; - Gxw::WaveView& fWaveView; - Gtk::Label& convolver_filename_label; +private: + int fTop; + GtkWidget* fBox[stackSize]; + int fMode[stackSize]; + gx_engine::GxEngine& engine; + gx_preset::GxSettings& gx_settings; + Gxw::WaveView& fWaveView; + Gtk::Label& convolver_filename_label; + Gtk::Label& convolver_mono_filename_label; + Gtk::HBox *widget; gx_ui::GxUI& ui; Glib::RefPtr accels; Glib::RefPtr window_icon; @@ -37,35 +57,32 @@ static const gboolean homogene = false; void loadRackFromGladeData(const char *xmldesc); void set_convolver_filename(); -protected: - virtual void openMonoRackBox(const char* label, int* posit, const char *id_on_off, const char *id_pre_post, const char *id_dialog) = 0; - virtual void closeMonoRackBox() = 0; - virtual void openStereoRackBox(const char* label, int* posit, const char *id_on_off, const char *id_dialog) = 0; - virtual void closeStereoRackBox() = 0; - virtual void openVerticalMidiBox(const char* label = "") = 0; + void set_convolver_mono_filename(); +private: + void openVerticalMidiBox(const char* label = ""); // functions used in interfaces void create_master_slider(string id) { - addwidget(UiRackMasterRegler::create(ui, new Gxw::HSlider(), id)); - } + addwidget(UiRackMasterRegler::create(ui, new Gxw::HSlider(), id)); + } void create_master_slider(string id, Glib::ustring(label)) { - addwidget(UiRackMasterRegler::create(ui, new Gxw::HSlider(), id, label)); - } + addwidget(UiRackMasterRegler::create(ui, new Gxw::HSlider(), id, label)); + } void closeBox(); void openSpaceBox(const char* label = ""); void create_small_rackknob(string id) { - addwidget(UiRackReglerWithCaption::create(ui, new Gxw::SmallKnob(), id)); - } + addwidget(UiRackReglerWithCaption::create(ui, new Gxw::SmallKnob(), id)); + } void create_small_rackknob(string id, Glib::ustring label) { - addwidget(UiRackReglerWithCaption::create(ui, new Gxw::SmallKnob(), id, label)); - } + addwidget(UiRackReglerWithCaption::create(ui, new Gxw::SmallKnob(), id, label)); + } void create_small_rackknobr(string id) { - addwidget(UiRackReglerWithCaption::create(ui, new Gxw::SmallKnobR(), id)); - } + addwidget(UiRackReglerWithCaption::create(ui, new Gxw::SmallKnobR(), id)); + } void create_small_rackknobr(string id, Glib::ustring label) { - addwidget(UiRackReglerWithCaption::create(ui, new Gxw::SmallKnobR(), id, label)); - } + addwidget(UiRackReglerWithCaption::create(ui, new Gxw::SmallKnobR(), id, label)); + } void openVerticalBox(const char* label = ""); void openFrameBox(const char* label); @@ -74,25 +91,61 @@ void openVerticalHideBox(const char* label = ""); void openHorizontalhideBox(const char* label = ""); void openHorizontalTableBox(const char* label); - void create_switch_no_caption(const char *sw_type, string id) { - addwidget(UiSwitch::create(ui, sw_type, id)); - } + void create_switch_no_caption(const char *sw_type, const string& id) { + addwidget(UiSwitch::create(ui, sw_type, id)); + } + void create_switch(const char *sw_type, const string& id, const char *label, Gtk::PositionType pos) { + if (label) { + addwidget(UiSwitchWithCaption::create(ui, sw_type, id, label, pos)); + } else { + addwidget(UiSwitchWithCaption::create(ui, sw_type, id, pos)); + } + } void openpaintampBox(const char* label = ""); void create_wheel(string id, bool show_value = false) { - addwidget(UiRegler::create(ui, new Gxw::Wheel(), id, show_value)); - } - void create_spin_value(string id) { - addwidget(UiRegler::create(ui, new Gxw::ValueDisplay(), id, true)); - } - void create_simple_spin_value(string id) { - addwidget(UiRegler::create(ui, new Gxw::SimpleValueDisplay(), id, true)); - } + addwidget(UiRegler::create(ui, new Gxw::Wheel(), id, show_value)); + } + void create_spin_value(const std::string& id, const char *label) { + GtkWidget *w; + Gxw::ValueDisplay *v = new Gxw::ValueDisplay(); + if (label) { + w = UiRackReglerWithCaption::create(ui, v, id, label); + } else { + w = UiRackReglerWithCaption::create(ui, v, id); + } + v->set_name("show_always"); + addwidget(w); + } + void create_simple_spin_value(const std::string& id, const char *label = 0) { + GtkWidget *w; + Gxw::SimpleValueDisplay *v = new Gxw::SimpleValueDisplay(); + if (label) { + w = UiRackReglerWithCaption::create(ui, v, id, label); + } else { + w = UiRackRegler::create(ui, v, id); + } + v->set_name("show_always"); + addwidget(w); + } void create_eq_rackslider_no_caption(string id) { - addwidget(UiRackRegler::create(ui, new Gxw::EqSlider(), id)); - } + addwidget(UiRackRegler::create(ui, new Gxw::EqSlider(), id)); + } + void create_port_display(string id, const char *label) { + if (label) { + if (*label) { + addwidget(UiRackReglerWithCaption::create(ui, new Gxw::PortDisplay(), id, label)); + } else { + addwidget(UiRackRegler::create(ui, new Gxw::PortDisplay(), id)); + } + } else { + addwidget(UiRackReglerWithCaption::create(ui, new Gxw::PortDisplay(), id)); + } + } void create_selector(string id, const char *widget_name=0); + void create_selector_with_caption(string id, const char *label); void openFlipLabelBox(const char* = ""); void openVerticalBox1(const char* label = ""); + void openVerticalBox2(const char* label = ""); void openPaintBox2(const char* label = ""); void openTabBox(const char* label = ""); void addCheckButton(string id, const char* label = 0); @@ -101,10 +154,11 @@ void addStatusDisplay(const char* label, bool* zone ); void addSmallJConvFavButton(const char* label, gx_jconv::IRWindow *irw); void openSetLabelBox(); + void openSetMonoLabelBox(); void addJConvFavButton(const char* label, gx_jconv::IRWindow *irw); void addJConvButton(const char* label, gx_jconv::IRWindow *irw); void addJToggleButton(const char* label, bool* zone); -protected: +private: // functions used indirectly void pushBox(int mode, GtkWidget* w); GtkWidget* addWidget(const char* label, GtkWidget* w); @@ -119,14 +173,18 @@ void addCheckButton(const char* label, bool* zone); void addNumEntry(const char* label, float* zone, float init, float min, float max, float step); void addMToggleButton(const char* label, bool* zone); + friend class UiBuilderImpl; public: StackBoxBuilder( - int& fTop_, GtkWidget*(&fBox_)[stackSize], gx_engine::GxEngine& engine_, - gx_preset::GxSettings& gx_settings_, int (&fMode_)[stackSize], - Gxw::WaveView &fWaveView_, Gtk::Label &convolver_filename_label_, gx_ui::GxUI& ui, + gx_engine::GxEngine& engine_, gx_preset::GxSettings& gx_settings_, + Gxw::WaveView &fWaveView_, Gtk::Label &convolver_filename_label_, + Gtk::Label& convolver_mono_filename_label_, gx_ui::GxUI& ui, Glib::RefPtr window_icon); ~StackBoxBuilder(); - friend class UiBuilderImpl; + void set_accelgroup(Glib::RefPtr accels_) { accels = accels_; } + void get_box(const std::string& name, Gtk::Widget*& mainbox, Gtk::Widget*& minibox); + void prepare(); + void fetch(Gtk::Widget*& mainbox, Gtk::Widget*& minibox); // mono void make_rackbox_ampdetail(); void make_rackbox_overdrive(); @@ -140,6 +198,7 @@ void make_rackbox_gx_distortion(); void make_rackbox_IR(); void make_rackbox_compressor(); + void make_rackbox_expander(); void make_rackbox_biquad(); void make_rackbox_tremolo(); void make_rackbox_phaser_mono(); @@ -148,6 +207,9 @@ void make_rackbox_feedback(); void make_rackbox_amp_tonestack(); void make_rackbox_cab(); + void make_rackbox_pre(); + void make_rackbox_jconv_mono(); + void make_rackbox_highbooster(); void make_rackbox_midi_out(); // stereo void make_rackbox_chorus(); diff -Nru guitarix-0.22.4/src/headers/gx_system.h guitarix-0.24.2/src/headers/gx_system.h --- guitarix-0.22.4/src/headers/gx_system.h 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/src/headers/gx_system.h 2012-10-20 03:56:02.000000000 +0000 @@ -262,14 +262,19 @@ /****************************************************************/ class PathList { +public: + typedef std::list< Glib::RefPtr > pathlist; + typedef std::list< Glib::RefPtr >::const_iterator iterator; private: - typedef list< Glib::RefPtr > pathlist; pathlist dirs; public: - PathList(): dirs() {} + PathList(const char *env_name = 0); void add(const string& d) { dirs.push_back(Gio::File::create_for_path(d)); } bool contains(const string& d) const; bool find_dir(string *d, const string& filename) const; + size_t size() { return dirs.size(); } + iterator begin() { return dirs.begin(); } + iterator end() { return dirs.end(); } }; /**************************************************************** @@ -292,6 +297,8 @@ vector jack_outputs; Glib::ustring jack_uuid; Glib::ustring jack_uuid2; + bool jack_noconnect; + Glib::ustring jack_servername; string load_file; string builder_dir; string style_dir; @@ -306,6 +313,7 @@ PathList IR_pathlist; Glib::ustring rcset; bool lterminal; + bool a_save; static CmdlineOptions *instance; void make_ending_slash(string& dirpath); string get_opskin(); @@ -326,6 +334,7 @@ string get_builder_filepath(const string& basename) const { return builder_dir + basename; } string get_user_filepath(const string& basename) const { return user_dir + basename; } string get_preset_filepath(const string& basename) const { return preset_dir + basename; } + string get_plugin_filepath(const string& basename) const { return plugin_dir + basename; } string get_factory_filepath(const string& basename) const { return factory_dir + basename; } string get_pluginpreset_filepath(const string& id) const { return pluginpreset_dir + id; } const string& get_user_dir() const { return user_dir; } @@ -342,6 +351,9 @@ const Glib::ustring& get_jack_uuid2() const { return jack_uuid2; } const Glib::ustring& get_jack_midi() const { return jack_midi; } const Glib::ustring& get_jack_input() const { return jack_input; } + const Glib::ustring& get_jack_servername() const { return jack_servername; } + bool get_jack_noconnect() const { return jack_noconnect; } + bool get_opt_auto_save() const { return a_save; } const PathList& get_IR_pathlist() const { return IR_pathlist; } Glib::ustring get_jack_output(unsigned int n) const; }; @@ -448,6 +460,7 @@ */ int gx_system_call(const string&, bool devnull = false, bool escape = false); +void strip(Glib::ustring& s); template inline string to_string(const T& t) { diff -Nru guitarix-0.22.4/src/headers/gx_ui.h guitarix-0.24.2/src/headers/gx_ui.h --- guitarix-0.22.4/src/headers/gx_ui.h 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/src/headers/gx_ui.h 2012-10-20 03:56:02.000000000 +0000 @@ -67,6 +67,10 @@ virtual ~GxUI(); // public methods +#ifndef NDEBUG + static size_t zoneCount(void *zone); +#endif + static void zapZone(void *zone); void registerZone(void*, GxUiItem*); void unregisterZone(void* z, GxUiItem* c); void updateAllZones(bool force = false); diff -Nru guitarix-0.22.4/src/headers/gx_ui_builder.h guitarix-0.24.2/src/headers/gx_ui_builder.h --- guitarix-0.22.4/src/headers/gx_ui_builder.h 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/src/headers/gx_ui_builder.h 2012-10-20 03:56:02.000000000 +0000 @@ -25,6 +25,9 @@ #ifndef SRC_HEADERS_GX_UI_BUILDER_H_ #define SRC_HEADERS_GX_UI_BUILDER_H_ +class PluginUI; +class MainWindow; + namespace gx_gui { template @@ -177,18 +180,30 @@ class UiBuilderImpl: public gx_engine::UiBuilderBase { protected: + MainWindow& main; + std::vector *pluginlist; static StackBoxBuilder *intf; static void openVerticalBox_(const char* label); + static void openVerticalBox1_(const char* label); + static void openVerticalBox2_(const char* label); static void openHorizontalBox_(const char* label); static void openHorizontalhideBox_(const char* label); + static void insertSpacer_(); static void create_small_rackknob_(const char *id, const char *label); + static void create_small_rackknobr_(const char *id, const char *label); static void create_master_slider_(const char *id, const char *label); - static void create_selector_(const char *id); + static void create_selector_no_caption_(const char *id); + static void create_selector_(const char *id, const char *label); + static void create_spin_value_(const char *id, const char *label); + static void create_switch_no_caption_(const char *sw_type,const char * id); + static void create_switch_(const char *sw_type,const char * id, const char *label); + static void create_port_display_(const char *id, const char *label); static void closeBox_(); static void load_glade_(const char *data); virtual bool load(gx_engine::Plugin *p); public: - UiBuilderImpl(StackBoxBuilder *i); + UiBuilderImpl(MainWindow *i, StackBoxBuilder *b, std::vector *pl=0); + bool load_unit(PluginUI &pl); }; GtkWidget *load_toplevel(GtkBuilder *builder, const char* filename, const char* windowname); diff -Nru guitarix-0.22.4/src/headers/ladspalist.h guitarix-0.24.2/src/headers/ladspalist.h --- guitarix-0.22.4/src/headers/ladspalist.h 1970-01-01 00:00:00.000000000 +0000 +++ guitarix-0.24.2/src/headers/ladspalist.h 2012-10-20 03:56:02.000000000 +0000 @@ -0,0 +1,346 @@ +/* + * Copyright (C) 2012 Andreas Degert, Hermann Meyer + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#include + +namespace ladspa { + +/**************************************************************** + ** PortDesc + */ + +enum DisplayType { + tp_scale, tp_scale_log, tp_toggle, tp_enum, tp_display, tp_display_toggle, tp_none, tp_int, +}; + +class ChangeableValues { +public: + enum { name_set = 0x01, dflt_set = 0x02, low_set = 0x04, up_set = 0x08, tp_set = 0x10, newrow_set = 0x20 }; +private: + Glib::ustring name; + float dflt; + float low; + float up; + DisplayType tp; + std::map enumdict; + bool newrow; + int set_flags; + inline void sf(int f) { set_flags |= f; } + friend bool operator!=(const ChangeableValues& v1, const ChangeableValues& v2); +public: + ChangeableValues(): name(), dflt(), low(), up(), tp(tp_scale), enumdict(), newrow(), set_flags(0) {} + int get_excl_flags(DisplayType tp) const; + bool has_settings(DisplayType tp) const; + inline bool is_set(int f) const { return set_flags & f; } + inline void unset(int f) { set_flags &= ~f; } + inline void set_name(const Glib::ustring& nm) { name = nm; sf(name_set); } + inline void set_dflt(float v) { dflt = v; sf(dflt_set); } + inline void set_low(float v) { low = v; sf(low_set); } + inline void set_up(float v) { up = v; sf(up_set); } + inline void set_tp(DisplayType v) { tp = v; sf(tp_set); } + inline void set_newrow(bool v) { newrow = v; sf(newrow_set); } + inline const Glib::ustring& get_name() { return name; } + inline float get_dflt() { return dflt; } + inline float get_low() { return low; } + inline float get_up() { return up; } + inline DisplayType get_tp() { return tp; } + inline bool get_newrow() { return newrow; } + inline bool has_enumkey(int k) { return enumdict.find(k) != enumdict.end(); } + void set_enumvalue(int k, const Glib::ustring& v) { enumdict[k] = v; } + inline std::map::iterator find_enum(int k) { return enumdict.find(k); } + inline void erase_enum(int k) { enumdict.erase(enumdict.find(k)); } + inline std::map::iterator enum_end() { return enumdict.end(); } +}; + +enum step_mode { + stp_coarse, + stp_normal, + stp_fine, +}; + +class PortDesc { +private: +public: + const int idx; + int pos; + const bool is_output; + const LADSPA_PortRangeHintDescriptor hint_desc; + bool fake_low; + bool fake_up; + bool fake_dflt; + step_mode step; + bool use_sr; + bool has_sr; + bool has_caption; + ChangeableValues factory; + ChangeableValues user; + void set_range_default(const LADSPA_PortRangeHint& h, ChangeableValues& store); + void set_default_value(const LADSPA_PortRangeHint& h, ChangeableValues& store); + void set_tp_default(const LADSPA_PortRangeHint& h, ChangeableValues& store); + float calc_step(); + void set_default(float value, Glib::ustring label); + void output(gx_system::JsonWriter& jw); + friend bool cmp_ctrl_ports(const PortDesc *a, const PortDesc *b); +public: + PortDesc(int idx_, int pos_, bool is_output_, Glib::ustring name, const LADSPA_PortRangeHint& hint); + void reset(); + void fixup(bool newrow); + bool check_changed(const PortDesc& vp) const; + Glib::ustring get_enum(int idx); + inline DisplayType get_tp() { return user.is_set(ChangeableValues::tp_set) ? user.get_tp() : factory.get_tp(); } + inline float get_low() { return user.is_set(ChangeableValues::low_set) ? user.get_low() : factory.get_low(); } + inline float get_up() { return user.is_set(ChangeableValues::up_set) ? user.get_up() : factory.get_up(); } + inline float get_dflt() { return user.is_set(ChangeableValues::dflt_set) ? user.get_dflt() : factory.get_dflt(); } + inline bool get_newrow() { return user.is_set(ChangeableValues::newrow_set) ? user.get_newrow() : factory.get_newrow(); } + const Glib::ustring& get_name() { return user.is_set(ChangeableValues::name_set) ? user.get_name() : factory.get_name(); } + inline int get_pos() { return pos; } + void set_low(float v); + void set_up(float v); + void set_dflt(float v); + void set_tp(DisplayType v); + void set_newrow(bool v); + bool has_settings(); + bool enumkey_changed(int k) { return user.has_enumkey(k); } + bool is_set(int f) { return user.is_set(f); } + void set_state(gx_system::JsonParser& jp, int version); +}; + + +/**************************************************************** + ** class PluginDesc + */ + +class PluginDesc { +private: +public: + unsigned long UniqueID; + Glib::ustring Label; + Glib::ustring Name; + Glib::ustring shortname; + Glib::ustring Maker; + int MasterIdx; + Glib::ustring MasterLabel; + int tp; + std::vector ctrl_ports; + std::string path; + int index; + Glib::ustring category; + Glib::ustring deduced_category; + int quirks; + int quirks_default; + std::string ladspa_category; + bool active; + bool active_set; + bool has_settings; + int add_wet_dry; + PluginDesc *old; + int quirks_get(); + void reset(); + bool check_changed(); + bool _i_check_has_settings(); + void check_has_settings(); + int set_active(bool v); + void fixup(); + void set_add_wet_dry_controller(bool v); + void copy_ports(PluginDesc *p); + void set_category(const std::vector& s); + void set_default(int idx, float value, const Glib::ustring& label); + void set_state(const Glib::ustring& fname); +public: + PluginDesc(const LADSPA_Descriptor& desc, int tp_, std::vector& ctrl_ports_, const std::string path_, int index_); + ~PluginDesc(); + void output_entry(gx_system::JsonWriter& jw); + void output(gx_system::JsonWriter& jw); +}; + +/**************************************************************** + ** class PluginDisplay + */ + +class EnumListStore: public Gtk::ListStore { +public: + class Columns: public Gtk::TreeModel::ColumnRecord { + public: + Gtk::TreeModelColumn value; + Gtk::TreeModelColumn label; + Gtk::TreeModelColumn port; + Columns() { add(value); add(label); add(port); } + } col; + EnumListStore(): Gtk::ListStore(Columns()) {} +}; + +class PortListStore: public Gtk::ListStore { +public: + class Columns: public Gtk::TreeModel::ColumnRecord { + public: + Gtk::TreeModelColumn pos; + Gtk::TreeModelColumn name; + Gtk::TreeModelColumn dflt; + Gtk::TreeModelColumn low; + Gtk::TreeModelColumn up; + Gtk::TreeModelColumn step; + Gtk::TreeModelColumn display; + Gtk::TreeModelColumn > display_types; + Gtk::TreeModelColumn port; + Gtk::TreeModelColumn newrow; + Gtk::TreeModelColumn use_sr; + Gtk::TreeModelColumn has_caption; + Columns() { + add(pos); add(name); add(dflt); add(low); add(up); add(step); add(display); + add(display_types); add(port); add(newrow); add(use_sr); add(has_caption); + } + } col; + PortListStore(): Gtk::ListStore(Columns()) {} +}; + +class PluginListStore: public Gtk::ListStore { +public: + class Columns: public Gtk::TreeModel::ColumnRecord { + public: + Gtk::TreeModelColumn name; + Gtk::TreeModelColumn active; + Gtk::TreeModelColumn pdesc; + Columns() { add(name); add(active); add(pdesc); } + } col; + PluginListStore(): Gtk::ListStore(Columns()) {} +}; + +class MasterIdxListStore: public Gtk::ListStore { +public: + class Columns: public Gtk::TreeModel::ColumnRecord { + public: + Gtk::TreeModelColumn idx; + Columns() { add(idx); } + } col; + MasterIdxListStore(): Gtk::ListStore(Columns()) {} +}; + +class PluginDisplay { +private: + const gx_system::CmdlineOptions& options; + std::vector pluginlist; + PluginDesc *current_plugin; + int old_state; + Glib::RefPtr bld; + int change_count; + Glib::RefPtr actiongroup; + Glib::RefPtr uimanager; + Glib::RefPtr enum_liststore; + Glib::RefPtr port_liststore; + Glib::RefPtr plugin_liststore; + Glib::RefPtr masteridx_liststore; + sigc::connection on_reordered_conn; + Glib::RefPtr display_type_list; + Glib::RefPtr display_type_list_sr; + Glib::RefPtr output_type_list; + sigc::slot finished_callback; + // + Glib::RefPtr quit_action; + Glib::RefPtr save_action; + Glib::RefPtr apply_action; + Glib::RefPtr select_all_action; + Glib::RefPtr select_none_action; + // + Gtk::Window *window; + Gtk::TreeView *treeview1; + Gtk::TreeView *treeview2; + Gtk::TreeView *treeview3; + Gtk::Entry *ladspa_category; + Gtk::Entry *ladspa_maker; + Gtk::Entry *ladspa_uniqueid; + Gtk::Entry *search_entry; + Gtk::ComboBox *combobox_mono_stereo; + Gtk::ToggleButton *selected_only; + Gtk::ToggleButton *changed_only; + Gtk::ToggleButton *show_all; + Gtk::Box *details_box; + Gtk::ToggleButton *show_details; + Gtk::Entry *plugin_name; + Gtk::ComboBox *plugin_category; + Gtk::ToggleButton *dry_wet_button; + Gtk::ComboBox *plugin_quirks; + Gtk::ComboBox *master_slider_idx; + Gtk::Entry *master_slider_name; + Gtk::CellRendererText *cellrenderer_master; + Gtk::CellRendererToggle *cellrenderer_newrow; + Gtk::CellRendererToggle *cellrenderer_caption; + Gtk::CellRendererToggle *cellrenderer_active; + Gtk::CellRendererText *cellrenderer_category; + Gtk::CellRendererText *cellrenderer_quirks; +private: + void set_title(); + void on_save(); + void on_apply(); + void on_quit(); + void on_select_all(bool v); + void on_find(); + bool on_delete_event(GdkEventAny*); + void on_show_details(); + void on_add_dry_wet_controller(); + void on_row_activated(const Gtk::TreePath& path, Gtk::TreeViewColumn* column); + void on_label_edited(const Glib::ustring& path, const Glib::ustring& newtext); + void on_parameter_selection_changed(); + void on_reordered(const Gtk::TreePath& path); + void on_type_edited(const Glib::ustring& path, const Glib::ustring& newtext); + void on_step_edited(const Glib::ustring& path, const Glib::ustring& newtext); + void on_newrow_toggled(const Glib::ustring& path); + void on_caption_toggled(const Glib::ustring& path); + void on_name_edited(const Glib::ustring& path, const Glib::ustring& newtext); + void on_dflt_edited(const Glib::ustring& path, const Glib::ustring& newtext); + void on_low_edited(const Glib::ustring& path, const Glib::ustring& newtext); + void on_up_edited(const Glib::ustring& path, const Glib::ustring& newtext); + void on_search_entry_activate(); + void selection_changed(); + void on_active_toggled(const Glib::ustring& path); + void on_view_changed(const Gtk::ToggleButton*); + void display_category(const Gtk::TreeIter& it); + void display_quirks(const Gtk::TreeIter& it); + void on_mono_stereo_changed(); + void on_delete_changes(); + bool search_equal(const Glib::RefPtr& model, int column, const Glib::ustring& key, const Gtk::TreeIter& iter); + void display_label(Gtk::CellRenderer *cell, const Gtk::TreeIter& it); + void display_step(Gtk::CellRenderer *cell, const Gtk::TreeIter& it); + void display_ladspa(Gtk::CellRenderer *cell, const Gtk::TreeIter& it); + void display_idx(Gtk::CellRenderer *cell, const Gtk::TreeIter& it); + void display_name(Gtk::CellRenderer *cell, const Gtk::TreeIter& it); + void display_default(Gtk::CellRenderer *cell, const Gtk::TreeIter& it); + void display_lower(Gtk::CellRenderer *cell, const Gtk::TreeIter& it); + void display_upper(Gtk::CellRenderer *cell, const Gtk::TreeIter& it); + void display_SR(Gtk::CellRenderer *cell, const Gtk::TreeIter& it); + void display_type(Gtk::CellRenderer *cell, const Gtk::TreeIter& it); + void display_newrow(Gtk::CellRenderer *cell, const Gtk::TreeIter& it); + void display_caption(Gtk::CellRenderer *cell, const Gtk::TreeIter& it); + bool check_for_changes(); + int ask_discard(); + void save_current(); + void load(); + bool do_save(); + void set_old_state(PluginDesc *p); + void display_master_idx(const Gtk::TreeIter& it); + void set_master_text(); + std::string get_config_filename() { return options.get_user_filepath("ladspa_defs.js"); } + void load_ladspalist(std::vector& old_not_found, std::vector& l); + std::string get_ladspa_plugin_config(unsigned long UniqueID); +public: + PluginDisplay(const gx_system::CmdlineOptions& options, Glib::RefPtr icon, sigc::slot finished_callback); + ~PluginDisplay(); + bool check_exit(); + void present() { window->present(); } +}; + +} // namespace ladspa diff -Nru guitarix-0.22.4/src/ladspa/ladspa_guitarix.cpp guitarix-0.24.2/src/ladspa/ladspa_guitarix.cpp --- guitarix-0.22.4/src/ladspa/ladspa_guitarix.cpp 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/src/ladspa/ladspa_guitarix.cpp 2012-10-20 03:56:02.000000000 +0000 @@ -1,3 +1,21 @@ +/* + * Copyright (C) 2011, 2012 Andreas Degert, Hermann Meyer + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + #include #include #include @@ -136,11 +154,12 @@ ParamMap& param; paramlist plist; MidiControllerList::controller_array *midi_list; - ConvolverAdapter* convolver; + ConvolverStereoAdapter* stereo_convolver; + ConvolverMonoAdapter* mono_convolver; ControlParameter& control_parameter; friend class StateIO; public: - PresetIO(ParamMap& param, ConvolverAdapter* convolver, ControlParameter& cp); + PresetIO(ParamMap& param, ConvolverStereoAdapter* stereo_convolver,ConvolverMonoAdapter* mono_convolver, ControlParameter& cp); ~PresetIO(); void read_preset(gx_system::JsonParser &jp, const gx_system::SettingsFileHeader&); void commit_preset(); @@ -150,12 +169,13 @@ }; // cp not yet initialized, only use address! -PresetIO::PresetIO(ParamMap& param_, ConvolverAdapter* convolver_, ControlParameter& cp) +PresetIO::PresetIO(ParamMap& param_, ConvolverStereoAdapter* stereo_convolver_, ConvolverMonoAdapter* mono_convolver_, ControlParameter& cp) : jcset(0), param(param_), plist(), midi_list(0), - convolver(convolver_), + stereo_convolver(stereo_convolver_), + mono_convolver(mono_convolver_), control_parameter(cp) { } @@ -195,7 +215,13 @@ } while (jp.peek() == gx_system::JsonParser::value_key); jp.next(gx_system::JsonParser::end_object); } else if (jp.current_value() == "jconv") { - if (convolver) { + if (stereo_convolver) { + gx_system::PathList sl; + sl.add(Glib::build_filename(Glib::get_user_config_dir(), "guitarix")); //FIXME + sl.add(GX_SOUND_DIR); + jcset = new GxJConvSettings(); + jcset->readJSON(jp, sl); + } else if (mono_convolver) { gx_system::PathList sl; sl.add(Glib::build_filename(Glib::get_user_config_dir(), "guitarix")); //FIXME sl.add(GX_SOUND_DIR); @@ -217,8 +243,10 @@ } void PresetIO::commit_preset() { - if (convolver && jcset) { - convolver->set(*jcset); + if (stereo_convolver && jcset) { + stereo_convolver->set(*jcset); + } else if (mono_convolver && jcset) { + mono_convolver->set(*jcset); } for (gx_engine::paramlist::iterator i = plist.begin(); i != plist.end(); ++i) { (*i)->setJSON_value(); @@ -243,7 +271,7 @@ class StateIO: public gx_system::AbstractStateIO, private PresetIO { public: - StateIO(ParamMap& param, ConvolverAdapter* convolver, ControlParameter& cp); + StateIO(ParamMap& param, ConvolverStereoAdapter* stereo_convolver, ConvolverMonoAdapter* mono_convolver, ControlParameter& cp); ~StateIO(); void read_state(gx_system::JsonParser &jp, const gx_system::SettingsFileHeader&); void commit_state(); @@ -251,8 +279,8 @@ }; // cp not yet initialized, only use address! -StateIO::StateIO(ParamMap& param, ConvolverAdapter* convolver, ControlParameter& cp) - : PresetIO(param, convolver, cp) { +StateIO::StateIO(ParamMap& param, ConvolverStereoAdapter* stereo_convolver, ConvolverMonoAdapter* mono_convolver, ControlParameter& cp) + : PresetIO(param, stereo_convolver, mono_convolver, cp) { } StateIO::~StateIO() { @@ -299,7 +327,7 @@ public: gx_system::PresetFile presetfile; LadspaSettings(string sfname, string presname, - ParamMap& param, EngineControl&, ConvolverAdapter*, ControlParameter&); + ParamMap& param, EngineControl&, ConvolverStereoAdapter*, ConvolverMonoAdapter*, ControlParameter&); ~LadspaSettings(); void load(int num); bool idx_in_preset(int idx) { return idx >= 0 && idx < presetfile.size(); } @@ -357,11 +385,11 @@ // seq and cp not yet initialized, only use address! LadspaSettings::LadspaSettings(string sfname, string presname, ParamMap& param, - EngineControl& seq, ConvolverAdapter* convolver, ControlParameter& cp) + EngineControl& seq, ConvolverStereoAdapter* stereo_convolver, ConvolverMonoAdapter* mono_convolver, ControlParameter& cp) : GxSettingsBase(seq), current_source(state), - preset_io(param, convolver, cp), - state_io(param, convolver, cp) { + preset_io(param, stereo_convolver, mono_convolver, cp), + state_io(param, stereo_convolver, mono_convolver, cp) { set_io(&state_io, &preset_io); set_statefilename(sfname); change_preset_file(presname); @@ -474,7 +502,7 @@ void prepare_run(); unsigned int activate(int *policy, int *prio); void load(); - LadspaGuitarix(EngineControl& engine, ConvolverAdapter* convolver, + LadspaGuitarix(EngineControl& engine, ConvolverStereoAdapter* stereo_convolver, ConvolverMonoAdapter* mono_convolver, ControlParameter& cp, const char *envvar); ~LadspaGuitarix(); static void start_presetloader() { PresetLoader::start_presetloader(); } @@ -498,7 +526,7 @@ // engine and cp not yet initialized, only use address! LadspaGuitarix::LadspaGuitarix( - EngineControl& engine, ConvolverAdapter* convolver, ControlParameter& cp, const char *envvar) + EngineControl& engine, ConvolverStereoAdapter* stereo_convolver, ConvolverMonoAdapter* mono_convolver, ControlParameter& cp, const char *envvar) : last_thread_id(), jack_bs(), jack_prio(), @@ -512,7 +540,7 @@ latency_port(), param(), control_parameter(cp), - settings(get_statefile(), get_presetfile(envvar), param, engine, convolver, cp) { + settings(get_statefile(), get_presetfile(envvar), param, engine, stereo_convolver, mono_convolver, cp) { PresetLoader::add_instance(this); } @@ -695,6 +723,15 @@ } +class LadspaPathList: public gx_system::PathList { +public: + inline LadspaPathList() { + add(Glib::build_filename(Glib::get_user_config_dir(), "guitarix")); //FIXME + add(GX_SOUND_DIR); + }; +}; + + /**************************************************************** * MONO Plugin * ****************************************************************/ @@ -717,10 +754,12 @@ ModuleSelectorFromList ampstack; // internal audio modules NoiseGate noisegate; + ConvolverMonoAdapter mono_convolver; CabinetConvolver cabinet; + PreampConvolver preamp; ContrastConvolver contrast; public: - MonoEngine(const string& plugin_dir, ParamMap& param, ParameterGroups& groups); + MonoEngine(const string& plugin_dir, ParamMap& param, ParameterGroups& groups, const gx_system::PathList& pathlist); ~MonoEngine(); virtual void wait_ramp_down_finished(); virtual bool update_module_lists(); @@ -854,26 +893,30 @@ 0 }; -MonoEngine::MonoEngine(const string& plugin_dir, ParamMap& param, ParameterGroups& groups) +MonoEngine::MonoEngine(const string& plugin_dir, ParamMap& param, ParameterGroups& groups, const gx_system::PathList& pathlist) : EngineControl(), resamp(), // ModuleSelector's crybaby( - *this, ui, "crybaby", N_("Crybaby"), builtin_crybaby_plugins, + *this, ui, "crybaby", N_("Crybaby"), "", builtin_crybaby_plugins, "crybaby.autowah", _("select"), 0, PGN_POST_PRE), tonestack( - *this, ui, "amp.tonestack", N_("Tonestack"), + *this, ui, "amp.tonestack", N_("Tonestack"), "", builtin_tonestack_plugins, "amp.tonestack.select", _("select"), 0, PGN_POST_PRE), ampstack( - *this, ui, "ampstack", "?Tube", builtin_amp_plugins, + *this, ui, "ampstack", "?Tube", "", builtin_amp_plugins, "tube.select", _("select"), ampstack_groups), // internal audio modules noisegate(), + mono_convolver(*this, sigc::mem_fun(mono_chain, &MonoModuleChain::sync), param, pathlist, ""), cabinet(*this, sigc::mem_fun(mono_chain, &MonoModuleChain::sync), resamp), + preamp(*this, sigc::mem_fun(mono_chain, &MonoModuleChain::sync), resamp), contrast(*this, sigc::mem_fun(mono_chain, &MonoModuleChain::sync), resamp) { + mono_convolver.set_sync(true); cabinet.set_sync(true); + preamp.set_sync(true); contrast.set_sync(true); load_static_plugins(); @@ -939,9 +982,11 @@ // mono pl.add(gx_effects::low_high_pass::plugin(), PLUGIN_POS_RACK, PGN_GUI); + pl.add(gx_effects::highbooster::plugin(), PLUGIN_POS_RACK, PGN_GUI); pl.add(gx_effects::selecteq::plugin(), PLUGIN_POS_RACK, PGN_GUI); pl.add(&crybaby.plugin, PLUGIN_POS_RACK, PGN_GUI); pl.add(gx_effects::gx_distortion::plugin(), PLUGIN_POS_RACK, PGN_GUI); + pl.add(pluginlib::ts9sim::plugin(), PLUGIN_POS_RACK, PGN_GUI); pl.add(gx_effects::impulseresponse::plugin(), PLUGIN_POS_RACK, PGN_GUI); pl.add(gx_effects::compressor::plugin(), PLUGIN_POS_RACK, PGN_GUI); pl.add(gx_effects::overdrive::plugin(), PLUGIN_POS_RACK, PGN_GUI); @@ -953,9 +998,12 @@ pl.add(gx_effects::phaser_mono::plugin(), PLUGIN_POS_RACK, PGN_GUI); pl.add(gx_effects::chorus_mono::plugin(), PLUGIN_POS_RACK, PGN_GUI); pl.add(gx_effects::flanger_mono::plugin(), PLUGIN_POS_RACK, PGN_GUI); + pl.add(pluginlib::flanger_gx::plugin(), PLUGIN_POS_RACK, PGN_GUI); pl.add(gx_effects::gx_feedback::plugin(), PLUGIN_POS_RACK, PGN_GUI); pl.add(&tonestack.plugin, PLUGIN_POS_RACK, PGN_GUI); + pl.add(&mono_convolver.plugin, PLUGIN_POS_RACK, PGN_GUI); pl.add(&cabinet.plugin, PLUGIN_POS_RACK, PGN_GUI); + pl.add(&preamp.plugin, PLUGIN_POS_RACK, PGN_GUI); pl.add(pluginlib::abgate::plugin(), PLUGIN_POS_RACK); pl.add(pluginlib::vibe::plugin_mono(), PLUGIN_POS_RACK); } @@ -1021,6 +1069,7 @@ void set(int cnt, LADSPA_Data *input_buffer, LADSPA_Data *output_buffer); }; + LadspaPathList pathlist; MonoEngine engine; ControlParameter control_parameter; ReBuffer rebuffer; @@ -1042,8 +1091,9 @@ }; LadspaGuitarixMono::LadspaGuitarixMono(unsigned long sr) - : LadspaGuitarix(engine, 0, control_parameter, "LADSPA_GUITARIX_MONO_PRESET"), - engine(Glib::build_filename(Glib::get_user_config_dir(), "guitarix/plugins/"), param, get_group_table()), + : LadspaGuitarix(engine, 0, &engine.mono_convolver, control_parameter, "LADSPA_GUITARIX_MONO_PRESET"), + pathlist(), + engine(Glib::build_filename(Glib::get_user_config_dir(), "guitarix/plugins/"), param, get_group_table(), pathlist), control_parameter(GUITARIX_PARAM_COUNT), rebuffer(), volume_port(), @@ -1329,7 +1379,7 @@ void load_static_plugins(); public: StereoModuleChain stereo_chain; - ConvolverAdapter convolver; + ConvolverStereoAdapter stereo_convolver; public: StereoEngine(const string& plugin_dir, ParamMap& param, ParameterGroups& groups, const gx_system::PathList& pathlist); ~StereoEngine(); @@ -1398,9 +1448,9 @@ StereoEngine::StereoEngine(const string& plugin_dir, ParamMap& param, ParameterGroups& groups, const gx_system::PathList& pathlist) : EngineControl(), // internal audio modules - convolver(*this, sigc::mem_fun(stereo_chain, &StereoModuleChain::sync), param, pathlist, "") { + stereo_convolver(*this, sigc::mem_fun(stereo_chain, &StereoModuleChain::sync), param, pathlist, "") { - convolver.set_sync(true); + stereo_convolver.set_sync(true); load_static_plugins(); @@ -1442,7 +1492,7 @@ pl.add(gx_effects::moog::plugin(), PLUGIN_POS_RACK, PGN_GUI); pl.add(gx_amps::gx_ampmodul::plugin(), PLUGIN_POS_RACK, PGN_GUI); pl.add(gx_effects::tonecontroll::plugin(), PLUGIN_POS_RACK, PGN_GUI); - pl.add(&convolver.plugin, PLUGIN_POS_RACK, PGN_GUI); + pl.add(&stereo_convolver.plugin, PLUGIN_POS_RACK, PGN_GUI); pl.add(gx_effects::stereoverb::plugin(), PLUGIN_POS_RACK, PGN_GUI); pl.add(pluginlib::zita_rev1::plugin(), PLUGIN_POS_RACK); pl.add(pluginlib::vibe::plugin_stereo(), PLUGIN_POS_RACK); @@ -1453,14 +1503,6 @@ ** class LadspaGuitarixStereo */ -class LadspaPathList: public gx_system::PathList { -public: - inline LadspaPathList() { - add(Glib::build_filename(Glib::get_user_config_dir(), "guitarix")); //FIXME - add(GX_SOUND_DIR); - }; -}; - class LadspaGuitarixStereo: LadspaGuitarix { private: @@ -1552,7 +1594,7 @@ }; LadspaGuitarixStereo::LadspaGuitarixStereo(unsigned long sr) - : LadspaGuitarix(engine, &engine.convolver, control_parameter, "LADSPA_GUITARIX_STEREO_PRESET"), + : LadspaGuitarix(engine, &engine.stereo_convolver, 0, control_parameter, "LADSPA_GUITARIX_STEREO_PRESET"), pathlist(), engine(Glib::build_filename(Glib::get_user_config_dir(), "guitarix/plugins/"), param, get_group_table(), pathlist), control_parameter(GUITARIX_PARAM_COUNT), diff -Nru guitarix-0.22.4/src/ladspa/wscript guitarix-0.24.2/src/ladspa/wscript --- guitarix-0.22.4/src/ladspa/wscript 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/src/ladspa/wscript 2012-10-20 03:56:02.000000000 +0000 @@ -1,11 +1,21 @@ #!/usr/bin/env python # encoding: utf-8 -import os +import sys, os, TaskGen, ctypes def configure(conf): pass +@TaskGen.feature('test_loadable') +def test_loadable(self): + def link_and_test(lib=self.link_task.outputs[0].bldpath(self.env), link=self.link_task.run): + link() + try: + ctypes.cdll.LoadLibrary(lib) + except Exception as e: + raise RuntimeError("LADSPA load test failed: %s" % e) + self.link_task.run = link_and_test + def build(bld): bsources = [ '../gx_head/engine/gx_json.cpp', @@ -22,15 +32,17 @@ '../plugins/zita_rev1.cc', '../plugins/vibe.cc', '../plugins/abgate.cc', + '../plugins/ts9sim.cc', + '../plugins/flanger_gx.cc', ] src = ['ladspa_guitarix.cpp'] + bsources - incl = ['../headers', '..','../gx_head/engine','../../libgxwmm','../../libgxw'] + incl = ['../headers', '..','../gx_head/engine','../plugins','../../libgxwmm','../../libgxw'] lib = [] - if bld.env['IS_LINUX']: + if sys.platform.startswith("linux"): lib.append('dl') uselib = ['JACK', 'SNDFILE', 'GTHREAD', 'GMODULE_EXPORT', - 'GLIBMM', 'GIOMM', 'FFTW3'] + 'GLIBMM', 'GIOMM', 'FFTW3', 'BOOST_SYSTEM'] if bld.env['ZITA_CONVOLVER']: uselib.append('ZITA_CONVOLVER') else: @@ -44,7 +56,7 @@ incl.append('../zita-resampler-1.1.0') ladspa_plugin = bld( #features='cxx cprogram', ## for debugging - features='cxx cshlib', + features='cxx cshlib test_loadable', includes = incl, lib = lib, uselib = uselib, @@ -54,7 +66,7 @@ target = 'ladspa_guitarix', source = src, install_path = '${LADSPADIR}', - chmod = 0755, + chmod = 0o755, ) ladspa_plugin.env['shlib_PATTERN'] = '%s.so' bld.install_files('${SHAREDIR}/ladspa/rdf', 'guitarix_amp.rdf') diff -Nru guitarix-0.22.4/src/plugins/abgate.cc guitarix-0.24.2/src/plugins/abgate.cc --- guitarix-0.22.4/src/plugins/abgate.cc 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/src/plugins/abgate.cc 2012-10-20 03:56:02.000000000 +0000 @@ -56,6 +56,7 @@ version = PLUGINDEF_VERSION; id = "abgate"; name = N_("abGate"); + category = N_("Misc"); mono_audio = process; set_samplerate = init; register_params = registerparam; diff -Nru guitarix-0.22.4/src/plugins/dunwah.dsp guitarix-0.24.2/src/plugins/dunwah.dsp --- guitarix-0.22.4/src/plugins/dunwah.dsp 1970-01-01 00:00:00.000000000 +0000 +++ guitarix-0.24.2/src/plugins/dunwah.dsp 2012-10-20 03:56:02.000000000 +0000 @@ -0,0 +1,63 @@ +declare id "dunwah"; +declare name "DunWah"; + +import("effect.lib"); + +dunwah = *(gs) : tf2(1,-1,0,a1s,a2s) +with { + // calculated by dunwah1.py + theta2pi = (1892.75 - 1 / (((0.000927476*wah+-0.00197293)*wah+0.002474)*wah+-0.00152132))/SR; + Q = ((-12.1248*wah+21.9241)*wah+-33.2116)*wah+25.8564; + g = 0.025 - 1 / ((((-127.479*wah+387.412)*wah+-466.009)*wah+302.062)*wah+-96.9872); + + R = 1 - theta2pi/(2*Q); + a1 = 0-2.0*R*cos(theta2pi); // biquad coeff + a2 = R*R; // biquad coeff + + // dezippering of slider-driven signals: + s = 0.999; // smoothing parameter (one-pole pole location) + a1s = a1 : smooth(s); + a2s = a2 : smooth(s); + gs = g : smooth(s); + + tf2 = component("filter.lib").tf2; + //wah = vslider("wah", 0, 0, 1, 0.01) : *(9) : +(1) : log10; + wah = vslider("wah", 0, 0, 1, 0.01); +}; + +dunwah2 = *(gs) : iir((b0, b1, b2, b3), (A1, A2, A3)) +with { + // calculated by dunwah2.py + theta2pi = (1973.48 - 1000 / ((((((12.499*wah+-40.3658)*wah+49.9836)*wah+-28.3434)*wah+5.76598)*wah+1.9841)*wah+-1.6086)) / SR; + Q = ((((-52.3051*wah+115.375)*wah+-99.7712)*wah+42.2734)*wah+-24.555)*wah+21.9737; + g = -0.933975 - 1 / (((((2.85511*wah+-5.20364)*wah+3.64419)*wah+-0.86331)*wah+0.270546)*wah+-0.814203); + gc = (-8.38823e-12*SR+1.73888e-06)*SR+-0.193457; + p1 = exp(-1000/(0.808471*SR)); + z1 = 1.00038; + z2 = (-8.52216e-12*SR+1.77528e-06)*SR+0.879905; + z3 = (-6.43963e-11*SR+1.54419e-05)*SR+-0.386688; + + b0 = 1.0; + b1 = -z1-z2-z3; + b2 = z1*z2+z1*z3+z2*z3; + b3 = -z1*z2*z3; + + // dezippering of slider-driven signals: + s = 0.993; // smoothing parameter (one-pole pole location) + + R = 1 - theta2pi/(2*Q); + a1 = -2.0*R*cos(theta2pi) : smooth(s); // biquad coeff + a2 = R*R : smooth(s); // biquad coeff + gs = g * gc : smooth(s); + + A1 = a1 - p1; + A2 = a2 - a1 * p1; + A3 = -a2 * p1; + + iir = component("filter.lib").iir; + + //wah = vslider("wah", 0, 0, 1, 0.01) : *(9) : +(1) : log10; + wah = vslider("wah", 0, 0, 1, 0.01); +}; + +process = dunwah2; diff -Nru guitarix-0.22.4/src/plugins/dunwah_ui.glade guitarix-0.24.2/src/plugins/dunwah_ui.glade --- guitarix-0.22.4/src/plugins/dunwah_ui.glade 1970-01-01 00:00:00.000000000 +0000 +++ guitarix-0.24.2/src/plugins/dunwah_ui.glade 2012-10-20 03:56:02.000000000 +0000 @@ -0,0 +1,88 @@ + + + + + + + False + + + True + False + + + True + False + + + True + False + + + True + False + + + True + False + label + + + False + True + 0 + + + + + True + True + True + dunwah.wah + label1:rack_label + + + False + False + 1 + + + + + False + False + 0 + + + + + True + False + 0 + + + + + True + True + 0 + + + + + True + False + + + + + + True + True + 1 + + + + + + diff -Nru guitarix-0.22.4/src/plugins/flanger_gx.dsp guitarix-0.24.2/src/plugins/flanger_gx.dsp --- guitarix-0.22.4/src/plugins/flanger_gx.dsp 1970-01-01 00:00:00.000000000 +0000 +++ guitarix-0.24.2/src/plugins/flanger_gx.dsp 2012-10-20 03:56:02.000000000 +0000 @@ -0,0 +1,31 @@ +declare id "flanger_mono_gx"; +declare name "Flanger GX"; +declare category "Modulation"; + +h_flanger(dmax, curdel, fb, wet) = _ <: _, (dly : (+:dly)~*(fb)) : mix with { + dly = component("music.lib").fdelay(dmax/2, curdel/2); + mix = *(2-wet), _*(wet) : +; +}; + +flanger(dmax, curdel, fb, wet) = _ <: _, (+:dly)~*(fb) : mix with { + dly = component("music.lib").fdelay(dmax, curdel); + mix = *(2-wet), _*(wet) : +; +}; + +process = h_flanger(dmax, curdel, fb, wet1) : + flanger( dmax, curdel, -fb, wet2) : + *(0.25) with { + SR = component("math.lib").SR; + dflange = 0.001 * SR * hslider("width[name:Width]", 5.0, 0, 10, 0.01); + odflange = 0.001 * SR * hslider("depth[name:Depth]", 0.5, 0, 5, 0.01); + dmax = 2048; // > max(dflange+odflange) at rate 96000 + freq = hslider("freq[log][name:Speed][unit:Hz]", 0.2, 0.05, 10, 1.06); + fb = hslider("feedback[name:Feedback]", -0.707, -0.99, 0.99, 0.01) * (2+abs(mix))/3; + lfo = component("oscillator.lib").oscrs; + curdel = odflange+dflange*(1+lfo(freq))/2; + //curdel = hslider("delay", 20, 0, 400, 0.1); + wet = hslider("wet[name:Wet]", 100, 0, 100, 1)/100; + mix = hslider("mix[name:Mix]", 0, -1, 1, 0.1); + wet1 = wet*min(1,1+mix); + wet2 = wet*min(1,1-mix); +}; diff -Nru guitarix-0.22.4/src/plugins/flanger_gx_ui.cc guitarix-0.24.2/src/plugins/flanger_gx_ui.cc --- guitarix-0.22.4/src/plugins/flanger_gx_ui.cc 1970-01-01 00:00:00.000000000 +0000 +++ guitarix-0.24.2/src/plugins/flanger_gx_ui.cc 2012-10-20 03:56:02.000000000 +0000 @@ -0,0 +1,12 @@ +b.openHorizontalhideBox(""); +b.create_master_slider(PARAM("wet"), "Dry/Wet"); +b.closeBox(); + +b.openHorizontalBox(""); +b.create_small_rackknob(PARAM("freq"), 0); +b.create_small_rackknob(PARAM("depth"), 0); +b.create_small_rackknob(PARAM("width"), 0); +b.create_small_rackknob(PARAM("feedback"), 0); +b.create_small_rackknob(PARAM("mix"), 0); +b.create_small_rackknob(PARAM("wet"), 0); +b.closeBox(); diff -Nru guitarix-0.22.4/src/plugins/generated/dunwah.cc guitarix-0.24.2/src/plugins/generated/dunwah.cc --- guitarix-0.22.4/src/plugins/generated/dunwah.cc 1970-01-01 00:00:00.000000000 +0000 +++ guitarix-0.24.2/src/plugins/generated/dunwah.cc 2012-10-20 03:56:02.000000000 +0000 @@ -0,0 +1,270 @@ +// generated from file '../src/plugins/dunwah.dsp' by dsp2cc: +// Code generated with Faust 0.9.46 (http://faust.grame.fr) + +#include "gx_faust_support.h" +#include "gx_plugin.h" + +namespace dunwah { + +class Dsp: public PluginDef { +private: + int fSamplingFreq; + FAUSTFLOAT fslider0; + int iConst0; + double fConst1; + double fRec1[2]; + double fConst2; + double fConst3; + double fRec2[2]; + double fConst4; + double fRec3[2]; + double fRec0[4]; + double fConst5; + double fConst6; + double fConst7; + double fConst8; + double fConst9; + double fConst10; + double fConst11; + void clear_state_f(); + int load_ui_f(const UiBuilder& b); + static const char *glade_def; + void init(unsigned int samplingFreq); + void compute(int count, float *input0, float *output0); + int register_par(const ParamReg& reg); + + static void clear_state_f_static(PluginDef*); + static int load_ui_f_static(const UiBuilder& b); + static void init_static(unsigned int samplingFreq, PluginDef*); + static void compute_static(int count, float *input0, float *output0, PluginDef*); + static int register_params_static(const ParamReg& reg); + static void del_instance(PluginDef *p); + +public: + Dsp(); + ~Dsp(); +}; + + + +Dsp::Dsp() + : PluginDef() { + version = PLUGINDEF_VERSION; + flags = 0; + id = "dunwah"; + name = N_("DunWah"); + groups = 0; + description = ""; // description (tooltip) + category = ""; // category + shortname = ""; // shortname + mono_audio = compute_static; + stereo_audio = 0; + set_samplerate = init_static; + activate_plugin = 0; + register_params = register_params_static; + load_ui = load_ui_f_static; + clear_state = clear_state_f_static; + delete_instance = del_instance; +} + +Dsp::~Dsp() { +} + +inline void Dsp::clear_state_f() +{ + for (int i=0; i<2; i++) fRec1[i] = 0; + for (int i=0; i<2; i++) fRec2[i] = 0; + for (int i=0; i<2; i++) fRec3[i] = 0; + for (int i=0; i<4; i++) fRec0[i] = 0; +} + +void Dsp::clear_state_f_static(PluginDef *p) +{ + static_cast(p)->clear_state_f(); +} + +inline void Dsp::init(unsigned int samplingFreq) +{ + fSamplingFreq = samplingFreq; + iConst0 = min(192000, max(1, fSamplingFreq)); + fConst1 = (0.007000000000000006 * ((iConst0 * (1.73888e-06 - (8.38823e-12 * iConst0))) - 0.193457)); + fConst2 = (0.5 / iConst0); + fConst3 = (1.0 / iConst0); + fConst4 = exp((0 - (1236.9027460477864 / iConst0))); + fConst5 = (1.77528e-06 - (8.52216e-12 * iConst0)); + fConst6 = (0.879905 + (iConst0 * fConst5)); + fConst7 = (1.54419e-05 - (6.43963e-11 * iConst0)); + fConst8 = ((iConst0 * fConst7) - 0.386688); + fConst9 = (fConst8 * (0 - (1.00038 * fConst6))); + fConst10 = ((fConst8 * fConst6) + (1.00038 * (fConst8 + fConst6))); + fConst11 = (0 - ((iConst0 * (fConst7 + fConst5)) + 1.4935970000000003)); + clear_state_f(); +} + +void Dsp::init_static(unsigned int samplingFreq, PluginDef *p) +{ + static_cast(p)->init(samplingFreq); +} + +inline void Dsp::compute(int count, float *input0, float *output0) +{ + double fSlow0 = fslider0; + double fSlow1 = (fConst1 * (0 - ((1.0 / ((fSlow0 * (0.270546 + (fSlow0 * ((fSlow0 * (3.64419 + (fSlow0 * ((2.85511 * fSlow0) - 5.20364)))) - 0.86331)))) - 0.814203)) + 0.933975))); + double fSlow2 = (1973.48 - (1000 / ((fSlow0 * (1.9841 + (fSlow0 * (5.76598 + (fSlow0 * ((fSlow0 * (49.9836 + (fSlow0 * ((12.499 * fSlow0) - 40.3658)))) - 28.3434)))))) - 1.6086))); + double fSlow3 = (1 - (fConst2 * (fSlow2 / (21.9737 + (fSlow0 * ((fSlow0 * (42.2734 + (fSlow0 * ((fSlow0 * (115.375 - (52.3051 * fSlow0))) - 99.7712)))) - 24.555)))))); + double fSlow4 = (0.007000000000000006 * (cos((fConst3 * fSlow2)) * (0 - (2.0 * fSlow3)))); + double fSlow5 = (0.007000000000000006 * faustpower<2>(fSlow3)); + for (int i=0; i0; i--) fRec0[i] = fRec0[i-1]; + fRec3[1] = fRec3[0]; + fRec2[1] = fRec2[0]; + fRec1[1] = fRec1[0]; + } +} + +void Dsp::compute_static(int count, float *input0, float *output0, PluginDef *p) +{ + static_cast(p)->compute(count, input0, output0); +} + +int Dsp::register_par(const ParamReg& reg) +{ + reg.registerVar("dunwah.wah","","S","",&fslider0, 0.0, 0.0, 1.0, 0.01); + return 0; +} + +int Dsp::register_params_static(const ParamReg& reg) +{ + return static_cast(reg.plugin)->register_par(reg); +} + +const char *Dsp::glade_def = "\ +\n\ +\n\ + \n\ + \n\ + \n\ + \n\ + False\n\ + \n\ + \n\ + True\n\ + False\n\ + \n\ + \n\ + True\n\ + False\n\ + \n\ + \n\ + True\n\ + False\n\ + \n\ + \n\ + True\n\ + False\n\ + \n\ + \n\ + True\n\ + False\n\ + label\n\ + \n\ + \n\ + False\n\ + True\n\ + 0\n\ + \n\ + \n\ + \n\ + \n\ + True\n\ + True\n\ + True\n\ + dunwah.wah\n\ + label1:rack_label\n\ + \n\ + \n\ + False\n\ + False\n\ + 1\n\ + \n\ + \n\ + \n\ + \n\ + False\n\ + False\n\ + 0\n\ + \n\ + \n\ + \n\ + \n\ + True\n\ + False\n\ + 0\n\ + \n\ + \n\ + \n\ + \n\ + True\n\ + True\n\ + 0\n\ + \n\ + \n\ + \n\ + \n\ + True\n\ + False\n\ + \n\ + \n\ + \n\ + \n\ + \n\ + True\n\ + True\n\ + 1\n\ + \n\ + \n\ + \n\ + \n\ + \n\ +\n\ +"; + +int Dsp::load_ui_f(const UiBuilder& b) +{ + b.load_glade(glade_def); + return 0; +} + +int Dsp::load_ui_f_static(const UiBuilder& b) +{ + return static_cast(b.plugin)->load_ui_f(b); +} + +PluginDef *plugin() { + return new Dsp(); +} + +void Dsp::del_instance(PluginDef *p) +{ + delete static_cast(p); +} + +extern "C" __attribute__ ((visibility ("default"))) int +get_gx_plugin(unsigned int idx, PluginDef **pplugin) +{ + if (!pplugin) { + return 1; + } + if (idx > 0) { + return -1; + } + *pplugin = new Dsp(); + return 1; +} +} // end namespace dunwah diff -Nru guitarix-0.22.4/src/plugins/generated/flanger_gx.cc guitarix-0.24.2/src/plugins/generated/flanger_gx.cc --- guitarix-0.22.4/src/plugins/generated/flanger_gx.cc 1970-01-01 00:00:00.000000000 +0000 +++ guitarix-0.24.2/src/plugins/generated/flanger_gx.cc 2012-10-20 03:56:02.000000000 +0000 @@ -0,0 +1,214 @@ +// generated from file '../src/plugins/flanger_gx.dsp' by dsp2cc: +// Code generated with Faust 0.9.46 (http://faust.grame.fr) + +#include "gx_faust_support.h" +#include "gx_plugin.h" + +namespace pluginlib { +namespace flanger_gx { + +class Dsp: public PluginDef { +private: + int fSamplingFreq; + int IOTA; + double fVec0[1024]; + int iVec1[2]; + FAUSTFLOAT fslider0; + FAUSTFLOAT fslider1; + FAUSTFLOAT fslider2; + FAUSTFLOAT fslider3; + int iConst0; + double fConst1; + double fRec1[2]; + double fRec2[2]; + FAUSTFLOAT fslider4; + FAUSTFLOAT fslider5; + double fConst2; + double fVec2[1024]; + double fRec0[2]; + double fVec3[2048]; + double fRec3[2]; + void clear_state_f(); + int load_ui_f(const UiBuilder& b); + void init(unsigned int samplingFreq); + void compute(int count, float *input0, float *output0); + int register_par(const ParamReg& reg); + + static void clear_state_f_static(PluginDef*); + static int load_ui_f_static(const UiBuilder& b); + static void init_static(unsigned int samplingFreq, PluginDef*); + static void compute_static(int count, float *input0, float *output0, PluginDef*); + static int register_params_static(const ParamReg& reg); + static void del_instance(PluginDef *p); + +public: + Dsp(); + ~Dsp(); +}; + + + +Dsp::Dsp() + : PluginDef() { + version = PLUGINDEF_VERSION; + flags = 0; + id = "flanger_mono_gx"; + name = N_("Flanger GX"); + groups = 0; + description = ""; // description (tooltip) + category = N_("Modulation"); // category + shortname = ""; // shortname + mono_audio = compute_static; + stereo_audio = 0; + set_samplerate = init_static; + activate_plugin = 0; + register_params = register_params_static; + load_ui = load_ui_f_static; + clear_state = clear_state_f_static; + delete_instance = del_instance; +} + +Dsp::~Dsp() { +} + +inline void Dsp::clear_state_f() +{ + for (int i=0; i<1024; i++) fVec0[i] = 0; + for (int i=0; i<2; i++) iVec1[i] = 0; + for (int i=0; i<2; i++) fRec1[i] = 0; + for (int i=0; i<2; i++) fRec2[i] = 0; + for (int i=0; i<1024; i++) fVec2[i] = 0; + for (int i=0; i<2; i++) fRec0[i] = 0; + for (int i=0; i<2048; i++) fVec3[i] = 0; + for (int i=0; i<2; i++) fRec3[i] = 0; +} + +void Dsp::clear_state_f_static(PluginDef *p) +{ + static_cast(p)->clear_state_f(); +} + +inline void Dsp::init(unsigned int samplingFreq) +{ + fSamplingFreq = samplingFreq; + IOTA = 0; + iConst0 = min(192000, max(1, fSamplingFreq)); + fConst1 = (6.283185307179586 / iConst0); + fConst2 = (0.5 * iConst0); + clear_state_f(); +} + +void Dsp::init_static(unsigned int samplingFreq, PluginDef *p) +{ + static_cast(p)->init(samplingFreq); +} + +inline void Dsp::compute(int count, float *input0, float *output0) +{ + double fSlow0 = fslider0; + double fSlow1 = fslider1; + double fSlow2 = (0.01 * (fSlow1 * min(1, (1 + fSlow0)))); + double fSlow3 = (2 - fSlow2); + double fSlow4 = (0.3333333333333333 * ((2 + fabs(fSlow0)) * fslider2)); + double fSlow5 = (fConst1 * fslider3); + double fSlow6 = sin(fSlow5); + double fSlow7 = cos(fSlow5); + double fSlow8 = (0 - fSlow6); + double fSlow9 = (0.0005 * fslider4); + double fSlow10 = (0.001 * fslider5); + double fSlow11 = (0.01 * (min(1, (1 - fSlow0)) * fSlow1)); + double fSlow12 = (2 - fSlow11); + double fSlow13 = (0 - fSlow4); + for (int i=0; i(p)->compute(count, input0, output0); +} + +int Dsp::register_par(const ParamReg& reg) +{ + reg.registerVar("flanger_mono_gx.depth",N_("Depth"),"S","",&fslider5, 0.5, 0.0, 5.0, 0.01); + reg.registerVar("flanger_mono_gx.width",N_("Width"),"S","",&fslider4, 5.0, 0.0, 1e+01, 0.01); + reg.registerVar("flanger_mono_gx.freq",N_("Speed"),"SL","",&fslider3, 0.2, 0.05, 1e+01, 1.06); + reg.registerVar("flanger_mono_gx.feedback",N_("Feedback"),"S","",&fslider2, -0.707, -0.99, 0.99, 0.01); + reg.registerVar("flanger_mono_gx.wet",N_("Wet"),"S","",&fslider1, 1e+02, 0.0, 1e+02, 1.0); + reg.registerVar("flanger_mono_gx.mix",N_("Mix"),"S","",&fslider0, 0.0, -1.0, 1.0, 0.1); + return 0; +} + +int Dsp::register_params_static(const ParamReg& reg) +{ + return static_cast(reg.plugin)->register_par(reg); +} + +inline int Dsp::load_ui_f(const UiBuilder& b) +{ +#define PARAM(p) ("flanger_mono_gx" "." p) + +b.openHorizontalhideBox(""); +b.create_master_slider(PARAM("wet"), "Dry/Wet"); +b.closeBox(); + +b.openHorizontalBox(""); +b.create_small_rackknob(PARAM("freq"), 0); +b.create_small_rackknob(PARAM("depth"), 0); +b.create_small_rackknob(PARAM("width"), 0); +b.create_small_rackknob(PARAM("feedback"), 0); +b.create_small_rackknob(PARAM("mix"), 0); +b.create_small_rackknob(PARAM("wet"), 0); +b.closeBox(); + +#undef PARAM + return 0; +} + +int Dsp::load_ui_f_static(const UiBuilder& b) +{ + return static_cast(b.plugin)->load_ui_f(b); +} + +PluginDef *plugin() { + return new Dsp(); +} + +void Dsp::del_instance(PluginDef *p) +{ + delete static_cast(p); +} + +} // end namespace flanger_gx +} // end namespace pluginlib diff -Nru guitarix-0.22.4/src/plugins/generated/ts9sim.cc guitarix-0.24.2/src/plugins/generated/ts9sim.cc --- guitarix-0.22.4/src/plugins/generated/ts9sim.cc 1970-01-01 00:00:00.000000000 +0000 +++ guitarix-0.24.2/src/plugins/generated/ts9sim.cc 2012-10-20 03:56:02.000000000 +0000 @@ -0,0 +1,184 @@ +// generated from file '../src/plugins/ts9sim.dsp' by dsp2cc: +// Code generated with Faust 0.9.46 (http://faust.grame.fr) + +#include "gx_faust_support.h" +#include "gx_plugin.h" +#include "ts9nonlin.h" + +namespace pluginlib { +namespace ts9sim { + +class Dsp: public PluginDef { +private: + int fSamplingFreq; + FAUSTFLOAT fslider0; + double fRec0[2]; + FAUSTFLOAT fslider1; + int iConst0; + double fConst1; + double fVec0[2]; + double fConst2; + double fConst3; + double fConst4; + FAUSTFLOAT fslider2; + double fConst5; + double fConst6; + double fRec2[2]; + double fVec1[2]; + double fRec1[2]; + void clear_state_f(); + int load_ui_f(const UiBuilder& b); + void init(unsigned int samplingFreq); + void compute(int count, float *input0, float *output0); + int register_par(const ParamReg& reg); + + static void clear_state_f_static(PluginDef*); + static int load_ui_f_static(const UiBuilder& b); + static void init_static(unsigned int samplingFreq, PluginDef*); + static void compute_static(int count, float *input0, float *output0, PluginDef*); + static int register_params_static(const ParamReg& reg); + static void del_instance(PluginDef *p); + +public: + Dsp(); + ~Dsp(); +}; + + + +Dsp::Dsp() + : PluginDef() { + version = PLUGINDEF_VERSION; + flags = 0; + id = "ts9sim"; + name = N_("Tube Screamer"); + groups = 0; + description = ""; // description (tooltip) + category = N_("Distortion"); // category + shortname = ""; // shortname + mono_audio = compute_static; + stereo_audio = 0; + set_samplerate = init_static; + activate_plugin = 0; + register_params = register_params_static; + load_ui = load_ui_f_static; + clear_state = clear_state_f_static; + delete_instance = del_instance; +} + +Dsp::~Dsp() { +} + +inline void Dsp::clear_state_f() +{ + for (int i=0; i<2; i++) fRec0[i] = 0; + for (int i=0; i<2; i++) fVec0[i] = 0; + for (int i=0; i<2; i++) fRec2[i] = 0; + for (int i=0; i<2; i++) fVec1[i] = 0; + for (int i=0; i<2; i++) fRec1[i] = 0; +} + +void Dsp::clear_state_f_static(PluginDef *p) +{ + static_cast(p)->clear_state_f(); +} + +inline void Dsp::init(unsigned int samplingFreq) +{ + fSamplingFreq = samplingFreq; + iConst0 = min(192000, max(1, fSamplingFreq)); + fConst1 = (3.141592653589793 / iConst0); + fConst2 = (0.00044179999999999995 * iConst0); + fConst3 = (1 + fConst2); + fConst4 = (0 - ((1 - fConst2) / fConst3)); + fConst5 = (9.4e-08 * iConst0); + fConst6 = (1.0 / fConst3); + clear_state_f(); +} + +void Dsp::init_static(unsigned int samplingFreq, PluginDef *p) +{ + static_cast(p)->init(samplingFreq); +} + +inline void Dsp::compute(int count, float *input0, float *output0) +{ + double fSlow0 = (0.0010000000000000009 * pow(10,(0.05 * fslider0))); + double fSlow1 = (1.0 / tan((fConst1 * fslider1))); + double fSlow2 = (1 + fSlow1); + double fSlow3 = (0 - ((1 - fSlow1) / fSlow2)); + double fSlow4 = (fConst5 * ((500000 * fslider2) + 55700)); + double fSlow5 = (1 + fSlow4); + double fSlow6 = (1 - fSlow4); + double fSlow7 = (1.0 / fSlow2); + for (int i=0; i(p)->compute(count, input0, output0); +} + +int Dsp::register_par(const ParamReg& reg) +{ + reg.registerVar("ts9sim.drive",N_("Drive"),"S","",&fslider2, 0.5, 0.0, 1.0, 0.01); + reg.registerVar("ts9sim.tone",N_("Tone"),"SL","",&fslider1, 4e+02, 1e+02, 1e+03, 1.03); + reg.registerVar("ts9sim.level",N_("Level"),"S","",&fslider0, -16.0, -2e+01, 4.0, 0.1); + return 0; +} + +int Dsp::register_params_static(const ParamReg& reg) +{ + return static_cast(reg.plugin)->register_par(reg); +} + +inline int Dsp::load_ui_f(const UiBuilder& b) +{ +#define PARAM(p) ("ts9sim" "." p) + +b.openHorizontalhideBox(""); +b.create_master_slider(PARAM("drive"), 0); +b.closeBox(); +b.openHorizontalBox(""); +b.insertSpacer(); +b.create_small_rackknobr(PARAM("drive"), 0); +b.create_small_rackknob(PARAM("level"), 0); +b.create_small_rackknob(PARAM("tone"), 0); +b.insertSpacer(); +b.closeBox(); + +#undef PARAM + return 0; +} + +int Dsp::load_ui_f_static(const UiBuilder& b) +{ + return static_cast(b.plugin)->load_ui_f(b); +} + +PluginDef *plugin() { + return new Dsp(); +} + +void Dsp::del_instance(PluginDef *p) +{ + delete static_cast(p); +} + +} // end namespace ts9sim +} // end namespace pluginlib diff -Nru guitarix-0.22.4/src/plugins/generated/zita_rev1.cc guitarix-0.24.2/src/plugins/generated/zita_rev1.cc --- guitarix-0.22.4/src/plugins/generated/zita_rev1.cc 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/src/plugins/generated/zita_rev1.cc 2012-10-20 03:56:02.000000000 +0000 @@ -1,5 +1,5 @@ // generated from file '../src/plugins/zita_rev1.dsp' by dsp2cc: -// Code generated with Faust 0.9.43 (http://faust.grame.fr) +// Code generated with Faust 0.9.46 (http://faust.grame.fr) #include "gx_faust_support.h" #include "gx_plugin.h" @@ -160,6 +160,9 @@ id = "zita_rev1"; name = N_("Zita Rev1"); groups = parm_groups; + description = ""; // description (tooltip) + category = N_("Reverb"); // category + shortname = ""; // shortname mono_audio = 0; stereo_audio = compute_static; set_samplerate = init_static; @@ -303,7 +306,7 @@ double fSlow3 = (1.0 - fSlow2); double fSlow4 = cos((fConst3 * fslider1)); double fSlow5 = (1.0 - (fSlow4 * fSlow2)); - double fSlow6 = sqrt(((faustpower<2>(fSlow5) / faustpower<2>(fSlow3)) - 1.0)); + double fSlow6 = sqrt(max(0, ((faustpower<2>(fSlow5) / faustpower<2>(fSlow3)) - 1.0))); double fSlow7 = (fSlow5 / fSlow3); double fSlow8 = (fSlow7 - fSlow6); double fSlow9 = (1.0 / tan((fConst4 * fslider2))); @@ -318,7 +321,7 @@ double fSlow18 = faustpower<2>(fSlow17); double fSlow19 = (1.0 - fSlow18); double fSlow20 = (1.0 - (fSlow4 * fSlow18)); - double fSlow21 = sqrt(((faustpower<2>(fSlow20) / faustpower<2>(fSlow19)) - 1.0)); + double fSlow21 = sqrt(max(0, ((faustpower<2>(fSlow20) / faustpower<2>(fSlow19)) - 1.0))); double fSlow22 = (fSlow20 / fSlow19); double fSlow23 = (fSlow22 - fSlow21); double fSlow24 = ((exp((fConst10 / fSlow13)) / fSlow17) - 1); @@ -327,7 +330,7 @@ double fSlow27 = faustpower<2>(fSlow26); double fSlow28 = (1.0 - fSlow27); double fSlow29 = (1.0 - (fSlow4 * fSlow27)); - double fSlow30 = sqrt(((faustpower<2>(fSlow29) / faustpower<2>(fSlow28)) - 1.0)); + double fSlow30 = sqrt(max(0, ((faustpower<2>(fSlow29) / faustpower<2>(fSlow28)) - 1.0))); double fSlow31 = (fSlow29 / fSlow28); double fSlow32 = (fSlow31 - fSlow30); double fSlow33 = ((exp((fConst15 / fSlow13)) / fSlow26) - 1); @@ -336,7 +339,7 @@ double fSlow36 = faustpower<2>(fSlow35); double fSlow37 = (1.0 - fSlow36); double fSlow38 = (1.0 - (fSlow4 * fSlow36)); - double fSlow39 = sqrt(((faustpower<2>(fSlow38) / faustpower<2>(fSlow37)) - 1.0)); + double fSlow39 = sqrt(max(0, ((faustpower<2>(fSlow38) / faustpower<2>(fSlow37)) - 1.0))); double fSlow40 = (fSlow38 / fSlow37); double fSlow41 = (fSlow40 - fSlow39); double fSlow42 = ((exp((fConst20 / fSlow13)) / fSlow35) - 1); @@ -345,7 +348,7 @@ double fSlow45 = faustpower<2>(fSlow44); double fSlow46 = (1.0 - fSlow45); double fSlow47 = (1.0 - (fSlow4 * fSlow45)); - double fSlow48 = sqrt(((faustpower<2>(fSlow47) / faustpower<2>(fSlow46)) - 1.0)); + double fSlow48 = sqrt(max(0, ((faustpower<2>(fSlow47) / faustpower<2>(fSlow46)) - 1.0))); double fSlow49 = (fSlow47 / fSlow46); double fSlow50 = (fSlow49 - fSlow48); double fSlow51 = ((exp((fConst25 / fSlow13)) / fSlow44) - 1); @@ -354,7 +357,7 @@ double fSlow54 = faustpower<2>(fSlow53); double fSlow55 = (1.0 - fSlow54); double fSlow56 = (1.0 - (fSlow4 * fSlow54)); - double fSlow57 = sqrt(((faustpower<2>(fSlow56) / faustpower<2>(fSlow55)) - 1.0)); + double fSlow57 = sqrt(max(0, ((faustpower<2>(fSlow56) / faustpower<2>(fSlow55)) - 1.0))); double fSlow58 = (fSlow56 / fSlow55); double fSlow59 = (fSlow58 - fSlow57); double fSlow60 = ((exp((fConst30 / fSlow13)) / fSlow53) - 1); @@ -363,7 +366,7 @@ double fSlow63 = faustpower<2>(fSlow62); double fSlow64 = (1.0 - fSlow63); double fSlow65 = (1.0 - (fSlow4 * fSlow63)); - double fSlow66 = sqrt(((faustpower<2>(fSlow65) / faustpower<2>(fSlow64)) - 1.0)); + double fSlow66 = sqrt(max(0, ((faustpower<2>(fSlow65) / faustpower<2>(fSlow64)) - 1.0))); double fSlow67 = (fSlow65 / fSlow64); double fSlow68 = (fSlow67 - fSlow66); double fSlow69 = ((exp((fConst35 / fSlow13)) / fSlow62) - 1); @@ -372,7 +375,7 @@ double fSlow72 = faustpower<2>(fSlow71); double fSlow73 = (1.0 - fSlow72); double fSlow74 = (1.0 - (fSlow72 * fSlow4)); - double fSlow75 = sqrt(((faustpower<2>(fSlow74) / faustpower<2>(fSlow73)) - 1.0)); + double fSlow75 = sqrt(max(0, ((faustpower<2>(fSlow74) / faustpower<2>(fSlow73)) - 1.0))); double fSlow76 = (fSlow74 / fSlow73); double fSlow77 = (fSlow76 - fSlow75); double fSlow78 = ((exp((fConst40 / fSlow13)) / fSlow71) - 1); diff -Nru guitarix-0.22.4/src/plugins/ts9nonlin.cc guitarix-0.24.2/src/plugins/ts9nonlin.cc --- guitarix-0.22.4/src/plugins/ts9nonlin.cc 1970-01-01 00:00:00.000000000 +0000 +++ guitarix-0.24.2/src/plugins/ts9nonlin.cc 2012-10-20 03:56:02.000000000 +0000 @@ -0,0 +1,26 @@ +// file generated by tools/ts9sim.py -- do not modify manually + +static table1d_imp<100> ts9table = { + 0,0.970874,101.97,100, { + 0.0,-0.0296990148227,-0.0599780676992,-0.0908231643281,-0.122163239629, + -0.15376009788,-0.184938007182,-0.214177260107,-0.239335434213,-0.259232575019, + -0.274433909887,-0.286183308354,-0.29553854444,-0.303222323477,-0.309706249977, + -0.315301338712,-0.320218440785,-0.324604982281,-0.328567120703,-0.332183356975, + -0.335513124719,-0.33860236542,-0.34148724693,-0.344196707008,-0.346754233717, + -0.34917913798,-0.351487480543,-0.35369275887,-0.355806424152,-0.357838275995, + -0.359796767655,-0.361689244919,-0.363522135105,-0.365301098113,-0.367031148289, + -0.368716753588,-0.370361916943,-0.371970243537,-0.373544996828,-0.375089145544, + -0.376605403346,-0.378096262548,-0.379564022938,-0.381010816596,-0.382438629377, + -0.383849319643,-0.385244634694,-0.386626225283,-0.387995658543,-0.389354429565, + -0.39070397188,-0.392045667012,-0.393380853288,-0.39471083403,-0.396036885269, + -0.397360263098,-0.398682210753,-0.400003965547,-0.401326765733,-0.402651857394, + -0.403980501471,-0.405313980999,-0.406653608692,-0.40800073496,-0.409356756504, + -0.410723125631,-0.412101360439,-0.413493056085,-0.414899897347,-0.416323672745, + -0.417766290556,-0.419229797097,-0.420716397759,-0.422228481377,-0.423768648654, + -0.425339745558,-0.426944902828,-0.428587583057,-0.430271637224,-0.432001373102, + -0.433781638746,-0.435617925286,-0.437516494692,-0.439484540257,-0.441530390423, + -0.443663770898,-0.445896146322,-0.448241172434,-0.450715304661,-0.453338632988, + -0.45613605235,-0.45913894467,-0.46238766699,-0.465935359011,-0.469854010456, + -0.474244617411,-0.479255257451,-0.48511588606,-0.492212726244,-0.501272723631 + } +}; diff -Nru guitarix-0.22.4/src/plugins/ts9nonlin.h guitarix-0.24.2/src/plugins/ts9nonlin.h --- guitarix-0.22.4/src/plugins/ts9nonlin.h 1970-01-01 00:00:00.000000000 +0000 +++ guitarix-0.24.2/src/plugins/ts9nonlin.h 2012-10-20 03:56:02.000000000 +0000 @@ -0,0 +1,43 @@ +/* + * Copyright (C) 2012 Andreas Degert, Hermann Meyer + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +template +struct table1d_imp { + float low; + float high; + float istep; + int size; + float data[tab_size]; +}; + +#include "ts9nonlin.cc" + +static inline double ts9nonlin(double x) { + double f = fabs(x); + f = (f/(3.0 + f) - ts9table.low) * ts9table.istep; + int i = static_cast(f); + if (i < 0) { + f = ts9table.data[0]; + } else if (i >= ts9table.size-1) { + f = ts9table.data[ts9table.size-1]; + } else { + f -= i; + f = ts9table.data[i]*(1-f) + ts9table.data[i+1]*f; + } + return copysign(f, -x); +} diff -Nru guitarix-0.22.4/src/plugins/ts9sim.dsp guitarix-0.24.2/src/plugins/ts9sim.dsp --- guitarix-0.22.4/src/plugins/ts9sim.dsp 1970-01-01 00:00:00.000000000 +0000 +++ guitarix-0.24.2/src/plugins/ts9sim.dsp 2012-10-20 03:56:02.000000000 +0000 @@ -0,0 +1,28 @@ +declare id "ts9sim"; +declare name "Tube Screamer"; +declare category "Distortion"; + +/* +** based on a circuit diagram of the Ibanez TS-9 and +** a mathematical analysis published by Tamás Kenéz +*/ + +smoothi(c) = *(1-c) : +~*(c); + +process = ts9 : lowpass : *(gain) with { + SR = component("math.lib").SR; + R1 = 4700; + R2 = 51000 + 500000 * hslider("drive[name:Drive]", 0.5, 0, 1, 0.01); + C = 0.047 * 1e-6; + a1 = (R1 + R2) * C * 2 * SR; + a2 = R1 * C * 2 * SR; + B0 = (1 + a1) / (1 + a2); + B1 = (1 - a1) / (1 + a2); + A1 = (1 - a2) / (1 + a2); + X2 = component("filter.lib").tf1(B0, B1, A1); + ts9nonlin = ffunction(float ts9nonlin(float), "ts9nonlin.h", ""); + ts9 = _ <: _ - ts9nonlin(X2-_) :> _; + fc = hslider("tone[log][name:Tone]", 400, 100, 1000, 1.03); + lowpass = component("filter.lib").lowpass(1,fc); + gain = hslider("level[name:Level]", -16, -20, 4, 0.1) : component("music.lib").db2linear : smoothi(0.999); +}; diff -Nru guitarix-0.22.4/src/plugins/ts9sim_ui.cc guitarix-0.24.2/src/plugins/ts9sim_ui.cc --- guitarix-0.22.4/src/plugins/ts9sim_ui.cc 1970-01-01 00:00:00.000000000 +0000 +++ guitarix-0.24.2/src/plugins/ts9sim_ui.cc 2012-10-20 03:56:02.000000000 +0000 @@ -0,0 +1,10 @@ +b.openHorizontalhideBox(""); +b.create_master_slider(PARAM("drive"), 0); +b.closeBox(); +b.openHorizontalBox(""); +b.insertSpacer(); +b.create_small_rackknobr(PARAM("drive"), 0); +b.create_small_rackknob(PARAM("level"), 0); +b.create_small_rackknob(PARAM("tone"), 0); +b.insertSpacer(); +b.closeBox(); diff -Nru guitarix-0.22.4/src/plugins/vibe.cc guitarix-0.24.2/src/plugins/vibe.cc --- guitarix-0.22.4/src/plugins/vibe.cc 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/src/plugins/vibe.cc 2012-10-20 03:56:02.000000000 +0000 @@ -189,8 +189,10 @@ } else { id = "univibe_mono"; name = N_("Vibe Mono"); + shortname = N_("Vibe"); mono_audio = process_mono; } + category = N_("Modulation"); set_samplerate = init; register_params = registerparam; load_ui = uiloader; diff -Nru guitarix-0.22.4/src/plugins/wscript guitarix-0.24.2/src/plugins/wscript --- guitarix-0.22.4/src/plugins/wscript 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/src/plugins/wscript 2012-10-20 03:56:02.000000000 +0000 @@ -4,9 +4,11 @@ import os csources = [ # generate .so files from c sources that can be loaded by guitarix + # element = name or [name, [lib, ...]] ] sources = [ # generate .so files that can be loaded by guitarix + #"dunwah.dsp", ] lib_csource_defs = [ # put in static library linked with guitarix @@ -16,6 +18,8 @@ lib_sources = [ # put in static library linked with guitarix "zita_rev1.dsp", + "ts9sim.dsp", + "flanger_gx.dsp", ] def build(bld): @@ -47,8 +51,8 @@ source = gdir + s, target = s, ) - lib_csources = [v if isinstance(v, basestring) else v[0] for v in lib_csource_defs] - lib_dict = dict([v for v in lib_csource_defs if not isinstance(v, basestring)]) + lib_csources = [v if isinstance(v, str) else v[0] for v in lib_csource_defs] + lib_dict = dict([v for v in lib_csource_defs if not isinstance(v, str)]) def run(task): l = [] for fname in lib_sources+lib_csources: @@ -58,7 +62,7 @@ l.append("namespace %s { PluginDef *%s(); }\n" % (name, pname)) else: l.append("namespace %s { PluginDef *plugin(); }\n" % name) - f = file(task.outputs[0].bldpath(task.env),"w") + f = open(task.outputs[0].bldpath(task.env),"w") f.write('#include "gx_plugin.h"\n\nnamespace pluginlib {\n') f.write("".join(l)) f.write("}\n") @@ -73,30 +77,37 @@ bld.env["HAVE_PLUGINLIB"] = have_pluginlib if have_pluginlib: bld(features = ['cxx', 'cstaticlib'], - includes = ["../headers"], + includes = [".","../headers"], source = [s.replace(".dsp",".cc") for s in lib_sources]+lib_csources, target = "plugins", # (also defines name of task) ) for s in sources: - bld(name = "create plugin .so", + tsk = bld(name = "create plugin .so", features = ['cxx', 'cshlib'], type = 'cshlib', cxxflags = ["-fvisibility=hidden"], - includes = ["../headers"], + includes = [".","../headers"], source = [s.replace(".dsp",".cc")], target = s.replace(".dsp",""), ) + tsk.env['shlib_PATTERN'] = '%s.so' for s in csources: - bld(name = "create plugin .so", + if not isinstance(s, str): + uselib = s[1] + s = s[0] + else: + uselib = [] + tsk = bld(name = "create plugin .so", features = ['cxx', 'cshlib'], type = 'cshlib', cxxflags = ["-fvisibility=hidden"], includes = ["../headers"], source = s, target = s.replace(".cc",""), + uselib = uselib, install_path = None, # for now... ) - + tsk.env['shlib_PATTERN'] = '%s.so' def configure(conf): pass diff -Nru guitarix-0.22.4/src/plugins/zita_rev1.dsp guitarix-0.24.2/src/plugins/zita_rev1.dsp --- guitarix-0.22.4/src/plugins/zita_rev1.dsp 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/src/plugins/zita_rev1.dsp 2012-10-20 03:56:02.000000000 +0000 @@ -3,6 +3,7 @@ declare id "zita_rev1"; declare name "Zita Rev1"; +declare category "Reverb"; import("filter.lib"); diff -Nru guitarix-0.22.4/tools/README guitarix-0.24.2/tools/README --- guitarix-0.22.4/tools/README 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/tools/README 2012-10-20 03:56:02.000000000 +0000 @@ -17,18 +17,6 @@ search all relevant guitarix source files for function names, variable names etc. Fits nicely with Emacs grep (see below). - - build-module, faustmod.pyx, pythonmodule.cpp - build python modules directly from faust sources (e.g. for - analytical processing). Uses faustmod.pyx - - - build-pluginloader, pluginloader.pyx, pluginloader.h - build a python module pluginloader.so which loads Guitarix - plugins - - - build-ladspaloader, ladspaloader.pyx - build a python module ladspaloader.so which loads LADSPA - plugins - - tubestage.dsp faust module as test case for build-module (core tube stage copied from the faust directory) @@ -57,6 +45,37 @@ convert the C++ output of faust into the form used by guitarix. Used by build process. +----------------- Python module builder ------------------------ + + - build-module, faustmod.pyx, pythonmodule.cpp + build python modules directly from faust sources (e.g. for + analytical processing). Uses faustmod.pyx + + - build-pluginloader, pluginloader.pyx, pluginloader.h + build a python module pluginloader.so which loads Guitarix + plugins + + - build-ladspaloader, ladspaloader.pyx + build a python module ladspaloader.so which loads LADSPA + plugins + +----------------- Guitarix module builder ---------------------- + + - build-cmodule + build a Guitarix module from a c source + + - build-faust + build a Guitarix module from a faust source + + - example.py + example how to use modules in python + run with "./build-cmodule example_plugin.cc && python example.py" + + - pyrun-fixed + can be used instead of just python to get a better controlled + runtime environment for execution timing (2nd part of example.py) + +---------------------------------------------------------------- Emacs support: diff -Nru guitarix-0.22.4/tools/build-cmodule guitarix-0.24.2/tools/build-cmodule --- guitarix-0.22.4/tools/build-cmodule 1970-01-01 00:00:00.000000000 +0000 +++ guitarix-0.24.2/tools/build-cmodule 2012-10-20 03:56:02.000000000 +0000 @@ -0,0 +1,27 @@ +#! /bin/bash +tooldir="$(dirname "$0")" +instdir="$tooldir"/.. +copy=0 +if [ "$1" = -c ]; then + copy=1 + shift +fi +[ "$1" = "" ] && { + echo "usage: build-cmodule [-c] " + echo " -c: copy generated file to user plugin dir" + exit 1 +} +set -e +bname="$(basename "${1%.*}" .dsp)" +opt="-shared -fPIC -fvisibility=hidden" +opt="$opt -I$instdir/src/gx_head -I$instdir/src/headers" +opt="$opt -Wall -g" +opt="$opt -O3 -march=i686 -mmmx -msse4.2 -mfpmath=sse -ftree-loop-linear -ffinite-math-only -fno-math-errno -fno-signed-zeros -fstrength-reduce" +opt="$opt $CFLAGS $LDFLAGS" +g++ -o "$bname".so "$1" $opt +if [ $copy = 1 ]; then + cp "$bname.so" ~/.config/guitarix/plugins/. + echo "created and copied $bname.so" +else + echo "created $bname.so" +fi diff -Nru guitarix-0.22.4/tools/build-faust guitarix-0.24.2/tools/build-faust --- guitarix-0.22.4/tools/build-faust 1970-01-01 00:00:00.000000000 +0000 +++ guitarix-0.24.2/tools/build-faust 2012-10-20 03:56:02.000000000 +0000 @@ -0,0 +1,44 @@ +#! /bin/bash +function usage() { + echo "usage: build-faust {options} []" + echo "options:" + echo " -s: faust use single precision" + echo " -c: copy generated file to user plugin dir" + exit 1 +} +faustargs="-double" +tooldir="$(dirname "$0")" +instdir="$tooldir"/.. +copy=0 +while getopts sc OPT; do + case "$OPT" in + h) usage;; + s) faustargs="";; + c) copy=1;; + \?) usage;; + esac +done +shift $(expr $OPTIND - 1) +[ "$1" = "" ] && usage +if [ "$2" = "" ]; then + bname="$(basename "$1" .dsp)" +else + bname="$2" +fi +set -e +"$tooldir"/dsp2cc --param-warn --init-type=plugin-instance --template-type=sharedlib -o "$bname.cc" "$1" +opt="$(python-config --cflags --ldflags | sed s/-Wstrict-prototypes//)" +opt="$opt -shared -fPIC -fvisibility=hidden" +opt="$opt -I$instdir/src/gx_head -I$instdir/src/headers" +opt="$opt -Wall -Wno-unused-function" +#opt="$opt -Wno-unused-but-set-variable" +opt="$opt -O3 -march=i686 -mmmx -msse4.2 -mfpmath=sse -ftree-loop-linear -ffinite-math-only -fno-math-errno -fno-signed-zeros -fstrength-reduce" +g++ $opt "$bname.cc" -o "$bname.so" +rm -f "$bname.cc" +echo "created $bname.so" +if [ $copy = 1 ]; then + cp "$bname.so" ~/.config/guitarix/plugins/. + echo "created and copied $bname.so" +else + echo "created $bname.so" +fi diff -Nru guitarix-0.22.4/tools/build-ladspaloader guitarix-0.24.2/tools/build-ladspaloader --- guitarix-0.22.4/tools/build-ladspaloader 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/tools/build-ladspaloader 2012-10-20 03:56:02.000000000 +0000 @@ -1,8 +1,10 @@ #! /bin/bash set -e -cd "$(dirname $0)" -pyinc="-I /usr/include/python2.7" +tooldir="$(dirname "$0")" pl=ladspaloader -cython $pl.pyx -gcc -g $pyinc -I ../src/headers -shared -fPIC $pl.c -lrt -o $pl.so -rm $pl.c +cython "$tooldir/$pl".pyx -o "$pl".c +opt="$(python-config --cflags --ldflags)" +opt="$opt -shared -fPIC -lrt" +opt="$opt -Wall -Wno-unused-function -Wno-unused-but-set-variable" +gcc -g $opt "$pl".c -o "$pl".so +rm "$pl".c diff -Nru guitarix-0.22.4/tools/build-module guitarix-0.24.2/tools/build-module --- guitarix-0.22.4/tools/build-module 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/tools/build-module 2012-10-20 03:56:02.000000000 +0000 @@ -2,25 +2,26 @@ function compile() { set -e rm -f "$2".so - faust $faustargs -a pythonmodule.cpp -o faustwrap.cpp "$1" + faust $faustargs -a "$tooldir"/pythonmodule.cpp -o faustwrap.cpp "$1" cython --cplus "$2".pyx - inc="-I../src/gx_head -I../src/headers -I/usr/include/python2.7" - opt="-fno-strict-aliasing -fwrapv -O2 -shared -fPIC" - opt="$opt -Wall -Wno-unused-but-set-variable -Wno-unused-function" - g++ $opt $inc "$2".cpp -o "$2".so -lrt + opt="$(python-config --cflags --ldflags | sed s/-Wstrict-prototypes//)" + opt="$opt -shared -fPIC -lrt" + opt="$opt -I$instdir/src/gx_head -I$instdir/src/headers" + opt="$opt -Wall -Wno-unused-function" + #opt="$opt -Wno-unused-but-set-variable" + opt="$opt -O3 -march=i686 -mmmx -msse4.2 -mfpmath=sse -ftree-loop-linear -ffinite-math-only -fno-math-errno -fno-signed-zeros -fstrength-reduce" + g++ "$2".cpp -o "$2".so $opt rm -f faustwrap.cpp $2.cpp echo "created $2.so" } -faustargs="-double" [ "$1" = "" ] && { - echo "usage: ./build-module [-single] []" - exit 1 -} -[ "$(dirname "$0")" != "." ] && { - echo 'error: please make "tools" your working directory' + echo "usage: build-module [-single] []" exit 1 } +faustargs="-double" +tooldir="$(dirname "$0")" +instdir="$tooldir"/.. [ "$1" = "-single" ] && { faustargs="" shift @@ -30,8 +31,8 @@ else bname="$2" fi -if [ "$bname" != faustmod ]; then +if [ "$tooldir" != . -o "$bname" != faustmod ]; then trap 'rm -f "$bname".pyx' EXIT - ln -s faustmod.pyx "$bname".pyx + ln -s "$tooldir"/faustmod.pyx "$bname".pyx fi compile "$1" "$bname" diff -Nru guitarix-0.22.4/tools/build-pluginloader guitarix-0.24.2/tools/build-pluginloader --- guitarix-0.22.4/tools/build-pluginloader 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/tools/build-pluginloader 2012-10-20 03:56:02.000000000 +0000 @@ -1,8 +1,12 @@ #! /bin/bash set -e -cd "$(dirname $0)" -pyinc="-I /usr/include/python2.7" +tooldir="$(dirname "$0")" +instdir="$tooldir"/.. pl=pluginloader -cython --cplus $pl.pyx -g++ -g $pyinc -I ../src/headers -shared -fPIC $pl.cpp -lrt -o $pl.so -rm $pl.cpp +cython --cplus "$tooldir/$pl".pyx -o "$pl".cpp +opt="$(python-config --cflags --ldflags | sed s/-Wstrict-prototypes//)" +opt="$opt -shared -fPIC -lrt" +opt="$opt -Wall -Wno-unused-function -Wno-unused-but-set-variable" +opt="$opt -I$tooldir -I$instdir/src/headers" +g++ -g $opt "$pl".cpp -o "$pl".so +rm "$pl".cpp diff -Nru guitarix-0.22.4/tools/build-ts9table guitarix-0.24.2/tools/build-ts9table --- guitarix-0.22.4/tools/build-ts9table 1970-01-01 00:00:00.000000000 +0000 +++ guitarix-0.24.2/tools/build-ts9table 2012-10-20 03:56:02.000000000 +0000 @@ -0,0 +1,8 @@ +#! /bin/bash +set -e +python ts9sim.py T > ../src/plugins/ts9nonlin.cc +cython --cplus ts9func.pyx +opt="$(python-config --cflags --ldflags | sed s/-Wstrict-prototypes//)" +opt="$opt -Wno-unused-function -shared -fPIC" +g++ ts9func.cpp $opt -I ../src/plugins -o ts9func.so +python ts9sim.py diff -Nru guitarix-0.22.4/tools/dsp2cc guitarix-0.24.2/tools/dsp2cc --- guitarix-0.22.4/tools/dsp2cc 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/tools/dsp2cc 2012-10-20 03:56:02.000000000 +0000 @@ -25,6 +25,8 @@ d["prefix"] = prefix d["N_name"] = wrap_N_("%(name)s" % self) d["N_tooltip"] = wrap_N_("%(tooltip)s" % self) + if "log" in d: + d["type"] += "L" if "alias" in d: assert "enum" not in d fp.write('\t%(variable)s_ = %(prefix)sregisterVar("%(id)s",%(N_name)s,"%(type)sA",%(N_tooltip)s,&%(variable)s%(tail)s);\n' % d) @@ -80,7 +82,7 @@ for v, r in self.ui.items(): r.write(fp, v, prefix) - def check_parameter(self, fname, uiname, l): + def check_parameter(self, fname, uiname, l, only_warn): s1 = set(l) s2 = set([v["id"] for v in self.ui.values()]) d = s2 - s1 @@ -91,9 +93,14 @@ errlevel = 1 d = s1 - s2 if d: - print ("%s:error: parameters in %s not found in faust dsp: %s" - % (fname, uiname, ", ".join(d))) - errlevel = 2 + if only_warn: + cat = "warning" + errlevel = 1 + else: + cat = "error" + errlevel = 2 + print ("%s:%s: parameters in %s not found in faust dsp: %s" + % (fname, cat, uiname, ", ".join(d))) return errlevel @@ -304,6 +311,12 @@ self.name = value elif key == "groups": self.groups.update(self.splitgroups(value)); + elif key == "category": + self.category = value + elif key == "shortname": + self.shortname = value + elif key == "description": + self.description = value def readIncludes(self, stop_expr): stop = re.compile(stop_expr).match @@ -468,6 +481,9 @@ "%s", // id %s, // name %s, // groups + %s, // description (tooltip) + %s, // category + %s, // shortname %s, // mono_audio %s, // stereo_audio init, // set_samplerate @@ -584,7 +600,10 @@ } #if %(has_cc_ui)s int load_ui(const UiBuilder& b) { +#define PARAM(p) ("%(plugin_id)s" "." p) %(cc_ui)s +#undef PARAM + return 0; } #endif @@ -606,6 +625,9 @@ "%(plugin_id)s", // id %(plugin_name)s, // name %(groups_p)s, // groups + %(description)s, // description (tooltip) + %(category)s, // category + %(shortname)s, // shortname %(mono_compute_p)s, // mono_audio %(stereo_compute_p)s, // stereo_audio init, // set_samplerate @@ -727,6 +749,9 @@ id = "%(plugin_id)s"; name = %(plugin_name)s; groups = %(groups_p)s; + description = %(description)s; // description (tooltip) + category = %(category)s; // category + shortname = %(shortname)s; // shortname mono_audio = %(mono_compute_p)s; stereo_audio = %(stereo_compute_p)s; set_samplerate = init_static; @@ -835,7 +860,10 @@ #if %(has_cc_ui)s inline int Dsp::load_ui_f(const UiBuilder& b) { +#define PARAM(p) ("%(plugin_id)s" "." p) %(cc_ui)s +#undef PARAM + return 0; } #if %(has_plugindef)s @@ -875,6 +903,20 @@ } #endif +#if %(sharedlib)s +extern "C" __attribute__ ((visibility ("default"))) int +get_gx_plugin(unsigned int idx, PluginDef **pplugin) +{ + if (!pplugin) { + return 1; + } + if (idx > 0) { + return -1; + } + *pplugin = new Dsp(); + return 1; +} +#endif } // end namespace %(namespace)s %(end_extra_namespace)s\ """ @@ -899,14 +941,13 @@ fp.write(plugin_standalone_header) self.parser.write(fp, "includes") - def write_load_ui(self, fp, wrap=True): + def write_load_ui(self, fp, plugin_id, wrap=True): load_ui = 0 ui_name = self.fname.replace(".dsp", "_ui.glade") if os.path.exists(ui_name): xml = file(ui_name).read() - if self.parser.ui.check_parameter( - self.fname, ui_name, - re.findall('([^<]*)',xml)): + found_params = re.findall('([^<]*)',xml) + if self.parser.ui.check_parameter(self.fname, ui_name, found_params, self.options.param_warn) > 1: raise SystemExit, 1 s = xml.replace("\\",r"\\").replace("\n","\\n\\\n").replace('"',r'\"') if wrap: @@ -918,9 +959,13 @@ ui_name = self.fname.replace(".dsp", "_ui.cc") if os.path.exists(ui_name): ccdef = file(ui_name).read() - if self.parser.ui.check_parameter( - self.fname, ui_name, - re.findall(r'\.create_[a-zA-Z0-9_]+\("([^"]*)',ccdef)): + re_func_name = r'.*\.create_[a-zA-Z0-9_]+' + re_str = r'"([^"]*)' + re_param = r'PARAM\(\s*' + re_str + re_expr = r'\s*(//)?'+re_func_name+r'\s*\(\s*(?:'+re_param+'|'+re_str+')' + found_params = [v[2] if v[2] else plugin_id + "." + v[1] + for v in re.findall(re_expr,ccdef) if not v[0]] + if self.parser.ui.check_parameter(self.fname, ui_name, found_params, self.options.param_warn) > 1: raise SystemExit, 1 fp.write("\n") fp.write(ccdef) @@ -931,11 +976,11 @@ fp.write("static int register_params(const ParamReg& reg)\n{\n") self.parser.ui.write(fp, prefix="reg.") fp.write("\treturn 0;\n}\n") - if self.write_load_ui(fp): + plugin_id = self.parser.toplevel or self.parser.topname + if self.write_load_ui(fp, plugin_id): load_ui = "load_ui" else: load_ui = "0" - plugin_id = self.parser.toplevel or self.parser.topname if self.parser.groups: fp.write("\nstatic const char* parm_groups[] = {\n%s\t};\n" % self.parser.formatted_groups(plugin_id)) if self.parser.name: @@ -946,6 +991,9 @@ plugin_id, # id plugin_name, # name "parm_groups" if self.parser.groups else "0", # groups + wrap_N_(getattr(self.parser,"description","")), # description (tooltip) + wrap_N_(getattr(self.parser,"category","")), # category + wrap_N_(getattr(self.parser,"shortname","")), # shortname "compute" if self.parser.getNumOutputs() == 1 else "0", # mono_audio "compute" if self.parser.getNumOutputs() == 2 else "0", # stereo_audio "activate" if self.has_activate else "0", # activate plugin @@ -963,9 +1011,9 @@ self.parser.ui.write(s, prefix) return s.getvalue() - def gen_load_ui(self): + def gen_load_ui(self, plugin_id): s = StringIO() - ret = self.write_load_ui(s, False) + ret = self.write_load_ui(s, plugin_id, False) if ret == 0: return False, "", False, "" if ret == 1: @@ -1003,8 +1051,8 @@ + "".join([", float *output%d" % i for i in range(self.parser.getNumOutputs())])) compute_call_args = ("".join([", input%d" % i for i in range(self.parser.getNumInputs())]) + "".join([", output%d" % i for i in range(self.parser.getNumOutputs())])) - has_cc_ui, cc_ui, has_glade_ui, glade_ui = self.gen_load_ui() plugin_id = self.parser.toplevel or self.parser.topname + has_cc_ui, cc_ui, has_glade_ui, glade_ui = self.gen_load_ui(plugin_id) if self.parser.groups: groups_define = "\nstatic const char* parm_groups[] = {\n%s\t};\n" % self.parser.formatted_groups(plugin_id) else: @@ -1048,6 +1096,9 @@ plugin_id = plugin_id, plugin_name = plugin_name, groups_p = "parm_groups" if groups_define else "0", + description = wrap_N_(getattr(self.parser,"description","")), + category = wrap_N_(getattr(self.parser,"category","")), + shortname = wrap_N_(getattr(self.parser,"shortname","")), mono_compute_p = "compute"+ds if self.parser.getNumOutputs() == 1 else "0", stereo_compute_p = "compute"+ds if self.parser.getNumOutputs() == 2 else "0", activate_p = "activate"+ds if self.has_activate else "0", @@ -1056,6 +1107,7 @@ has_plugindef = has_plugindef, has_separate_header = fp_head is not None, header_name = h_name, + sharedlib = self.options.template_type == "sharedlib", )) s.seek(0) depth = 0 # conditional nesting depth @@ -1188,6 +1240,8 @@ help="template for code generation: %s" % ", ".join(template_opts)) op.add_option("-N", "--in-namespace", action="store", metavar="NAMESPACE", help="put definitions inside an extra namespace") + op.add_option("-e", "--param-warn", dest="param_warn", action="store_true", default=False, + help="don't signal an error when the ui definition references an unknown dsp parameter") options, args = op.parse_args() if options.init_type not in init_opts: op.error("unknown init-type") diff -Nru guitarix-0.22.4/tools/dunwah1.py guitarix-0.24.2/tools/dunwah1.py --- guitarix-0.22.4/tools/dunwah1.py 1970-01-01 00:00:00.000000000 +0000 +++ guitarix-0.24.2/tools/dunwah1.py 2012-10-20 03:56:02.000000000 +0000 @@ -0,0 +1,276 @@ +import os, re, math, pickle +from pylab import * +from scipy.signal import freqz +from scipy import optimize + +def display_parameter(filt): + print "Parameter:" + print "\n".join([" %s=%s [%s..%s]" % ((k,filt[k])+filt.get_range(k)) + for k in filt.keys()]) + +def plot_figure(filt, name, para, rg): + display_parameter(filt) + impulse = zeros(10000,dtype=float32) + impulse[0] = 1 + dflt = filt[para] + subplot(2,2,1) + title('Guitarix crybaby2') + ylabel("gain (dB)") + xlabel("Frequency (Hz)") + sn = False + res = [] + for freq in rg: + res.append(plotone(filt, freq, para, impulse, '-')) + legend(title="Param.: %s" % name, fancybox=True, loc='upper right') + a = array(res); + subplot(2,2,2) + plot(1/(1.06-a[:,0]), a[:,1]) + subplot(2,2,3) + plot(a[:,0], a[:,2]) + subplot(2,2,4) + plot(a[:,0], a[:,3]) + show() + +def plot_figure_libcrybaby(): + from pluginloader import Plugin + filt = Plugin("../build/default/src/plugins/libcrybaby.so") + filt['crybaby2.refvolt'] = 0.1 + para = 'crybaby2.hotpotz' + name = filt.get_var_attr(para)[0] + rg = log10(linspace(*np.power(10,filt.get_range(para)), num=10)) + filt.init(48000) + plot_figure(filt, name, para, rg) + +def plot_figure_dunwah(): + import dunwah + filt = dunwah.dsp() + para = 'wah' + name = "DunWah" + rg = log10(linspace(*np.power(10,filt.get_range(para)), num=10)) + filt.init(48000) + plot_figure(filt, name, para, rg) + +def save_octave(name, var, fd): + assert isinstance(var, ndarray) and len(var.shape) == 1 + print >>fd, "# name:", name + iscompl = iscomplexobj(var) + if iscompl: + print >>fd, "# type: complex matrix" + else: + print >>fd, "# type: matrix" + print >>fd, "# rows: 1" + print >>fd, "# columns:", var.shape[0] + if iscompl: + for v in var: + print >>fd, (v.real, v.imag), + else: + for v in var: + print >>fd, v, + print >>fd + +def load_octave(fd): + var = [] + d = {} + for l in fd: + if l.startswith("#"): + m = re.match("# *([a-z]+): *(.*)\n", l) + if not m: + continue + d[m.group(1)] = m.group(2) + else: + var.append(array([float(v) for v in l.split()])) + return var + +def invfreqz(w, h, numzeros=2, numpoles=2): + fd = file("/tmp/out", "w"); + save_octave("F", w, fd) + save_octave("H", h, fd) + fd.close() + p = os.popen("octave -q","w") + p.write( + "load /tmp/out;\n" + "wt = 1 ./ F.^2;\n" + "[B,A] = invfreqz(H,F,%d,%d,wt);\n" + "save /tmp/out B A;\n" + % (numzeros, numpoles)) + p.close() + fd = file("/tmp/out"); + res = load_octave(fd) + fd.close() + os.remove("/tmp/out") + return res + +Bconst = array((1, -1.04, 0.04)) + +def estimate(rg, filt, para, impulse, fs): + aa = zeros(len(rg)) + Q = zeros(len(rg)) + maxh = zeros(len(rg)) + for i, freq in enumerate(rg): + filt[para] = freq + filt.compute(zeros(10000,dtype=float32)) + w, h = freqz(filt.compute(impulse), worN=15000) + k1 = int(round(len(h)*100.0/fs)) + k2 = int(round(len(h)*10000.0/fs)) + B, A = invfreqz(w[k1:k2+1], h[k1:k2+1]) + + R = sqrt(A[2]) + theta = math.acos(A[1]/(-2*R)) + aa[i] = fs * theta + frn = theta / (2*pi) + Q[i] = (pi * frn) / (1 - R) + + print 'Pole frequency = %f Hz' % (aa[i]/(2*pi)) + #print 'Q = %f' % Q[i] + #print "R =", R + #print "frn =", frn, "theta =", theta + + A = array((1, -2*R*cos(theta), R*R)) + w1, h1 = freqz(Bconst, A, worN=15000) + maxh[i] = max(abs(h)) + #print "gain =", gain[i] + return aa, Q, maxh + +def fit_param(rg, aa, Q, fs): + def f(t): + xx = 1/(t-aa) + a = polyfit(rg, xx, 3) + return sum((xx-polyval(a,rg))**2) + off = optimize.fmin(f, 0.04*fs, disp=False)[0] + f = 1/(off-aa) + a1A = polyfit(rg, f, 3) + #def ff(x, *p): + # return off - 1/polyval(p, x) + #a1A = optimize.curve_fit(ff, rg, aa, a1A)[0] + print "theta2pi = %g - 1 / (%s);" % (off, string_polyval(a1A, "wah")) + qA = polyfit(rg, Q, 3) + print "Q = %s;" % string_polyval(qA, "wah") + return off, a1A, qA + +def show_param(rg, off, g_off, aa, a1A, Q, qA, gain, gA): + subplot(2,2,1) + f = 1/(off-aa) + plot(rg, f,"b") + plot(rg,polyval(a1A,rg),"r") + subplot(2,2,2) + plot(rg, Q,"g") + plot(rg, polyval(qA,rg), "r") + subplot(2,2,3) + plot(rg, 1/(g_off-gain), "b") + plot(rg, polyval(gA,rg), "r") + show() + +def string_polyval(a, var): + s = "" + for i, v in enumerate(a): + if i == 0: + s = "%g" % v + elif i == 1: + s = "%s*%s+%g" % (s, var, v) + else: + s = "(%s)*%s+%g" % (s, var, v) + return s + +def make_gain(rg, off, a1A, qA, maxh, fs): + gain = zeros(len(rg)) + for i, freq in enumerate(rg): + q = polyval(qA, freq) + a1 = (off - 1 / polyval(a1A, freq)) / fs + r = 1 - a1/(2*q) + + A = array((1, -2*r*math.cos(a1), r*r)) + w1, h1 = freqz(Bconst, A, worN=15000) + gain[i] = maxh[i]/max(abs(h1)) + g_off = 0.025 + a = polyfit(rg, 1/(g_off-gain), 4) + def f(x, *p): + return g_off-1/polyval(p, x) + a = optimize.curve_fit(f, rg, gain, a) + a = a[0] + print "g = %g - 1 / (%s):" % (g_off, string_polyval(a, "wah")) + return g_off, gain, a + +def output_freqz_libcrybaby(): + from pluginloader import Plugin + filt = Plugin("../build/default/src/plugins/libcrybaby.so") + filt['crybaby2.refvolt'] = 0.1 + para = 'crybaby2.hotpotz' + name = filt.get_var_attr(para)[0] + fs = 44100 + filt.init(fs) + impulse = zeros(10000,dtype=float32) + impulse[0] = 1 + #rg = linspace(*filt.get_range(para), num=20) + rg = log10(linspace(*np.power(10,filt.get_range(para)), num=20)) + if True: + aa, Q, maxh = estimate(rg, filt, para, impulse, fs) + pickle.dump((aa,Q,maxh), file("p.out","w")) + else: + aa, Q, maxh = pickle.load(file("p.out")) + off, a1A, qA = fit_param(rg, aa, Q, fs) + g_off, gain, gA = make_gain(rg, off, a1A, qA, maxh, fs) + show_param(rg, off, g_off, aa, a1A, Q, qA, gain, gA) + rg = log10(linspace(*np.power(10,filt.get_range(para)), num=10)) + for i, freq in enumerate(rg): + filt[para] = freq + filt.compute(zeros(10000,dtype=float32)) + w, h = freqz(filt.compute(impulse), worN=15000) + k1 = int(round(len(h)*30.0/fs)) + k2 = int(round(len(h)*5000.0/fs)) + B, A = invfreqz(w[k1:k2+1], h[k1:k2+1]) + + R = sqrt(A[2]) + theta = math.acos(A[1]/(-2*R)) + aa[i] = A[1]/(-2*R) + frn = theta / (2*pi) + Q[i] = (pi * frn) / (1 - R) + + print 'Pole frequency = %f Hz' % (frn * fs) + print 'Q = %f' % Q[i] + + if False: + A = array((1, -2*R*cos(theta), R*R)) + w1, h1 = freqz(Bconst, A, worN=15000) + gain[i] = max(abs(h))/max(abs(h1)) + B *= gain[i] + h1 *= gain[i] + print "gain =", gain[i] + #h = h1 + + if True: + q = polyval(qA, freq) + a1 = (off - 1 / polyval(a1A, freq)) / fs + frn = a1/(2*pi) + r = 1 - a1/(2*q) + #print "R =", r + #print "frn =", frn, "theta =", math.acos(a1) + g = g_off - 1 / polyval(gA, freq) + + A = array((1, -2*r*cos(a1), r*r)) + w1, h1 = freqz(Bconst*g, A, worN=15000) + + R = sqrt(A[2]) + theta = math.acos(A[1]/(-2*R)) + frn = theta / (2*pi) + bq = (pi * frn) / (1 - R) + print 'Pole frequency = %f Hz' % (frn * fs) + print 'Q = %f' % q + print "gain =", g + + w *= fs / (2*pi) + semilogx(w[1:], 20*log10(abs(h[1:])), "b") + semilogx(w[1:], 20*log10(abs(h1[1:])), "r") + show() + +def display_parameter(filt): + print "Parameter:" + print "\n".join([" %s=%s [%s..%s]" % ((k,filt[k])+filt.get_range(k)) + for k in filt.keys()]) + +if __name__ == "__main__": + try: + #plot_figure_libcrybaby() + #plot_figure_dunwah() + output_freqz_libcrybaby() + except KeyboardInterrupt: + pass diff -Nru guitarix-0.22.4/tools/dunwah2.py guitarix-0.24.2/tools/dunwah2.py --- guitarix-0.22.4/tools/dunwah2.py 1970-01-01 00:00:00.000000000 +0000 +++ guitarix-0.24.2/tools/dunwah2.py 2012-10-20 03:56:02.000000000 +0000 @@ -0,0 +1,435 @@ +import os, re, math, pickle +from pylab import * +from scipy.signal import freqz, lfilter +from scipy import optimize + +def display_parameter(filt): + print "Parameter:" + print "\n".join([" %s=%s [%s..%s]" % ((k,filt[k])+filt.get_range(k)) + for k in filt.keys()]) + +def freqz_scaled(v, rate, rng, n = 2400): + w, h = freqz(v, worN=n) + scale = lambda freq: int(round(2 * n * freq / rate)) + n0 = scale(rng[0]) + n1 = scale(rng[1]) + w = w[n0:n1+1] + h = h[n0:n1+1] + w *= rate / (2*pi) + return w, h + +def parabolaTurningPoint(w, y, h=None): + idx = y.argmax() + yTop = y[idx-1] - y[idx+1] + yBottom = y[idx+1] + y[idx-1] - 2 * y[idx]; + if yBottom != 0.0: + x0 = yTop / (2 * yBottom) + else: + x0 = 0 + if h is not None: + if x0 > 0: + hh = h[idx] + x0 * (h[idx+1]-h[idx]) + else: + hh = h[idx-1] + x0 * (h[idx]-h[idx-1]) + return w[idx] + x0*(w[idx+1]-w[idx]), hh + else: + return w[idx] + x0*(w[idx+1]-w[idx]), y[idx] - (yBottom / 2) * x0 * x0 + +def db_point(w, h, db): + d = h - db + return parabolaTurningPoint(w, -d * d, h) + +def plotone(filt, freq, para, impulse, clr='--', fs=44100): + filt[para] = freq + filt.compute(zeros(10000,dtype=float32)) + w, h = freqz_scaled(filt.compute(impulse), fs, [30, 15000], 15000) + h = 20*log10(abs(h)) + wmax, hmax = parabolaTurningPoint(w, h) + wmax3, hmax3 = db_point(w, h, hmax-3) + q = wmax/wmax3 + Q = 1/abs(q-1/q) + print "%.2f %.2f %g %g" % (freq, wmax, hmax, Q) + semilogx(w, h, clr, label="%.3f" % freq) + return (freq, wmax, hmax, Q) + +def plot_figure(filt, name, para, rg, clr="-", fs=44100): + display_parameter(filt) + impulse = zeros(10000,dtype=float32) + impulse[0] = 1 + dflt = filt[para] + #subplot(2,2,1) + title('Guitarix crybaby2') + ylabel("gain (dB)") + xlabel("Frequency (Hz)") + sn = False + res = [] + for freq in rg: + res.append(plotone(filt, freq, para, impulse, clr, fs)) + #legend(title="Param.: %s" % name, fancybox=True, loc='upper right') + #a = array(res); + #subplot(2,2,2) + #plot(1/(1.06-a[:,0]), a[:,1]) + #subplot(2,2,3) + #plot(a[:,0], a[:,2]) + #subplot(2,2,4) + #plot(a[:,0], a[:,3]) + #show() + +def plot_figure_libcrybaby(clr="-",fs=44100): + from pluginloader import Plugin + filt = Plugin("../build/default/src/plugins/libcrybaby.so") + filt['crybaby2.refvolt'] = 0.1 + para = 'crybaby2.hotpotz' + name = filt.get_var_attr(para)[0] + rg = log10(linspace(*np.power(10,filt.get_range(para)), num=10)) + filt.init(fs) + plot_figure(filt, name, para, rg, clr, fs) + +def plot_figure_dunwah(clr="-", fs=44100): + import dunwah + filt = dunwah.dsp() + para = 'wah' + name = "DunWah" + #rg = linspace(*filt.get_range(para), num=10) + rg = log10(linspace(*np.power(10,filt.get_range(para)), num=10)) + filt.init(fs) + plot_figure(filt, name, para, rg, clr, fs) + +def plot_figure_crybaby(clr="-", fs=44100): + import crybaby + para = '.crybaby.wah' + filt = crybaby.dsp() + name = "Pot" + #rg = linspace(*filt.get_range(para), num=10) + rg = log10(linspace(*np.power(10,filt.get_range(para)), num=10)) + filt.init(fs) + plot_figure(filt, name, para, rg, clr, fs) + +def plot_figure_autowah(clr="-", fs=44100): + import ladspaloader + filt = ladspaloader.Ladspa("/usr/lib/ladspa/autowah.so", fs) + filt["Drive"] = 0 + filt["Decay"] = 0 + filt["Range"] = 0 + filt["Mix"] = 1 + name = "Freq" + para = "Freq" + rg = linspace(0, 1, num=10) + plot_figure(filt, name, para, rg, clr, fs) + +def save_octave(name, var, fd): + assert isinstance(var, ndarray) and len(var.shape) == 1 + print >>fd, "# name:", name + iscompl = iscomplexobj(var) + if iscompl: + print >>fd, "# type: complex matrix" + else: + print >>fd, "# type: matrix" + print >>fd, "# rows: 1" + print >>fd, "# columns:", var.shape[0] + if iscompl: + for v in var: + print >>fd, (v.real, v.imag), + else: + for v in var: + print >>fd, v, + print >>fd + +def load_octave(fd): + var = [] + d = {} + for l in fd: + if l.startswith("#"): + m = re.match("# *([a-z]+): *(.*)\n", l) + if not m: + continue + d[m.group(1)] = m.group(2) + else: + var.append(array([float(v) for v in l.split()])) + return var + +def invfreqz(w, h): + fd = file("/tmp/out", "w"); + save_octave("F", w, fd) + save_octave("H", h, fd) + fd.close() + p = os.popen("octave -q","w") + p.write( + "load /tmp/out;\n" + "wt = 1 ./ F.^2;\n" + "[B,A] = invfreqz(H,F,3,3,wt);\n" + "save /tmp/out B A;\n") + p.close() + fd = file("/tmp/out"); + res = load_octave(fd) + fd.close() + os.remove("/tmp/out") + return res + +def run_filter(filt,impulse,fs): + # skip transients + filt.compute(zeros(10000,dtype=float32)) + # calculate frequency response + w, h = freqz(filt.compute(impulse), worN=15000) + # calculate filter coefficients + k1 = int(round(len(h)*10.0/fs)) + k2 = int(round(len(h)*20000.0/fs)) + B, A = invfreqz(w[k1:k2+1], h[k1:k2+1]) + return B, A, h + +def estimate(rg, filt, para, impulse, fs): + aa = zeros(len(rg)) + Q = zeros(len(rg)) + maxh = zeros(len(rg)) + real_roots = zeros(len(rg)) + for i, freq in enumerate(rg): + filt[para] = freq + B, A, h = run_filter(filt, impulse, fs) + maxh[i] = max(abs(h)) + # use a constant B + #print B/B[0] + if i == (len(rg)+1)/2: + Bconst = B + freq_const = freq + # use just the two conjugate roots for the biquad + # the real root is nearly constant + bq_roots = [] + for j, v in enumerate(roots(A)): + if v.imag == 0: + real_roots[i] = v.real + else: + bq_roots.append(v) + A_bq = poly(bq_roots) + # calculate pole frequency and quality factor + R = sqrt(A_bq[2]) + theta = math.acos(A_bq[1]/(-2*R)) + aa[i] = fs * theta + Q[i] = theta / (2 - 2*R) + + print 'Pole frequency = %f Hz' % (aa[i]/(2*pi)) + #print 'Q = %f' % Q[i] + #print "R =", R + + return aa, Q, maxh, sum(real_roots) / len(real_roots), Bconst, freq_const + +def fit_param(rg, aa, Q, fs): + #order = 3 + order = 6 + def f(t): + xx = 1/(t-aa) + a = polyfit(rg, xx, order) + def ff(x, *p): + return t - 1/polyval(p, x) + a = optimize.curve_fit(ff, rg, aa, a) + a = a[0] + res = sum((xx-polyval(a,rg))**2)/sum(xx*xx)**2 + return res + off = optimize.fmin(f, 0.04*fs, disp=False)[0] + f = 1/(off-aa) + a = polyfit(rg, f, order) + def ff(x, *p): + return off - 1/polyval(p, x) + a = optimize.curve_fit(ff, rg, aa, a) + a = a[0] + a1A = a + #order = 4 + order = 5 + a = polyfit(rg, Q, order) + qA = a + return off, a1A, qA + +def show_param(rg, off, g_off, aa, a1A, Q, qA, gain, gA): + subplot(2,2,1) + f = 1/(off-aa) + plot(rg, f,"b") + plot(rg,polyval(a1A,rg),"r") + subplot(2,2,2) + plot(rg, Q,"g") + plot(rg, polyval(qA,rg), "r") + subplot(2,2,3) + plot(rg, 1/(g_off-gain), "b") + plot(rg, polyval(gA,rg), "r") + show() + +def string_polyval(a, var): + s = "" + for i, v in enumerate(a): + if i == 0: + s = "%g" % v + elif i == 1: + s = "%s*%s+%g" % (s, var, v) + else: + s = "(%s)*%s+%g" % (s, var, v) + return s + +def make_gain(rg, off, a1A, qA, maxh, z1, Bconst, fs): + gain = zeros(len(rg)) + for i, freq in enumerate(rg): + q = polyval(qA, freq) + a1 = (off - 1 / polyval(a1A, freq)) / fs + r = 1 - a1/(2*q) + A = array((1, -2*r*math.cos(a1), r*r)) + rr = list(roots(A)) + rr.append(z1) + A = poly(rr) + w1, h1 = freqz(Bconst, A, worN=15000) + gain[i] = maxh[i]/max(abs(h1)) + #order = 1 + order = 5 + def ff(t): + xx = 1/(t-gain) + a = polyfit(rg, xx, order) + def f(x, *p): + return t-1/polyval(p, x) + a = optimize.curve_fit(f, rg, gain, a) + a = a[0] + return sum((xx-polyval(a,rg))**2) + g_off = optimize.fmin(ff, -0.007, disp = False) + def f(x, *p): + return g_off-1/polyval(p, x) + a = polyfit(rg, 1/(g_off-gain), order) + a = optimize.curve_fit(f, rg, gain, a) + a = a[0] + return gain, g_off, a + +def estimate_SR(filt, para, freq_const, impulse): + lz1 = [] + lz2 = [] + lz3 = [] + lg = [] + ss = linspace(44100, 96000, 10) + for fs in ss: + filt.init(fs) + filt[para] = freq_const + B, A, h = run_filter(filt, impulse, fs) + rr = roots(B) + lz1.append(rr[0]) + lz2.append(rr[1]) + lz3.append(rr[2]) + lg.append(B[0]) + z1 = sum(lz1)/len(lz1) + z2A = polyfit(ss, lz2, 2) + z3A = polyfit(ss, lz3, 2) + gc = polyfit(ss, lg, 2) + return z1, z2A, z3A, gc + +def output_freqz_libcrybaby(): + from pluginloader import Plugin + filt = Plugin("../build/default/src/plugins/libcrybaby.so") + filt['crybaby2.refvolt'] = 0.1 + para = 'crybaby2.hotpotz' + name = filt.get_var_attr(para)[0] + fs = 44100 + filt.init(fs) + impulse = zeros(10000,dtype=float32) + impulse[0] = 1 + rg = log10(linspace(*np.power(10,filt.get_range(para)), num=20)) + if False: + aa, Q, maxh, p1, Bconst, freq_const = estimate(rg, filt, para, impulse, fs) + pickle.dump((aa,Q,maxh,p1,Bconst,freq_const), file("p.out","w")) + else: + aa, Q, maxh, p1, Bconst, freq_const = pickle.load(file("p.out")) + z1, z2A, z3A, gcA = estimate_SR(filt, para, freq_const, impulse) + off, a1A, qA = fit_param(rg, aa, Q, fs) + gain, g_off, gA = make_gain(rg, off, a1A, qA, maxh, p1, Bconst, fs) + #show_param(rg, off, g_off, aa, a1A, Q, qA, gain, gA) + rg = log10(linspace(*np.power(10,filt.get_range(para)), num=10)) + filt.init(fs) + for i, freq in enumerate(rg): + filt[para] = freq + filt.compute(zeros(10000,dtype=float32)) + w, h = freqz(filt.compute(impulse), worN=15000) + + q = polyval(qA, freq) + a1 = (off - 1 / polyval(a1A, freq)) / fs + g = g_off - 1 / polyval(gA, freq) + gc = polyval(gcA, fs) + + r = 1 - a1/(2*q) + A = array((1, -2*r*cos(a1), r*r)) + A = poly(list(roots(A))+[p1]) + B = poly([polyval(z2A,fs),polyval(z3A,fs),z1]) + w1, h1 = freqz(B*g*gc, A, worN=15000) + + semilogx((w*fs/(2*pi))[1:], 20*log10(abs(h[1:])), "b") + semilogx((w1*fs/(2*pi))[1:], 20*log10(abs(h1[1:])), "r") + + print "theta2pi = (%g - 1000 / (%s)) / SR;" % (off, string_polyval(a1A*1000, "wah")) + print "Q = %s;" % string_polyval(qA, "wah") + print "g = %g - 1 / (%s);" % (g_off, string_polyval(gA, "wah")) + print "gc = %s;" % string_polyval(gcA, "SR") + print "p1 = exp(-1000/(%g*SR));" % (-1000/(fs*log(p1))) + print "z1 = %g;" % z1 + print "z2 = %s;" % string_polyval(z2A, "SR") + print "z3 = %s;" % string_polyval(z3A, "SR") + + show() + +def compare_dynamics(freq, fs): + global title + title("Freq = %g" % freq) + + lfo_freq = 5.0 + block_size = 64 + time = 1 + block_cnt = (time*fs+block_size-1)/block_size + samples = block_cnt * block_size + + def sine(freq, div=1): + return array(sin(2*pi*linspace(0,freq*time,samples / div)),dtype=float32) + + tm = linspace(0,samples/float(fs),samples) + lfo = 0.5 + sine(lfo_freq,block_size) * 0.5 + signal = sine(freq).reshape(block_cnt,block_size) + tt = linspace(0,1,samples / 100) + + def sweep(filt, para, clr): + filt[para] = 0.0 + filt.compute(zeros(10000,float32)) + out = zeros((block_cnt,block_size)) + for i in range(block_cnt): + filt[para] = lfo[i] + out[i] = filt.compute(signal[i]) + t = 0.999 + ampl = lfilter([1-t],[1,-t],abs(out.reshape(samples))) + plot(tm[4000:], 20*log10(ampl[4000:]), clr) + + import dunwah + filt = dunwah.dsp() + filt.init(fs) + para = "wah" + + sweep(filt, para, "r") + + from pluginloader import Plugin + filt = Plugin("../build/default/src/plugins/libcrybaby.so") + filt.init(fs) + filt['crybaby2.refvolt'] = 0.1 + para = 'crybaby2.hotpotz' + + sweep(filt, para, "b") + +def dynamics_figure(fs): + subplot(221) + compare_dynamics(410, fs) + subplot(222) + compare_dynamics(500, fs) + subplot(223) + compare_dynamics(800, fs) + subplot(224) + compare_dynamics(1000, fs) + +def compare_freqz(fs): + plot_figure_dunwah("r", fs) + plot_figure_libcrybaby("b", fs) + +if __name__ == "__main__": + fs = 44100 + #fs = 48000*2 + try: + compare_freqz(fs) + #output_freqz_libcrybaby() + #dynamics_figure(fs) + show() + except KeyboardInterrupt: + pass diff -Nru guitarix-0.22.4/tools/example.py guitarix-0.24.2/tools/example.py --- guitarix-0.22.4/tools/example.py 1970-01-01 00:00:00.000000000 +0000 +++ guitarix-0.24.2/tools/example.py 2012-10-20 03:56:02.000000000 +0000 @@ -0,0 +1,30 @@ +from pylab import * +from scipy.signal import freqz +import pluginloader + +fs = 44100 +dsp = pluginloader.Plugin("./example_plugin.so") +dsp.init(fs) +print "default level:", dsp["dsp.level"] +dsp["dsp.level"] = 0.5 +impulse = zeros(5, dtype=float32) +impulse[0] = 1.0 +w, h = freqz(dsp.compute(impulse)) +# skip frequency 0 (h[0] == 0) +w = w[1:] +# scale 0..2*pi to 0 .. fs +w = w/(2*pi)*fs +# dB of absolute value +h = 20*log10(abs(h[1:])) +plot(w, h) +show() + +## execution time: + +inp = array(np.random.uniform(0, 1, 1000), float32) +n = 100 +tm = zeros(n) +for i in range(n): + dsp.compute(inp) + tm[i] = dsp.nanosec_per_sample +print "%.2f +/- %.3f" % (mean(tm), std(tm)) diff -Nru guitarix-0.22.4/tools/example_plugin.cc guitarix-0.24.2/tools/example_plugin.cc --- guitarix-0.22.4/tools/example_plugin.cc 1970-01-01 00:00:00.000000000 +0000 +++ guitarix-0.24.2/tools/example_plugin.cc 2012-10-20 03:56:02.000000000 +0000 @@ -0,0 +1,80 @@ +#include +#include +#include "gx_plugin.h" + +#define PLUGIN_ID "dsp" +#define PLUGIN_NAME "DSP" + +#define PARAM(p) (PLUGIN_ID "." p) + +class Dsp: public PluginDef { +private: + static void init(unsigned int samplingFreq, PluginDef *plugin); + static void process(int count, float *input, float *output, PluginDef *plugin); + static int registerparam(const ParamReg& reg); + static int uiloader(const UiBuilder& builder); + static void del_instance(PluginDef *plugin); + // + float level; + float x; +public: + Dsp(); +}; + +Dsp::Dsp() + : PluginDef() { + version = PLUGINDEF_VERSION; + id = PLUGIN_ID; + name = PLUGIN_NAME; + mono_audio = process; + set_samplerate = init; + register_params = registerparam; + load_ui = uiloader; + delete_instance = del_instance; +} + +void Dsp::init(unsigned int samplingFreq, PluginDef *plugin) { + Dsp& self = *static_cast(plugin); + self.x = 0; +} + +void Dsp::process(int count, float *input, float *output, PluginDef *plugin) { + Dsp& self = *static_cast(plugin); + for (int i = 0; i < count; ++i) { + output[i] = (input[i] - self.x) * self.level; + self.x = input[i]; + } +} + +int Dsp::registerparam(const ParamReg& reg) { + Dsp& self = *static_cast(reg.plugin); + // the numbers are: default, lower, upper, step + // (step is not used by the python module) + reg.registerVar(PARAM("level"),"","S","",&self.level,5.0,0.1,10.0,0.1); + return 0; +} + +int Dsp::uiloader(const UiBuilder& b) { + //Dsp& self = *static_cast(b.plugin); + b.openHorizontalhideBox(""); + b.closeBox(); + b.create_small_rackknob(PARAM("level"),0); + return 0; +} + +void Dsp::del_instance(PluginDef *plugin) { + delete static_cast(plugin); +} + +extern "C" __attribute__ ((visibility ("default"))) int +get_gx_plugin(unsigned int idx, PluginDef **pplugin) +{ + const int count = 1; + if (!pplugin) { + return count; + } + switch (idx) { + case 0: *pplugin = new Dsp(); return count; + default: *pplugin = 0; return -1; + } +} diff -Nru guitarix-0.22.4/tools/faustmod.pyx guitarix-0.24.2/tools/faustmod.pyx --- guitarix-0.22.4/tools/faustmod.pyx 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/tools/faustmod.pyx 2012-10-20 03:56:02.000000000 +0000 @@ -152,10 +152,10 @@ cdef fKeyIter p = self.interface.fKeyParam.find(pname) if p == self.interface.fKeyParam.end(): raise KeyError("not found: %s" % pname) - if pval < deref(p).second.fMin: - pval = deref(p).second.fMin - if pval > deref(p).second.fMax: - pval = deref(p).second.fMax + if not (deref(p).second.fMin <= pval <= deref(p).second.fMax): + raise ValueError( + "parameter %s value %s outside range [%s, %s]" + % (pname, pval, deref(p).second.fMin, deref(p).second.fMax)) deref(p).second.fZone[0] = pval property num_inputs: diff -Nru guitarix-0.22.4/tools/gx_preset.sh guitarix-0.24.2/tools/gx_preset.sh --- guitarix-0.22.4/tools/gx_preset.sh 1970-01-01 00:00:00.000000000 +0000 +++ guitarix-0.24.2/tools/gx_preset.sh 2012-10-20 03:56:02.000000000 +0000 @@ -0,0 +1,52 @@ +#!/bin/bash + +#### export a guitarix preset-bank including settings for LADSPA plugins +#### as preset-bank-name.tar.bz2. use -e preset-bankname +#### import guitarix preset-bank from the preset-bank-name.tar.bz2 +#### use -i preset-bankname. +#### the script must run from the same directory +#### where the preset-bank-name.tar.bz2 is located + +conf="none"; +file="no"; +while getopts eie:h o +do case "$o" in + e) conf="export";; + i) conf="import";; + h) echo "Usage: $0 [-e|-i] " ; + echo " -e = export guitarix-preset-bank " ; + echo " -i = import guitarix-preset-bank " && exit 1;; + *) echo "Usage: $0 [-e|-i] " ; + echo " -e = export guitarix-preset-bank " ; + echo " -i = import guitarix-preset-bank " && exit 1;; +esac +done + +# Reset $@ +shift `echo $OPTIND-1 | bc`; +file=$1; +DIR=$( cd "$( dirname "$0" )" && pwd ); + +if [ -n "$file" ];then +if grep -q export <<<$conf;then +cd $HOME/.config/guitarix; +tar -cf $DIR/$file.tar.bz2 --bzip2 banks/$file.gx plugins/*.js ladspa_defs.js; +echo "create $DIR/$file.tar.bz2"; +echo "done"; +exit 0; +elif grep -q import <<<$conf;then +tar -xjkf $file.tar.bz2 -C $HOME/.config/guitarix/ --exclude ladspa_defs.js; +echo "extract $file.tar.bz2 to $HOME/.config/guitarix/"; +tar -xf $file.tar.bz2 ladspa_defs.js; +cat $HOME/.config/guitarix/ladspa_defs.js >> ladspa_defs.js; +sort -u ladspa_defs.js | sed -e 's/^]//' -e '/^$/d' > ladspa_opt.js ; +echo "]" >> ladspa_opt.js ; +cat ladspa_opt.js > $HOME/.config/guitarix/ladspa_defs.js; +rm "ladspa_opt.js"; +rm "ladspa_defs.js"; +echo "done"; +exit 0; +fi +fi +echo "Error: please use with [-e |-i] "; +exit 0; diff -Nru guitarix-0.22.4/tools/pluginloader.pyx guitarix-0.24.2/tools/pluginloader.pyx --- guitarix-0.22.4/tools/pluginloader.pyx 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/tools/pluginloader.pyx 2012-10-20 03:56:02.000000000 +0000 @@ -87,10 +87,12 @@ cdef dict d cdef double time_per_sample - def __cinit__(self, char *path, unsigned int idx = 0): + def __cinit__(self, path, unsigned int idx = 0): cdef int n self.varmap = new VarMap() self.p = 0 + if "/" not in path: + path = "./" + path # do not search system dirs self.handle = dlopen(path, RTLD_LOCAL|RTLD_NOW) if not self.handle: raise RuntimeError("Cannot open library: %s [%s]" % (path, dlerror())) @@ -105,7 +107,7 @@ raise RuntimeError("error loading plugins") if n == 0: raise RuntimeError("no plugin found") - if idx >= n: + if idx >= n: raise RuntimeError("idx too big (%d > %d)" % (idx, n-1)) if get_gx_plugin(idx, &self.p) < 0: raise RuntimeError("plugin loader error") @@ -166,10 +168,10 @@ cdef variter p = self.varmap[0].find(pname) if p == self.varmap[0].end(): raise KeyError("not found: %s" % pname) - if pval < deref(p).second[0].low: - pval = deref(p).second[0].low - if pval > deref(p).second[0].up: - pval = deref(p).second[0].up + if not (deref(p).second[0].low <= pval <= deref(p).second[0].up): + raise ValueError( + "parameter %s value %s outside range [%s, %s]" + % (pname, pval, deref(p).second[0].low, deref(p).second[0].up)) if deref(p).second[0].var: deref(p).second[0].var[0] = pval elif deref(p).second[0].uvar: @@ -177,6 +179,26 @@ else: assert(False) + property num_inputs: + "number of input channels" + def __get__(self): + if self.p[0].mono_audio: + return 1 + elif self.p[0].stereo_audio: + return 2 + else: + return 0 + + property num_outputs: + "number of output channels" + def __get__(self): + if self.p[0].mono_audio: + return 1 + elif self.p[0].stereo_audio: + return 2 + else: + return 0 + def init(self, int samplingRate): """argument: sample rate must be called before calling compute""" @@ -216,6 +238,8 @@ count, (inp.data), (inp.data+inp.strides[0]), (o.data), (o.data+o.strides[0]), self.p) clock_gettime(CLOCK_MONOTONIC, &t1) + else: + raise ValueError("no process function available") self.time_per_sample = ts_diff(t1,t0)/count return o diff -Nru guitarix-0.22.4/tools/pyrun-fixed guitarix-0.24.2/tools/pyrun-fixed --- guitarix-0.22.4/tools/pyrun-fixed 1970-01-01 00:00:00.000000000 +0000 +++ guitarix-0.24.2/tools/pyrun-fixed 2012-10-20 03:56:02.000000000 +0000 @@ -0,0 +1,10 @@ +#! /bin/bash +[ $# -eq 0 ] && { echo "usage: pyrun-fixed python-script {args}"; exit; } +set -e +gov=($(cpufreq-info -c 0 -p)) +if [ ${gov[-1]} != userspace ]; then + freq=($(cpufreq-info -c 0 -l)) + trap "sudo cpufreq-set -c 0 -g ondemand" EXIT + sudo cpufreq-set -c 0 -f ${freq[-1]} +fi +chrt 80 taskset -c 0 python "$@" diff -Nru guitarix-0.22.4/tools/ts9func.pyx guitarix-0.24.2/tools/ts9func.pyx --- guitarix-0.22.4/tools/ts9func.pyx 1970-01-01 00:00:00.000000000 +0000 +++ guitarix-0.24.2/tools/ts9func.pyx 2012-10-20 03:56:02.000000000 +0000 @@ -0,0 +1,13 @@ +import numpy as np +cimport numpy as np + +cdef extern from "ts9nonlin.h": + double ts9nonlin(double x) + extern float x0ts9 "ts9table.low" + extern float hts9 "ts9table.istep" + extern int nts9 "ts9table.size" + +def ts9func(x): + return ts9nonlin(x) + +ts9func_range = [(x0ts9, hts9, nts9)] diff -Nru guitarix-0.22.4/tools/ts9sim.py guitarix-0.24.2/tools/ts9sim.py --- guitarix-0.22.4/tools/ts9sim.py 1970-01-01 00:00:00.000000000 +0000 +++ guitarix-0.24.2/tools/ts9sim.py 2012-10-20 03:56:02.000000000 +0000 @@ -0,0 +1,72 @@ +# -*- coding: utf-8 -*- +from pylab import * +from scipy.optimize import brentq +import sys + +class PlotManager(object): + def __init__(self, r, c): + self.r = r + self.c = c + self.i = 1 + + def __call__(self): + subplot(self.r,self.c,self.i) + self.i += 1 + +def f(D, x, d): + Is = 10 * 1e-12 + mUt = 30 * 1e-3 + R2 = 51000 + 500000 * d + return (x+D)/R2 + Is * (exp(D/mUt) - exp(-D/mUt)) + +def F(x, d): + ret = brentq(f, -0.6, 0.6, args=(x, d)) + return ret + +def xf(v): + return v / (3.0 + v) + +def fx(v): + return 3.0 * v / (1.0 - v) + +def show_diff(pm): + from ts9func import ts9func + d = 1.0 + pm() + x = linspace(0, 100, 2000) + y = vectorize(lambda v: F(v, d))(x) + y1 = vectorize(lambda v: ts9func(v))(x) + plot(x, y-y1, "-") + pm() + x = linspace(0, 2.5, 200) + y = vectorize(lambda v: F(v, d))(x) + y1 = vectorize(ts9func)(x) + plot(x, y-y1, "-") + +def write_ftube_table(Vi, Vp): + """write C source""" + sys.stdout.write('\t%g,%g,%g,%d, {' % (Vi[0], Vi[-1], (len(Vi)-1)/(Vi[-1]-Vi[0]), len(Vi))) + s = "" + for i, v in enumerate(Vi): + if i % 5 == 0: + sys.stdout.write(s+"\n\t") + s = "" + sys.stdout.write(s+str(Vp[i])) + s = "," + sys.stdout.write("\n\t}") + +def make_table(): + Vi = linspace(xf(0.0),xf(100.0),100) + sys.stdout.write("// file generated by tools/ts9sim.py -- do not modify manually\n") + sys.stdout.write("\n") + sys.stdout.write("static table1d_imp<%d> ts9table = {\n" % len(Vi)) + Vp = vectorize(lambda v: F(fx(v), 1.0))(Vi) + write_ftube_table(Vi, Vp) + sys.stdout.write("\n};\n") + +if len(sys.argv) == 2: + make_table() +else: + pm = PlotManager(2,1) + show_diff(pm) + show() diff -Nru guitarix-0.22.4/waf guitarix-0.24.2/waf --- guitarix-0.22.4/waf 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/waf 2012-10-20 03:56:02.000000000 +0000 @@ -148,7 +148,10 @@ return dir wafdir = find_lib() -w = join(wafdir, 'wafadmin') +if sys.version > '3': + w = join(wafdir, 'wafadmin3') +else: + w = join(wafdir, 'wafadmin') t = join(w, 'Tools') f = join(w, '3rdparty') sys.path = [w, t, f] + sys.path diff -Nru guitarix-0.22.4/wafadmin3/3rdparty/boost.py guitarix-0.24.2/wafadmin3/3rdparty/boost.py --- guitarix-0.22.4/wafadmin3/3rdparty/boost.py 1970-01-01 00:00:00.000000000 +0000 +++ guitarix-0.24.2/wafadmin3/3rdparty/boost.py 2012-10-20 03:56:02.000000000 +0000 @@ -0,0 +1,225 @@ +#! /usr/bin/env python +# encoding: utf-8 + +import os.path,glob,types,re,sys +import Configure,config_c,Options,Utils,Logs +from Logs import warn,debug +from Configure import conf +boost_code=''' +#include +#include +int main() { std::cout << BOOST_VERSION << std::endl; } +''' +boost_libpath=['/usr/lib','/usr/local/lib','/opt/local/lib','/sw/lib','/lib'] +boost_cpppath=['/usr/include','/usr/local/include','/opt/local/include','/sw/include'] +STATIC_NOSTATIC='nostatic' +STATIC_BOTH='both' +STATIC_ONLYSTATIC='onlystatic' +is_versiontag=re.compile('^\d+_\d+_?\d*$') +is_threadingtag=re.compile('^mt$') +is_abitag=re.compile('^[sgydpn]+$') +is_toolsettag=re.compile('^(acc|borland|como|cw|dmc|darwin|gcc|hp_cxx|intel|kylix|vc|mgw|qcc|sun|vacpp)\d*$') +is_pythontag=re.compile('^py[0-9]{2}$') +def set_options(opt): + opt.add_option('--boost-includes',type='string',default='',dest='boostincludes',help='path to the boost directory where the includes are e.g. /usr/local/include/boost-1_35') + opt.add_option('--boost-libs',type='string',default='',dest='boostlibs',help='path to the directory where the boost libs are e.g. /usr/local/lib') +def string_to_version(s): + version=s.split('.') + if len(version)<3:return 0 + return int(version[0])*100000+int(version[1])*100+int(version[2]) +def version_string(version): + major=version/100000 + minor=version/100%1000 + minor_minor=version%100 + if minor_minor==0: + return"%d_%d"%(major,minor) + else: + return"%d_%d_%d"%(major,minor,minor_minor) +def libfiles(lib,pattern,lib_paths): + result=[] + for lib_path in lib_paths: + libname=pattern%('boost_%s[!_]*'%lib) + result+=glob.glob(os.path.join(lib_path,libname)) + return result +def get_boost_version_number(self,dir): + try: + return self.run_c_code(compiler='cxx',code=boost_code,includes=dir,execute=1,env=self.env.copy(),type='cprogram',compile_mode='cxx',compile_filename='test.cpp') + except Configure.ConfigurationError as e: + return-1 +def set_default(kw,var,val): + if not var in kw: + kw[var]=val +def tags_score(tags,kw): + score=0 + needed_tags={'threading':kw['tag_threading'],'abi':kw['tag_abi'],'toolset':kw['tag_toolset'],'version':kw['tag_version'],'python':kw['tag_python']} + if kw['tag_toolset']is None: + v=kw['env'] + toolset=v['CXX_NAME'] + if v['CXX_VERSION']: + version_no=v['CXX_VERSION'].split('.') + toolset+=version_no[0] + if len(version_no)>1: + toolset+=version_no[1] + needed_tags['toolset']=toolset + found_tags={} + for tag in tags: + if is_versiontag.match(tag):found_tags['version']=tag + if is_threadingtag.match(tag):found_tags['threading']=tag + if is_abitag.match(tag):found_tags['abi']=tag + if is_toolsettag.match(tag):found_tags['toolset']=tag + if is_pythontag.match(tag):found_tags['python']=tag + for tagname in needed_tags.keys(): + if needed_tags[tagname]is not None and tagname in found_tags: + if re.compile(needed_tags[tagname]).match(found_tags[tagname]): + score+=kw['score_'+tagname][0] + else: + score+=kw['score_'+tagname][1] + return score +def validate_boost(self,kw): + ver=kw.get('version','') + for x in'min_version max_version version'.split(): + set_default(kw,x,ver) + set_default(kw,'lib','') + kw['lib']=Utils.to_list(kw['lib']) + set_default(kw,'env',self.env) + set_default(kw,'libpath',boost_libpath) + set_default(kw,'cpppath',boost_cpppath) + for x in'tag_threading tag_version tag_toolset'.split(): + set_default(kw,x,None) + set_default(kw,'tag_abi','^[^d]*$') + set_default(kw,'python',str(sys.version_info[0])+str(sys.version_info[1])) + set_default(kw,'tag_python','^py'+kw['python']+'$') + set_default(kw,'score_threading',(10,-10)) + set_default(kw,'score_abi',(10,-10)) + set_default(kw,'score_python',(10,-10)) + set_default(kw,'score_toolset',(1,-1)) + set_default(kw,'score_version',(100,-100)) + set_default(kw,'score_min',0) + set_default(kw,'static',STATIC_NOSTATIC) + set_default(kw,'found_includes',False) + set_default(kw,'min_score',0) + set_default(kw,'errmsg','not found') + set_default(kw,'okmsg','ok') +def find_boost_includes(self,kw): + boostPath=getattr(Options.options,'boostincludes','') + if boostPath: + boostPath=[os.path.normpath(os.path.expandvars(os.path.expanduser(boostPath)))] + else: + boostPath=Utils.to_list(kw['cpppath']) + min_version=string_to_version(kw.get('min_version','')) + max_version=string_to_version(kw.get('max_version',''))or(sys.maxsize-1) + version=0 + for include_path in boostPath: + boost_paths=[p for p in glob.glob(os.path.join(include_path,'boost*'))if os.path.isdir(p)] + debug('BOOST Paths: %r'%boost_paths) + for path in boost_paths: + pathname=os.path.split(path)[-1] + ret=-1 + if pathname=='boost': + path=include_path + ret=self.get_boost_version_number(path) + elif pathname.startswith('boost-'): + ret=self.get_boost_version_number(path) + ret=int(ret) + if ret!=-1 and ret>=min_version and ret<=max_version and ret>version: + boost_path=path + version=ret + if not version: + self.fatal('boost headers not found! (required version min: %s max: %s)'%(kw['min_version'],kw['max_version'])) + return False + found_version=version_string(version) + versiontag='^'+found_version+'$' + if kw['tag_version']is None: + kw['tag_version']=versiontag + elif kw['tag_version']!=versiontag: + warn('boost header version %r and tag_version %r do not match!'%(versiontag,kw['tag_version'])) + env=self.env + env['CPPPATH_BOOST']=boost_path + env['BOOST_VERSION']=found_version + self.found_includes=1 + ret='Version %s (%s)'%(found_version,boost_path) + return ret +def find_boost_library(self,lib,kw): + def find_library_from_list(lib,files): + lib_pattern=re.compile('.*boost_(.*?)\..*') + result=(None,None) + resultscore=kw['min_score']-1 + for file in files: + m=lib_pattern.search(file,1) + if m: + libname=m.group(1) + libtags=libname.split('-')[1:] + currentscore=tags_score(libtags,kw) + if currentscore>resultscore: + result=(libname,file) + resultscore=currentscore + return result + lib_paths=getattr(Options.options,'boostlibs','') + if lib_paths: + lib_paths=[os.path.normpath(os.path.expandvars(os.path.expanduser(lib_paths)))] + else: + lib_paths=Utils.to_list(kw['libpath']) + v=kw.get('env',self.env) + (libname,file)=(None,None) + if kw['static']in[STATIC_NOSTATIC,STATIC_BOTH]: + st_env_prefix='LIB' + files=libfiles(lib,v['shlib_PATTERN'],lib_paths) + (libname,file)=find_library_from_list(lib,files) + if libname is None and kw['static']in[STATIC_ONLYSTATIC,STATIC_BOTH]: + st_env_prefix='STATICLIB' + staticLibPattern=v['staticlib_PATTERN'] + if self.env['CC_NAME']=='msvc': + staticLibPattern='lib'+staticLibPattern + files=libfiles(lib,staticLibPattern,lib_paths) + (libname,file)=find_library_from_list(lib,files) + if libname is not None: + v['LIBPATH_BOOST_'+lib.upper()]=[os.path.split(file)[0]] + if self.env['CC_NAME']=='msvc'and os.path.splitext(file)[1]=='.lib': + v[st_env_prefix+'_BOOST_'+lib.upper()]=['libboost_'+libname] + else: + v[st_env_prefix+'_BOOST_'+lib.upper()]=['boost_'+libname] + return + self.fatal('lib boost_'+lib+' not found!') +def check_boost(self,*k,**kw): + if not self.env['CXX']: + self.fatal('load a c++ compiler tool first, for example conf.check_tool("g++")') + self.validate_boost(kw) + ret=None + try: + if not kw.get('found_includes',None): + self.check_message_1(kw.get('msg_includes','boost headers')) + ret=self.find_boost_includes(kw) + except Configure.ConfigurationError as e: + if'errmsg'in kw: + self.check_message_2(kw['errmsg'],'YELLOW') + if'mandatory'in kw: + if Logs.verbose>1: + raise + else: + self.fatal('the configuration failed (see %r)'%self.log.name) + else: + if'okmsg'in kw: + self.check_message_2(kw.get('okmsg_includes',ret)) + for lib in kw['lib']: + self.check_message_1('library boost_'+lib) + try: + self.find_boost_library(lib,kw) + except Configure.ConfigurationError as e: + ret=False + if'errmsg'in kw: + self.check_message_2(kw['errmsg'],'YELLOW') + if'mandatory'in kw: + if Logs.verbose>1: + raise + else: + self.fatal('the configuration failed (see %r)'%self.log.name) + else: + if'okmsg'in kw: + self.check_message_2(kw['okmsg']) + return ret + +conf(get_boost_version_number) +conf(validate_boost) +conf(find_boost_includes) +conf(find_boost_library) +conf(check_boost) diff -Nru guitarix-0.22.4/wafadmin3/3rdparty/fluid.py guitarix-0.24.2/wafadmin3/3rdparty/fluid.py --- guitarix-0.22.4/wafadmin3/3rdparty/fluid.py 1970-01-01 00:00:00.000000000 +0000 +++ guitarix-0.24.2/wafadmin3/3rdparty/fluid.py 2012-10-20 03:56:02.000000000 +0000 @@ -0,0 +1,17 @@ +#! /usr/bin/env python +# encoding: utf-8 + +import Task +from TaskGen import extension +Task.simple_task_type('fluid','${FLUID} -c -o ${TGT[0].abspath(env)} -h ${TGT[1].abspath(env)} ${SRC}','BLUE',shell=False,ext_out='.cxx') +def fluid(self,node): + cpp=node.change_ext('.cpp') + hpp=node.change_ext('.hpp') + self.create_task('fluid',node,[cpp,hpp]) + if'cxx'in self.features: + self.allnodes.append(cpp) +def detect(conf): + fluid=conf.find_program('fluid',var='FLUID',mandatory=True) + conf.check_cfg(path='fltk-config',package='',args='--cxxflags --ldflags',uselib_store='FLTK',mandatory=True) + +extension('.fl')(fluid) diff -Nru guitarix-0.22.4/wafadmin3/Build.py guitarix-0.24.2/wafadmin3/Build.py --- guitarix-0.22.4/wafadmin3/Build.py 1970-01-01 00:00:00.000000000 +0000 +++ guitarix-0.24.2/wafadmin3/Build.py 2012-10-20 03:56:02.000000000 +0000 @@ -0,0 +1,676 @@ +#! /usr/bin/env python +# encoding: utf-8 +import sys +if sys.hexversion < 0x020400f0: from sets import Set as set +import os,sys,errno,re,glob,gc,datetime,shutil +try:import cPickle +except:import pickle as cPickle +import Runner,TaskGen,Node,Scripting,Utils,Environment,Task,Logs,Options +from Logs import debug,error,info +from Constants import* +SAVED_ATTRS='root srcnode bldnode node_sigs node_deps raw_deps task_sigs id_nodes'.split() +bld=None +class BuildError(Utils.WafError): + def __init__(self,b=None,t=[]): + self.bld=b + self.tasks=t + self.ret=1 + Utils.WafError.__init__(self,self.format_error()) + def format_error(self): + lst=['Build failed:'] + for tsk in self.tasks: + txt=tsk.format_error() + if txt:lst.append(txt) + sep=' ' + if len(lst)>2: + sep='\n' + return sep.join(lst) +def group_method(fun): + def f(*k,**kw): + if not k[0].is_install: + return False + postpone=True + if'postpone'in kw: + postpone=kw['postpone'] + del kw['postpone'] + if postpone: + m=k[0].task_manager + if not m.groups:m.add_group() + m.groups[m.current_group].post_funs.append((fun,k,kw)) + if not'cwd'in kw: + kw['cwd']=k[0].path + else: + fun(*k,**kw) + return f +class BuildContext(Utils.Context): + def __init__(self): + global bld + bld=self + self.task_manager=Task.TaskManager() + self.id_nodes=0 + self.idx={} + self.all_envs={} + self.bdir='' + self.path=None + self.deps_man=Utils.DefaultDict(list) + self.cache_node_abspath={} + self.cache_scanned_folders={} + self.uninstall=[] + for v in'cache_node_abspath task_sigs node_deps raw_deps node_sigs'.split(): + var={} + setattr(self,v,var) + self.cache_dir_contents={} + self.all_task_gen=[] + self.task_gen_cache_names={} + self.cache_sig_vars={} + self.log=None + self.root=None + self.srcnode=None + self.bldnode=None + class node_class(Node.Node): + pass + self.node_class=node_class + self.node_class.__module__="Node" + self.node_class.__name__="Nodu" + self.node_class.bld=self + self.is_install=None + def __copy__(self): + raise Utils.WafError('build contexts are not supposed to be cloned') + def load(self): + try: + env=Environment.Environment(os.path.join(self.cachedir,'build.config.py')) + except(IOError,OSError): + pass + else: + if env['version']1:raise + if data: + for x in SAVED_ATTRS:setattr(self,x,data[x]) + else: + debug('build: Build cache loading failed') + finally: + if f:f.close() + gc.enable() + def save(self): + gc.disable() + self.root.__class__.bld=None + Node.Nodu=self.node_class + db=os.path.join(self.bdir,DBFILE) + file=open(db+'.tmp','wb') + data={} + for x in SAVED_ATTRS:data[x]=getattr(self,x) + cPickle.dump(data,file) + file.close() + try:os.unlink(db) + except OSError:pass + os.rename(db+'.tmp',db) + self.root.__class__.bld=self + gc.enable() + def clean(self): + debug('build: clean called') + precious=set([]) + for env in self.all_envs.values(): + for x in env[CFG_FILES]: + node=self.srcnode.find_resource(x) + if node: + precious.add(node.id) + def clean_rec(node): + for x in list(node.childs.keys()): + nd=node.childs[x] + tp=nd.id&3 + if tp==Node.DIR: + clean_rec(nd) + elif tp==Node.BUILD: + if nd.id in precious:continue + for env in self.all_envs.values(): + try:os.remove(nd.abspath(env)) + except OSError:pass + node.childs.__delitem__(x) + clean_rec(self.srcnode) + for v in'node_sigs node_deps task_sigs raw_deps cache_node_abspath'.split(): + setattr(self,v,{}) + def compile(self): + debug('build: compile called') + self.flush() + self.generator=Runner.Parallel(self,Options.options.jobs) + def dw(on=True): + if Options.options.progress_bar: + if on:sys.stderr.write(Logs.colors.cursor_on) + else:sys.stderr.write(Logs.colors.cursor_off) + debug('build: executor starting') + back=os.getcwd() + os.chdir(self.bldnode.abspath()) + try: + try: + dw(on=False) + self.generator.start() + except KeyboardInterrupt: + dw() + self.save() + raise + except Exception: + dw() + raise + else: + dw() + self.save() + if self.generator.error: + raise BuildError(self,self.task_manager.tasks_done) + finally: + os.chdir(back) + def install(self): + debug('build: install called') + self.flush() + if self.is_install<0: + lst=[] + for x in self.uninstall: + dir=os.path.dirname(x) + if not dir in lst:lst.append(dir) + lst.sort() + lst.reverse() + nlst=[] + for y in lst: + x=y + while len(x)>4: + if not x in nlst:nlst.append(x) + x=os.path.dirname(x) + nlst.sort() + nlst.reverse() + for x in nlst: + try:os.rmdir(x) + except OSError:pass + def new_task_gen(self,*k,**kw): + if self.task_gen_cache_names: + self.task_gen_cache_names={} + kw['bld']=self + if len(k)==0: + ret=TaskGen.task_gen(*k,**kw) + else: + cls_name=k[0] + try:cls=TaskGen.task_gen.classes[cls_name] + except KeyError:raise Utils.WscriptError('%s is not a valid task generator -> %s'%(cls_name,[x for x in TaskGen.task_gen.classes])) + ret=cls(*k,**kw) + return ret + def __call__(self,*k,**kw): + if self.task_gen_cache_names: + self.task_gen_cache_names={} + kw['bld']=self + return TaskGen.task_gen(*k,**kw) + def load_envs(self): + try: + lst=Utils.listdir(self.cachedir) + except OSError as e: + if e.errno==errno.ENOENT: + raise Utils.WafError('The project was not configured: run "waf configure" first!') + else: + raise + if not lst: + raise Utils.WafError('The cache directory is empty: reconfigure the project') + for file in lst: + if file.endswith(CACHE_SUFFIX): + env=Environment.Environment(os.path.join(self.cachedir,file)) + name=file[:-len(CACHE_SUFFIX)] + self.all_envs[name]=env + self.init_variants() + for env in self.all_envs.values(): + for f in env[CFG_FILES]: + newnode=self.path.find_or_declare(f) + try: + hash=Utils.h_file(newnode.abspath(env)) + except(IOError,AttributeError): + error("cannot find "+f) + hash=SIG_NIL + self.node_sigs[env.variant()][newnode.id]=hash + self.bldnode=self.root.find_dir(self.bldnode.abspath()) + self.path=self.srcnode=self.root.find_dir(self.srcnode.abspath()) + self.cwd=self.bldnode.abspath() + def setup(self,tool,tooldir=None,funs=None): + if isinstance(tool,list): + for i in tool:self.setup(i,tooldir) + return + if not tooldir:tooldir=Options.tooldir + module=Utils.load_tool(tool,tooldir) + if hasattr(module,"setup"):module.setup(self) + def init_variants(self): + debug('build: init variants') + lstvariants=[] + for env in self.all_envs.values(): + if not env.variant()in lstvariants: + lstvariants.append(env.variant()) + self.lst_variants=lstvariants + debug('build: list of variants is %r',lstvariants) + for name in lstvariants+[0]: + for v in'node_sigs cache_node_abspath'.split(): + var=getattr(self,v) + if not name in var: + var[name]={} + def load_dirs(self,srcdir,blddir,load_cache=1): + assert(os.path.isabs(srcdir)) + assert(os.path.isabs(blddir)) + self.cachedir=os.path.join(blddir,CACHE_DIR) + if srcdir==blddir: + raise Utils.WafError("build dir must be different from srcdir: %s <-> %s "%(srcdir,blddir)) + self.bdir=blddir + self.load() + if not self.root: + Node.Nodu=self.node_class + self.root=Node.Nodu('',None,Node.DIR) + if not self.srcnode: + self.srcnode=self.root.ensure_dir_node_from_path(srcdir) + debug('build: srcnode is %s and srcdir %s',self.srcnode.name,srcdir) + self.path=self.srcnode + try:os.makedirs(blddir) + except OSError:pass + if not self.bldnode: + self.bldnode=self.root.ensure_dir_node_from_path(blddir) + self.init_variants() + def rescan(self,src_dir_node): + if self.cache_scanned_folders.get(src_dir_node.id,None):return + self.cache_scanned_folders[src_dir_node.id]=True + if hasattr(self,'repository'):self.repository(src_dir_node) + if not src_dir_node.name and sys.platform=='win32': + return + parent_path=src_dir_node.abspath() + try: + lst=set(Utils.listdir(parent_path)) + except OSError: + lst=set([]) + self.cache_dir_contents[src_dir_node.id]=lst + cache=self.node_sigs[0] + for x in src_dir_node.childs.values(): + if x.id&3!=Node.FILE:continue + if x.name in lst: + try: + cache[x.id]=Utils.h_file(x.abspath()) + except IOError: + raise Utils.WafError('The file %s is not readable or has become a dir'%x.abspath()) + else: + try:del cache[x.id] + except KeyError:pass + del src_dir_node.childs[x.name] + h1=self.srcnode.height() + h2=src_dir_node.height() + lst=[] + child=src_dir_node + while h2>h1: + lst.append(child.name) + child=child.parent + h2-=1 + lst.reverse() + try: + for variant in self.lst_variants: + sub_path=os.path.join(self.bldnode.abspath(),variant,*lst) + self.listdir_bld(src_dir_node,sub_path,variant) + except OSError: + for node in list(src_dir_node.childs.values()): + if node.id&3!=Node.BUILD: + continue + for dct in self.node_sigs.values(): + if node.id in dct: + dct.__delitem__(node.id) + src_dir_node.childs.__delitem__(node.name) + for variant in self.lst_variants: + sub_path=os.path.join(self.bldnode.abspath(),variant,*lst) + try: + os.makedirs(sub_path) + except OSError: + pass + def listdir_src(self,parent_node): + pass + def remove_node(self,node): + pass + def listdir_bld(self,parent_node,path,variant): + i_existing_nodes=[x for x in parent_node.childs.values()if x.id&3==Node.BUILD] + lst=set(Utils.listdir(path)) + node_names=set([x.name for x in i_existing_nodes]) + remove_names=node_names-lst + ids_to_remove=[x.id for x in i_existing_nodes if x.name in remove_names] + cache=self.node_sigs[variant] + for nid in ids_to_remove: + if nid in cache: + cache.__delitem__(nid) + def get_env(self): + return self.env_of_name('default') + def set_env(self,name,val): + self.all_envs[name]=val + env=property(get_env,set_env) + def add_manual_dependency(self,path,value): + if isinstance(path,Node.Node): + node=path + elif os.path.isabs(path): + node=self.root.find_resource(path) + else: + node=self.path.find_resource(path) + self.deps_man[node.id].append(value) + def launch_node(self): + try: + return self.p_ln + except AttributeError: + self.p_ln=self.root.find_dir(Options.launch_dir) + return self.p_ln + def glob(self,pattern,relative=True): + path=self.path.abspath() + files=[self.root.find_resource(x)for x in glob.glob(path+os.sep+pattern)] + if relative: + files=[x.path_to_parent(self.path)for x in files if x] + else: + files=[x.abspath()for x in files if x] + return files + def add_group(self,*k): + self.task_manager.add_group(*k) + def set_group(self,*k,**kw): + self.task_manager.set_group(*k,**kw) + def hash_env_vars(self,env,vars_lst): + idx=str(id(env))+str(vars_lst) + try:return self.cache_sig_vars[idx] + except KeyError:pass + lst=[str(env[a])for a in vars_lst] + ret=Utils.h_list(lst) + debug('envhash: %r %r',ret,lst) + self.cache_sig_vars[idx]=ret + return ret + def name_to_obj(self,name,env): + cache=self.task_gen_cache_names + if not cache: + for x in self.all_task_gen: + vt=x.env.variant()+'_' + if x.name: + cache[vt+x.name]=x + else: + if isinstance(x.target,str): + target=x.target + else: + target=' '.join(x.target) + v=vt+target + if not cache.get(v,None): + cache[v]=x + return cache.get(env.variant()+'_'+name,None) + def flush(self,all=1): + self.ini=datetime.datetime.now() + self.task_gen_cache_names={} + self.name_to_obj('',self.env) + debug('build: delayed operation TaskGen.flush() called') + if Options.options.compile_targets: + debug('task_gen: posting objects %r listed in compile_targets',Options.options.compile_targets) + mana=self.task_manager + to_post=[] + min_grp=0 + target_objects=Utils.DefaultDict(list) + for target_name in Options.options.compile_targets.split(','): + target_name=target_name.strip() + for env in self.all_envs.values(): + tg=self.name_to_obj(target_name,env) + if tg: + target_objects[target_name].append(tg) + m=mana.group_idx(tg) + if m>min_grp: + min_grp=m + to_post=[tg] + elif m==min_grp: + to_post.append(tg) + if not target_name in target_objects and all: + raise Utils.WafError("target '%s' does not exist"%target_name) + debug('group: Forcing up to group %s for target %s',mana.group_name(min_grp),Options.options.compile_targets) + for i in range(len(mana.groups)): + mana.current_group=i + if i==min_grp: + break + g=mana.groups[i] + debug('group: Forcing group %s',mana.group_name(g)) + for t in g.tasks_gen: + debug('group: Posting %s',t.name or t.target) + t.post() + for t in to_post: + t.post() + else: + debug('task_gen: posting objects (normal)') + ln=self.launch_node() + if ln.is_child_of(self.bldnode)or not ln.is_child_of(self.srcnode): + ln=self.srcnode + proj_node=self.root.find_dir(os.path.split(Utils.g_module.root_path)[0]) + if proj_node.id!=self.srcnode.id: + ln=self.srcnode + for i in range(len(self.task_manager.groups)): + g=self.task_manager.groups[i] + self.task_manager.current_group=i + if Logs.verbose: + groups=[x for x in self.task_manager.groups_names if id(self.task_manager.groups_names[x])==id(g)] + name=groups and groups[0]or'unnamed' + Logs.debug('group: group',name) + for tg in g.tasks_gen: + if not tg.path.is_child_of(ln): + continue + if Logs.verbose: + Logs.debug('group: %s'%tg) + tg.post() + def env_of_name(self,name): + try: + return self.all_envs[name] + except KeyError: + error('no such environment: '+name) + return None + def progress_line(self,state,total,col1,col2): + n=len(str(total)) + Utils.rot_idx+=1 + ind=Utils.rot_chr[Utils.rot_idx%4] + ini=self.ini + pc=(100.*state)/total + eta=Utils.get_elapsed_time(ini) + fs="[%%%dd/%%%dd][%%s%%2d%%%%%%s][%s]["%(n,n,ind) + left=fs%(state,total,col1,pc,col2) + right='][%s%s%s]'%(col1,eta,col2) + cols=Utils.get_term_cols()-len(left)-len(right)+2*len(col1)+2*len(col2) + if cols<7:cols=7 + ratio=int((cols*state)/total)-1 + bar=('='*ratio+'>').ljust(cols) + msg=Utils.indicator%(left,bar,right) + return msg + def do_install(self,src,tgt,chmod=O644): + if self.is_install>0: + if not Options.options.force: + try: + st1=os.stat(tgt) + st2=os.stat(src) + except OSError: + pass + else: + if st1.st_mtime>=st2.st_mtime and st1.st_size==st2.st_size: + return False + srclbl=src.replace(self.srcnode.abspath(None)+os.sep,'') + info("* installing %s as %s"%(srclbl,tgt)) + try:os.remove(tgt) + except OSError:pass + try: + shutil.copy2(src,tgt) + os.chmod(tgt,chmod) + except IOError: + try: + os.stat(src) + except(OSError,IOError): + error('File %r does not exist'%src) + raise Utils.WafError('Could not install the file %r'%tgt) + return True + elif self.is_install<0: + info("* uninstalling %s"%tgt) + self.uninstall.append(tgt) + try: + os.remove(tgt) + except OSError as e: + if e.errno!=errno.ENOENT: + if not getattr(self,'uninstall_error',None): + self.uninstall_error=True + Logs.warn('build: some files could not be uninstalled (retry with -vv to list them)') + if Logs.verbose>1: + Logs.warn('could not remove %s (error code %r)'%(e.filename,e.errno)) + return True + red=re.compile(r"^([A-Za-z]:)?[/\\\\]*") + def get_install_path(self,path,env=None): + if not env:env=self.env + destdir=env.get_destdir() + path=path.replace('/',os.sep) + destpath=Utils.subst_vars(path,env) + if destdir: + destpath=os.path.join(destdir,self.red.sub('',destpath)) + return destpath + def install_dir(self,path,env=None): + if env: + assert isinstance(env,Environment.Environment),"invalid parameter" + else: + env=self.env + if not path: + return[] + destpath=self.get_install_path(path,env) + if self.is_install>0: + info('* creating %s'%destpath) + Utils.check_dir(destpath) + elif self.is_install<0: + info('* removing %s'%destpath) + self.uninstall.append(destpath+'/xxx') + def install_files(self,path,files,env=None,chmod=O644,relative_trick=False,cwd=None): + if env: + assert isinstance(env,Environment.Environment),"invalid parameter" + else: + env=self.env + if not path:return[] + if not cwd: + cwd=self.path + if isinstance(files,str)and'*'in files: + gl=cwd.abspath()+os.sep+files + lst=glob.glob(gl) + else: + lst=Utils.to_list(files) + if not getattr(lst,'__iter__',False): + lst=[lst] + destpath=self.get_install_path(path,env) + Utils.check_dir(destpath) + installed_files=[] + for filename in lst: + if isinstance(filename,str)and os.path.isabs(filename): + alst=Utils.split_path(filename) + destfile=os.path.join(destpath,alst[-1]) + else: + if isinstance(filename,Node.Node): + nd=filename + else: + nd=cwd.find_resource(filename) + if not nd: + raise Utils.WafError("Unable to install the file %r (not found in %s)"%(filename,cwd)) + if relative_trick: + destfile=os.path.join(destpath,filename) + Utils.check_dir(os.path.dirname(destfile)) + else: + destfile=os.path.join(destpath,nd.name) + filename=nd.abspath(env) + if self.do_install(filename,destfile,chmod): + installed_files.append(destfile) + return installed_files + def install_as(self,path,srcfile,env=None,chmod=O644,cwd=None): + if env: + assert isinstance(env,Environment.Environment),"invalid parameter" + else: + env=self.env + if not path: + raise Utils.WafError("where do you want to install %r? (%r?)"%(srcfile,path)) + if not cwd: + cwd=self.path + destpath=self.get_install_path(path,env) + dir,name=os.path.split(destpath) + Utils.check_dir(dir) + if isinstance(srcfile,Node.Node): + src=srcfile.abspath(env) + else: + src=srcfile + if not os.path.isabs(srcfile): + node=cwd.find_resource(srcfile) + if not node: + raise Utils.WafError("Unable to install the file %r (not found in %s)"%(srcfile,cwd)) + src=node.abspath(env) + return self.do_install(src,destpath,chmod) + def symlink_as(self,path,src,env=None,cwd=None): + if sys.platform=='win32': + return + if not path: + raise Utils.WafError("where do you want to install %r? (%r?)"%(src,path)) + tgt=self.get_install_path(path,env) + dir,name=os.path.split(tgt) + Utils.check_dir(dir) + if self.is_install>0: + link=False + if not os.path.islink(tgt): + link=True + elif os.readlink(tgt)!=src: + link=True + if link: + try:os.remove(tgt) + except OSError:pass + info('* symlink %s (-> %s)'%(tgt,src)) + os.symlink(src,tgt) + return 0 + else: + try: + info('* removing %s'%(tgt)) + os.remove(tgt) + return 0 + except OSError: + return 1 + def exec_command(self,cmd,**kw): + debug('runner: system command -> %s',cmd) + if self.log: + self.log.write('%s\n'%cmd) + kw['log']=self.log + try: + if not kw.get('cwd',None): + kw['cwd']=self.cwd + except AttributeError: + self.cwd=kw['cwd']=self.bldnode.abspath() + return Utils.exec_command(cmd,**kw) + def printout(self,s): + f=self.log or sys.stderr + f.write(s) + f.flush() + def add_subdirs(self,dirs): + self.recurse(dirs,'build') + def pre_recurse(self,name_or_mod,path,nexdir): + if not hasattr(self,'oldpath'): + self.oldpath=[] + self.oldpath.append(self.path) + self.path=self.root.find_dir(nexdir) + return{'bld':self,'ctx':self} + def post_recurse(self,name_or_mod,path,nexdir): + self.path=self.oldpath.pop() + def pre_build(self): + if hasattr(self,'pre_funs'): + for m in self.pre_funs: + m(self) + def post_build(self): + if hasattr(self,'post_funs'): + for m in self.post_funs: + m(self) + def add_pre_fun(self,meth): + try:self.pre_funs.append(meth) + except AttributeError:self.pre_funs=[meth] + def add_post_fun(self,meth): + try:self.post_funs.append(meth) + except AttributeError:self.post_funs=[meth] + def use_the_magic(self): + Task.algotype=Task.MAXPARALLEL + Task.file_deps=Task.extract_deps + self.magic=True + install_as=group_method(install_as) + install_files=group_method(install_files) + symlink_as=group_method(symlink_as) + diff -Nru guitarix-0.22.4/wafadmin3/Configure.py guitarix-0.24.2/wafadmin3/Configure.py --- guitarix-0.22.4/wafadmin3/Configure.py 1970-01-01 00:00:00.000000000 +0000 +++ guitarix-0.24.2/wafadmin3/Configure.py 2012-10-20 03:56:02.000000000 +0000 @@ -0,0 +1,316 @@ +#! /usr/bin/env python +# encoding: utf-8 + +import os,shlex,sys,time +try:import cPickle +except ImportError:import pickle as cPickle +import Environment,Utils,Options,Logs +from Logs import warn +from Constants import* +try: + from urllib import request +except: + from urllib import urlopen +else: + urlopen=request.urlopen +conf_template='''# project %(app)s configured on %(now)s by +# waf %(wafver)s (abi %(abi)s, python %(pyver)x on %(systype)s) +# using %(args)s +# +''' +class ConfigurationError(Utils.WscriptError): + pass +autoconfig=False +def find_file(filename,path_list): + for directory in Utils.to_list(path_list): + if os.path.exists(os.path.join(directory,filename)): + return directory + return'' +def find_program_impl(env,filename,path_list=[],var=None,environ=None): + if not environ: + environ=os.environ + try:path_list=path_list.split() + except AttributeError:pass + if var: + if env[var]:return env[var] + if var in environ:env[var]=environ[var] + if not path_list:path_list=environ.get('PATH','').split(os.pathsep) + ext=(Options.platform=='win32')and'.exe,.com,.bat,.cmd'or'' + for y in[filename+x for x in ext.split(',')]: + for directory in path_list: + x=os.path.join(directory,y) + if os.path.isfile(x): + if var:env[var]=x + return x + return'' +class ConfigurationContext(Utils.Context): + tests={} + error_handlers=[] + def __init__(self,env=None,blddir='',srcdir=''): + self.env=None + self.envname='' + self.environ=dict(os.environ) + self.line_just=40 + self.blddir=blddir + self.srcdir=srcdir + self.all_envs={} + self.cwd=self.curdir=os.getcwd() + self.tools=[] + self.setenv(DEFAULT) + self.lastprog='' + self.hash=0 + self.files=[] + self.tool_cache=[] + if self.blddir: + self.post_init() + def post_init(self): + self.cachedir=os.path.join(self.blddir,CACHE_DIR) + path=os.path.join(self.blddir,WAF_CONFIG_LOG) + try:os.unlink(path) + except(OSError,IOError):pass + try: + self.log=open(path,'w') + except(OSError,IOError): + self.fatal('could not open %r for writing'%path) + app=Utils.g_module.APPNAME + if app: + ver=getattr(Utils.g_module,'VERSION','') + if ver: + app="%s (%s)"%(app,ver) + now=time.ctime() + pyver=sys.hexversion + systype=sys.platform + args=" ".join(sys.argv) + wafver=WAFVERSION + abi=ABI + self.log.write(conf_template%vars()) + def __del__(self): + if hasattr(self,'log')and self.log: + self.log.close() + def fatal(self,msg): + raise ConfigurationError(msg) + def check_tool(self,input,tooldir=None,funs=None): + tools=Utils.to_list(input) + if tooldir:tooldir=Utils.to_list(tooldir) + for tool in tools: + tool=tool.replace('++','xx') + if tool=='java':tool='javaw' + if tool.lower()=='unittest':tool='unittestw' + mag=(tool,id(self.env),funs) + if mag in self.tool_cache: + continue + self.tool_cache.append(mag) + module=None + try: + module=Utils.load_tool(tool,tooldir) + except Exception as e: + ex=e + if Options.options.download: + _3rdparty=os.path.normpath(Options.tooldir[0]+os.sep+'..'+os.sep+'3rdparty') + for x in Utils.to_list(Options.remote_repo): + for sub in['branches/waf-%s/wafadmin/3rdparty'%WAFVERSION,'trunk/wafadmin/3rdparty']: + url='/'.join((x,sub,tool+'.py')) + try: + web=urlopen(url) + if web.getcode()!=200: + continue + except Exception as e: + continue + else: + loc=None + try: + loc=open(_3rdparty+os.sep+tool+'.py','wb') + loc.write(web.read()) + web.close() + finally: + if loc: + loc.close() + Logs.warn('downloaded %s from %s'%(tool,url)) + try: + module=Utils.load_tool(tool,tooldir) + except: + Logs.warn('module %s from %s is unusable'%(tool,url)) + try: + os.unlink(_3rdparty+os.sep+tool+'.py') + except: + pass + continue + else: + break + if not module: + Logs.error('Could not load the tool %r or download a suitable replacement from the repository (sys.path %r)\n%s'%(tool,sys.path,e)) + raise ex + else: + Logs.error('Could not load the tool %r in %r (try the --download option?):\n%s'%(tool,sys.path,e)) + raise ex + if funs is not None: + self.eval_rules(funs) + else: + func=getattr(module,'detect',None) + if func: + if type(func)is type(find_file):func(self) + else:self.eval_rules(func) + self.tools.append({'tool':tool,'tooldir':tooldir,'funs':funs}) + def sub_config(self,k): + self.recurse(k,name='configure') + def pre_recurse(self,name_or_mod,path,nexdir): + return{'conf':self,'ctx':self} + def post_recurse(self,name_or_mod,path,nexdir): + if not autoconfig: + return + self.hash=hash((self.hash,getattr(name_or_mod,'waf_hash_val',name_or_mod))) + self.files.append(path) + def store(self,file=''): + if not os.path.isdir(self.cachedir): + os.makedirs(self.cachedir) + if not file: + file=open(os.path.join(self.cachedir,'build.config.py'),'w') + file.write('version = 0x%x\n'%HEXVERSION) + file.write('tools = %r\n'%self.tools) + file.close() + if not self.all_envs: + self.fatal('nothing to store in the configuration context!') + for key in self.all_envs: + tmpenv=self.all_envs[key] + tmpenv.store(os.path.join(self.cachedir,key+CACHE_SUFFIX)) + def set_env_name(self,name,env): + self.all_envs[name]=env + return env + def retrieve(self,name,fromenv=None): + try: + env=self.all_envs[name] + except KeyError: + env=Environment.Environment() + env['PREFIX']=os.path.abspath(os.path.expanduser(Options.options.prefix)) + self.all_envs[name]=env + else: + if fromenv:warn("The environment %s may have been configured already"%name) + return env + def setenv(self,name): + self.env=self.retrieve(name) + self.envname=name + def add_os_flags(self,var,dest=None): + try:self.env.append_value(dest or var,Utils.to_list(self.environ[var])) + except KeyError:pass + def check_message_1(self,sr): + self.line_just=max(self.line_just,len(sr)) + for x in('\n',self.line_just*'-','\n',sr,'\n'): + self.log.write(x) + Utils.pprint('NORMAL',"%s :"%sr.ljust(self.line_just),sep='') + def check_message_2(self,sr,color='GREEN'): + self.log.write(sr) + self.log.write('\n') + Utils.pprint(color,sr) + def check_message(self,th,msg,state,option=''): + sr='Checking for %s %s'%(th,msg) + self.check_message_1(sr) + p=self.check_message_2 + if state:p('ok '+str(option)) + else:p('not found','YELLOW') + def check_message_custom(self,th,msg,custom,option='',color='PINK'): + sr='Checking for %s %s'%(th,msg) + self.check_message_1(sr) + self.check_message_2(custom,color) + def msg(self,msg,result,color=None): + self.start_msg('Checking for '+msg) + if not isinstance(color,str): + color=result and'GREEN'or'YELLOW' + self.end_msg(result,color) + def start_msg(self,msg): + try: + if self.in_msg: + return + except: + self.in_msg=0 + self.in_msg+=1 + self.line_just=max(self.line_just,len(msg)) + for x in('\n',self.line_just*'-','\n',msg,'\n'): + self.log.write(x) + Utils.pprint('NORMAL',"%s :"%msg.ljust(self.line_just),sep='') + def end_msg(self,result,color): + self.in_msg-=1 + if self.in_msg: + return + if not color: + color='GREEN' + if result==True: + msg='ok' + elif result==False: + msg='not found' + color='YELLOW' + else: + msg=str(result) + self.log.write(msg) + self.log.write('\n') + Utils.pprint(color,msg) + def find_program(self,filename,path_list=[],var=None,mandatory=False): + ret=None + if var: + if self.env[var]: + ret=self.env[var] + elif var in os.environ: + ret=os.environ[var] + if not isinstance(filename,list):filename=[filename] + if not ret: + for x in filename: + ret=find_program_impl(self.env,x,path_list,var,environ=self.environ) + if ret:break + self.check_message_1('Checking for program %s'%' or '.join(filename)) + self.log.write(' find program=%r paths=%r var=%r\n -> %r\n'%(filename,path_list,var,ret)) + if ret: + Utils.pprint('GREEN',str(ret)) + else: + Utils.pprint('YELLOW','not found') + if mandatory: + self.fatal('The program %r is required'%filename) + if var: + self.env[var]=ret + return ret + def cmd_to_list(self,cmd): + if isinstance(cmd,str)and cmd.find(' '): + try: + os.stat(cmd) + except OSError: + return shlex.split(cmd) + else: + return[cmd] + return cmd + def __getattr__(self,name): + r=self.__class__.__dict__.get(name,None) + if r:return r + if name and name.startswith('require_'): + for k in['check_','find_']: + n=name.replace('require_',k) + ret=self.__class__.__dict__.get(n,None) + if ret: + def run(*k,**kw): + r=ret(self,*k,**kw) + if not r: + self.fatal('requirement failure') + return r + return run + self.fatal('No such method %r'%name) + def eval_rules(self,rules): + self.rules=Utils.to_list(rules) + for x in self.rules: + f=getattr(self,x) + if not f:self.fatal("No such method '%s'."%x) + try: + f() + except Exception as e: + ret=self.err_handler(x,e) + if ret==BREAK: + break + elif ret==CONTINUE: + continue + else: + self.fatal(e) + def err_handler(self,fun,error): + pass +def conf(f): + setattr(ConfigurationContext,f.__name__,f) + return f +def conftest(f): + ConfigurationContext.tests[f.__name__]=f + return conf(f) + diff -Nru guitarix-0.22.4/wafadmin3/Constants.py guitarix-0.24.2/wafadmin3/Constants.py --- guitarix-0.22.4/wafadmin3/Constants.py 1970-01-01 00:00:00.000000000 +0000 +++ guitarix-0.24.2/wafadmin3/Constants.py 2012-10-20 03:56:02.000000000 +0000 @@ -0,0 +1,47 @@ +#! /usr/bin/env python +# encoding: utf-8 + +HEXVERSION=0x10512 +WAFVERSION="1.5.18" +WAFREVISION="8760" +ABI=37 +O644=420 +O755=493 +MAXJOBS=99999999 +CACHE_DIR='c4che' +CACHE_SUFFIX='.cache.py' +DBFILE='.wafpickle-%d'%ABI +WSCRIPT_FILE='wscript' +WSCRIPT_BUILD_FILE='wscript_build' +WAF_CONFIG_LOG='config.log' +WAF_CONFIG_H='config.h' +SIG_NIL=b'iluvcuteoverload' +VARIANT='_VARIANT_' +DEFAULT='default' +SRCDIR='srcdir' +BLDDIR='blddir' +APPNAME='APPNAME' +VERSION='VERSION' +DEFINES='defines' +UNDEFINED=() +BREAK="break" +CONTINUE="continue" +JOBCONTROL="JOBCONTROL" +MAXPARALLEL="MAXPARALLEL" +NORMAL="NORMAL" +NOT_RUN=0 +MISSING=1 +CRASHED=2 +EXCEPTION=3 +SKIPPED=8 +SUCCESS=9 +ASK_LATER=-1 +SKIP_ME=-2 +RUN_ME=-3 +LOG_FORMAT="%(asctime)s %(c1)s%(zone)s%(c2)s %(message)s" +HOUR_FORMAT="%H:%M:%S" +TEST_OK=True +CFG_FILES='cfg_files' +INSTALL=1337 +UNINSTALL=-1337 + diff -Nru guitarix-0.22.4/wafadmin3/Environment.py guitarix-0.24.2/wafadmin3/Environment.py --- guitarix-0.22.4/wafadmin3/Environment.py 1970-01-01 00:00:00.000000000 +0000 +++ guitarix-0.24.2/wafadmin3/Environment.py 2012-10-20 03:56:02.000000000 +0000 @@ -0,0 +1,158 @@ +#! /usr/bin/env python +# encoding: utf-8 +import sys +if sys.hexversion < 0x020400f0: from sets import Set as set +import os,copy,re +import Logs,Options,Utils +from Constants import* +re_imp=re.compile('^(#)*?([^#=]*?)\ =\ (.*?)$',re.M) +class Environment(object): + __slots__=("table","parent") + def __init__(self,filename=None): + self.table={} + if filename: + self.load(filename) + def __contains__(self,key): + if key in self.table:return True + try:return self.parent.__contains__(key) + except AttributeError:return False + def __str__(self): + keys=set() + cur=self + while cur: + keys.update(cur.table.keys()) + cur=getattr(cur,'parent',None) + keys=list(keys) + keys.sort() + return"\n".join(["%r %r"%(x,self.__getitem__(x))for x in keys]) + def __getitem__(self,key): + try: + while 1: + x=self.table.get(key,None) + if not x is None: + return x + self=self.parent + except AttributeError: + return[] + def __setitem__(self,key,value): + self.table[key]=value + def __delitem__(self,key): + del self.table[key] + def pop(self,key,*args): + if len(args): + return self.table.pop(key,*args) + return self.table.pop(key) + def set_variant(self,name): + self.table[VARIANT]=name + def variant(self): + try: + while 1: + x=self.table.get(VARIANT,None) + if not x is None: + return x + self=self.parent + except AttributeError: + return DEFAULT + def copy(self): + newenv=Environment() + newenv.parent=self + return newenv + def detach(self): + tbl=self.get_merged_dict() + try: + delattr(self,'parent') + except AttributeError: + pass + else: + keys=tbl.keys() + for x in keys: + tbl[x]=copy.deepcopy(tbl[x]) + self.table=tbl + def get_flat(self,key): + s=self[key] + if isinstance(s,str):return s + return' '.join(s) + def _get_list_value_for_modification(self,key): + try: + value=self.table[key] + except KeyError: + try:value=self.parent[key] + except AttributeError:value=[] + if isinstance(value,list): + value=value[:] + else: + value=[value] + else: + if not isinstance(value,list): + value=[value] + self.table[key]=value + return value + def append_value(self,var,value): + current_value=self._get_list_value_for_modification(var) + if isinstance(value,list): + current_value.extend(value) + else: + current_value.append(value) + def prepend_value(self,var,value): + current_value=self._get_list_value_for_modification(var) + if isinstance(value,list): + current_value=value+current_value + self.table[var]=current_value + else: + current_value.insert(0,value) + def append_unique(self,var,value): + current_value=self._get_list_value_for_modification(var) + if isinstance(value,list): + for value_item in value: + if value_item not in current_value: + current_value.append(value_item) + else: + if value not in current_value: + current_value.append(value) + def get_merged_dict(self): + table_list=[] + env=self + while 1: + table_list.insert(0,env.table) + try:env=env.parent + except AttributeError:break + merged_table={} + for table in table_list: + merged_table.update(table) + return merged_table + def store(self,filename): + file=open(filename,'w') + merged_table=self.get_merged_dict() + keys=list(merged_table.keys()) + keys.sort() + for k in keys:file.write('%s = %r\n'%(k,merged_table[k])) + file.close() + def load(self,filename): + tbl=self.table + code=Utils.readf(filename) + for m in re_imp.finditer(code): + g=m.group + tbl[g(2)]=eval(g(3)) + Logs.debug('env: %s',self.table) + def get_destdir(self): + if self.__getitem__('NOINSTALL'):return'' + return Options.options.destdir + def update(self,d): + for k,v in d.items(): + self[k]=v + def __getattr__(self,name): + if name in self.__slots__: + return object.__getattr__(self,name) + else: + return self[name] + def __setattr__(self,name,value): + if name in self.__slots__: + object.__setattr__(self,name,value) + else: + self[name]=value + def __delattr__(self,name): + if name in self.__slots__: + object.__delattr__(self,name) + else: + del self[name] + diff -Nru guitarix-0.22.4/wafadmin3/Logs.py guitarix-0.24.2/wafadmin3/Logs.py --- guitarix-0.22.4/wafadmin3/Logs.py 1970-01-01 00:00:00.000000000 +0000 +++ guitarix-0.24.2/wafadmin3/Logs.py 2012-10-20 03:56:02.000000000 +0000 @@ -0,0 +1,97 @@ +#! /usr/bin/env python +# encoding: utf-8 + +import ansiterm +import os,re,logging,traceback,sys +from Constants import* +zones='' +verbose=0 +colors_lst={'USE':True,'BOLD':'\x1b[01;1m','RED':'\x1b[01;31m','GREEN':'\x1b[32m','YELLOW':'\x1b[33m','PINK':'\x1b[35m','BLUE':'\x1b[01;34m','CYAN':'\x1b[36m','NORMAL':'\x1b[0m','cursor_on':'\x1b[?25h','cursor_off':'\x1b[?25l',} +got_tty=False +term=os.environ.get('TERM','dumb') +if not term in['dumb','emacs']: + try: + got_tty=sys.stderr.isatty()or(sys.platform=='win32'and term in['xterm','msys']) + except AttributeError: + pass +import Utils +if not got_tty or'NOCOLOR'in os.environ: + colors_lst['USE']=False +def get_color(cl): + if not colors_lst['USE']:return'' + return colors_lst.get(cl,'') +class foo(object): + def __getattr__(self,a): + return get_color(a) + def __call__(self,a): + return get_color(a) +colors=foo() +re_log=re.compile(r'(\w+): (.*)',re.M) +class log_filter(logging.Filter): + def __init__(self,name=None): + pass + def filter(self,rec): + rec.c1=colors.PINK + rec.c2=colors.NORMAL + rec.zone=rec.module + if rec.levelno>=logging.INFO: + if rec.levelno>=logging.ERROR: + rec.c1=colors.RED + elif rec.levelno>=logging.WARNING: + rec.c1=colors.YELLOW + else: + rec.c1=colors.GREEN + return True + zone='' + m=re_log.match(rec.msg) + if m: + zone=rec.zone=m.group(1) + rec.msg=m.group(2) + if zones: + return getattr(rec,'zone','')in zones or'*'in zones + elif not verbose>2: + return False + return True +class formatter(logging.Formatter): + def __init__(self): + logging.Formatter.__init__(self,LOG_FORMAT,HOUR_FORMAT) + def format(self,rec): + if rec.levelno>=logging.WARNING or rec.levelno==logging.INFO: + try: + return'%s%s%s'%(rec.c1,rec.msg.decode('utf-8'),rec.c2) + except: + return rec.c1+rec.msg+rec.c2 + return logging.Formatter.format(self,rec) +def debug(*k,**kw): + if verbose: + k=list(k) + k[0]=k[0].replace('\n',' ') + logging.debug(*k,**kw) +def error(*k,**kw): + logging.error(*k,**kw) + if verbose>1: + if isinstance(k[0],Utils.WafError): + st=k[0].stack + else: + st=traceback.extract_stack() + if st: + st=st[:-1] + buf=[] + for filename,lineno,name,line in st: + buf.append(' File "%s", line %d, in %s'%(filename,lineno,name)) + if line: + buf.append(' %s'%line.strip()) + if buf:logging.error("\n".join(buf)) +warn=logging.warn +info=logging.info +def init_log(): + log=logging.getLogger() + log.handlers=[] + log.filters=[] + hdlr=logging.StreamHandler() + hdlr.setFormatter(formatter()) + log.addHandler(hdlr) + log.addFilter(log_filter()) + log.setLevel(logging.DEBUG) +init_log() + diff -Nru guitarix-0.22.4/wafadmin3/Node.py guitarix-0.24.2/wafadmin3/Node.py --- guitarix-0.22.4/wafadmin3/Node.py 1970-01-01 00:00:00.000000000 +0000 +++ guitarix-0.24.2/wafadmin3/Node.py 2012-10-20 03:56:02.000000000 +0000 @@ -0,0 +1,494 @@ +#! /usr/bin/env python +# encoding: utf-8 +import sys +if sys.hexversion < 0x020400f0: from sets import Set as set +import os,sys,fnmatch,re,stat +import Utils,Constants +UNDEFINED=0 +DIR=1 +FILE=2 +BUILD=3 +type_to_string={UNDEFINED:"unk",DIR:"dir",FILE:"src",BUILD:"bld"} +prune_pats='.git .bzr .hg .svn _MTN _darcs CVS SCCS'.split() +exclude_pats=prune_pats+'*~ #*# .#* %*% ._* .gitignore .cvsignore vssver.scc .DS_Store'.split() +exclude_regs=''' +**/*~ +**/#*# +**/.#* +**/%*% +**/._* +**/CVS +**/CVS/** +**/.cvsignore +**/SCCS +**/SCCS/** +**/vssver.scc +**/.svn +**/.svn/** +**/.git +**/.git/** +**/.gitignore +**/.bzr +**/.bzr/** +**/.hg +**/.hg/** +**/_MTN +**/_MTN/** +**/_darcs +**/_darcs/** +**/.DS_Store''' +class Node(object): + __slots__=("name","parent","id","childs") + def __init__(self,name,parent,node_type=UNDEFINED): + self.name=name + self.parent=parent + self.__class__.bld.id_nodes+=4 + self.id=self.__class__.bld.id_nodes+node_type + if node_type==DIR:self.childs={} + if parent and name in parent.childs: + raise Utils.WafError('node %s exists in the parent files %r already'%(name,parent)) + if parent:parent.childs[name]=self + def __setstate__(self,data): + if len(data)==4: + (self.parent,self.name,self.id,self.childs)=data + else: + (self.parent,self.name,self.id)=data + def __getstate__(self): + if getattr(self,'childs',None)is None: + return(self.parent,self.name,self.id) + else: + return(self.parent,self.name,self.id,self.childs) + def __str__(self): + if not self.parent:return'' + return"%s://%s"%(type_to_string[self.id&3],self.abspath()) + def __repr__(self): + return self.__str__() + def __hash__(self): + raise Utils.WafError('nodes, you are doing it wrong') + def __copy__(self): + raise Utils.WafError('nodes are not supposed to be cloned') + def get_type(self): + return self.id&3 + def set_type(self,t): + self.id=self.id+t-self.id&3 + def dirs(self): + return[x for x in self.childs.values()if x.id&3==DIR] + def files(self): + return[x for x in self.childs.values()if x.id&3==FILE] + def get_dir(self,name,default=None): + node=self.childs.get(name,None) + if not node or node.id&3!=DIR:return default + return node + def get_file(self,name,default=None): + node=self.childs.get(name,None) + if not node or node.id&3!=FILE:return default + return node + def get_build(self,name,default=None): + node=self.childs.get(name,None) + if not node or node.id&3!=BUILD:return default + return node + def find_resource(self,lst): + if isinstance(lst,str): + lst=Utils.split_path(lst) + if len(lst)==1: + parent=self + else: + parent=self.find_dir(lst[:-1]) + if not parent:return None + self.__class__.bld.rescan(parent) + name=lst[-1] + node=parent.childs.get(name,None) + if node: + tp=node.id&3 + if tp==FILE or tp==BUILD: + return node + else: + return None + tree=self.__class__.bld + if not name in tree.cache_dir_contents[parent.id]: + return None + path=parent.abspath()+os.sep+name + try: + st=Utils.h_file(path) + except IOError: + return None + child=self.__class__(name,parent,FILE) + tree.node_sigs[0][child.id]=st + return child + def find_or_declare(self,lst): + if isinstance(lst,str): + lst=Utils.split_path(lst) + if len(lst)==1: + parent=self + else: + parent=self.find_dir(lst[:-1]) + if not parent:return None + self.__class__.bld.rescan(parent) + name=lst[-1] + node=parent.childs.get(name,None) + if node: + tp=node.id&3 + if tp!=BUILD: + raise Utils.WafError('find_or_declare found a source file where a build file was expected %r'%'/'.join(lst)) + return node + node=self.__class__(name,parent,BUILD) + return node + def find_dir(self,lst): + if isinstance(lst,str): + lst=Utils.split_path(lst) + current=self + for name in lst: + self.__class__.bld.rescan(current) + prev=current + if not current.parent and name==current.name: + continue + elif not name: + continue + elif name=='.': + continue + elif name=='..': + current=current.parent or current + else: + current=prev.childs.get(name,None) + if current is None: + dir_cont=self.__class__.bld.cache_dir_contents + if prev.id in dir_cont and name in dir_cont[prev.id]: + if not prev.name: + if os.sep=='/': + dirname=os.sep+name + else: + dirname=name + else: + dirname=prev.abspath()+os.sep+name + if not os.path.isdir(dirname): + return None + current=self.__class__(name,prev,DIR) + elif(not prev.name and len(name)==2 and name[1]==':')or name.startswith('\\\\'): + current=self.__class__(name,prev,DIR) + else: + return None + else: + if current.id&3!=DIR: + return None + return current + def ensure_dir_node_from_path(self,lst): + if isinstance(lst,str): + lst=Utils.split_path(lst) + current=self + for name in lst: + if not name: + continue + elif name=='.': + continue + elif name=='..': + current=current.parent or current + else: + prev=current + current=prev.childs.get(name,None) + if current is None: + current=self.__class__(name,prev,DIR) + return current + def exclusive_build_node(self,path): + lst=Utils.split_path(path) + name=lst[-1] + if len(lst)>1: + parent=None + try: + parent=self.find_dir(lst[:-1]) + except OSError: + pass + if not parent: + parent=self.ensure_dir_node_from_path(lst[:-1]) + self.__class__.bld.rescan(parent) + else: + try: + self.__class__.bld.rescan(parent) + except OSError: + pass + else: + parent=self + node=parent.childs.get(name,None) + if not node: + node=self.__class__(name,parent,BUILD) + return node + def path_to_parent(self,parent): + lst=[] + p=self + h1=parent.height() + h2=p.height() + while h2>h1: + h2-=1 + lst.append(p.name) + p=p.parent + if lst: + lst.reverse() + ret=os.path.join(*lst) + else: + ret='' + return ret + def find_ancestor(self,node): + dist=self.height()-node.height() + if dist<0:return node.find_ancestor(self) + cand=self + while dist>0: + cand=cand.parent + dist-=1 + if cand==node:return cand + cursor=node + while cand.parent: + cand=cand.parent + cursor=cursor.parent + if cand==cursor:return cand + def relpath_gen(self,from_node): + if self==from_node:return'.' + if from_node.parent==self:return'..' + ancestor=self.find_ancestor(from_node) + lst=[] + cand=self + while not cand.id==ancestor.id: + lst.append(cand.name) + cand=cand.parent + cand=from_node + while not cand.id==ancestor.id: + lst.append('..') + cand=cand.parent + lst.reverse() + return os.sep.join(lst) + def nice_path(self,env=None): + tree=self.__class__.bld + ln=tree.launch_node() + if self.id&3==FILE:return self.relpath_gen(ln) + else:return os.path.join(tree.bldnode.relpath_gen(ln),env.variant(),self.relpath_gen(tree.srcnode)) + def is_child_of(self,node): + p=self + diff=self.height()-node.height() + while diff>0: + diff-=1 + p=p.parent + return p.id==node.id + def variant(self,env): + if not env:return 0 + elif self.id&3==FILE:return 0 + else:return env.variant() + def height(self): + d=self + val=-1 + while d: + d=d.parent + val+=1 + return val + def abspath(self,env=None): + variant=(env and(self.id&3!=FILE)and env.variant())or 0 + ret=self.__class__.bld.cache_node_abspath[variant].get(self.id,None) + if ret:return ret + if not variant: + if not self.parent: + val=os.sep=='/'and os.sep or'' + elif not self.parent.name: + val=(os.sep=='/'and os.sep or'')+self.name + else: + val=self.parent.abspath()+os.sep+self.name + else: + val=os.sep.join((self.__class__.bld.bldnode.abspath(),variant,self.path_to_parent(self.__class__.bld.srcnode))) + self.__class__.bld.cache_node_abspath[variant][self.id]=val + return val + def change_ext(self,ext): + name=self.name + k=name.rfind('.') + if k>=0: + name=name[:k]+ext + else: + name=name+ext + return self.parent.find_or_declare([name]) + def src_dir(self,env): + return self.parent.srcpath(env) + def bld_dir(self,env): + return self.parent.bldpath(env) + def bld_base(self,env): + s=os.path.splitext(self.name)[0] + return os.path.join(self.bld_dir(env),s) + def bldpath(self,env=None): + if self.id&3==FILE: + return self.relpath_gen(self.__class__.bld.bldnode) + p=self.path_to_parent(self.__class__.bld.srcnode) + if p is not'': + return env.variant()+os.sep+p + return env.variant() + def srcpath(self,env=None): + if self.id&3==BUILD: + return self.bldpath(env) + return self.relpath_gen(self.__class__.bld.bldnode) + def read(self,env): + return Utils.readf(self.abspath(env)) + def dir(self,env): + return self.parent.abspath(env) + def file(self): + return self.name + def file_base(self): + return os.path.splitext(self.name)[0] + def suffix(self): + k=max(0,self.name.rfind('.')) + return self.name[k:] + def find_iter_impl(self,src=True,bld=True,dir=True,accept_name=None,is_prune=None,maxdepth=25): + bld_ctx=self.__class__.bld + bld_ctx.rescan(self) + for name in bld_ctx.cache_dir_contents[self.id]: + if accept_name(self,name): + node=self.find_resource(name) + if node: + if src and node.id&3==FILE: + yield node + else: + node=self.find_dir(name) + if node and node.id!=bld_ctx.bldnode.id: + if dir: + yield node + if not is_prune(self,name): + if maxdepth: + for k in node.find_iter_impl(src,bld,dir,accept_name,is_prune,maxdepth=maxdepth-1): + yield k + else: + if not is_prune(self,name): + node=self.find_resource(name) + if not node: + node=self.find_dir(name) + if node and node.id!=bld_ctx.bldnode.id: + if maxdepth: + for k in node.find_iter_impl(src,bld,dir,accept_name,is_prune,maxdepth=maxdepth-1): + yield k + if bld: + for node in self.childs.values(): + if node.id==bld_ctx.bldnode.id: + continue + if node.id&3==BUILD: + if accept_name(self,node.name): + yield node + raise StopIteration + def find_iter(self,in_pat=['*'],ex_pat=exclude_pats,prune_pat=prune_pats,src=True,bld=True,dir=False,maxdepth=25,flat=False): + if not(src or bld or dir): + raise StopIteration + if self.id&3!=DIR: + raise StopIteration + in_pat=Utils.to_list(in_pat) + ex_pat=Utils.to_list(ex_pat) + prune_pat=Utils.to_list(prune_pat) + def accept_name(node,name): + for pat in ex_pat: + if fnmatch.fnmatchcase(name,pat): + return False + for pat in in_pat: + if fnmatch.fnmatchcase(name,pat): + return True + return False + def is_prune(node,name): + for pat in prune_pat: + if fnmatch.fnmatchcase(name,pat): + return True + return False + ret=self.find_iter_impl(src,bld,dir,accept_name,is_prune,maxdepth=maxdepth) + if flat: + return" ".join([x.relpath_gen(self)for x in ret]) + return ret + def ant_glob(self,*k,**kw): + src=kw.get('src',1) + bld=kw.get('bld',0) + dir=kw.get('dir',0) + excl=kw.get('excl',exclude_regs) + incl=k and k[0]or kw.get('incl','**') + def to_pat(s): + lst=Utils.to_list(s) + ret=[] + for x in lst: + x=x.replace('//','/') + if x.endswith('/'): + x+='**' + lst2=x.split('/') + accu=[] + for k in lst2: + if k=='**': + accu.append(k) + else: + k=k.replace('.','[.]').replace('*','.*').replace('?','.') + k='^%s$'%k + accu.append(re.compile(k)) + ret.append(accu) + return ret + def filtre(name,nn): + ret=[] + for lst in nn: + if not lst: + pass + elif lst[0]=='**': + ret.append(lst) + if len(lst)>1: + if lst[1].match(name): + ret.append(lst[2:]) + else: + ret.append([]) + elif lst[0].match(name): + ret.append(lst[1:]) + return ret + def accept(name,pats): + nacc=filtre(name,pats[0]) + nrej=filtre(name,pats[1]) + if[]in nrej: + nacc=[] + return[nacc,nrej] + def ant_iter(nodi,maxdepth=25,pats=[]): + nodi.__class__.bld.rescan(nodi) + for name in nodi.__class__.bld.cache_dir_contents[nodi.id]: + npats=accept(name,pats) + if npats and npats[0]: + accepted=[]in npats[0] + node=nodi.find_resource(name) + if node and accepted: + if src and node.id&3==FILE: + yield node + else: + node=nodi.find_dir(name) + if node and node.id!=nodi.__class__.bld.bldnode.id: + if accepted and dir: + yield node + if maxdepth: + for k in ant_iter(node,maxdepth=maxdepth-1,pats=npats): + yield k + if bld: + for node in nodi.childs.values(): + if node.id==nodi.__class__.bld.bldnode.id: + continue + if node.id&3==BUILD: + npats=accept(node.name,pats) + if npats and npats[0]and[]in npats[0]: + yield node + raise StopIteration + ret=[x for x in ant_iter(self,pats=[to_pat(incl),to_pat(excl)])] + if kw.get('flat',True): + return" ".join([x.relpath_gen(self)for x in ret]) + return ret + def update_build_dir(self,env=None): + if not env: + for env in bld.all_envs: + self.update_build_dir(env) + return + path=self.abspath(env) + lst=Utils.listdir(path) + try: + self.__class__.bld.cache_dir_contents[self.id].update(lst) + except KeyError: + self.__class__.bld.cache_dir_contents[self.id]=set(lst) + self.__class__.bld.cache_scanned_folders[self.id]=True + for k in lst: + npath=path+os.sep+k + st=os.stat(npath) + if stat.S_ISREG(st[stat.ST_MODE]): + ick=self.find_or_declare(k) + if not(ick.id in self.__class__.bld.node_sigs[env.variant()]): + self.__class__.bld.node_sigs[env.variant()][ick.id]=Constants.SIG_NIL + elif stat.S_ISDIR(st[stat.ST_MODE]): + child=self.find_dir(k) + if not child: + child=self.ensure_dir_node_from_path(k) + child.update_build_dir(env) +class Nodu(Node): + pass + diff -Nru guitarix-0.22.4/wafadmin3/Options.py guitarix-0.24.2/wafadmin3/Options.py --- guitarix-0.22.4/wafadmin3/Options.py 1970-01-01 00:00:00.000000000 +0000 +++ guitarix-0.24.2/wafadmin3/Options.py 2012-10-20 03:56:02.000000000 +0000 @@ -0,0 +1,158 @@ +#! /usr/bin/env python +# encoding: utf-8 + +import os,sys,imp,types,tempfile,optparse +import Logs,Utils +from Constants import* +cmds='distclean configure build install clean uninstall check dist distcheck'.split() +commands={} +is_install=False +options={} +arg_line=[] +launch_dir='' +tooldir='' +lockfile=os.environ.get('WAFLOCK','.lock-wscript') +try:cache_global=os.path.abspath(os.environ['WAFCACHE']) +except KeyError:cache_global='' +platform=Utils.unversioned_sys_platform() +conf_file='conf-runs-%s-%d.pickle'%(platform,ABI) +remote_repo=['http://waf.googlecode.com/svn/'] +default_prefix=os.environ.get('PREFIX') +if not default_prefix: + if platform=='win32': + d=tempfile.gettempdir() + default_prefix=d[0].upper()+d[1:] + else:default_prefix='/usr/local/' +default_jobs=os.environ.get('JOBS',-1) +if default_jobs<1: + try: + if'SC_NPROCESSORS_ONLN'in os.sysconf_names: + default_jobs=os.sysconf('SC_NPROCESSORS_ONLN') + else: + default_jobs=int(Utils.cmd_output(['sysctl','-n','hw.ncpu'])) + except: + if os.name=='java': + from java.lang import Runtime + default_jobs=Runtime.getRuntime().availableProcessors() + else: + default_jobs=int(os.environ.get('NUMBER_OF_PROCESSORS',1)) +default_destdir=os.environ.get('DESTDIR','') +def get_usage(self): + cmds_str=[] + module=Utils.g_module + if module: + tbl=module.__dict__ + keys=list(tbl.keys()) + keys.sort() + if'build'in tbl: + if not module.build.__doc__: + module.build.__doc__='builds the project' + if'configure'in tbl: + if not module.configure.__doc__: + module.configure.__doc__='configures the project' + ban=['set_options','init','shutdown'] + optlst=[x for x in keys if not x in ban and type(tbl[x])is type(parse_args_impl)and tbl[x].__doc__ and not x.startswith('_')] + just=max([len(x)for x in optlst]) + for x in optlst: + cmds_str.append(' %s: %s'%(x.ljust(just),tbl[x].__doc__)) + ret='\n'.join(cmds_str) + else: + ret=' '.join(cmds) + return'''waf [command] [options] + +Main commands (example: ./waf build -j4) +%s +'''%ret +setattr(optparse.OptionParser,'get_usage',get_usage) +def create_parser(module=None): + Logs.debug('options: create_parser is called') + parser=optparse.OptionParser(conflict_handler="resolve",version='waf %s (%s)'%(WAFVERSION,WAFREVISION)) + parser.formatter.width=Utils.get_term_cols() + p=parser.add_option + p('-j','--jobs',type='int',default=default_jobs,help='amount of parallel jobs (%r)'%default_jobs,dest='jobs') + p('-k','--keep',action='store_true',default=False,help='keep running happily on independent task groups',dest='keep') + p('-v','--verbose',action='count',default=0,help='verbosity level -v -vv or -vvv [default: 0]',dest='verbose') + p('--nocache',action='store_true',default=False,help='ignore the WAFCACHE (if set)',dest='nocache') + p('--zones',action='store',default='',help='debugging zones (task_gen, deps, tasks, etc)',dest='zones') + p('-p','--progress',action='count',default=0,help='-p: progress bar; -pp: ide output',dest='progress_bar') + p('--targets',action='store',default='',help='build given task generators, e.g. "target1,target2"',dest='compile_targets') + gr=optparse.OptionGroup(parser,'configuration options') + parser.add_option_group(gr) + gr.add_option('-b','--blddir',action='store',default='',help='build dir for the project (configuration)',dest='blddir') + gr.add_option('-s','--srcdir',action='store',default='',help='src dir for the project (configuration)',dest='srcdir') + gr.add_option('--prefix',help='installation prefix (configuration) [default: %r]'%default_prefix,default=default_prefix,dest='prefix') + gr.add_option('--download',action='store_true',default=False,help='try to download the tools if missing',dest='download') + gr=optparse.OptionGroup(parser,'installation options') + parser.add_option_group(gr) + gr.add_option('--destdir',help='installation root [default: %r]'%default_destdir,default=default_destdir,dest='destdir') + gr.add_option('-f','--force',action='store_true',default=False,help='force file installation',dest='force') + return parser +def parse_args_impl(parser,_args=None): + global options,commands,arg_line + (options,args)=parser.parse_args(args=_args) + arg_line=args + commands={} + for var in cmds:commands[var]=0 + if not args: + commands['build']=1 + args.append('build') + for arg in args: + commands[arg]=True + if'check'in args: + idx=args.index('check') + try: + bidx=args.index('build') + if bidx>idx: + raise ValueError('build before check') + except ValueError as e: + args.insert(idx,'build') + if args[0]!='init': + args.insert(0,'init') + if options.keep:options.jobs=1 + if options.jobs<1:options.jobs=1 + if'install'in sys.argv or'uninstall'in sys.argv: + options.destdir=options.destdir and os.path.abspath(os.path.expanduser(options.destdir)) + Logs.verbose=options.verbose + Logs.init_log() + if options.zones: + Logs.zones=options.zones.split(',') + if not Logs.verbose:Logs.verbose=1 + elif Logs.verbose>0: + Logs.zones=['runner'] + if Logs.verbose>2: + Logs.zones=['*'] +class Handler(Utils.Context): + parser=None + def __init__(self,module=None): + self.parser=create_parser(module) + self.cwd=os.getcwd() + Handler.parser=self + def add_option(self,*k,**kw): + self.parser.add_option(*k,**kw) + def add_option_group(self,*k,**kw): + return self.parser.add_option_group(*k,**kw) + def get_option_group(self,opt_str): + return self.parser.get_option_group(opt_str) + def sub_options(self,*k,**kw): + if not k:raise Utils.WscriptError('folder expected') + self.recurse(k[0],name='set_options') + def tool_options(self,*k,**kw): + + if not k[0]: + raise Utils.WscriptError('invalid tool_options call %r %r'%(k,kw)) + tools=Utils.to_list(k[0]) + path=Utils.to_list(kw.get('tdir',kw.get('tooldir',tooldir))) + for tool in tools: + tool=tool.replace('++','xx') + if tool=='java':tool='javaw' + if tool.lower()=='unittest':tool='unittestw' + module=Utils.load_tool(tool,path) + try: + fun=module.set_options + except AttributeError: + pass + else: + fun(kw.get('option_group',self)) + def parse_args(self,args=None): + parse_args_impl(self.parser,args) + diff -Nru guitarix-0.22.4/wafadmin3/Runner.py guitarix-0.24.2/wafadmin3/Runner.py --- guitarix-0.22.4/wafadmin3/Runner.py 1970-01-01 00:00:00.000000000 +0000 +++ guitarix-0.24.2/wafadmin3/Runner.py 2012-10-20 03:56:02.000000000 +0000 @@ -0,0 +1,165 @@ +#! /usr/bin/env python +# encoding: utf-8 +import sys +if sys.hexversion < 0x020400f0: from sets import Set as set +import os,sys,random,time,threading,traceback +try:from Queue import Queue +except ImportError:from queue import Queue +import Build,Utils,Logs,Options +from Logs import debug,error +from Constants import* +GAP=15 +run_old=threading.Thread.run +def run(*args,**kwargs): + try: + run_old(*args,**kwargs) + except(KeyboardInterrupt,SystemExit): + raise + except: + sys.excepthook(*sys.exc_info()) +threading.Thread.run=run +def process_task(tsk): + m=tsk.master + if m.stop: + m.out.put(tsk) + return + try: + tsk.generator.bld.printout(tsk.display()) + if tsk.__class__.stat:ret=tsk.__class__.stat(tsk) + else:ret=tsk.call_run() + except Exception as e: + tsk.err_msg=Utils.ex_stack() + tsk.hasrun=EXCEPTION + m.error_handler(tsk) + m.out.put(tsk) + return + if ret: + tsk.err_code=ret + tsk.hasrun=CRASHED + else: + try: + tsk.post_run() + except Utils.WafError: + pass + except Exception: + tsk.err_msg=Utils.ex_stack() + tsk.hasrun=EXCEPTION + else: + tsk.hasrun=SUCCESS + if tsk.hasrun!=SUCCESS: + m.error_handler(tsk) + m.out.put(tsk) +class TaskConsumer(threading.Thread): + ready=Queue(0) + consumers=[] + def __init__(self): + threading.Thread.__init__(self) + self.setDaemon(1) + self.start() + def run(self): + try: + self.loop() + except: + pass + def loop(self): + while 1: + tsk=TaskConsumer.ready.get() + process_task(tsk) +class Parallel(object): + def __init__(self,bld,j=2): + self.numjobs=j + self.manager=bld.task_manager + self.manager.current_group=0 + self.total=self.manager.total() + self.outstanding=[] + self.maxjobs=MAXJOBS + self.frozen=[] + self.out=Queue(0) + self.count=0 + self.processed=1 + self.stop=False + self.error=False + def get_next(self): + if not self.outstanding: + return None + return self.outstanding.pop(0) + def postpone(self,tsk): + if random.randint(0,1): + self.frozen.insert(0,tsk) + else: + self.frozen.append(tsk) + def refill_task_list(self): + while self.count>self.numjobs+GAP or self.count>=self.maxjobs: + self.get_out() + while not self.outstanding: + if self.count: + self.get_out() + if self.frozen: + self.outstanding+=self.frozen + self.frozen=[] + elif not self.count: + (jobs,tmp)=self.manager.get_next_set() + if jobs!=None:self.maxjobs=jobs + if tmp:self.outstanding+=tmp + break + def get_out(self): + ret=self.out.get() + self.manager.add_finished(ret) + if not self.stop and getattr(ret,'more_tasks',None): + self.outstanding+=ret.more_tasks + self.total+=len(ret.more_tasks) + self.count-=1 + def error_handler(self,tsk): + if not Options.options.keep: + self.stop=True + self.error=True + def start(self): + if TaskConsumer.consumers: + while len(TaskConsumer.consumers)0: + self.set_order(keys[i],keys[j]) + elif val<0: + self.set_order(keys[j],keys[i]) + def tasks_in_parallel(self): + if not self.ready:self.prepare() + keys=list(self.cstr_groups.keys()) + unconnected=[] + remainder=[] + for u in keys: + for k in self.cstr_order.values(): + if u in k: + remainder.append(u) + break + else: + unconnected.append(u) + toreturn=[] + for y in unconnected: + toreturn.extend(self.cstr_groups[y]) + for y in unconnected: + try:self.cstr_order.__delitem__(y) + except KeyError:pass + self.cstr_groups.__delitem__(y) + if not toreturn and remainder: + raise Utils.WafError("circular order constraint detected %r"%remainder) + return toreturn + def tasks_by_max_jobs(self): + if not self.ready:self.prepare() + if not self.temp_tasks:self.temp_tasks=self.tasks_in_parallel() + if not self.temp_tasks:return(None,None) + maxjobs=MAXJOBS + ret=[] + remaining=[] + for t in self.temp_tasks: + m=getattr(t,"maxjobs",getattr(self.__class__,"maxjobs",MAXJOBS)) + if m>maxjobs: + remaining.append(t) + elif m task failed (err #%d): %r"%(self.err_code,self) + except AttributeError: + return" -> task failed: %r"%self + elif self.hasrun==MISSING: + return" -> missing files: %r"%self + else: + return'' + def install(self): + bld=self.generator.bld + d=self.attr('install') + if self.attr('install_path'): + lst=[a.relpath_gen(bld.srcnode)for a in self.outputs] + perm=self.attr('chmod',O644) + if self.attr('src'): + lst+=[a.relpath_gen(bld.srcnode)for a in self.inputs] + if self.attr('filename'): + dir=self.install_path.rstrip(os.sep)+os.sep+self.attr('filename') + bld.install_as(dir,lst[0],self.env,perm) + else: + bld.install_files(self.install_path,lst,self.env,perm) +class Task(TaskBase): + vars=[] + def __init__(self,env,**kw): + TaskBase.__init__(self,**kw) + self.env=env + self.inputs=[] + self.outputs=[] + self.deps_nodes=[] + self.run_after=[] + def __str__(self): + env=self.env + src_str=' '.join([a.nice_path(env)for a in self.inputs]) + tgt_str=' '.join([a.nice_path(env)for a in self.outputs]) + if self.outputs:sep=' -> ' + else:sep='' + return'%s: %s%s%s\n'%(self.__class__.__name__.replace('_task',''),src_str,sep,tgt_str) + def __repr__(self): + return"".join(['\n\t{task: ',self.__class__.__name__," ",",".join([x.name for x in self.inputs])," -> ",",".join([x.name for x in self.outputs]),'}']) + def unique_id(self): + try: + return self.uid + except AttributeError: + m=md5() + up=m.update + up(self.__class__.__name__.encode()) + up(self.env.variant().encode()) + p=None + for x in self.inputs+self.outputs: + if p!=x.parent.id: + p=x.parent.id + up(x.parent.abspath().encode()) + up(x.name.encode()) + self.uid=m.digest() + return self.uid + def set_inputs(self,inp): + if isinstance(inp,list):self.inputs+=inp + else:self.inputs.append(inp) + def set_outputs(self,out): + if isinstance(out,list):self.outputs+=out + else:self.outputs.append(out) + def set_run_after(self,task): + assert isinstance(task,TaskBase) + self.run_after.append(task) + def add_file_dependency(self,filename): + node=self.generator.bld.path.find_resource(filename) + self.deps_nodes.append(node) + def signature(self): + try:return self.cache_sig[0] + except AttributeError:pass + self.m=md5() + exp_sig=self.sig_explicit_deps() + var_sig=self.sig_vars() + imp_sig=SIG_NIL + if self.scan: + try: + imp_sig=self.sig_implicit_deps() + except ValueError: + return self.signature() + ret=self.m.digest() + self.cache_sig=(ret,exp_sig,imp_sig,var_sig) + return ret + def runnable_status(self): + if self.inputs and(not self.outputs): + if not getattr(self.__class__,'quiet',None): + warn("invalid task (no inputs OR outputs): override in a Task subclass or set the attribute 'quiet' %r"%self) + for t in self.run_after: + if not t.hasrun: + return ASK_LATER + env=self.env + bld=self.generator.bld + new_sig=self.signature() + key=self.unique_id() + try: + prev_sig=bld.task_sigs[key][0] + except KeyError: + debug("task: task %r must run as it was never run before or the task code changed",self) + return RUN_ME + for node in self.outputs: + variant=node.variant(env) + try: + if bld.node_sigs[variant][node.id]!=new_sig: + return RUN_ME + except KeyError: + debug("task: task %r must run as the output nodes do not exist",self) + return RUN_ME + if Logs.verbose:self.debug_why(bld.task_sigs[key]) + if new_sig!=prev_sig: + return RUN_ME + return SKIP_ME + def post_run(self): + bld=self.generator.bld + env=self.env + sig=self.signature() + ssig=binascii.hexlify(sig) + variant=env.variant() + for node in self.outputs: + try: + os.stat(node.abspath(env)) + except OSError: + self.hasrun=MISSING + self.err_msg='-> missing file: %r'%node.abspath(env) + raise Utils.WafError + bld.node_sigs[variant][node.id]=sig + bld.task_sigs[self.unique_id()]=self.cache_sig + if not Options.cache_global or Options.options.nocache or not self.outputs: + return None + if getattr(self,'cached',None): + return None + dname=os.path.join(Options.cache_global,ssig.decode()) + tmpdir=tempfile.mkdtemp(prefix=Options.cache_global) + try: + shutil.rmtree(dname) + except: + pass + try: + for node in self.outputs: + variant=node.variant(env) + dest=os.path.join(tmpdir,node.name) + shutil.copy2(node.abspath(env),dest) + except(OSError,IOError): + try: + shutil.rmtree(tmpdir) + except: + pass + else: + try: + os.rename(tmpdir,dname) + except OSError: + try: + shutil.rmtree(tmpdir) + except: + pass + else: + try: + os.chmod(dname,O755) + except: + pass + def can_retrieve_cache(self): + if not Options.cache_global or Options.options.nocache or not self.outputs: + return None + env=self.env + sig=self.signature() + ssig=binascii.hexlify(sig) + dname=os.path.join(Options.cache_global,ssig.decode()) + try: + t1=os.stat(dname).st_mtime + except OSError: + return None + for node in self.outputs: + variant=node.variant(env) + orig=os.path.join(dname,node.name) + try: + shutil.copy2(orig,node.abspath(env)) + os.utime(orig,None) + except(OSError,IOError): + debug('task: failed retrieving file') + return None + try: + t2=os.stat(dname).st_mtime + except OSError: + return None + if t1!=t2: + return None + for node in self.outputs: + self.generator.bld.node_sigs[variant][node.id]=sig + if Options.options.progress_bar<1: + self.generator.bld.printout('restoring from cache %r\n'%node.bldpath(env)) + self.cached=True + return 1 + def debug_why(self,old_sigs): + new_sigs=self.cache_sig + def v(x): + return x.encode('hex') + debug("Task %r",self) + msgs=['Task must run','* Source file or manual dependency','* Implicit dependency','* Environment variable'] + tmp='task: -> %s: %s %s' + for x in range(len(msgs)): + if(new_sigs[x]!=old_sigs[x]): + debug(tmp,msgs[x],v(old_sigs[x]),v(new_sigs[x])) + def sig_explicit_deps(self): + bld=self.generator.bld + up=self.m.update + for x in self.inputs+getattr(self,'dep_nodes',[]): + if not x.parent.id in bld.cache_scanned_folders: + bld.rescan(x.parent) + variant=x.variant(self.env) + try: + up(bld.node_sigs[variant][x.id]) + except KeyError: + raise Utils.WafError('Missing node signature for %r (required by %r)'%(x,self)) + if bld.deps_man: + additional_deps=bld.deps_man + for x in self.inputs+self.outputs: + try: + d=additional_deps[x.id] + except KeyError: + continue + for v in d: + if isinstance(v,Node.Node): + bld.rescan(v.parent) + variant=v.variant(self.env) + try: + v=bld.node_sigs[variant][v.id] + except KeyError: + raise Utils.WafError('Missing node signature for %r (required by %r)'%(v,self)) + elif hasattr(v,'__call__'): + v=v() + up(v) + for x in self.deps_nodes: + v=bld.node_sigs[x.variant(self.env)][x.id] + up(v) + return self.m.digest() + def sig_vars(self): + bld=self.generator.bld + env=self.env + act_sig=bld.hash_env_vars(env,self.__class__.vars) + self.m.update(act_sig) + dep_vars=getattr(self,'dep_vars',None) + if dep_vars: + self.m.update(bld.hash_env_vars(env,dep_vars)) + return self.m.digest() + scan=None + def sig_implicit_deps(self): + bld=self.generator.bld + key=self.unique_id() + prev_sigs=bld.task_sigs.get(key,()) + if prev_sigs: + try: + if prev_sigs[2]==self.compute_sig_implicit_deps(): + return prev_sigs[2] + except(KeyError,OSError): + pass + del bld.task_sigs[key] + raise ValueError('rescan') + (nodes,names)=self.scan() + if Logs.verbose: + debug('deps: scanner for %s returned %s %s',str(self),str(nodes),str(names)) + bld.node_deps[key]=nodes + bld.raw_deps[key]=names + try: + sig=self.compute_sig_implicit_deps() + except KeyError: + try: + nodes=[] + for k in bld.node_deps.get(self.unique_id(),[]): + if k.id&3==2: + if not k.id in bld.node_sigs[0]: + nodes.append(k) + else: + if not k.id in bld.node_sigs[self.env.variant()]: + nodes.append(k) + except: + nodes='?' + raise Utils.WafError('Missing node signature for %r (for implicit dependencies %r)'%(nodes,self)) + return sig + def compute_sig_implicit_deps(self): + upd=self.m.update + bld=self.generator.bld + tstamp=bld.node_sigs + env=self.env + for k in bld.node_deps.get(self.unique_id(),[]): + if not k.parent.id in bld.cache_scanned_folders: + bld.rescan(k.parent) + if k.id&3==2: + upd(tstamp[0][k.id]) + else: + upd(tstamp[env.variant()][k.id]) + return self.m.digest() +def funex(c): + dc={} + exec(c,dc) + return dc['f'] +reg_act=re.compile(r"(?P\\)|(?P\$\$)|(?P\$\{(?P\w+)(?P.*?)\})",re.M) +def compile_fun_shell(name,line): + extr=[] + def repl(match): + g=match.group + if g('dollar'):return"$" + elif g('backslash'):return'\\\\' + elif g('subst'):extr.append((g('var'),g('code')));return"%s" + return None + line=reg_act.sub(repl,line)or line + parm=[] + dvars=[] + app=parm.append + for(var,meth)in extr: + if var=='SRC': + if meth:app('task.inputs%s'%meth) + else:app('" ".join([a.srcpath(env) for a in task.inputs])') + elif var=='TGT': + if meth:app('task.outputs%s'%meth) + else:app('" ".join([a.bldpath(env) for a in task.outputs])') + else: + if not var in dvars:dvars.append(var) + app("p('%s')"%var) + if parm:parm="%% (%s) "%(',\n\t\t'.join(parm)) + else:parm='' + c=COMPILE_TEMPLATE_SHELL%(line,parm) + debug('action: %s',c) + return(funex(c),dvars) +def compile_fun_noshell(name,line): + extr=[] + def repl(match): + g=match.group + if g('dollar'):return"$" + elif g('subst'):extr.append((g('var'),g('code')));return"<<|@|>>" + return None + line2=reg_act.sub(repl,line) + params=line2.split('<<|@|>>') + buf=[] + dvars=[] + app=buf.append + for x in range(len(extr)): + params[x]=params[x].strip() + if params[x]: + app("lst.extend(%r)"%params[x].split()) + (var,meth)=extr[x] + if var=='SRC': + if meth:app('lst.append(task.inputs%s)'%meth) + else:app("lst.extend([a.srcpath(env) for a in task.inputs])") + elif var=='TGT': + if meth:app('lst.append(task.outputs%s)'%meth) + else:app("lst.extend([a.bldpath(env) for a in task.outputs])") + else: + app('lst.extend(to_list(env[%r]))'%var) + if not var in dvars:dvars.append(var) + if params[-1]: + app("lst.extend(%r)"%shlex.split(params[-1])) + fun=COMPILE_TEMPLATE_NOSHELL%"\n\t".join(buf) + debug('action: %s',fun) + return(funex(fun),dvars) +def compile_fun(name,line,shell=None): + if line.find('<')>0 or line.find('>')>0 or line.find('&&')>0: + shell=True + if shell is None: + if sys.platform=='win32': + shell=False + else: + shell=True + if shell: + return compile_fun_shell(name,line) + else: + return compile_fun_noshell(name,line) +def simple_task_type(name,line,color='GREEN',vars=[],ext_in=[],ext_out=[],before=[],after=[],shell=None): + (fun,dvars)=compile_fun(name,line,shell) + fun.code=line + return task_type_from_func(name,fun,vars or dvars,color,ext_in,ext_out,before,after) +def task_type_from_func(name,func,vars=[],color='GREEN',ext_in=[],ext_out=[],before=[],after=[]): + params={'run':func,'vars':vars,'color':color,'name':name,'ext_in':Utils.to_list(ext_in),'ext_out':Utils.to_list(ext_out),'before':Utils.to_list(before),'after':Utils.to_list(after),} + cls=type(Task)(name,(Task,),params) + TaskBase.classes[name]=cls + return cls +def always_run(cls): + old=cls.runnable_status + def always(self): + old(self) + return RUN_ME + cls.runnable_status=always +def update_outputs(cls): + old_post_run=cls.post_run + def post_run(self): + old_post_run(self) + bld=self.generator.bld + for output in self.outputs: + bld.node_sigs[self.env.variant()][output.id]=Utils.h_file(output.abspath(self.env)) + cls.post_run=post_run + old_runnable_status=cls.runnable_status + def runnable_status(self): + status=old_runnable_status(self) + if status!=RUN_ME: + return status + try: + bld=self.outputs[0].__class__.bld + new_sig=self.signature() + prev_sig=bld.task_sigs[self.unique_id()][0] + if prev_sig==new_sig: + for x in self.outputs: + if not x.id in bld.node_sigs[self.env.variant()]: + return RUN_ME + return SKIP_ME + except KeyError: + pass + except IndexError: + pass + return RUN_ME + cls.runnable_status=runnable_status +def extract_outputs(tasks): + v={} + for x in tasks: + try: + (ins,outs)=v[x.env.variant()] + except KeyError: + ins={} + outs={} + v[x.env.variant()]=(ins,outs) + for a in getattr(x,'inputs',[]): + try:ins[a.id].append(x) + except KeyError:ins[a.id]=[x] + for a in getattr(x,'outputs',[]): + try:outs[a.id].append(x) + except KeyError:outs[a.id]=[x] + for(ins,outs)in v.values(): + links=set(ins.keys()).intersection(outs.keys()) + for k in links: + for a in ins[k]: + for b in outs[k]: + a.set_run_after(b) +def extract_deps(tasks): + extract_outputs(tasks) + out_to_task={} + for x in tasks: + v=x.env.variant() + try: + lst=x.outputs + except AttributeError: + pass + else: + for node in lst: + out_to_task[(v,node.id)]=x + dep_to_task={} + for x in tasks: + try: + x.signature() + except: + pass + v=x.env.variant() + key=x.unique_id() + for k in x.generator.bld.node_deps.get(x.unique_id(),[]): + try:dep_to_task[(v,k.id)].append(x) + except KeyError:dep_to_task[(v,k.id)]=[x] + deps=set(dep_to_task.keys()).intersection(set(out_to_task.keys())) + for idx in deps: + for k in dep_to_task[idx]: + k.set_run_after(out_to_task[idx]) + for x in tasks: + try: + delattr(x,'cache_sig') + except AttributeError: + pass + diff -Nru guitarix-0.22.4/wafadmin3/TaskGen.py guitarix-0.24.2/wafadmin3/TaskGen.py --- guitarix-0.22.4/wafadmin3/TaskGen.py 1970-01-01 00:00:00.000000000 +0000 +++ guitarix-0.24.2/wafadmin3/TaskGen.py 2012-10-20 03:56:02.000000000 +0000 @@ -0,0 +1,345 @@ +#! /usr/bin/env python +# encoding: utf-8 +import sys +if sys.hexversion < 0x020400f0: from sets import Set as set +import os,traceback,copy +import Build,Task,Utils,Logs,Options +from Logs import debug,error,warn +from Constants import* +typos={'sources':'source','targets':'target','include':'includes','define':'defines','importpath':'importpaths','install_var':'install_path','install_subdir':'install_path','inst_var':'install_path','inst_dir':'install_path','feature':'features',} +class register_obj(type): + def __init__(cls,name,bases,dict): + super(register_obj,cls).__init__(name,bases,dict) + name=cls.__name__ + suffix='_taskgen' + if name.endswith(suffix): + task_gen.classes[name.replace(suffix,'')]=cls +class task_gen(object, metaclass=register_obj): + mappings={} + mapped={} + prec=Utils.DefaultDict(list) + traits=Utils.DefaultDict(set) + classes={} + def __init__(self,*kw,**kwargs): + self.prec=Utils.DefaultDict(list) + self.source='' + self.target='' + self.meths=[] + self.mappings={} + self.features=list(kw) + self.tasks=[] + self.default_chmod=O644 + self.default_install_path=None + self.allnodes=[] + self.bld=kwargs.get('bld',Build.bld) + self.env=self.bld.env.copy() + self.path=self.bld.path + self.name='' + self.idx=self.bld.idx[self.path.id]=self.bld.idx.get(self.path.id,0)+1 + for key,val in kwargs.items(): + setattr(self,key,val) + self.bld.task_manager.add_task_gen(self) + self.bld.all_task_gen.append(self) + def __str__(self): + return(""%(self.name or self.target,self.__class__.__name__,str(self.path))) + def __setattr__(self,name,attr): + real=typos.get(name,name) + if real!=name: + warn('typo %s -> %s'%(name,real)) + if Logs.verbose>0: + traceback.print_stack() + object.__setattr__(self,real,attr) + def to_list(self,value): + if isinstance(value,str):return value.split() + else:return value + def apply(self): + keys=set(self.meths) + self.features=Utils.to_list(self.features) + for x in self.features+['*']: + st=task_gen.traits[x] + if not st: + warn('feature %r does not exist - bind at least one method to it'%x) + keys.update(st) + prec={} + prec_tbl=self.prec or task_gen.prec + for x in prec_tbl: + if x in keys: + prec[x]=prec_tbl[x] + tmp=[] + for a in keys: + for x in prec.values(): + if a in x:break + else: + tmp.append(a) + out=[] + while tmp: + e=tmp.pop() + if e in keys:out.append(e) + try: + nlst=prec[e] + except KeyError: + pass + else: + del prec[e] + for x in nlst: + for y in prec: + if x in prec[y]: + break + else: + tmp.append(x) + if prec:raise Utils.WafError("graph has a cycle %s"%str(prec)) + out.reverse() + self.meths=out + debug('task_gen: posting %s %d',self,id(self)) + for x in out: + try: + v=getattr(self,x) + except AttributeError: + raise Utils.WafError("tried to retrieve %s which is not a valid method"%x) + debug('task_gen: -> %s (%d)',x,id(self)) + v() + def post(self): + if not self.name: + if isinstance(self.target,list): + self.name=' '.join(self.target) + else: + self.name=self.target + if getattr(self,'posted',None): + return + self.apply() + self.posted=True + debug('task_gen: posted %s',self.name) + def get_hook(self,ext): + try:return self.mappings[ext] + except KeyError: + try:return task_gen.mappings[ext] + except KeyError:return None + def create_task(self,name,src=None,tgt=None,env=None): + env=env or self.env + task=Task.TaskBase.classes[name](env.copy(),generator=self) + if src: + task.set_inputs(src) + if tgt: + task.set_outputs(tgt) + self.tasks.append(task) + return task + def name_to_obj(self,name): + return self.bld.name_to_obj(name,self.env) + def find_sources_in_dirs(self,dirnames,excludes=[],exts=[]): + err_msg="'%s' attribute must be a list" + if not isinstance(excludes,list): + raise Utils.WscriptError(err_msg%'excludes') + if not isinstance(exts,list): + raise Utils.WscriptError(err_msg%'exts') + lst=[] + dirnames=self.to_list(dirnames) + ext_lst=exts or list(self.mappings.keys())+list(task_gen.mappings.keys()) + for name in dirnames: + anode=self.path.find_dir(name) + if not anode or not anode.is_child_of(self.bld.srcnode): + raise Utils.WscriptError("Unable to use '%s' - either because it's not a relative path"", or it's not child of '%s'."%(name,self.bld.srcnode)) + self.bld.rescan(anode) + for name in self.bld.cache_dir_contents[anode.id]: + if name.startswith('.'): + continue + (base,ext)=os.path.splitext(name) + if ext in ext_lst and not name in lst and not name in excludes: + lst.append((anode.relpath_gen(self.path)or'.')+os.path.sep+name) + lst.sort() + self.source=self.to_list(self.source) + if not self.source:self.source=lst + else:self.source+=lst + def clone(self,env): + newobj=task_gen(bld=self.bld) + for x in self.__dict__: + if x in['env','bld']: + continue + elif x in["path","features"]: + setattr(newobj,x,getattr(self,x)) + else: + setattr(newobj,x,copy.copy(getattr(self,x))) + newobj.__class__=self.__class__ + if isinstance(env,str): + newobj.env=self.bld.all_envs[env].copy() + else: + newobj.env=env.copy() + return newobj + def get_inst_path(self): + return getattr(self,'_install_path',getattr(self,'default_install_path','')) + def set_inst_path(self,val): + self._install_path=val + install_path=property(get_inst_path,set_inst_path) + def get_chmod(self): + return getattr(self,'_chmod',getattr(self,'default_chmod',O644)) + def set_chmod(self,val): + self._chmod=val + chmod=property(get_chmod,set_chmod) +def declare_extension(var,func): + try: + for x in Utils.to_list(var): + task_gen.mappings[x]=func + except: + raise Utils.WscriptError('declare_extension takes either a list or a string %r'%var) + task_gen.mapped[func.__name__]=func +def declare_order(*k): + assert(len(k)>1) + n=len(k)-1 + for i in range(n): + f1=k[i] + f2=k[i+1] + if not f1 in task_gen.prec[f2]: + task_gen.prec[f2].append(f1) +def declare_chain(name='',action='',ext_in='',ext_out='',reentrant=True,color='BLUE',install=0,before=[],after=[],decider=None,rule=None,scan=None): + action=action or rule + if isinstance(action,str): + act=Task.simple_task_type(name,action,color=color) + else: + act=Task.task_type_from_func(name,action,color=color) + act.ext_in=tuple(Utils.to_list(ext_in)) + act.ext_out=tuple(Utils.to_list(ext_out)) + act.before=Utils.to_list(before) + act.after=Utils.to_list(after) + act.scan=scan + def x_file(self,node): + if decider: + ext=decider(self,node) + else: + ext=ext_out + if isinstance(ext,str): + out_source=node.change_ext(ext) + if reentrant: + self.allnodes.append(out_source) + elif isinstance(ext,list): + out_source=[node.change_ext(x)for x in ext] + if reentrant: + for i in range((reentrant is True)and len(out_source)or reentrant): + self.allnodes.append(out_source[i]) + else: + raise Utils.WafError("do not know how to process %s"%str(ext)) + tsk=self.create_task(name,node,out_source) + if node.__class__.bld.is_install: + tsk.install=install + declare_extension(act.ext_in,x_file) + return x_file +def bind_feature(name,methods): + lst=Utils.to_list(methods) + task_gen.traits[name].update(lst) +def taskgen(func): + setattr(task_gen,func.__name__,func) + return func +def feature(*k): + def deco(func): + setattr(task_gen,func.__name__,func) + for name in k: + task_gen.traits[name].update([func.__name__]) + return func + return deco +def before(*k): + def deco(func): + setattr(task_gen,func.__name__,func) + for fun_name in k: + if not func.__name__ in task_gen.prec[fun_name]: + task_gen.prec[fun_name].append(func.__name__) + return func + return deco +def after(*k): + def deco(func): + setattr(task_gen,func.__name__,func) + for fun_name in k: + if not fun_name in task_gen.prec[func.__name__]: + task_gen.prec[func.__name__].append(fun_name) + return func + return deco +def extension(var): + def deco(func): + setattr(task_gen,func.__name__,func) + try: + for x in Utils.to_list(var): + task_gen.mappings[x]=func + except: + raise Utils.WafError('extension takes either a list or a string %r'%var) + task_gen.mapped[func.__name__]=func + return func + return deco +def apply_core(self): + find_resource=self.path.find_resource + for filename in self.to_list(self.source): + x=self.get_hook(filename) + if x: + x(self,filename) + else: + node=find_resource(filename) + if not node:raise Utils.WafError("source not found: '%s' in '%s'"%(filename,str(self.path))) + self.allnodes.append(node) + for node in self.allnodes: + x=self.get_hook(node.suffix()) + if not x: + raise Utils.WafError("Cannot guess how to process %s (got mappings %r in %r) -> try conf.check_tool(..)?"%(str(node),self.__class__.mappings.keys(),self.__class__)) + x(self,node) +feature('*')(apply_core) +def exec_rule(self): + if not getattr(self,'rule',None): + return + try: + self.meths.remove('apply_core') + except ValueError: + pass + func=self.rule + vars2=[] + if isinstance(func,str): + (func,vars2)=Task.compile_fun('',self.rule,shell=getattr(self,'shell',True)) + func.code=self.rule + name=getattr(self,'name',None)or self.target or self.rule + if not isinstance(name,str): + name=str(self.idx) + cls=Task.task_type_from_func(name,func,getattr(self,'vars',vars2)) + cls.color=getattr(self,'color','BLUE') + tsk=self.create_task(name) + dep_vars=getattr(self,'dep_vars',['ruledeps']) + if dep_vars: + tsk.dep_vars=dep_vars + if isinstance(self.rule,str): + tsk.env.ruledeps=self.rule + else: + tsk.env.ruledeps=Utils.h_fun(self.rule) + if getattr(self,'target',None): + cls.quiet=True + tsk.outputs=[self.path.find_or_declare(x)for x in self.to_list(self.target)] + if getattr(self,'source',None): + cls.quiet=True + tsk.inputs=[] + for x in self.to_list(self.source): + y=self.path.find_resource(x) + if not y: + raise Utils.WafError('input file %r could not be found (%r)'%(x,self.path.abspath())) + tsk.inputs.append(y) + if self.allnodes: + tsk.inputs.extend(self.allnodes) + if getattr(self,'scan',None): + cls.scan=self.scan + if getattr(self,'install_path',None): + tsk.install_path=self.install_path + if getattr(self,'cwd',None): + tsk.cwd=self.cwd + if getattr(self,'on_results',None): + Task.update_outputs(cls) + if getattr(self,'always',None): + Task.always_run(cls) + for x in['after','before','ext_in','ext_out']: + setattr(cls,x,getattr(self,x,[])) +feature('*')(exec_rule) +before('apply_core')(exec_rule) +def sequence_order(self): + if self.meths and self.meths[-1]!='sequence_order': + self.meths.append('sequence_order') + return + if getattr(self,'seq_start',None): + return + if getattr(self.bld,'prev',None): + self.bld.prev.post() + for x in self.bld.prev.tasks: + for y in self.tasks: + y.set_run_after(x) + self.bld.prev=self +feature('seq')(sequence_order) + diff -Nru guitarix-0.22.4/wafadmin3/Tools/__init__.py guitarix-0.24.2/wafadmin3/Tools/__init__.py --- guitarix-0.22.4/wafadmin3/Tools/__init__.py 1970-01-01 00:00:00.000000000 +0000 +++ guitarix-0.24.2/wafadmin3/Tools/__init__.py 2012-10-20 03:56:02.000000000 +0000 @@ -0,0 +1,4 @@ +#! /usr/bin/env python +# encoding: utf-8 + + diff -Nru guitarix-0.22.4/wafadmin3/Tools/ar.py guitarix-0.24.2/wafadmin3/Tools/ar.py --- guitarix-0.22.4/wafadmin3/Tools/ar.py 1970-01-01 00:00:00.000000000 +0000 +++ guitarix-0.24.2/wafadmin3/Tools/ar.py 2012-10-20 03:56:02.000000000 +0000 @@ -0,0 +1,26 @@ +#! /usr/bin/env python +# encoding: utf-8 + +import os,sys +import Task,Utils +from Configure import conftest +ar_str='${AR} ${ARFLAGS} ${AR_TGT_F}${TGT} ${AR_SRC_F}${SRC}' +cls=Task.simple_task_type('static_link',ar_str,color='YELLOW',ext_in='.o',ext_out='.bin',shell=False) +cls.maxjobs=1 +cls.install=Utils.nada +old=cls.run +def wrap(self): + try:os.remove(self.outputs[0].abspath(self.env)) + except OSError:pass + return old(self) +setattr(cls,'run',wrap) +def detect(conf): + conf.find_program('ar',var='AR') + conf.find_program('ranlib',var='RANLIB') + conf.env.ARFLAGS='rcs' +def find_ar(conf): + v=conf.env + conf.check_tool('ar') + if not v['AR']:conf.fatal('ar is required for static libraries - not found') + +conftest(find_ar) diff -Nru guitarix-0.22.4/wafadmin3/Tools/bison.py guitarix-0.24.2/wafadmin3/Tools/bison.py --- guitarix-0.22.4/wafadmin3/Tools/bison.py 1970-01-01 00:00:00.000000000 +0000 +++ guitarix-0.24.2/wafadmin3/Tools/bison.py 2012-10-20 03:56:02.000000000 +0000 @@ -0,0 +1,26 @@ +#! /usr/bin/env python +# encoding: utf-8 + +import Task +from TaskGen import extension +bison='${BISON} ${BISONFLAGS} ${SRC[0].abspath()} -o ${TGT[0].name}' +cls=Task.simple_task_type('bison',bison,'GREEN',ext_in='.yc .y .yy',ext_out='.c .cxx .h .l',shell=False) +def big_bison(self,node): + has_h='-d'in self.env['BISONFLAGS'] + outs=[] + if node.name.endswith('.yc'): + outs.append(node.change_ext('.tab.cc')) + if has_h: + outs.append(node.change_ext('.tab.hh')) + else: + outs.append(node.change_ext('.tab.c')) + if has_h: + outs.append(node.change_ext('.tab.h')) + tsk=self.create_task('bison',node,outs) + tsk.cwd=node.bld_dir(tsk.env) + self.allnodes.append(outs[0]) +def detect(conf): + bison=conf.find_program('bison',var='BISON',mandatory=True) + conf.env['BISONFLAGS']='-d' + +extension(['.y','.yc','.yy'])(big_bison) diff -Nru guitarix-0.22.4/wafadmin3/Tools/cc.py guitarix-0.24.2/wafadmin3/Tools/cc.py --- guitarix-0.22.4/wafadmin3/Tools/cc.py 1970-01-01 00:00:00.000000000 +0000 +++ guitarix-0.24.2/wafadmin3/Tools/cc.py 2012-10-20 03:56:02.000000000 +0000 @@ -0,0 +1,70 @@ +#! /usr/bin/env python +# encoding: utf-8 +import sys +if sys.hexversion < 0x020400f0: from sets import Set as set +import os +import TaskGen,Build,Utils,Task +from Logs import debug +import ccroot +from TaskGen import feature,before,extension,after +g_cc_flag_vars=['CCDEPS','FRAMEWORK','FRAMEWORKPATH','STATICLIB','LIB','LIBPATH','LINKFLAGS','RPATH','CCFLAGS','CPPPATH','CPPFLAGS','CCDEFINES'] +EXT_CC=['.c'] +g_cc_type_vars=['CCFLAGS','LINKFLAGS'] +class cc_taskgen(ccroot.ccroot_abstract): + pass +def init_cc(self): + self.p_flag_vars=set(self.p_flag_vars).union(g_cc_flag_vars) + self.p_type_vars=set(self.p_type_vars).union(g_cc_type_vars) + if not self.env['CC_NAME']: + raise Utils.WafError("At least one compiler (gcc, ..) must be selected") +def apply_obj_vars_cc(self): + env=self.env + app=env.append_unique + cpppath_st=env['CPPPATH_ST'] + for i in env['INC_PATHS']: + app('_CCINCFLAGS',cpppath_st%i.bldpath(env)) + app('_CCINCFLAGS',cpppath_st%i.srcpath(env)) + for i in env['CPPPATH']: + app('_CCINCFLAGS',cpppath_st%i) +def apply_defines_cc(self): + self.defines=getattr(self,'defines',[]) + lst=self.to_list(self.defines)+self.to_list(self.env['CCDEFINES']) + milst=[] + for defi in lst: + if not defi in milst: + milst.append(defi) + libs=self.to_list(self.uselib) + for l in libs: + val=self.env['CCDEFINES_'+l] + if val:milst+=val + self.env['DEFLINES']=["%s %s"%(x[0],Utils.trimquotes('='.join(x[1:])))for x in[y.split('=')for y in milst]] + y=self.env['CCDEFINES_ST'] + self.env.append_unique('_CCDEFFLAGS',[y%x for x in milst]) +def c_hook(self,node): + if getattr(self,'obj_ext',None): + obj_ext=self.obj_ext + else: + obj_ext='_%d.o'%self.idx + task=self.create_task('cc',node,node.change_ext(obj_ext)) + try: + self.compiled_tasks.append(task) + except AttributeError: + raise Utils.WafError('Have you forgotten to set the feature "cc" on %s?'%str(self)) + return task +cc_str='${CC} ${CCFLAGS} ${CPPFLAGS} ${_CCINCFLAGS} ${_CCDEFFLAGS} ${CC_SRC_F}${SRC} ${CC_TGT_F}${TGT}' +cls=Task.simple_task_type('cc',cc_str,'GREEN',ext_out='.o',ext_in='.c',shell=False) +cls.scan=ccroot.scan +cls.vars.append('CCDEPS') +link_str='${LINK_CC} ${CCLNK_SRC_F}${SRC} ${CCLNK_TGT_F}${TGT[0].abspath(env)} ${LINKFLAGS}' +cls=Task.simple_task_type('cc_link',link_str,color='YELLOW',ext_in='.o',ext_out='.bin',shell=False) +cls.maxjobs=1 +cls.install=Utils.nada + +feature('cc')(init_cc) +before('apply_type_vars')(init_cc) +after('default_cc')(init_cc) +feature('cc')(apply_obj_vars_cc) +after('apply_incpaths')(apply_obj_vars_cc) +feature('cc')(apply_defines_cc) +after('apply_lib_vars')(apply_defines_cc) +extension(EXT_CC)(c_hook) diff -Nru guitarix-0.22.4/wafadmin3/Tools/ccroot.py guitarix-0.24.2/wafadmin3/Tools/ccroot.py --- guitarix-0.22.4/wafadmin3/Tools/ccroot.py 1970-01-01 00:00:00.000000000 +0000 +++ guitarix-0.24.2/wafadmin3/Tools/ccroot.py 2012-10-20 03:56:02.000000000 +0000 @@ -0,0 +1,394 @@ +#! /usr/bin/env python +# encoding: utf-8 +import sys +if sys.hexversion < 0x020400f0: from sets import Set as set +import os,sys,re +import TaskGen,Task,Utils,preproc,Logs,Build,Options +from Logs import error,debug,warn +from Utils import md5 +from TaskGen import taskgen,after,before,feature +from Constants import* +from Configure import conftest +try: + from cStringIO import StringIO +except ImportError: + from io import StringIO +import config_c +USE_TOP_LEVEL=False +def get_cc_version(conf,cc,gcc=False,icc=False): + cmd=cc+['-dM','-E','-'] + try: + p=Utils.pproc.Popen(cmd,stdin=Utils.pproc.PIPE,stdout=Utils.pproc.PIPE,stderr=Utils.pproc.PIPE) + p.stdin.write(b'\n') + out=p.communicate()[0].decode("utf-8") + except: + conf.fatal('could not determine the compiler version %r'%cmd) + out=str(out) + if gcc: + if out.find('__INTEL_COMPILER')>=0: + conf.fatal('The intel compiler pretends to be gcc') + if out.find('__GNUC__')<0: + conf.fatal('Could not determine the compiler type') + if icc and out.find('__INTEL_COMPILER')<0: + conf.fatal('Not icc/icpc') + k={} + if icc or gcc: + out=out.split('\n') + import shlex + for line in out: + lst=shlex.split(line) + if len(lst)>2: + key=lst[1] + val=lst[2] + k[key]=val + def isD(var): + return var in k + def isT(var): + return var in k and k[var]!='0' + mp1={'__linux__':'linux','__GNU__':'gnu','__FreeBSD__':'freebsd','__NetBSD__':'netbsd','__OpenBSD__':'openbsd','__sun':'sunos','__hpux':'hpux','__sgi':'irix','_AIX':'aix','__CYGWIN__':'cygwin','__MSYS__':'msys','_UWIN':'uwin','_WIN64':'win32','_WIN32':'win32',} + for i in mp1: + if isD(i): + conf.env.DEST_OS=mp1[i] + break + else: + if isD('__APPLE__')and isD('__MACH__'): + conf.env.DEST_OS='darwin' + elif isD('__unix__'): + conf.env.DEST_OS='generic' + if isD('__ELF__'): + conf.env.DEST_BINFMT='elf' + mp2={'__x86_64__':'x86_64','__i386__':'x86','__ia64__':'ia','__mips__':'mips','__sparc__':'sparc','__alpha__':'alpha','__arm__':'arm','__hppa__':'hppa','__powerpc__':'powerpc',} + for i in mp2: + if isD(i): + conf.env.DEST_CPU=mp2[i] + break + debug('ccroot: dest platform: '+' '.join([conf.env[x]or'?'for x in('DEST_OS','DEST_BINFMT','DEST_CPU')])) + conf.env['CC_VERSION']=(k['__GNUC__'],k['__GNUC_MINOR__'],k['__GNUC_PATCHLEVEL__']) + return k +class DEBUG_LEVELS: + ULTRADEBUG="ultradebug" + DEBUG="debug" + RELEASE="release" + OPTIMIZED="optimized" + CUSTOM="custom" + ALL=[ULTRADEBUG,DEBUG,RELEASE,OPTIMIZED,CUSTOM] +def scan(self): + debug('ccroot: _scan_preprocessor(self, node, env, path_lst)') + if len(self.inputs)==1: + node=self.inputs[0] + (nodes,names)=preproc.get_deps(node,self.env,nodepaths=self.env['INC_PATHS']) + if Logs.verbose: + debug('deps: deps for %s: %r; unresolved %r',str(node),nodes,names) + return(nodes,names) + all_nodes=[] + all_names=[] + seen=set() + for node in self.inputs: + (nodes,names)=preproc.get_deps(node,self.env,nodepaths=self.env['INC_PATHS']) + if Logs.verbose: + debug('deps: deps for %s: %r; unresolved %r',str(node),nodes,names) + for x in nodes: + if id(x)in seen:continue + seen.add(id(x)) + all_nodes.append(x) + for x in names: + if not x in all_names: + all_names.append(x) + return(all_nodes,all_names) +class ccroot_abstract(TaskGen.task_gen): + def __init__(self,*k,**kw): + if len(k)>1: + k=list(k) + if k[1][0]!='c': + k[1]='c'+k[1] + TaskGen.task_gen.__init__(self,*k,**kw) +def get_target_name(self): + tp='program' + for x in self.features: + if x in['cshlib','cstaticlib']: + tp=x.lstrip('c') + pattern=self.env[tp+'_PATTERN'] + if not pattern:pattern='%s' + dir,name=os.path.split(self.target) + if self.env.DEST_BINFMT=='pe'and getattr(self,'vnum',None)and'cshlib'in self.features: + name=name+'-'+self.vnum.split('.')[0] + return os.path.join(dir,pattern%name) +def default_cc(self): + Utils.def_attrs(self,includes='',defines='',rpaths='',uselib='',uselib_local='',add_objects='',p_flag_vars=[],p_type_vars=[],compiled_tasks=[],link_task=None) + if not self.env.DEST_BINFMT: + self.env.DEST_BINFMT=Utils.unversioned_sys_platform_to_binary_format(self.env.DEST_OS or Utils.unversioned_sys_platform()) + if not self.env.BINDIR:self.env.BINDIR=Utils.subst_vars('${PREFIX}/bin',self.env) + if not self.env.LIBDIR:self.env.LIBDIR=Utils.subst_vars('${PREFIX}/lib${LIB_EXT}',self.env) +def apply_verif(self): + if not(self.source or getattr(self,'add_objects',None)or getattr(self,'uselib_local',None)or getattr(self,'obj_files',None)): + raise Utils.WafError('no source files specified for %s'%self) + if not self.target: + raise Utils.WafError('no target for %s'%self) +def vars_target_cprogram(self): + self.default_install_path=self.env.BINDIR + self.default_chmod=O755 +def vars_target_cshlib(self): + if self.env.DEST_BINFMT=='pe': + self.default_chmod=O755 + self.default_install_path=self.env.BINDIR + else: + self.default_install_path=self.env.LIBDIR +def default_link_install(self): + if self.install_path: + self.bld.install_files(self.install_path,self.link_task.outputs[0],env=self.env,chmod=self.chmod) +def apply_incpaths(self): + lst=[] + for lib in self.to_list(self.uselib): + for path in self.env['CPPPATH_'+lib]: + if not path in lst: + lst.append(path) + if preproc.go_absolute: + for path in preproc.standard_includes: + if not path in lst: + lst.append(path) + for path in self.to_list(self.includes): + if not path in lst: + if preproc.go_absolute or not os.path.isabs(path): + lst.append(path) + else: + self.env.prepend_value('CPPPATH',path) + for path in lst: + node=None + if os.path.isabs(path): + if preproc.go_absolute: + node=self.bld.root.find_dir(path) + elif path[0]=='#': + node=self.bld.srcnode + if len(path)>1: + node=node.find_dir(path[1:]) + else: + node=self.path.find_dir(path) + if node: + self.env.append_value('INC_PATHS',node) + if USE_TOP_LEVEL: + self.env.append_value('INC_PATHS',self.bld.srcnode) +def apply_type_vars(self): + for x in self.features: + if not x in['cprogram','cstaticlib','cshlib']: + continue + x=x.lstrip('c') + st=self.env[x+'_USELIB'] + if st:self.uselib=self.uselib+' '+st + for var in self.p_type_vars: + compvar='%s_%s'%(x,var) + value=self.env[compvar] + if value:self.env.append_value(var,value) +def apply_link(self): + link=getattr(self,'link',None) + if not link: + if'cstaticlib'in self.features:link='static_link' + elif'cxx'in self.features:link='cxx_link' + else:link='cc_link' + tsk=self.create_task(link) + outputs=[t.outputs[0]for t in self.compiled_tasks] + tsk.set_inputs(outputs) + tsk.set_outputs(self.path.find_or_declare(get_target_name(self))) + self.link_task=tsk +def apply_lib_vars(self): + env=self.env + self.uselib=self.to_list(self.uselib) + names=self.to_list(self.uselib_local) + seen=set([]) + tmp=Utils.deque(names) + while tmp: + lib_name=tmp.popleft() + if lib_name in seen: + continue + y=self.name_to_obj(lib_name) + if not y: + raise Utils.WafError('object %r was not found in uselib_local (required by %r)'%(lib_name,self.name)) + y.post() + seen.add(lib_name) + if getattr(y,'uselib_local',None): + lst=y.to_list(y.uselib_local) + if'cshlib'in y.features or'cprogram'in y.features: + lst=[x for x in lst if not'cstaticlib'in self.name_to_obj(x).features] + tmp.extend(lst) + if getattr(y,'link_task',None): + link_name=y.target[y.target.rfind(os.sep)+1:] + if'cstaticlib'in y.features: + env.append_value('STATICLIB',link_name) + elif'cshlib'in y.features or'cprogram'in y.features: + env.append_value('LIB',link_name) + self.link_task.set_run_after(y.link_task) + dep_nodes=getattr(self.link_task,'dep_nodes',[]) + self.link_task.dep_nodes=dep_nodes+y.link_task.outputs + tmp_path=y.link_task.outputs[0].parent.bldpath(self.env) + if not tmp_path in env['LIBPATH']:env.prepend_value('LIBPATH',tmp_path) + for v in self.to_list(y.uselib): + if not env['STATICLIB_'+v]: + if not v in self.uselib: + self.uselib.insert(0,v) + if getattr(y,'export_incdirs',None): + for x in self.to_list(y.export_incdirs): + node=y.path.find_dir(x) + if not node: + raise Utils.WafError('object %r: invalid folder %r in export_incdirs'%(y.target,x)) + self.env.append_unique('INC_PATHS',node) + for x in self.uselib: + for v in self.p_flag_vars: + val=self.env[v+'_'+x] + if val:self.env.append_value(v,val) +def apply_objdeps(self): + if not getattr(self,'add_objects',None):return + seen=[] + names=self.to_list(self.add_objects) + while names: + x=names[0] + if x in seen: + names=names[1:] + continue + y=self.name_to_obj(x) + if not y: + raise Utils.WafError('object %r was not found in uselib_local (required by add_objects %r)'%(x,self.name)) + if getattr(y,'add_objects',None): + added=0 + lst=y.to_list(y.add_objects) + lst.reverse() + for u in lst: + if u in seen:continue + added=1 + names=[u]+names + if added:continue + y.post() + seen.append(x) + for t in y.compiled_tasks: + self.link_task.inputs.extend(t.outputs) +def apply_obj_vars(self): + v=self.env + lib_st=v['LIB_ST'] + staticlib_st=v['STATICLIB_ST'] + libpath_st=v['LIBPATH_ST'] + staticlibpath_st=v['STATICLIBPATH_ST'] + rpath_st=v['RPATH_ST'] + app=v.append_unique + if v['FULLSTATIC']: + v.append_value('LINKFLAGS',v['FULLSTATIC_MARKER']) + for i in v['RPATH']: + if i and rpath_st: + app('LINKFLAGS',rpath_st%i) + for i in v['LIBPATH']: + app('LINKFLAGS',libpath_st%i) + app('LINKFLAGS',staticlibpath_st%i) + if v['STATICLIB']: + v.append_value('LINKFLAGS',v['STATICLIB_MARKER']) + k=[(staticlib_st%i)for i in v['STATICLIB']] + app('LINKFLAGS',k) + if not v['FULLSTATIC']: + if v['STATICLIB']or v['LIB']: + v.append_value('LINKFLAGS',v['SHLIB_MARKER']) + app('LINKFLAGS',[lib_st%i for i in v['LIB']]) +def process_obj_files(self): + if not hasattr(self,'obj_files'):return + for x in self.obj_files: + node=self.path.find_resource(x) + self.link_task.inputs.append(node) +def add_obj_file(self,file): + if not hasattr(self,'obj_files'):self.obj_files=[] + if not'process_obj_files'in self.meths:self.meths.append('process_obj_files') + self.obj_files.append(file) +c_attrs={'cxxflag':'CXXFLAGS','cflag':'CCFLAGS','ccflag':'CCFLAGS','linkflag':'LINKFLAGS','ldflag':'LINKFLAGS','lib':'LIB','libpath':'LIBPATH','staticlib':'STATICLIB','staticlibpath':'STATICLIBPATH','rpath':'RPATH','framework':'FRAMEWORK','frameworkpath':'FRAMEWORKPATH'} +def add_extra_flags(self): + for x in self.__dict__.keys(): + y=x.lower() + if y[-1]=='s': + y=y[:-1] + if c_attrs.get(y,None): + self.env.append_unique(c_attrs[y],getattr(self,x)) +def apply_implib(self): + if not self.env.DEST_BINFMT=='pe': + return + self.meths.remove('default_link_install') + bindir=self.install_path + if not bindir:return + dll=self.link_task.outputs[0] + self.bld.install_files(bindir,dll,self.env,self.chmod) + implib=self.env['implib_PATTERN']%os.path.split(self.target)[1] + implib=dll.parent.find_or_declare(implib) + self.link_task.outputs.append(implib) + self.bld.install_as('${LIBDIR}/%s'%implib.name,implib,self.env) + self.env.append_value('LINKFLAGS',(self.env['IMPLIB_ST']%implib.bldpath(self.env)).split()) +def apply_vnum(self): + if not getattr(self,'vnum','')or not'cshlib'in self.features or os.name!='posix'or self.env.DEST_BINFMT not in('elf','mac-o'): + return + self.meths.remove('default_link_install') + link=self.link_task + nums=self.vnum.split('.') + node=link.outputs[0] + libname=node.name + if libname.endswith('.dylib'): + name3=libname.replace('.dylib','.%s.dylib'%self.vnum) + name2=libname.replace('.dylib','.%s.dylib'%nums[0]) + else: + name3=libname+'.'+self.vnum + name2=libname+'.'+nums[0] + if self.env.SONAME_ST: + v=self.env.SONAME_ST%name2 + self.env.append_value('LINKFLAGS',v.split()) + bld=self.bld + nums=self.vnum.split('.') + path=self.install_path + if not path:return + bld.install_as(path+os.sep+name3,node,env=self.env) + bld.symlink_as(path+os.sep+name2,name3) + bld.symlink_as(path+os.sep+libname,name3) + tsk=self.create_task('vnum') + tsk.set_inputs([node]) + tsk.set_outputs(node.parent.find_or_declare(name2)) +def exec_vnum_link(self): + path=self.outputs[0].abspath(self.env) + try: + os.remove(path) + except OSError: + pass + try: + os.symlink(self.inputs[0].name,path) + except OSError: + return 1 +cls=Task.task_type_from_func('vnum',func=exec_vnum_link,ext_in='.bin',color='CYAN') +cls.quiet=1 +def add_as_needed(conf): + if conf.env.DEST_BINFMT=='elf'and'gcc'in(conf.env.CXX_NAME,conf.env.CC_NAME): + conf.env.append_unique('LINKFLAGS','--as-needed') + +feature('cc','cxx')(default_cc) +before('apply_core')(default_cc) +feature('cprogram','dprogram','cstaticlib','dstaticlib','cshlib','dshlib')(apply_verif) +feature('cprogram','dprogram')(vars_target_cprogram) +after('default_cc')(vars_target_cprogram) +before('apply_core')(vars_target_cprogram) +after('default_cc')(vars_target_cshlib) +feature('cshlib','dshlib')(vars_target_cshlib) +before('apply_core')(vars_target_cshlib) +feature('cprogram','dprogram','cstaticlib','dstaticlib','cshlib','dshlib')(default_link_install) +after('apply_link','vars_target_cprogram','vars_target_cshlib')(default_link_install) +feature('cc','cxx')(apply_incpaths) +after('apply_type_vars','apply_lib_vars','apply_core')(apply_incpaths) +feature('cc','cxx')(apply_type_vars) +after('init_cc','init_cxx')(apply_type_vars) +before('apply_lib_vars')(apply_type_vars) +feature('cprogram','cshlib','cstaticlib')(apply_link) +after('apply_core')(apply_link) +feature('cc','cxx')(apply_lib_vars) +after('apply_link','init_cc','init_cxx','apply_core')(apply_lib_vars) +feature('cprogram','cstaticlib','cshlib')(apply_objdeps) +after('init_cc','init_cxx','apply_link')(apply_objdeps) +feature('cprogram','cshlib','cstaticlib')(apply_obj_vars) +after('apply_lib_vars')(apply_obj_vars) +after('apply_link')(process_obj_files) +taskgen(add_obj_file) +feature('cc','cxx')(add_extra_flags) +before('init_cxx','init_cc')(add_extra_flags) +before('apply_lib_vars','apply_obj_vars','apply_incpaths','init_cc')(add_extra_flags) +feature('cshlib')(apply_implib) +after('apply_link','default_cc')(apply_implib) +before('apply_lib_vars','apply_objdeps','default_link_install')(apply_implib) +feature('cshlib')(apply_vnum) +after('apply_link')(apply_vnum) +before('apply_lib_vars','default_link_install')(apply_vnum) +conftest(add_as_needed) diff -Nru guitarix-0.22.4/wafadmin3/Tools/compiler_cc.py guitarix-0.24.2/wafadmin3/Tools/compiler_cc.py --- guitarix-0.22.4/wafadmin3/Tools/compiler_cc.py 1970-01-01 00:00:00.000000000 +0000 +++ guitarix-0.24.2/wafadmin3/Tools/compiler_cc.py 2012-10-20 03:56:02.000000000 +0000 @@ -0,0 +1,43 @@ +#! /usr/bin/env python +# encoding: utf-8 + +import os,sys,imp,types,ccroot +import optparse +import Utils,Configure,Options +from Logs import debug +c_compiler={'win32':['msvc','gcc'],'cygwin':['gcc'],'darwin':['gcc'],'aix':['xlc','gcc'],'linux':['gcc','icc','suncc'],'sunos':['gcc','suncc'],'irix':['gcc'],'hpux':['gcc'],'gnu':['gcc'],'default':['gcc']} +def __list_possible_compiler(platform): + try: + return c_compiler[platform] + except KeyError: + return c_compiler["default"] +def detect(conf): + try:test_for_compiler=Options.options.check_c_compiler + except AttributeError:conf.fatal("Add set_options(opt): opt.tool_options('compiler_cc')") + orig=conf.env + for compiler in test_for_compiler.split(): + conf.env=orig.copy() + try: + conf.check_tool(compiler) + except Configure.ConfigurationError as e: + debug('compiler_cc: %r'%e) + else: + if conf.env['CC']: + orig.table=conf.env.get_merged_dict() + conf.env=orig + conf.check_message(compiler,'',True) + conf.env['COMPILER_CC']=compiler + break + conf.check_message(compiler,'',False) + break + else: + conf.fatal('could not configure a c compiler!') +def set_options(opt): + build_platform=Utils.unversioned_sys_platform() + possible_compiler_list=__list_possible_compiler(build_platform) + test_for_compiler=' '.join(possible_compiler_list) + cc_compiler_opts=opt.add_option_group("C Compiler Options") + cc_compiler_opts.add_option('--check-c-compiler',default="%s"%test_for_compiler,help='On this platform (%s) the following C-Compiler will be checked by default: "%s"'%(build_platform,test_for_compiler),dest="check_c_compiler") + for c_compiler in test_for_compiler.split(): + opt.tool_options('%s'%c_compiler,option_group=cc_compiler_opts) + diff -Nru guitarix-0.22.4/wafadmin3/Tools/compiler_cxx.py guitarix-0.24.2/wafadmin3/Tools/compiler_cxx.py --- guitarix-0.22.4/wafadmin3/Tools/compiler_cxx.py 1970-01-01 00:00:00.000000000 +0000 +++ guitarix-0.24.2/wafadmin3/Tools/compiler_cxx.py 2012-10-20 03:56:02.000000000 +0000 @@ -0,0 +1,43 @@ +#! /usr/bin/env python +# encoding: utf-8 + +import os,sys,imp,types,ccroot +import optparse +import Utils,Configure,Options +from Logs import debug +cxx_compiler={'win32':['msvc','g++'],'cygwin':['g++'],'darwin':['g++'],'aix':['xlc++','g++'],'linux':['g++','icpc','sunc++'],'sunos':['g++','sunc++'],'irix':['g++'],'hpux':['g++'],'gnu':['g++'],'default':['g++']} +def __list_possible_compiler(platform): + try: + return cxx_compiler[platform] + except KeyError: + return cxx_compiler["default"] +def detect(conf): + try:test_for_compiler=Options.options.check_cxx_compiler + except AttributeError:raise Configure.ConfigurationError("Add set_options(opt): opt.tool_options('compiler_cxx')") + orig=conf.env + for compiler in test_for_compiler.split(): + try: + conf.env=orig.copy() + conf.check_tool(compiler) + except Configure.ConfigurationError as e: + debug('compiler_cxx: %r'%e) + else: + if conf.env['CXX']: + orig.table=conf.env.get_merged_dict() + conf.env=orig + conf.check_message(compiler,'',True) + conf.env['COMPILER_CXX']=compiler + break + conf.check_message(compiler,'',False) + break + else: + conf.fatal('could not configure a cxx compiler!') +def set_options(opt): + build_platform=Utils.unversioned_sys_platform() + possible_compiler_list=__list_possible_compiler(build_platform) + test_for_compiler=' '.join(possible_compiler_list) + cxx_compiler_opts=opt.add_option_group('C++ Compiler Options') + cxx_compiler_opts.add_option('--check-cxx-compiler',default="%s"%test_for_compiler,help='On this platform (%s) the following C++ Compiler will be checked by default: "%s"'%(build_platform,test_for_compiler),dest="check_cxx_compiler") + for cxx_compiler in test_for_compiler.split(): + opt.tool_options('%s'%cxx_compiler,option_group=cxx_compiler_opts) + diff -Nru guitarix-0.22.4/wafadmin3/Tools/compiler_d.py guitarix-0.24.2/wafadmin3/Tools/compiler_d.py --- guitarix-0.22.4/wafadmin3/Tools/compiler_d.py 1970-01-01 00:00:00.000000000 +0000 +++ guitarix-0.24.2/wafadmin3/Tools/compiler_d.py 2012-10-20 03:56:02.000000000 +0000 @@ -0,0 +1,25 @@ +#! /usr/bin/env python +# encoding: utf-8 + +import os,sys,imp,types +import Utils,Configure,Options +def detect(conf): + if getattr(Options.options,'check_dmd_first',None): + test_for_compiler=['dmd','gdc'] + else: + test_for_compiler=['gdc','dmd'] + for d_compiler in test_for_compiler: + try: + conf.check_tool(d_compiler) + except: + pass + else: + break + else: + conf.fatal('no suitable d compiler was found') +def set_options(opt): + d_compiler_opts=opt.add_option_group('D Compiler Options') + d_compiler_opts.add_option('--check-dmd-first',action='store_true',help='checks for the gdc compiler before dmd (default is the other way round)',dest='check_dmd_first',default=False) + for d_compiler in['gdc','dmd']: + opt.tool_options('%s'%d_compiler,option_group=d_compiler_opts) + diff -Nru guitarix-0.22.4/wafadmin3/Tools/config_c.py guitarix-0.24.2/wafadmin3/Tools/config_c.py --- guitarix-0.22.4/wafadmin3/Tools/config_c.py 1970-01-01 00:00:00.000000000 +0000 +++ guitarix-0.24.2/wafadmin3/Tools/config_c.py 2012-10-20 03:56:02.000000000 +0000 @@ -0,0 +1,535 @@ +#! /usr/bin/env python +# encoding: utf-8 +import sys +if sys.hexversion < 0x020400f0: from sets import Set as set +import os,imp,sys,shlex,shutil +from Utils import md5 +import Build,Utils,Configure,Task,Options,Logs,TaskGen +from Constants import* +from Configure import conf,conftest +cfg_ver={'atleast-version':'>=','exact-version':'==','max-version':'<=',} +SNIP1=''' + int main() { + void *p; + p=(void*)(%s); + return 0; +} +''' +SNIP2=''' +int main() { + if ((%(type_name)s *) 0) return 0; + if (sizeof (%(type_name)s)) return 0; +} +''' +SNIP3=''' +int main() { + return 0; +} +''' +def parse_flags(line,uselib,env): + lst=shlex.split(line) + while lst: + x=lst.pop(0) + st=x[:2] + ot=x[2:] + if st=='-I'or st=='/I': + if not ot:ot=lst.pop(0) + env.append_unique('CPPPATH_'+uselib,ot) + elif st=='-D': + if not ot:ot=lst.pop(0) + env.append_unique('CXXDEFINES_'+uselib,ot) + env.append_unique('CCDEFINES_'+uselib,ot) + elif st=='-l': + if not ot:ot=lst.pop(0) + env.append_unique('LIB_'+uselib,ot) + elif st=='-L': + if not ot:ot=lst.pop(0) + env.append_unique('LIBPATH_'+uselib,ot) + elif x=='-pthread'or x.startswith('+'): + env.append_unique('CCFLAGS_'+uselib,x) + env.append_unique('CXXFLAGS_'+uselib,x) + env.append_unique('LINKFLAGS_'+uselib,x) + elif x=='-framework': + env.append_unique('FRAMEWORK_'+uselib,lst.pop(0)) + elif x.startswith('-F'): + env.append_unique('FRAMEWORKPATH_'+uselib,x[2:]) + elif x.startswith('-std'): + env.append_unique('CCFLAGS_'+uselib,x) + env.append_unique('LINKFLAGS_'+uselib,x) + elif x.startswith('-Wl'): + env.append_unique('LINKFLAGS_'+uselib,x) + elif x.startswith('-m')or x.startswith('-f'): + env.append_unique('CCFLAGS_'+uselib,x) + env.append_unique('CXXFLAGS_'+uselib,x) +def ret_msg(self,f,kw): + if isinstance(f,str): + return f + return f(kw) +def validate_cfg(self,kw): + if not'path'in kw: + kw['path']='pkg-config --errors-to-stdout --print-errors' + if'atleast_pkgconfig_version'in kw: + if not'msg'in kw: + kw['msg']='Checking for pkg-config version >= %s'%kw['atleast_pkgconfig_version'] + return + if'modversion'in kw: + return + if'variables'in kw: + if not'msg'in kw: + kw['msg']='Checking for %s variables'%kw['package'] + return + for x in cfg_ver.keys(): + y=x.replace('-','_') + if y in kw: + if not'package'in kw: + raise ValueError('%s requires a package'%x) + if not'msg'in kw: + kw['msg']='Checking for %s %s %s'%(kw['package'],cfg_ver[x],kw[y]) + return + if not'msg'in kw: + kw['msg']='Checking for %s'%(kw['package']or kw['path']) + if not'okmsg'in kw: + kw['okmsg']='yes' + if not'errmsg'in kw: + kw['errmsg']='not found' +def cmd_and_log(self,cmd,kw): + Logs.debug('runner: %s\n'%cmd) + if self.log: + self.log.write('%s\n'%cmd) + try: + p=Utils.pproc.Popen(cmd,stdout=Utils.pproc.PIPE,stderr=Utils.pproc.PIPE,shell=True) + (out,err)=p.communicate() + except OSError as e: + self.log.write('error %r'%e) + self.fatal(str(e)) + out=out.decode("utf-8") + err=err.decode("utf-8") + if self.log: + self.log.write(out) + self.log.write(err) + if p.returncode: + if not kw.get('errmsg',''): + if kw.get('mandatory',False): + kw['errmsg']=out.strip() + else: + kw['errmsg']='no' + self.fatal('fail') + return out +def exec_cfg(self,kw): + if'atleast_pkgconfig_version'in kw: + cmd='%s --atleast-pkgconfig-version=%s'%(kw['path'],kw['atleast_pkgconfig_version']) + self.cmd_and_log(cmd,kw) + if not'okmsg'in kw: + kw['okmsg']='yes' + return + for x in cfg_ver: + y=x.replace('-','_') + if y in kw: + self.cmd_and_log('%s --%s=%s %s'%(kw['path'],x,kw[y],kw['package']),kw) + if not'okmsg'in kw: + kw['okmsg']='yes' + self.define(self.have_define(kw.get('uselib_store',kw['package'])),1,0) + break + if'modversion'in kw: + version=self.cmd_and_log('%s --modversion %s'%(kw['path'],kw['modversion']),kw).strip() + self.define('%s_VERSION'%Utils.quote_define_name(kw.get('uselib_store',kw['modversion'])),version) + return version + if'variables'in kw: + env=kw.get('env',self.env) + uselib=kw.get('uselib_store',kw['package'].upper()) + vars=Utils.to_list(kw['variables']) + for v in vars: + val=self.cmd_and_log('%s --variable=%s %s'%(kw['path'],v,kw['package']),kw).strip() + var='%s_%s'%(uselib,v) + env[var]=val + if not'okmsg'in kw: + kw['okmsg']='yes' + return + lst=[kw['path']] + defi=kw.get('define_variable',None) + if not defi: + defi=self.env.PKG_CONFIG_DEFINES or{} + for key,val in defi.items(): + lst.append('--define-variable=%s=%s'%(key,val)) + lst.append(kw.get('args','')) + lst.append(kw['package']) + cmd=' '.join(lst) + ret=self.cmd_and_log(cmd,kw) + if not'okmsg'in kw: + kw['okmsg']='yes' + self.define(self.have_define(kw.get('uselib_store',kw['package'])),1,0) + parse_flags(ret,kw.get('uselib_store',kw['package'].upper()),kw.get('env',self.env)) + return ret +def check_cfg(self,*k,**kw): + self.validate_cfg(kw) + if'msg'in kw: + self.check_message_1(kw['msg']) + ret=None + try: + ret=self.exec_cfg(kw) + except Configure.ConfigurationError as e: + if'errmsg'in kw: + self.check_message_2(kw['errmsg'],'YELLOW') + if'mandatory'in kw and kw['mandatory']: + if Logs.verbose>1: + raise + else: + self.fatal('the configuration failed (see %r)'%self.log.name) + else: + kw['success']=ret + if'okmsg'in kw: + self.check_message_2(self.ret_msg(kw['okmsg'],kw)) + return ret +def validate_c(self,kw): + if not'env'in kw: + kw['env']=self.env.copy() + env=kw['env'] + if not'compiler'in kw: + kw['compiler']='cc' + if env['CXX_NAME']and Task.TaskBase.classes.get('cxx',None): + kw['compiler']='cxx' + if not self.env['CXX']: + self.fatal('a c++ compiler is required') + else: + if not self.env['CC']: + self.fatal('a c compiler is required') + if not'type'in kw: + kw['type']='cprogram' + assert not(kw['type']!='cprogram'and kw.get('execute',0)),'can only execute programs' + def to_header(dct): + if'header_name'in dct: + dct=Utils.to_list(dct['header_name']) + return''.join(['#include <%s>\n'%x for x in dct]) + return'' + if not'compile_mode'in kw: + kw['compile_mode']=(kw['compiler']=='cxx')and'cxx'or'cc' + if not'compile_filename'in kw: + kw['compile_filename']='test.c'+((kw['compile_mode']=='cxx')and'pp'or'') + if'framework_name'in kw: + try:TaskGen.task_gen.create_task_macapp + except AttributeError:self.fatal('frameworks require the osx tool') + fwkname=kw['framework_name'] + if not'uselib_store'in kw: + kw['uselib_store']=fwkname.upper() + if not kw.get('no_header',False): + if not'header_name'in kw: + kw['header_name']=[] + fwk='%s/%s.h'%(fwkname,fwkname) + if kw.get('remove_dot_h',None): + fwk=fwk[:-2] + kw['header_name']=Utils.to_list(kw['header_name'])+[fwk] + kw['msg']='Checking for framework %s'%fwkname + kw['framework']=fwkname + if'function_name'in kw: + fu=kw['function_name'] + if not'msg'in kw: + kw['msg']='Checking for function %s'%fu + kw['code']=to_header(kw)+SNIP1%fu + if not'uselib_store'in kw: + kw['uselib_store']=fu.upper() + if not'define_name'in kw: + kw['define_name']=self.have_define(fu) + elif'type_name'in kw: + tu=kw['type_name'] + if not'msg'in kw: + kw['msg']='Checking for type %s'%tu + if not'header_name'in kw: + kw['header_name']='stdint.h' + kw['code']=to_header(kw)+SNIP2%{'type_name':tu} + if not'define_name'in kw: + kw['define_name']=self.have_define(tu.upper()) + elif'header_name'in kw: + if not'msg'in kw: + kw['msg']='Checking for header %s'%kw['header_name'] + l=Utils.to_list(kw['header_name']) + assert len(l)>0,'list of headers in header_name is empty' + kw['code']=to_header(kw)+SNIP3 + if not'uselib_store'in kw: + kw['uselib_store']=l[0].upper() + if not'define_name'in kw: + kw['define_name']=self.have_define(l[0]) + if'lib'in kw: + if not'msg'in kw: + kw['msg']='Checking for library %s'%kw['lib'] + if not'uselib_store'in kw: + kw['uselib_store']=kw['lib'].upper() + if'staticlib'in kw: + if not'msg'in kw: + kw['msg']='Checking for static library %s'%kw['staticlib'] + if not'uselib_store'in kw: + kw['uselib_store']=kw['staticlib'].upper() + if'fragment'in kw: + kw['code']=kw['fragment'] + if not'msg'in kw: + kw['msg']='Checking for custom code' + if not'errmsg'in kw: + kw['errmsg']='no' + for(flagsname,flagstype)in[('cxxflags','compiler'),('cflags','compiler'),('linkflags','linker')]: + if flagsname in kw: + if not'msg'in kw: + kw['msg']='Checking for %s flags %s'%(flagstype,kw[flagsname]) + if not'errmsg'in kw: + kw['errmsg']='no' + if not'execute'in kw: + kw['execute']=False + if not'errmsg'in kw: + kw['errmsg']='not found' + if not'okmsg'in kw: + kw['okmsg']='yes' + if not'code'in kw: + kw['code']=SNIP3 + if not kw.get('success'):kw['success']=None + assert'msg'in kw,'invalid parameters, read http://freehackers.org/~tnagy/wafbook/single.html#config_helpers_c' +def post_check(self,*k,**kw): + is_success=False + if kw['execute']: + if kw['success']is not None: + is_success=True + else: + is_success=(kw['success']==0) + if'define_name'in kw: + if'header_name'in kw or'function_name'in kw or'type_name'in kw or'fragment'in kw: + if kw['execute']: + key=kw['success'] + try: + key=key.decode('utf-8') + except: + pass + if isinstance(key,str): + if key: + self.define(kw['define_name'],key,quote=kw.get('quote',1)) + else: + self.define_cond(kw['define_name'],True) + else: + self.define_cond(kw['define_name'],False) + else: + self.define_cond(kw['define_name'],is_success) + if is_success and'uselib_store'in kw: + import cc,cxx + for k in set(cc.g_cc_flag_vars).union(cxx.g_cxx_flag_vars): + lk=k.lower() + if k=='CPPPATH':lk='includes' + if k=='CXXDEFINES':lk='defines' + if k=='CCDEFINES':lk='defines' + if lk in kw: + val=kw[lk] + if isinstance(val,str): + val=val.rstrip(os.path.sep) + self.env.append_unique(k+'_'+kw['uselib_store'],val) +def check(self,*k,**kw): + self.validate_c(kw) + self.check_message_1(kw['msg']) + ret=None + try: + ret=self.run_c_code(*k,**kw) + except Configure.ConfigurationError as e: + self.check_message_2(kw['errmsg'],'YELLOW') + if'mandatory'in kw and kw['mandatory']: + if Logs.verbose>1: + raise + else: + self.fatal('the configuration failed (see %r)'%self.log.name) + else: + kw['success']=ret + self.check_message_2(self.ret_msg(kw['okmsg'],kw)) + self.post_check(*k,**kw) + if not kw.get('execute',False): + return ret==0 + return ret +def run_c_code(self,*k,**kw): + test_f_name=kw['compile_filename'] + k=0 + while k<10000: + dir=os.path.join(self.blddir,'.conf_check_%d'%k) + try: + shutil.rmtree(dir) + except OSError: + pass + try: + os.stat(dir) + except OSError: + break + k+=1 + try: + os.makedirs(dir) + except: + self.fatal('cannot create a configuration test folder %r'%dir) + try: + os.stat(dir) + except: + self.fatal('cannot use the configuration test folder %r'%dir) + bdir=os.path.join(dir,'testbuild') + if not os.path.exists(bdir): + os.makedirs(bdir) + env=kw['env'] + dest=open(os.path.join(dir,test_f_name),'w') + dest.write(kw['code']) + dest.close() + back=os.path.abspath('.') + bld=Build.BuildContext() + bld.log=self.log + bld.all_envs.update(self.all_envs) + bld.all_envs['default']=env + bld.lst_variants=bld.all_envs.keys() + bld.load_dirs(dir,bdir) + os.chdir(dir) + bld.rescan(bld.srcnode) + if not'features'in kw: + kw['features']=[kw['compile_mode'],kw['type']] + o=bld(features=kw['features'],source=test_f_name,target='testprog') + for k,v in kw.items(): + setattr(o,k,v) + self.log.write("==>\n%s\n<==\n"%kw['code']) + try: + bld.compile() + except Utils.WafError: + ret=Utils.ex_stack() + else: + ret=0 + os.chdir(back) + if ret: + self.log.write('command returned %r'%ret) + self.fatal(str(ret)) + if kw['execute']: + lastprog=o.link_task.outputs[0].abspath(env) + args=Utils.to_list(kw.get('exec_args',[])) + proc=Utils.pproc.Popen([lastprog]+args,stdout=Utils.pproc.PIPE,stderr=Utils.pproc.PIPE) + (out,err)=proc.communicate() + w=self.log.write + w(str(out)) + w('\n') + w(str(err)) + w('\n') + w('returncode %r'%proc.returncode) + w('\n') + if proc.returncode: + self.fatal(Utils.ex_stack()) + ret=out + return ret +def check_cxx(self,*k,**kw): + kw['compiler']='cxx' + return self.check(*k,**kw) +def check_cc(self,*k,**kw): + kw['compiler']='cc' + return self.check(*k,**kw) +def define(self,define,value,quote=1): + assert define and isinstance(define,str) + tbl=self.env[DEFINES]or Utils.ordered_dict() + if isinstance(value,str): + if quote: + tbl[define]='"%s"'%repr('"'+value)[2:-1].replace('"','\\"') + else: + tbl[define]=value + elif isinstance(value,int): + tbl[define]=value + else: + raise TypeError('define %r -> %r must be a string or an int'%(define,value)) + self.env[DEFINES]=tbl + self.env[define]=value +def undefine(self,define): + assert define and isinstance(define,str) + tbl=self.env[DEFINES]or Utils.ordered_dict() + value=UNDEFINED + tbl[define]=value + self.env[DEFINES]=tbl + self.env[define]=value +def define_cond(self,name,value): + if value: + self.define(name,1) + else: + self.undefine(name) +def is_defined(self,key): + defines=self.env[DEFINES] + if not defines: + return False + try: + value=defines[key] + except KeyError: + return False + else: + return value!=UNDEFINED +def get_define(self,define): + try:return self.env[DEFINES][define] + except KeyError:return None +def have_define(self,name): + return self.__dict__.get('HAVE_PAT','HAVE_%s')%Utils.quote_define_name(name) +def write_config_header(self,configfile='',env='',guard='',top=False): + if not configfile:configfile=WAF_CONFIG_H + waf_guard=guard or'_%s_WAF'%Utils.quote_define_name(configfile) + if not env:env=self.env + if top: + diff='' + else: + diff=Utils.diff_path(self.srcdir,self.curdir) + full=os.sep.join([self.blddir,env.variant(),diff,configfile]) + full=os.path.normpath(full) + (dir,base)=os.path.split(full) + try:os.makedirs(dir) + except:pass + dest=open(full,'w') + dest.write('/* Configuration header created by Waf - do not edit */\n') + dest.write('#ifndef %s\n#define %s\n\n'%(waf_guard,waf_guard)) + dest.write(self.get_config_header()) + env.append_unique(CFG_FILES,os.path.join(diff,configfile)) + dest.write('\n#endif /* %s */\n'%waf_guard) + dest.close() +def get_config_header(self): + config_header=[] + tbl=self.env[DEFINES]or Utils.ordered_dict() + for key in tbl.allkeys: + value=tbl[key] + if value is None: + config_header.append('#define %s'%key) + elif value is UNDEFINED: + config_header.append('/* #undef %s */'%key) + else: + config_header.append('#define %s %s'%(key,value)) + return"\n".join(config_header) +def find_cpp(conf): + v=conf.env + cpp=None + if v['CPP']:cpp=v['CPP'] + elif'CPP'in conf.environ:cpp=conf.environ['CPP'] + if not cpp:cpp=conf.find_program('cpp',var='CPP') + if not cpp:cpp=v['CC'] + if not cpp:cpp=v['CXX'] + v['CPP']=cpp +def cc_add_flags(conf): + conf.add_os_flags('CFLAGS','CCFLAGS') + conf.add_os_flags('CPPFLAGS') +def cxx_add_flags(conf): + conf.add_os_flags('CXXFLAGS') + conf.add_os_flags('CPPFLAGS') +def link_add_flags(conf): + conf.add_os_flags('LINKFLAGS') + conf.add_os_flags('LDFLAGS','LINKFLAGS') +def cc_load_tools(conf): + conf.check_tool('cc') +def cxx_load_tools(conf): + conf.check_tool('cxx') + +conf(ret_msg) +conf(validate_cfg) +conf(cmd_and_log) +conf(exec_cfg) +conf(check_cfg) +conf(validate_c) +conf(post_check) +conf(check) +conf(run_c_code) +conf(check_cxx) +conf(check_cc) +conf(define) +conf(undefine) +conf(define_cond) +conf(is_defined) +conf(get_define) +conf(have_define) +conf(write_config_header) +conf(get_config_header) +conftest(find_cpp) +conftest(cc_add_flags) +conftest(cxx_add_flags) +conftest(link_add_flags) +conftest(cc_load_tools) +conftest(cxx_load_tools) diff -Nru guitarix-0.22.4/wafadmin3/Tools/cs.py guitarix-0.24.2/wafadmin3/Tools/cs.py --- guitarix-0.22.4/wafadmin3/Tools/cs.py 1970-01-01 00:00:00.000000000 +0000 +++ guitarix-0.24.2/wafadmin3/Tools/cs.py 2012-10-20 03:56:02.000000000 +0000 @@ -0,0 +1,44 @@ +#! /usr/bin/env python +# encoding: utf-8 + +import TaskGen,Utils,Task,Options +from Logs import error +from TaskGen import before,after,taskgen,feature +flag_vars=['FLAGS','ASSEMBLIES'] +def init_cs(self): + Utils.def_attrs(self,flags='',assemblies='',resources='',uselib='') +def apply_uselib_cs(self): + if not self.uselib: + return + global flag_vars + for var in self.to_list(self.uselib): + for v in self.flag_vars: + val=self.env[v+'_'+var] + if val:self.env.append_value(v,val) +def apply_cs(self): + try:self.meths.remove('apply_core') + except ValueError:pass + for i in self.to_list(self.assemblies)+self.env['ASSEMBLIES']: + self.env.append_unique('_ASSEMBLIES','/r:'+i) + for i in self.to_list(self.resources): + self.env.append_unique('_RESOURCES','/resource:'+i) + self.env['_TYPE']=getattr(self,'type','exe') + self.env.append_unique('_FLAGS',self.to_list(self.flags)) + self.env.append_unique('_FLAGS',self.env.FLAGS) + nodes=[self.path.find_resource(i)for i in self.to_list(self.source)] + self.create_task('mcs',nodes,self.path.find_or_declare(self.target)) +Task.simple_task_type('mcs','${MCS} ${SRC} /target:${_TYPE} /out:${TGT} ${_FLAGS} ${_ASSEMBLIES} ${_RESOURCES}',color='YELLOW') +def detect(conf): + csc=getattr(Options.options,'cscbinary',None) + if csc: + conf.env.MCS=csc + conf.find_program(['gmcs','mcs'],var='MCS') +def set_options(opt): + opt.add_option('--with-csc-binary',type='string',dest='cscbinary') + +feature('cs')(init_cs) +feature('cs')(apply_uselib_cs) +after('init_cs')(apply_uselib_cs) +feature('cs')(apply_cs) +after('apply_uselib_cs')(apply_cs) +before('apply_core')(apply_cs) diff -Nru guitarix-0.22.4/wafadmin3/Tools/cxx.py guitarix-0.24.2/wafadmin3/Tools/cxx.py --- guitarix-0.22.4/wafadmin3/Tools/cxx.py 1970-01-01 00:00:00.000000000 +0000 +++ guitarix-0.24.2/wafadmin3/Tools/cxx.py 2012-10-20 03:56:02.000000000 +0000 @@ -0,0 +1,71 @@ +#! /usr/bin/env python +# encoding: utf-8 +import sys +if sys.hexversion < 0x020400f0: from sets import Set as set +import TaskGen,Task,Utils +from Logs import debug +import ccroot +from TaskGen import feature,before,extension,after +g_cxx_flag_vars=['CXXDEPS','FRAMEWORK','FRAMEWORKPATH','STATICLIB','LIB','LIBPATH','LINKFLAGS','RPATH','CXXFLAGS','CCFLAGS','CPPPATH','CPPFLAGS','CXXDEFINES'] +EXT_CXX=['.cpp','.cc','.cxx','.C','.c++'] +g_cxx_type_vars=['CXXFLAGS','LINKFLAGS'] +class cxx_taskgen(ccroot.ccroot_abstract): + pass +def init_cxx(self): + if not'cc'in self.features: + self.mappings['.c']=TaskGen.task_gen.mappings['.cxx'] + self.p_flag_vars=set(self.p_flag_vars).union(g_cxx_flag_vars) + self.p_type_vars=set(self.p_type_vars).union(g_cxx_type_vars) + if not self.env['CXX_NAME']: + raise Utils.WafError("At least one compiler (g++, ..) must be selected") +def apply_obj_vars_cxx(self): + env=self.env + app=env.append_unique + cxxpath_st=env['CPPPATH_ST'] + for i in env['INC_PATHS']: + app('_CXXINCFLAGS',cxxpath_st%i.bldpath(env)) + app('_CXXINCFLAGS',cxxpath_st%i.srcpath(env)) + for i in env['CPPPATH']: + app('_CXXINCFLAGS',cxxpath_st%i) +def apply_defines_cxx(self): + self.defines=getattr(self,'defines',[]) + lst=self.to_list(self.defines)+self.to_list(self.env['CXXDEFINES']) + milst=[] + for defi in lst: + if not defi in milst: + milst.append(defi) + libs=self.to_list(self.uselib) + for l in libs: + val=self.env['CXXDEFINES_'+l] + if val:milst+=self.to_list(val) + self.env['DEFLINES']=["%s %s"%(x[0],Utils.trimquotes('='.join(x[1:])))for x in[y.split('=')for y in milst]] + y=self.env['CXXDEFINES_ST'] + self.env.append_unique('_CXXDEFFLAGS',[y%x for x in milst]) +def cxx_hook(self,node): + if getattr(self,'obj_ext',None): + obj_ext=self.obj_ext + else: + obj_ext='_%d.o'%self.idx + task=self.create_task('cxx',node,node.change_ext(obj_ext)) + try: + self.compiled_tasks.append(task) + except AttributeError: + raise Utils.WafError('Have you forgotten to set the feature "cxx" on %s?'%str(self)) + return task +cxx_str='${CXX} ${CXXFLAGS} ${CPPFLAGS} ${_CXXINCFLAGS} ${_CXXDEFFLAGS} ${CXX_SRC_F}${SRC} ${CXX_TGT_F}${TGT}' +cls=Task.simple_task_type('cxx',cxx_str,color='GREEN',ext_out='.o',ext_in='.cxx',shell=False) +cls.scan=ccroot.scan +cls.vars.append('CXXDEPS') +link_str='${LINK_CXX} ${CXXLNK_SRC_F}${SRC} ${CXXLNK_TGT_F}${TGT[0].abspath(env)} ${LINKFLAGS}' +cls=Task.simple_task_type('cxx_link',link_str,color='YELLOW',ext_in='.o',ext_out='.bin',shell=False) +cls.maxjobs=1 +cls.install=Utils.nada + +feature('cxx')(init_cxx) +before('apply_type_vars')(init_cxx) +after('default_cc')(init_cxx) +feature('cxx')(apply_obj_vars_cxx) +after('apply_incpaths')(apply_obj_vars_cxx) +feature('cxx')(apply_defines_cxx) +after('apply_lib_vars')(apply_defines_cxx) +extension(EXT_CXX)(cxx_hook) diff -Nru guitarix-0.22.4/wafadmin3/Tools/d.py guitarix-0.24.2/wafadmin3/Tools/d.py --- guitarix-0.22.4/wafadmin3/Tools/d.py 1970-01-01 00:00:00.000000000 +0000 +++ guitarix-0.24.2/wafadmin3/Tools/d.py 2012-10-20 03:56:02.000000000 +0000 @@ -0,0 +1,368 @@ +#! /usr/bin/env python +# encoding: utf-8 +import sys +if sys.hexversion < 0x020400f0: from sets import Set as set +import os,sys,re,optparse +import ccroot +import TaskGen,Utils,Task,Configure,Logs,Build +from Logs import debug,error +from TaskGen import taskgen,feature,after,before,extension +from Configure import conftest +EXT_D=['.d','.di','.D'] +D_METHS=['apply_core','apply_vnum','apply_objdeps'] +DLIB=""" +version(D_Version2) { + import std.stdio; + int main() { + writefln("phobos2"); + return 0; + } +} else { + version(Tango) { + import tango.stdc.stdio; + int main() { + printf("tango"); + return 0; + } + } else { + import std.stdio; + int main() { + writefln("phobos1"); + return 0; + } + } +} +""" +def filter_comments(filename): + txt=Utils.readf(filename) + i=0 + buf=[] + max=len(txt) + begin=0 + while i1: + self.features.append('d'+k[1]) +TaskGen.bind_feature('d',D_METHS) +def init_d(self): + Utils.def_attrs(self,dflags='',importpaths='',libs='',libpaths='',uselib='',uselib_local='',generate_headers=False,compiled_tasks=[],add_objects=[],link_task=None) +def apply_d_libs(self): + env=self.env + self.uselib=self.to_list(self.uselib) + names=self.to_list(self.uselib_local) + seen=set([]) + tmp=Utils.deque(names) + while tmp: + lib_name=tmp.popleft() + if lib_name in seen: + continue + y=self.name_to_obj(lib_name) + if not y: + raise Utils.WafError('object %r was not found in uselib_local (required by %r)'%(lib_name,self.name)) + y.post() + seen.add(lib_name) + if getattr(y,'uselib_local',None): + lst=y.to_list(y.uselib_local) + if'dshlib'in y.features or'dprogram'in y.features: + lst=[x for x in lst if not'dstaticlib'in self.name_to_obj(x).features] + tmp.extend(lst) + if getattr(y,'link_task',None): + link_name=y.target[y.target.rfind(os.sep)+1:] + if'dstaticlib'in y.features or'dshlib'in y.features: + env.append_unique('DLINKFLAGS',env.DLIB_ST%link_name) + env.append_unique('DLINKFLAGS',env.DLIBPATH_ST%y.link_task.outputs[0].parent.bldpath(env)) + self.link_task.set_run_after(y.link_task) + dep_nodes=getattr(self.link_task,'dep_nodes',[]) + self.link_task.dep_nodes=dep_nodes+y.link_task.outputs + for v in self.to_list(y.uselib): + if not v in self.uselib: + self.uselib.insert(0,v) + if getattr(y,'export_incdirs',None): + for x in self.to_list(y.export_incdirs): + node=y.path.find_dir(x) + if not node: + raise Utils.WafError('object %r: invalid folder %r in export_incdirs'%(y.target,x)) + self.env.append_unique('INC_PATHS',node) +def apply_d_link(self): + link=getattr(self,'link',None) + if not link: + if'dstaticlib'in self.features:link='static_link' + else:link='d_link' + outputs=[t.outputs[0]for t in self.compiled_tasks] + self.link_task=self.create_task(link,outputs,self.path.find_or_declare(get_target_name(self))) +def apply_d_vars(self): + env=self.env + dpath_st=env['DPATH_ST'] + lib_st=env['DLIB_ST'] + libpath_st=env['DLIBPATH_ST'] + importpaths=self.to_list(self.importpaths) + libpaths=[] + libs=[] + uselib=self.to_list(self.uselib) + for i in uselib: + if env['DFLAGS_'+i]: + env.append_unique('DFLAGS',env['DFLAGS_'+i]) + for x in self.features: + if not x in['dprogram','dstaticlib','dshlib']: + continue + x.lstrip('d') + d_shlib_dflags=env['D_'+x+'_DFLAGS'] + if d_shlib_dflags: + env.append_unique('DFLAGS',d_shlib_dflags) + for i in uselib: + if env['DPATH_'+i]: + for entry in self.to_list(env['DPATH_'+i]): + if not entry in importpaths: + importpaths.append(entry) + for path in importpaths: + if os.path.isabs(path): + env.append_unique('_DIMPORTFLAGS',dpath_st%path) + else: + node=self.path.find_dir(path) + self.env.append_unique('INC_PATHS',node) + env.append_unique('_DIMPORTFLAGS',dpath_st%node.srcpath(env)) + env.append_unique('_DIMPORTFLAGS',dpath_st%node.bldpath(env)) + for i in uselib: + if env['LIBPATH_'+i]: + for entry in self.to_list(env['LIBPATH_'+i]): + if not entry in libpaths: + libpaths.append(entry) + libpaths=self.to_list(self.libpaths)+libpaths + for path in libpaths: + if not os.path.isabs(path): + node=self.path.find_resource(path) + if not node: + raise Utils.WafError('could not find libpath %r from %r'%(path,self)) + path=node.abspath(self.env) + env.append_unique('DLINKFLAGS',libpath_st%path) + for i in uselib: + if env['LIB_'+i]: + for entry in self.to_list(env['LIB_'+i]): + if not entry in libs: + libs.append(entry) + libs.extend(self.to_list(self.libs)) + for flag in self.to_list(self.dflags): + env.append_unique('DFLAGS',flag) + for lib in libs: + env.append_unique('DLINKFLAGS',lib_st%lib) + for i in uselib: + dlinkflags=env['DLINKFLAGS_'+i] + if dlinkflags: + for linkflag in dlinkflags: + env.append_unique('DLINKFLAGS',linkflag) +def add_shlib_d_flags(self): + for linkflag in self.env['D_shlib_LINKFLAGS']: + self.env.append_unique('DLINKFLAGS',linkflag) +def d_hook(self,node): + task=self.create_task(self.generate_headers and'd_with_header'or'd') + try:obj_ext=self.obj_ext + except AttributeError:obj_ext='_%d.o'%self.idx + task.inputs=[node] + task.outputs=[node.change_ext(obj_ext)] + self.compiled_tasks.append(task) + if self.generate_headers: + header_node=node.change_ext(self.env['DHEADER_ext']) + task.outputs+=[header_node] +d_str='${D_COMPILER} ${DFLAGS} ${_DIMPORTFLAGS} ${D_SRC_F}${SRC} ${D_TGT_F}${TGT}' +d_with_header_str='${D_COMPILER} ${DFLAGS} ${_DIMPORTFLAGS} \ +${D_HDR_F}${TGT[1].bldpath(env)} \ +${D_SRC_F}${SRC} \ +${D_TGT_F}${TGT[0].bldpath(env)}' +link_str='${D_LINKER} ${DLNK_SRC_F}${SRC} ${DLNK_TGT_F}${TGT} ${DLINKFLAGS}' +def override_exec(cls): + old_exec=cls.exec_command + def exec_command(self,*k,**kw): + if isinstance(k[0],list): + lst=k[0] + for i in range(len(lst)): + if lst[i]=='-of': + del lst[i] + lst[i]='-of'+lst[i] + break + return old_exec(self,*k,**kw) + cls.exec_command=exec_command +cls=Task.simple_task_type('d',d_str,'GREEN',before='static_link d_link',shell=False) +cls.scan=scan +override_exec(cls) +cls=Task.simple_task_type('d_with_header',d_with_header_str,'GREEN',before='static_link d_link',shell=False) +override_exec(cls) +cls=Task.simple_task_type('d_link',link_str,color='YELLOW',shell=False) +override_exec(cls) +def generate_header(self,filename,install_path): + if not hasattr(self,'header_lst'):self.header_lst=[] + self.meths.append('process_header') + self.header_lst.append([filename,install_path]) +def process_header(self): + env=self.env + for i in getattr(self,'header_lst',[]): + node=self.path.find_resource(i[0]) + if not node: + raise Utils.WafError('file not found on d obj '+i[0]) + task=self.create_task('d_header') + task.set_inputs(node) + task.set_outputs(node.change_ext('.di')) +d_header_str='${D_COMPILER} ${D_HEADER} ${SRC}' +Task.simple_task_type('d_header',d_header_str,color='BLUE',shell=False) +def d_platform_flags(conf): + v=conf.env + binfmt=v.DEST_BINFMT or Utils.unversioned_sys_platform_to_binary_format(v.DEST_OS or Utils.unversioned_sys_platform()) + if binfmt=='pe': + v['D_program_PATTERN']='%s.exe' + v['D_shlib_PATTERN']='lib%s.dll' + v['D_staticlib_PATTERN']='lib%s.a' + else: + v['D_program_PATTERN']='%s' + v['D_shlib_PATTERN']='lib%s.so' + v['D_staticlib_PATTERN']='lib%s.a' +def check_dlibrary(conf): + ret=conf.check_cc(features='d dprogram',fragment=DLIB,mandatory=True,compile_filename='test.d',execute=True) + conf.env.DLIBRARY=ret.strip().decode("utf-8") + +feature('d')(init_d) +before('apply_type_vars')(init_d) +feature('d')(init_d) +before('apply_d_libs')(init_d) +feature('d')(apply_d_libs) +after('apply_d_link','init_d')(apply_d_libs) +before('apply_vnum','apply_d_vars')(apply_d_libs) +feature('dprogram','dshlib','dstaticlib')(apply_d_link) +after('apply_core')(apply_d_link) +feature('d')(apply_d_vars) +after('apply_core')(apply_d_vars) +feature('dshlib')(add_shlib_d_flags) +after('apply_d_vars')(add_shlib_d_flags) +extension(EXT_D)(d_hook) +taskgen(generate_header) +before('apply_core')(process_header) +conftest(d_platform_flags) +conftest(check_dlibrary) diff -Nru guitarix-0.22.4/wafadmin3/Tools/dbus.py guitarix-0.24.2/wafadmin3/Tools/dbus.py --- guitarix-0.22.4/wafadmin3/Tools/dbus.py 1970-01-01 00:00:00.000000000 +0000 +++ guitarix-0.24.2/wafadmin3/Tools/dbus.py 2012-10-20 03:56:02.000000000 +0000 @@ -0,0 +1,24 @@ +#! /usr/bin/env python +# encoding: utf-8 + +import Task,Utils +from TaskGen import taskgen,before,after,feature +def add_dbus_file(self,filename,prefix,mode): + if not hasattr(self,'dbus_lst'): + self.dbus_lst=[] + self.meths.append('process_dbus') + self.dbus_lst.append([filename,prefix,mode]) +def process_dbus(self): + for filename,prefix,mode in getattr(self,'dbus_lst',[]): + node=self.path.find_resource(filename) + if not node: + raise Utils.WafError('file not found '+filename) + tsk=self.create_task('dbus_binding_tool',node,node.change_ext('.h')) + tsk.env.DBUS_BINDING_TOOL_PREFIX=prefix + tsk.env.DBUS_BINDING_TOOL_MODE=mode +Task.simple_task_type('dbus_binding_tool','${DBUS_BINDING_TOOL} --prefix=${DBUS_BINDING_TOOL_PREFIX} --mode=${DBUS_BINDING_TOOL_MODE} --output=${TGT} ${SRC}',color='BLUE',before='cc') +def detect(conf): + dbus_binding_tool=conf.find_program('dbus-binding-tool',var='DBUS_BINDING_TOOL') + +taskgen(add_dbus_file) +before('apply_core')(process_dbus) diff -Nru guitarix-0.22.4/wafadmin3/Tools/dmd.py guitarix-0.24.2/wafadmin3/Tools/dmd.py --- guitarix-0.22.4/wafadmin3/Tools/dmd.py 1970-01-01 00:00:00.000000000 +0000 +++ guitarix-0.24.2/wafadmin3/Tools/dmd.py 2012-10-20 03:56:02.000000000 +0000 @@ -0,0 +1,44 @@ +#! /usr/bin/env python +# encoding: utf-8 + +import sys +import Utils,ar +from Configure import conftest +def find_dmd(conf): + conf.find_program(['dmd','ldc'],var='D_COMPILER',mandatory=True) +def common_flags_ldc(conf): + v=conf.env + v['DFLAGS']=['-d-version=Posix'] + v['DLINKFLAGS']=[] + v['D_shlib_DFLAGS']=['-relocation-model=pic'] +def common_flags_dmd(conf): + v=conf.env + v['DFLAGS']=['-version=Posix'] + v['D_SRC_F']='' + v['D_TGT_F']=['-c','-of'] + v['DPATH_ST']='-I%s' + v['D_LINKER']=v['D_COMPILER'] + v['DLNK_SRC_F']='' + v['DLNK_TGT_F']='-of' + v['DLIB_ST']='-L-l%s' + v['DLIBPATH_ST']='-L-L%s' + v['DFLAGS_OPTIMIZED']=['-O'] + v['DFLAGS_DEBUG']=['-g','-debug'] + v['DFLAGS_ULTRADEBUG']=['-g','-debug'] + v['DLINKFLAGS']=['-quiet'] + v['D_shlib_DFLAGS']=['-fPIC'] + v['D_shlib_LINKFLAGS']=['-L-shared'] + v['DHEADER_ext']='.di' + v['D_HDR_F']=['-H','-Hf'] +def detect(conf): + conf.find_dmd() + conf.check_tool('ar') + conf.check_tool('d') + conf.common_flags_dmd() + conf.d_platform_flags() + if conf.env.D_COMPILER.find('ldc')>-1: + conf.common_flags_ldc() + +conftest(find_dmd) +conftest(common_flags_ldc) +conftest(common_flags_dmd) diff -Nru guitarix-0.22.4/wafadmin3/Tools/flex.py guitarix-0.24.2/wafadmin3/Tools/flex.py --- guitarix-0.22.4/wafadmin3/Tools/flex.py 1970-01-01 00:00:00.000000000 +0000 +++ guitarix-0.24.2/wafadmin3/Tools/flex.py 2012-10-20 03:56:02.000000000 +0000 @@ -0,0 +1,12 @@ +#! /usr/bin/env python +# encoding: utf-8 + +import TaskGen +def decide_ext(self,node): + if'cxx'in self.features:return'.lex.cc' + else:return'.lex.c' +TaskGen.declare_chain(name='flex',rule='${FLEX} -o${TGT} ${FLEXFLAGS} ${SRC}',ext_in='.l',ext_out='.c .cxx',decider=decide_ext) +def detect(conf): + conf.find_program('flex',var='FLEX',mandatory=True) + conf.env['FLEXFLAGS']='' + diff -Nru guitarix-0.22.4/wafadmin3/Tools/gas.py guitarix-0.24.2/wafadmin3/Tools/gas.py --- guitarix-0.22.4/wafadmin3/Tools/gas.py 1970-01-01 00:00:00.000000000 +0000 +++ guitarix-0.24.2/wafadmin3/Tools/gas.py 2012-10-20 03:56:02.000000000 +0000 @@ -0,0 +1,27 @@ +#! /usr/bin/env python +# encoding: utf-8 + +import os,sys +import Task +from TaskGen import extension,taskgen,after,before +EXT_ASM=['.s','.S','.asm','.ASM','.spp','.SPP'] +as_str='${AS} ${ASFLAGS} ${_ASINCFLAGS} ${SRC} -o ${TGT}' +Task.simple_task_type('asm',as_str,'PINK',ext_out='.o',shell=False) +def asm_hook(self,node): + try:obj_ext=self.obj_ext + except AttributeError:obj_ext='_%d.o'%self.idx + task=self.create_task('asm',node,node.change_ext(obj_ext)) + self.compiled_tasks.append(task) + self.meths.append('asm_incflags') +def asm_incflags(self): + self.env.append_value('_ASINCFLAGS',self.env.ASINCFLAGS) + var=('cxx'in self.features)and'CXX'or'CC' + self.env.append_value('_ASINCFLAGS',self.env['_%sINCFLAGS'%var]) +def detect(conf): + conf.find_program(['gas','as'],var='AS') + if not conf.env.AS:conf.env.AS=conf.env.CC + +extension(EXT_ASM)(asm_hook) +after('apply_obj_vars_cc')(asm_incflags) +after('apply_obj_vars_cxx')(asm_incflags) +before('apply_link')(asm_incflags) diff -Nru guitarix-0.22.4/wafadmin3/Tools/gcc.py guitarix-0.24.2/wafadmin3/Tools/gcc.py --- guitarix-0.22.4/wafadmin3/Tools/gcc.py 1970-01-01 00:00:00.000000000 +0000 +++ guitarix-0.24.2/wafadmin3/Tools/gcc.py 2012-10-20 03:56:02.000000000 +0000 @@ -0,0 +1,93 @@ +#! /usr/bin/env python +# encoding: utf-8 + +import os,sys +import Configure,Options,Utils +import ccroot,ar +from Configure import conftest +def find_gcc(conf): + cc=conf.find_program(['gcc','cc'],var='CC',mandatory=True) + cc=conf.cmd_to_list(cc) + ccroot.get_cc_version(conf,cc,gcc=True) + conf.env.CC_NAME='gcc' + conf.env.CC=cc +def gcc_common_flags(conf): + v=conf.env + v['CCFLAGS_DEBUG']=['-g'] + v['CCFLAGS_RELEASE']=['-O2'] + v['CC_SRC_F']='' + v['CC_TGT_F']=['-c','-o',''] + v['CPPPATH_ST']='-I%s' + if not v['LINK_CC']:v['LINK_CC']=v['CC'] + v['CCLNK_SRC_F']='' + v['CCLNK_TGT_F']=['-o',''] + v['LIB_ST']='-l%s' + v['LIBPATH_ST']='-L%s' + v['STATICLIB_ST']='-l%s' + v['STATICLIBPATH_ST']='-L%s' + v['RPATH_ST']='-Wl,-rpath,%s' + v['CCDEFINES_ST']='-D%s' + v['SONAME_ST']='-Wl,-h,%s' + v['SHLIB_MARKER']='-Wl,-Bdynamic' + v['STATICLIB_MARKER']='-Wl,-Bstatic' + v['FULLSTATIC_MARKER']='-static' + v['program_PATTERN']='%s' + v['shlib_CCFLAGS']=['-fPIC','-DPIC'] + v['shlib_LINKFLAGS']=['-shared'] + v['shlib_PATTERN']='lib%s.so' + v['staticlib_LINKFLAGS']=['-Wl,-Bstatic'] + v['staticlib_PATTERN']='lib%s.a' + v['LINKFLAGS_MACBUNDLE']=['-bundle','-undefined','dynamic_lookup'] + v['CCFLAGS_MACBUNDLE']=['-fPIC'] + v['macbundle_PATTERN']='%s.bundle' +def gcc_modifier_win32(conf): + v=conf.env + v['program_PATTERN']='%s.exe' + v['shlib_PATTERN']='%s.dll' + v['implib_PATTERN']='lib%s.dll.a' + v['IMPLIB_ST']='-Wl,--out-implib,%s' + dest_arch=v['DEST_CPU'] + v['shlib_CCFLAGS']=['-DPIC'] + v.append_value('shlib_CCFLAGS','-DDLL_EXPORT') + v.append_value('LINKFLAGS','-Wl,--enable-auto-import') +def gcc_modifier_cygwin(conf): + gcc_modifier_win32(conf) + v=conf.env + v['shlib_PATTERN']='cyg%s.dll' + v.append_value('shlib_LINKFLAGS','-Wl,--enable-auto-image-base') +def gcc_modifier_darwin(conf): + v=conf.env + v['shlib_CCFLAGS']=['-fPIC','-compatibility_version','1','-current_version','1'] + v['shlib_LINKFLAGS']=['-dynamiclib'] + v['shlib_PATTERN']='lib%s.dylib' + v['staticlib_LINKFLAGS']=[] + v['SHLIB_MARKER']='' + v['STATICLIB_MARKER']='' + v['SONAME_ST']='' +def gcc_modifier_aix(conf): + v=conf.env + v['program_LINKFLAGS']=['-Wl,-brtl'] + v['shlib_LINKFLAGS']=['-shared','-Wl,-brtl,-bexpfull'] + v['SHLIB_MARKER']='' +def gcc_modifier_platform(conf): + dest_os=conf.env['DEST_OS']or Utils.unversioned_sys_platform() + gcc_modifier_func=globals().get('gcc_modifier_'+dest_os) + if gcc_modifier_func: + gcc_modifier_func(conf) +def detect(conf): + conf.find_gcc() + conf.find_cpp() + conf.find_ar() + conf.gcc_common_flags() + conf.gcc_modifier_platform() + conf.cc_load_tools() + conf.cc_add_flags() + conf.link_add_flags() + +conftest(find_gcc) +conftest(gcc_common_flags) +conftest(gcc_modifier_win32) +conftest(gcc_modifier_cygwin) +conftest(gcc_modifier_darwin) +conftest(gcc_modifier_aix) +conftest(gcc_modifier_platform) diff -Nru guitarix-0.22.4/wafadmin3/Tools/gcov.py guitarix-0.24.2/wafadmin3/Tools/gcov.py --- guitarix-0.22.4/wafadmin3/Tools/gcov.py 1970-01-01 00:00:00.000000000 +0000 +++ guitarix-0.24.2/wafadmin3/Tools/gcov.py 2012-10-20 03:56:02.000000000 +0000 @@ -0,0 +1,21 @@ +#! /usr/bin/env python +# encoding: utf-8 + +import Options +import Task +def set_options(opt): + opt.add_option('--with-gcov',action='store_true',help='Use gcov for profiling',default=False) +def setup(bld): + for name in('cc','cxx'): + if name not in Task.TaskBase.classes: + continue + task=Task.TaskBase.classes[name] + line=task.run.code.replace('SRC','SRC[0].abspath(env)') + (fun,v)=Task.compile_fun(name,line,False) + fun.code=line + task.run=fun +def detect(conf): + conf.find_program('gcov') + gcov_flags='-fprofile-arcs -ftest-coverage'.split() + conf.env['CXXFLAGS']=conf.env['CFLAGS']=conf.env['LINKFLAGS']=gcov_flags + diff -Nru guitarix-0.22.4/wafadmin3/Tools/gdc.py guitarix-0.24.2/wafadmin3/Tools/gdc.py --- guitarix-0.22.4/wafadmin3/Tools/gdc.py 1970-01-01 00:00:00.000000000 +0000 +++ guitarix-0.24.2/wafadmin3/Tools/gdc.py 2012-10-20 03:56:02.000000000 +0000 @@ -0,0 +1,36 @@ +#! /usr/bin/env python +# encoding: utf-8 + +import sys +import Utils,ar +from Configure import conftest +def find_gdc(conf): + conf.find_program('gdc',var='D_COMPILER',mandatory=True) +def common_flags_gdc(conf): + v=conf.env + v['DFLAGS']=[] + v['D_SRC_F']='' + v['D_TGT_F']=['-c','-o',''] + v['DPATH_ST']='-I%s' + v['D_LINKER']=v['D_COMPILER'] + v['DLNK_SRC_F']='' + v['DLNK_TGT_F']=['-o',''] + v['DLIB_ST']='-l%s' + v['DLIBPATH_ST']='-L%s' + v['DLINKFLAGS']=[] + v['DFLAGS_OPTIMIZED']=['-O3'] + v['DFLAGS_DEBUG']=['-O0'] + v['DFLAGS_ULTRADEBUG']=['-O0'] + v['D_shlib_DFLAGS']=[] + v['D_shlib_LINKFLAGS']=['-shared'] + v['DHEADER_ext']='.di' + v['D_HDR_F']='-fintfc -fintfc-file=' +def detect(conf): + conf.find_gdc() + conf.check_tool('ar') + conf.check_tool('d') + conf.common_flags_gdc() + conf.d_platform_flags() + +conftest(find_gdc) +conftest(common_flags_gdc) diff -Nru guitarix-0.22.4/wafadmin3/Tools/glib2.py guitarix-0.24.2/wafadmin3/Tools/glib2.py --- guitarix-0.22.4/wafadmin3/Tools/glib2.py 1970-01-01 00:00:00.000000000 +0000 +++ guitarix-0.24.2/wafadmin3/Tools/glib2.py 2012-10-20 03:56:02.000000000 +0000 @@ -0,0 +1,83 @@ +#! /usr/bin/env python +# encoding: utf-8 + +import Task,Utils +from TaskGen import taskgen,before,after,feature +def add_marshal_file(self,filename,prefix): + if not hasattr(self,'marshal_list'): + self.marshal_list=[] + self.meths.append('process_marshal') + self.marshal_list.append((filename,prefix)) +def process_marshal(self): + for f,prefix in getattr(self,'marshal_list',[]): + node=self.path.find_resource(f) + if not node: + raise Utils.WafError('file not found %r'%f) + h_node=node.change_ext('.h') + c_node=node.change_ext('.c') + task=self.create_task('glib_genmarshal',node,[h_node,c_node]) + task.env.GLIB_GENMARSHAL_PREFIX=prefix + self.allnodes.append(c_node) +def genmarshal_func(self): + bld=self.inputs[0].__class__.bld + get=self.env.get_flat + cmd1="%s %s --prefix=%s --header > %s"%(get('GLIB_GENMARSHAL'),self.inputs[0].srcpath(self.env),get('GLIB_GENMARSHAL_PREFIX'),self.outputs[0].abspath(self.env)) + ret=bld.exec_command(cmd1) + if ret:return ret + f=open(self.outputs[1].abspath(self.env),'wb') + c='''#include "%s"\n'''%self.outputs[0].name + f.write(c.encode("utf-8")) + f.close() + cmd2="%s %s --prefix=%s --body >> %s"%(get('GLIB_GENMARSHAL'),self.inputs[0].srcpath(self.env),get('GLIB_GENMARSHAL_PREFIX'),self.outputs[1].abspath(self.env)) + ret=Utils.exec_command(cmd2) + if ret:return ret +def add_enums_from_template(self,source='',target='',template='',comments=''): + if not hasattr(self,'enums_list'): + self.enums_list=[] + self.meths.append('process_enums') + self.enums_list.append({'source':source,'target':target,'template':template,'file-head':'','file-prod':'','file-tail':'','enum-prod':'','value-head':'','value-prod':'','value-tail':'','comments':comments}) +def add_enums(self,source='',target='',file_head='',file_prod='',file_tail='',enum_prod='',value_head='',value_prod='',value_tail='',comments=''): + if not hasattr(self,'enums_list'): + self.enums_list=[] + self.meths.append('process_enums') + self.enums_list.append({'source':source,'template':'','target':target,'file-head':file_head,'file-prod':file_prod,'file-tail':file_tail,'enum-prod':enum_prod,'value-head':value_head,'value-prod':value_prod,'value-tail':value_tail,'comments':comments}) +def process_enums(self): + for enum in getattr(self,'enums_list',[]): + task=self.create_task('glib_mkenums') + env=task.env + inputs=[] + source_list=self.to_list(enum['source']) + if not source_list: + raise Utils.WafError('missing source '+str(enum)) + source_list=[self.path.find_resource(k)for k in source_list] + inputs+=source_list + env['GLIB_MKENUMS_SOURCE']=[k.srcpath(env)for k in source_list] + if not enum['target']: + raise Utils.WafError('missing target '+str(enum)) + tgt_node=self.path.find_or_declare(enum['target']) + if tgt_node.name.endswith('.c'): + self.allnodes.append(tgt_node) + env['GLIB_MKENUMS_TARGET']=tgt_node.abspath(env) + options=[] + if enum['template']: + template_node=self.path.find_resource(enum['template']) + options.append('--template %s'%(template_node.abspath(env))) + inputs.append(template_node) + params={'file-head':'--fhead','file-prod':'--fprod','file-tail':'--ftail','enum-prod':'--eprod','value-head':'--vhead','value-prod':'--vprod','value-tail':'--vtail','comments':'--comments'} + for param,option in params.items(): + if enum[param]: + options.append('%s %r'%(option,enum[param])) + env['GLIB_MKENUMS_OPTIONS']=' '.join(options) + task.set_inputs(inputs) + task.set_outputs(tgt_node) +Task.task_type_from_func('glib_genmarshal',func=genmarshal_func,vars=['GLIB_GENMARSHAL_PREFIX','GLIB_GENMARSHAL'],color='BLUE',before='cc cxx') +Task.simple_task_type('glib_mkenums','${GLIB_MKENUMS} ${GLIB_MKENUMS_OPTIONS} ${GLIB_MKENUMS_SOURCE} > ${GLIB_MKENUMS_TARGET}',color='PINK',before='cc cxx') +def detect(conf): + glib_genmarshal=conf.find_program('glib-genmarshal',var='GLIB_GENMARSHAL') + mk_enums_tool=conf.find_program('glib-mkenums',var='GLIB_MKENUMS') + +taskgen(add_marshal_file) +before('apply_core')(process_marshal) +taskgen(add_enums_from_template) +taskgen(add_enums) +before('apply_core')(process_enums) diff -Nru guitarix-0.22.4/wafadmin3/Tools/gnome.py guitarix-0.24.2/wafadmin3/Tools/gnome.py --- guitarix-0.22.4/wafadmin3/Tools/gnome.py 1970-01-01 00:00:00.000000000 +0000 +++ guitarix-0.24.2/wafadmin3/Tools/gnome.py 2012-10-20 03:56:02.000000000 +0000 @@ -0,0 +1,163 @@ +#! /usr/bin/env python +# encoding: utf-8 + +import os,re +import TaskGen,Utils,Runner,Task,Build,Options,Logs +import cc +from Logs import error +from TaskGen import taskgen,before,after,feature +n1_regexp=re.compile('(.*)',re.M) +n2_regexp=re.compile('(.*)',re.M) +def postinstall_schemas(prog_name): + if Build.bld.is_install: + dir=Build.bld.get_install_path('${PREFIX}/etc/gconf/schemas/%s.schemas'%prog_name) + if not Options.options.destdir: + Utils.pprint('YELLOW','Installing GConf schema') + command='gconftool-2 --install-schema-file=%s 1> /dev/null'%dir + ret=Utils.exec_command(command) + else: + Utils.pprint('YELLOW','GConf schema not installed. After install, run this:') + Utils.pprint('YELLOW','gconftool-2 --install-schema-file=%s'%dir) +def postinstall_icons(): + dir=Build.bld.get_install_path('${DATADIR}/icons/hicolor') + if Build.bld.is_install: + if not Options.options.destdir: + Utils.pprint('YELLOW',"Updating Gtk icon cache.") + command='gtk-update-icon-cache -q -f -t %s'%dir + ret=Utils.exec_command(command) + else: + Utils.pprint('YELLOW','Icon cache not updated. After install, run this:') + Utils.pprint('YELLOW','gtk-update-icon-cache -q -f -t %s'%dir) +def postinstall_scrollkeeper(prog_name): + if Build.bld.is_install: + if os.access('/var/log/scrollkeeper.log',os.W_OK): + dir1=Build.bld.get_install_path('${PREFIX}/var/scrollkeeper') + dir2=Build.bld.get_install_path('${DATADIR}/omf/%s'%prog_name) + command='scrollkeeper-update -q -p %s -o %s'%(dir1,dir2) + ret=Utils.exec_command(command) +def postinstall(prog_name='myapp',schemas=1,icons=1,scrollkeeper=1): + if schemas:postinstall_schemas(prog_name) + if icons:postinstall_icons() + if scrollkeeper:postinstall_scrollkeeper(prog_name) +class gnome_doc_taskgen(TaskGen.task_gen): + def __init__(self,*k,**kw): + TaskGen.task_gen.__init__(self,*k,**kw) +def init_gnome_doc(self): + self.default_install_path='${PREFIX}/share' +def apply_gnome_doc(self): + self.env['APPNAME']=self.doc_module + lst=self.to_list(self.doc_linguas) + bld=self.bld + lst.append('C') + for x in lst: + if not x=='C': + tsk=self.create_task('xml2po') + node=self.path.find_resource(x+'/'+x+'.po') + src=self.path.find_resource('C/%s.xml'%self.doc_module) + out=self.path.find_or_declare('%s/%s.xml'%(x,self.doc_module)) + tsk.set_inputs([node,src]) + tsk.set_outputs(out) + else: + out=self.path.find_resource('%s/%s.xml'%(x,self.doc_module)) + tsk2=self.create_task('xsltproc2po') + out2=self.path.find_or_declare('%s/%s-%s.omf'%(x,self.doc_module,x)) + tsk2.set_outputs(out2) + node=self.path.find_resource(self.doc_module+".omf.in") + tsk2.inputs=[node,out] + tsk2.run_after.append(tsk) + if bld.is_install: + path=self.install_path+'/gnome/help/%s/%s'%(self.doc_module,x) + bld.install_files(self.install_path+'/omf',out2,env=self.env) + for y in self.to_list(self.doc_figures): + try: + os.stat(self.path.abspath()+'/'+x+'/'+y) + bld.install_as(path+'/'+y,self.path.abspath()+'/'+x+'/'+y) + except: + bld.install_as(path+'/'+y,self.path.abspath()+'/C/'+y) + bld.install_as(path+'/%s.xml'%self.doc_module,out.abspath(self.env)) + if x=='C': + xmls=self.to_list(self.doc_includes) + xmls.append(self.doc_entities) + for z in xmls: + out=self.path.find_resource('%s/%s'%(x,z)) + bld.install_as(path+'/%s'%z,out.abspath(self.env)) +class xml_to_taskgen(TaskGen.task_gen): + def __init__(self,*k,**kw): + TaskGen.task_gen.__init__(self,*k,**kw) +def init_xml_to(self): + Utils.def_attrs(self,source='xmlfile',xslt='xlsltfile',target='hey',default_install_path='${PREFIX}',task_created=None) +def apply_xml_to(self): + xmlfile=self.path.find_resource(self.source) + xsltfile=self.path.find_resource(self.xslt) + tsk=self.create_task('xmlto',[xmlfile,xsltfile],xmlfile.change_ext('html')) + tsk.install_path=self.install_path +def sgml_scan(self): + node=self.inputs[0] + env=self.env + variant=node.variant(env) + fi=open(node.abspath(env),'r') + content=fi.read() + fi.close() + name=n1_regexp.findall(content)[0] + num=n2_regexp.findall(content)[0] + doc_name=name+'.'+num + if not self.outputs: + self.outputs=[self.generator.path.find_or_declare(doc_name)] + return([],[doc_name]) +class gnome_sgml2man_taskgen(TaskGen.task_gen): + def __init__(self,*k,**kw): + TaskGen.task_gen.__init__(self,*k,**kw) +def apply_gnome_sgml2man(self): + assert(getattr(self,'appname',None)) + def install_result(task): + out=task.outputs[0] + name=out.name + ext=name[-1] + env=task.env + self.bld.install_files('${DATADIR}/man/man%s/'%ext,out,env) + self.bld.rescan(self.path) + for name in self.bld.cache_dir_contents[self.path.id]: + base,ext=os.path.splitext(name) + if ext!='.sgml':continue + task=self.create_task('sgml2man') + task.set_inputs(self.path.find_resource(name)) + task.task_generator=self + if self.bld.is_install:task.install=install_result + task.scan() +cls=Task.simple_task_type('sgml2man','${SGML2MAN} -o ${TGT[0].bld_dir(env)} ${SRC} > /dev/null',color='BLUE') +cls.scan=sgml_scan +cls.quiet=1 +Task.simple_task_type('xmlto','${XMLTO} html -m ${SRC[1].abspath(env)} ${SRC[0].abspath(env)}') +Task.simple_task_type('xml2po','${XML2PO} ${XML2POFLAGS} ${SRC} > ${TGT}',color='BLUE') +xslt_magic="""${XSLTPROC2PO} -o ${TGT[0].abspath(env)} \ +--stringparam db2omf.basename ${APPNAME} \ +--stringparam db2omf.format docbook \ +--stringparam db2omf.lang ${TGT[0].abspath(env)[:-4].split('-')[-1]} \ +--stringparam db2omf.dtd '-//OASIS//DTD DocBook XML V4.3//EN' \ +--stringparam db2omf.omf_dir ${PREFIX}/share/omf \ +--stringparam db2omf.help_dir ${PREFIX}/share/gnome/help \ +--stringparam db2omf.omf_in ${SRC[0].abspath(env)} \ +--stringparam db2omf.scrollkeeper_cl ${SCROLLKEEPER_DATADIR}/Templates/C/scrollkeeper_cl.xml \ +${DB2OMF} ${SRC[1].abspath(env)}""" +Task.simple_task_type('xsltproc2po',xslt_magic,color='BLUE') +def detect(conf): + conf.check_tool('gnu_dirs glib2 dbus') + sgml2man=conf.find_program('docbook2man',var='SGML2MAN') + def getstr(varname): + return getattr(Options.options,varname,'') + conf.define('GNOMELOCALEDIR',os.path.join(conf.env['DATADIR'],'locale')) + xml2po=conf.find_program('xml2po',var='XML2PO') + xsltproc2po=conf.find_program('xsltproc',var='XSLTPROC2PO') + conf.env['XML2POFLAGS']='-e -p' + conf.env['SCROLLKEEPER_DATADIR']=Utils.cmd_output("scrollkeeper-config --pkgdatadir",silent=1).strip() + conf.env['DB2OMF']=Utils.cmd_output("/usr/bin/pkg-config --variable db2omf gnome-doc-utils",silent=1).strip() +def set_options(opt): + opt.add_option('--want-rpath',type='int',default=1,dest='want_rpath',help='set rpath to 1 or 0 [Default 1]') + +feature('gnome_doc')(init_gnome_doc) +feature('gnome_doc')(apply_gnome_doc) +after('init_gnome_doc')(apply_gnome_doc) +feature('xml_to')(init_xml_to) +feature('xml_to')(apply_xml_to) +after('init_xml_to')(apply_xml_to) +feature('gnome_sgml2man')(apply_gnome_sgml2man) diff -Nru guitarix-0.22.4/wafadmin3/Tools/gnu_dirs.py guitarix-0.24.2/wafadmin3/Tools/gnu_dirs.py --- guitarix-0.22.4/wafadmin3/Tools/gnu_dirs.py 1970-01-01 00:00:00.000000000 +0000 +++ guitarix-0.24.2/wafadmin3/Tools/gnu_dirs.py 2012-10-20 03:56:02.000000000 +0000 @@ -0,0 +1,63 @@ +#! /usr/bin/env python +# encoding: utf-8 + +import Utils,Options +_options=[x.split(', ')for x in''' +bindir, user executables, ${EXEC_PREFIX}/bin +sbindir, system admin executables, ${EXEC_PREFIX}/sbin +libexecdir, program executables, ${EXEC_PREFIX}/libexec +sysconfdir, read-only single-machine data, ${PREFIX}/etc +sharedstatedir, modifiable architecture-independent data, ${PREFIX}/com +localstatedir, modifiable single-machine data, ${PREFIX}/var +libdir, object code libraries, ${EXEC_PREFIX}/lib +includedir, C header files, ${PREFIX}/include +oldincludedir, C header files for non-gcc, /usr/include +datarootdir, read-only arch.-independent data root, ${PREFIX}/share +datadir, read-only architecture-independent data, ${DATAROOTDIR} +infodir, info documentation, ${DATAROOTDIR}/info +localedir, locale-dependent data, ${DATAROOTDIR}/locale +mandir, man documentation, ${DATAROOTDIR}/man +docdir, documentation root, ${DATAROOTDIR}/doc/${PACKAGE} +htmldir, html documentation, ${DOCDIR} +dvidir, dvi documentation, ${DOCDIR} +pdfdir, pdf documentation, ${DOCDIR} +psdir, ps documentation, ${DOCDIR} +'''.split('\n')if x] +def detect(conf): + def get_param(varname,default): + return getattr(Options.options,varname,'')or default + env=conf.env + env['EXEC_PREFIX']=get_param('EXEC_PREFIX',env['PREFIX']) + env['PACKAGE']=Utils.g_module.APPNAME + complete=False + iter=0 + while not complete and iter=0: + inner_class_node=k.find_or_declare(u) + inner[inner_class_node.id]=inner_class_node + to_add=set(inner.keys())-set([x.id for x in self.outputs]) + for x in to_add: + self.outputs.append(inner[x]) + return Task.Task.post_run(self) +cls.post_run=post_run_javac +def detect(conf): + java_path=conf.environ['PATH'].split(os.pathsep) + v=conf.env + if'JAVA_HOME'in conf.environ: + java_path=[os.path.join(conf.environ['JAVA_HOME'],'bin')]+java_path + conf.env['JAVA_HOME']=[conf.environ['JAVA_HOME']] + for x in'javac java jar'.split(): + conf.find_program(x,var=x.upper(),path_list=java_path) + conf.env[x.upper()]=conf.cmd_to_list(conf.env[x.upper()]) + v['JAVA_EXT']=['.java'] + if'CLASSPATH'in conf.environ: + v['CLASSPATH']=conf.environ['CLASSPATH'] + if not v['JAR']:conf.fatal('jar is required for making java packages') + if not v['JAVAC']:conf.fatal('javac is required for compiling java classes') + v['JARCREATE']='cf' +def check_java_class(self,classname,with_classpath=None): + import shutil + javatestdir='.waf-javatest' + classpath=javatestdir + if self.env['CLASSPATH']: + classpath+=os.pathsep+self.env['CLASSPATH'] + if isinstance(with_classpath,str): + classpath+=os.pathsep+with_classpath + shutil.rmtree(javatestdir,True) + os.mkdir(javatestdir) + java_file=open(os.path.join(javatestdir,'Test.java'),'w') + java_file.write(class_check_source) + java_file.close() + Utils.exec_command(self.env['JAVAC']+[os.path.join(javatestdir,'Test.java')],shell=False) + cmd=self.env['JAVA']+['-cp',classpath,'Test',classname] + self.log.write("%s\n"%str(cmd)) + found=Utils.exec_command(cmd,shell=False,log=self.log) + self.check_message('Java class %s'%classname,"",not found) + shutil.rmtree(javatestdir,True) + return found +def check_jni_headers(conf): + if not conf.env.CC_NAME and not conf.env.CXX_NAME: + conf.fatal('load a compiler first (gcc, g++, ..)') + if not conf.env.JAVA_HOME: + conf.fatal('set JAVA_HOME in the system environment') + javaHome=conf.env['JAVA_HOME'][0] + b=Build.BuildContext() + b.load_dirs(conf.srcdir,conf.blddir) + dir=b.root.find_dir(conf.env.JAVA_HOME[0]+'/include') + f=dir.ant_glob('**/(jni|jni_md).h',flat=False) + incDirs=[x.parent.abspath()for x in f] + dir=b.root.find_dir(conf.env.JAVA_HOME[0]) + f=dir.ant_glob('**/*jvm.(so|dll)',flat=False) + libDirs=[x.parent.abspath()for x in f]or[javaHome] + for i,d in enumerate(libDirs): + if conf.check(header_name='jni.h',define_name='HAVE_JNI_H',lib='jvm',libpath=d,includes=incDirs,uselib_store='JAVA',uselib='JAVA'): + break + else: + conf.fatal('could not find lib jvm in %r (see config.log)'%libDirs) + +feature('jar')(jar_files) +before('apply_core')(jar_files) +feature('javac')(apply_java) +before('apply_core')(apply_java) +conf(check_java_class) +conf(check_jni_headers) diff -Nru guitarix-0.22.4/wafadmin3/Tools/kde4.py guitarix-0.24.2/wafadmin3/Tools/kde4.py --- guitarix-0.22.4/wafadmin3/Tools/kde4.py 1970-01-01 00:00:00.000000000 +0000 +++ guitarix-0.24.2/wafadmin3/Tools/kde4.py 2012-10-20 03:56:02.000000000 +0000 @@ -0,0 +1,57 @@ +#! /usr/bin/env python +# encoding: utf-8 + +import os,sys,re +import Options,TaskGen,Task,Utils +from TaskGen import taskgen,feature,after +class msgfmt_taskgen(TaskGen.task_gen): + def __init__(self,*k,**kw): + TaskGen.task_gen.__init__(self,*k,**kw) +def init_msgfmt(self): + self.default_install_path='${KDE4_LOCALE_INSTALL_DIR}' +def apply_msgfmt(self): + for lang in self.to_list(self.langs): + node=self.path.find_resource(lang+'.po') + task=self.create_task('msgfmt',node,node.change_ext('.mo')) + if not self.bld.is_install:continue + langname=lang.split('/') + langname=langname[-1] + task.install_path=self.install_path+os.sep+langname+os.sep+'LC_MESSAGES' + task.filename=getattr(self,'appname','set_your_appname')+'.mo' + task.chmod=self.chmod +def detect(conf): + kdeconfig=conf.find_program('kde4-config') + if not kdeconfig: + conf.fatal('we need kde4-config') + prefix=Utils.cmd_output('%s --prefix'%kdeconfig,silent=True).strip() + file='%s/share/apps/cmake/modules/KDELibsDependencies.cmake'%prefix + try:os.stat(file) + except OSError: + file='%s/share/kde4/apps/cmake/modules/KDELibsDependencies.cmake'%prefix + try:os.stat(file) + except OSError:conf.fatal('could not open %s'%file) + try: + txt=Utils.readf(file) + except(OSError,IOError): + conf.fatal('could not read %s'%file) + txt=txt.replace('\\\n','\n') + fu=re.compile('#(.*)\n') + txt=fu.sub('',txt) + setregexp=re.compile('([sS][eE][tT]\s*\()\s*([^\s]+)\s+\"([^"]+)\"\)') + found=setregexp.findall(txt) + for(_,key,val)in found: + conf.env[key]=val + conf.env['LIB_KDECORE']='kdecore' + conf.env['LIB_KDEUI']='kdeui' + conf.env['LIB_KIO']='kio' + conf.env['LIB_KHTML']='khtml' + conf.env['LIB_KPARTS']='kparts' + conf.env['LIBPATH_KDECORE']=conf.env['KDE4_LIB_INSTALL_DIR'] + conf.env['CPPPATH_KDECORE']=conf.env['KDE4_INCLUDE_INSTALL_DIR'] + conf.env.append_value('CPPPATH_KDECORE',conf.env['KDE4_INCLUDE_INSTALL_DIR']+"/KDE") + conf.env['MSGFMT']=conf.find_program('msgfmt') +Task.simple_task_type('msgfmt','${MSGFMT} ${SRC} -o ${TGT}',color='BLUE',shell=False) + +feature('msgfmt')(init_msgfmt) +feature('msgfmt')(apply_msgfmt) +after('init_msgfmt')(apply_msgfmt) diff -Nru guitarix-0.22.4/wafadmin3/Tools/libtool.py guitarix-0.24.2/wafadmin3/Tools/libtool.py --- guitarix-0.22.4/wafadmin3/Tools/libtool.py 1970-01-01 00:00:00.000000000 +0000 +++ guitarix-0.24.2/wafadmin3/Tools/libtool.py 2012-10-20 03:56:02.000000000 +0000 @@ -0,0 +1,239 @@ +#! /usr/bin/env python +# encoding: utf-8 + +import sys,re,os,optparse +import TaskGen,Task,Utils,preproc +from Logs import error,debug,warn +from TaskGen import taskgen,after,before,feature +REVISION="0.1.3" +fakelibtool_vardeps=['CXX','PREFIX'] +def fakelibtool_build(task): + env=task.env + dest=open(task.outputs[0].abspath(env),'w') + sname=task.inputs[0].name + fu=dest.write + fu("# Generated by ltmain.sh - GNU libtool 1.5.18 - (pwn3d by BKsys II code name WAF)\n") + if env['vnum']: + nums=env['vnum'].split('.') + libname=task.inputs[0].name + name3=libname+'.'+env['vnum'] + name2=libname+'.'+nums[0] + name1=libname + fu("dlname='%s'\n"%name2) + strn=" ".join([name3,name2,name1]) + fu("library_names='%s'\n"%(strn)) + else: + fu("dlname='%s'\n"%sname) + fu("library_names='%s %s %s'\n"%(sname,sname,sname)) + fu("old_library=''\n") + vars=' '.join(env['libtoolvars']+env['LINKFLAGS']) + fu("dependency_libs='%s'\n"%vars) + fu("current=0\n") + fu("age=0\nrevision=0\ninstalled=yes\nshouldnotlink=no\n") + fu("dlopen=''\ndlpreopen=''\n") + fu("libdir='%s/lib'\n"%env['PREFIX']) + dest.close() + return 0 +def read_la_file(path): + sp=re.compile(r'^([^=]+)=\'(.*)\'$') + dc={} + file=open(path,"r") + for line in file.readlines(): + try: + _,left,right,_=sp.split(line.strip()) + dc[left]=right + except ValueError: + pass + file.close() + return dc +def apply_link_libtool(self): + if self.type!='program': + linktask=self.link_task + self.latask=self.create_task('fakelibtool',linktask.outputs,linktask.outputs[0].change_ext('.la')) + if self.bld.is_install: + self.bld.install_files('${PREFIX}/lib',linktask.outputs[0],self.env) +def apply_libtool(self): + self.env['vnum']=self.vnum + paths=[] + libs=[] + libtool_files=[] + libtool_vars=[] + for l in self.env['LINKFLAGS']: + if l[:2]=='-L': + paths.append(l[2:]) + elif l[:2]=='-l': + libs.append(l[2:]) + for l in libs: + for p in paths: + dict=read_la_file(p+'/lib'+l+'.la') + linkflags2=dict.get('dependency_libs','') + for v in linkflags2.split(): + if v.endswith('.la'): + libtool_files.append(v) + libtool_vars.append(v) + continue + self.env.append_unique('LINKFLAGS',v) + break + self.env['libtoolvars']=libtool_vars + while libtool_files: + file=libtool_files.pop() + dict=read_la_file(file) + for v in dict['dependency_libs'].split(): + if v[-3:]=='.la': + libtool_files.append(v) + continue + self.env.append_unique('LINKFLAGS',v) +Task.task_type_from_func('fakelibtool',vars=fakelibtool_vardeps,func=fakelibtool_build,color='BLUE',after="cc_link cxx_link static_link") +class libtool_la_file: + def __init__(self,la_filename): + self.__la_filename=la_filename + self.linkname=str(os.path.split(la_filename)[-1])[:-3] + if self.linkname.startswith("lib"): + self.linkname=self.linkname[3:] + self.dlname=None + self.library_names=None + self.old_library=None + self.dependency_libs=None + self.current=None + self.age=None + self.revision=None + self.installed=None + self.shouldnotlink=None + self.dlopen=None + self.dlpreopen=None + self.libdir='/usr/lib' + if not self.__parse(): + raise ValueError("file %s not found!!"%(la_filename)) + def __parse(self): + if not os.path.isfile(self.__la_filename):return 0 + la_file=open(self.__la_filename,'r') + for line in la_file: + ln=line.strip() + if not ln:continue + if ln[0]=='#':continue + (key,value)=str(ln).split('=',1) + key=key.strip() + value=value.strip() + if value=="no":value=False + elif value=="yes":value=True + else: + try:value=int(value) + except ValueError:value=value.strip("'") + setattr(self,key,value) + la_file.close() + return 1 + def get_libs(self): + libs=[] + if self.dependency_libs: + libs=str(self.dependency_libs).strip().split() + if libs==None: + libs=[] + libs.insert(0,"-l%s"%self.linkname.strip()) + libs.insert(0,"-L%s"%self.libdir.strip()) + return libs + def __str__(self): + return'''\ +dlname = "%(dlname)s" +library_names = "%(library_names)s" +old_library = "%(old_library)s" +dependency_libs = "%(dependency_libs)s" +version = %(current)s.%(age)s.%(revision)s +installed = "%(installed)s" +shouldnotlink = "%(shouldnotlink)s" +dlopen = "%(dlopen)s" +dlpreopen = "%(dlpreopen)s" +libdir = "%(libdir)s"'''%self.__dict__ +class libtool_config: + def __init__(self,la_filename): + self.__libtool_la_file=libtool_la_file(la_filename) + tmp=self.__libtool_la_file + self.__version=[int(tmp.current),int(tmp.age),int(tmp.revision)] + self.__sub_la_files=[] + self.__sub_la_files.append(la_filename) + self.__libs=None + def __cmp__(self,other): + if not other: + return 1 + othervers=[int(s)for s in str(other).split(".")] + selfvers=self.__version + return cmp(selfvers,othervers) + def __str__(self): + return"\n".join([str(self.__libtool_la_file),' '.join(self.__libtool_la_file.get_libs()),'* New getlibs:',' '.join(self.get_libs())]) + def __get_la_libs(self,la_filename): + return libtool_la_file(la_filename).get_libs() + def get_libs(self): + libs_list=list(self.__libtool_la_file.get_libs()) + libs_map={} + while len(libs_list)>0: + entry=libs_list.pop(0) + if entry: + if str(entry).endswith(".la"): + if entry not in self.__sub_la_files: + self.__sub_la_files.append(entry) + libs_list.extend(self.__get_la_libs(entry)) + else: + libs_map[entry]=1 + self.__libs=libs_map.keys() + return self.__libs + def get_libs_only_L(self): + if not self.__libs:self.get_libs() + libs=self.__libs + libs=[s for s in libs if str(s).startswith('-L')] + return libs + def get_libs_only_l(self): + if not self.__libs:self.get_libs() + libs=self.__libs + libs=[s for s in libs if str(s).startswith('-l')] + return libs + def get_libs_only_other(self): + if not self.__libs:self.get_libs() + libs=self.__libs + libs=[s for s in libs if not(str(s).startswith('-L')or str(s).startswith('-l'))] + return libs +def useCmdLine(): + usage='''Usage: %prog [options] PathToFile.la +example: %prog --atleast-version=2.0.0 /usr/lib/libIlmImf.la +nor: %prog --libs /usr/lib/libamarok.la''' + parser=optparse.OptionParser(usage) + a=parser.add_option + a("--version",dest="versionNumber",action="store_true",default=False,help="output version of libtool-config") + a("--debug",dest="debug",action="store_true",default=False,help="enable debug") + a("--libs",dest="libs",action="store_true",default=False,help="output all linker flags") + a("--libs-only-l",dest="libs_only_l",action="store_true",default=False,help="output -l flags") + a("--libs-only-L",dest="libs_only_L",action="store_true",default=False,help="output -L flags") + a("--libs-only-other",dest="libs_only_other",action="store_true",default=False,help="output other libs (e.g. -pthread)") + a("--atleast-version",dest="atleast_version",default=None,help="return 0 if the module is at least version ATLEAST_VERSION") + a("--exact-version",dest="exact_version",default=None,help="return 0 if the module is exactly version EXACT_VERSION") + a("--max-version",dest="max_version",default=None,help="return 0 if the module is at no newer than version MAX_VERSION") + (options,args)=parser.parse_args() + if len(args)!=1 and not options.versionNumber: + parser.error("incorrect number of arguments") + if options.versionNumber: + print("libtool-config version %s"%REVISION) + return 0 + ltf=libtool_config(args[0]) + if options.debug: + print(ltf) + if options.atleast_version: + if ltf>=options.atleast_version:return 0 + sys.exit(1) + if options.exact_version: + if ltf==options.exact_version:return 0 + sys.exit(1) + if options.max_version: + if ltf<=options.max_version:return 0 + sys.exit(1) + def p(x): + print(" ".join(x)) + if options.libs:p(ltf.get_libs()) + elif options.libs_only_l:p(ltf.get_libs_only_l()) + elif options.libs_only_L:p(ltf.get_libs_only_L()) + elif options.libs_only_other:p(ltf.get_libs_only_other()) + return 0 +if __name__=='__main__': + useCmdLine() + +feature("libtool")(apply_link_libtool) +after('apply_link')(apply_link_libtool) +feature("libtool")(apply_libtool) +before('apply_core')(apply_libtool) diff -Nru guitarix-0.22.4/wafadmin3/Tools/lua.py guitarix-0.24.2/wafadmin3/Tools/lua.py --- guitarix-0.22.4/wafadmin3/Tools/lua.py 1970-01-01 00:00:00.000000000 +0000 +++ guitarix-0.24.2/wafadmin3/Tools/lua.py 2012-10-20 03:56:02.000000000 +0000 @@ -0,0 +1,13 @@ +#! /usr/bin/env python +# encoding: utf-8 + +import TaskGen +from TaskGen import taskgen,feature +from Constants import* +TaskGen.declare_chain(name='luac',rule='${LUAC} -s -o ${TGT} ${SRC}',ext_in='.lua',ext_out='.luac',reentrant=False,install='LUADIR',) +def init_lua(self): + self.default_chmod=O755 +def detect(conf): + conf.find_program('luac',var='LUAC',mandatory=True) + +feature('lua')(init_lua) diff -Nru guitarix-0.22.4/wafadmin3/Tools/misc.py guitarix-0.24.2/wafadmin3/Tools/misc.py --- guitarix-0.22.4/wafadmin3/Tools/misc.py 1970-01-01 00:00:00.000000000 +0000 +++ guitarix-0.24.2/wafadmin3/Tools/misc.py 2012-10-20 03:56:02.000000000 +0000 @@ -0,0 +1,302 @@ +#! /usr/bin/env python +# encoding: utf-8 + +import shutil,re,os +import TaskGen,Node,Task,Utils,Build,Constants +from TaskGen import feature,taskgen,after,before +from Logs import debug +def copy_func(tsk): + env=tsk.env + infile=tsk.inputs[0].abspath(env) + outfile=tsk.outputs[0].abspath(env) + try: + shutil.copy2(infile,outfile) + except(OSError,IOError): + return 1 + else: + if tsk.chmod:os.chmod(outfile,tsk.chmod) + return 0 +def action_process_file_func(tsk): + if not tsk.fun:raise Utils.WafError('task must have a function attached to it for copy_func to work!') + return tsk.fun(tsk) +class cmd_taskgen(TaskGen.task_gen): + def __init__(self,*k,**kw): + TaskGen.task_gen.__init__(self,*k,**kw) +def apply_cmd(self): + if not self.fun:raise Utils.WafError('cmdobj needs a function!') + tsk=Task.TaskBase() + tsk.fun=self.fun + tsk.env=self.env + self.tasks.append(tsk) + tsk.install_path=self.install_path +class copy_taskgen(TaskGen.task_gen): + def __init__(self,*k,**kw): + TaskGen.task_gen.__init__(self,*k,**kw) +def apply_copy(self): + Utils.def_attrs(self,fun=copy_func) + self.default_install_path=0 + lst=self.to_list(self.source) + self.meths.remove('apply_core') + for filename in lst: + node=self.path.find_resource(filename) + if not node:raise Utils.WafError('cannot find input file %s for processing'%filename) + target=self.target + if not target or len(lst)>1:target=node.name + newnode=self.path.find_or_declare(target) + tsk=self.create_task('copy',node,newnode) + tsk.fun=self.fun + tsk.chmod=self.chmod + tsk.install_path=self.install_path + if not tsk.env: + tsk.debug() + raise Utils.WafError('task without an environment') +def subst_func(tsk): + m4_re=re.compile('@(\w+)@',re.M) + env=tsk.env + infile=tsk.inputs[0].abspath(env) + outfile=tsk.outputs[0].abspath(env) + code=Utils.readf(infile) + code=code.replace('%','%%') + s=m4_re.sub(r'%(\1)s',code) + di=tsk.dict or{} + if not di: + names=m4_re.findall(code) + for i in names: + di[i]=env.get_flat(i)or env.get_flat(i.upper()) + file=open(outfile,'w') + file.write(s%di) + file.close() + if tsk.chmod:os.chmod(outfile,tsk.chmod) +class subst_taskgen(TaskGen.task_gen): + def __init__(self,*k,**kw): + TaskGen.task_gen.__init__(self,*k,**kw) +def apply_subst(self): + Utils.def_attrs(self,fun=subst_func) + self.default_install_path=0 + lst=self.to_list(self.source) + self.meths.remove('apply_core') + self.dict=getattr(self,'dict',{}) + for filename in lst: + node=self.path.find_resource(filename) + if not node:raise Utils.WafError('cannot find input file %s for processing'%filename) + if self.target: + newnode=self.path.find_or_declare(self.target) + else: + newnode=node.change_ext('') + try: + self.dict=self.dict.get_merged_dict() + except AttributeError: + pass + if self.dict and not self.env['DICT_HASH']: + self.env=self.env.copy() + keys=list(self.dict.keys()) + keys.sort() + lst=[self.dict[x]for x in keys] + self.env['DICT_HASH']=str(Utils.h_list(lst)) + tsk=self.create_task('copy',node,newnode) + tsk.fun=self.fun + tsk.dict=self.dict + tsk.dep_vars=['DICT_HASH'] + tsk.install_path=self.install_path + tsk.chmod=self.chmod + if not tsk.env: + tsk.debug() + raise Utils.WafError('task without an environment') +class cmd_arg(object): + def __init__(self,name,template='%s'): + self.name=name + self.template=template + self.node=None +class input_file(cmd_arg): + def find_node(self,base_path): + assert isinstance(base_path,Node.Node) + self.node=base_path.find_resource(self.name) + if self.node is None: + raise Utils.WafError("Input file %s not found in "%(self.name,base_path)) + def get_path(self,env,absolute): + if absolute: + return self.template%self.node.abspath(env) + else: + return self.template%self.node.srcpath(env) +class output_file(cmd_arg): + def find_node(self,base_path): + assert isinstance(base_path,Node.Node) + self.node=base_path.find_or_declare(self.name) + if self.node is None: + raise Utils.WafError("Output file %s not found in "%(self.name,base_path)) + def get_path(self,env,absolute): + if absolute: + return self.template%self.node.abspath(env) + else: + return self.template%self.node.bldpath(env) +class cmd_dir_arg(cmd_arg): + def find_node(self,base_path): + assert isinstance(base_path,Node.Node) + self.node=base_path.find_dir(self.name) + if self.node is None: + raise Utils.WafError("Directory %s not found in "%(self.name,base_path)) +class input_dir(cmd_dir_arg): + def get_path(self,dummy_env,dummy_absolute): + return self.template%self.node.abspath() +class output_dir(cmd_dir_arg): + def get_path(self,env,dummy_absolute): + return self.template%self.node.abspath(env) +class command_output(Task.Task): + color="BLUE" + def __init__(self,env,command,command_node,command_args,stdin,stdout,cwd,os_env,stderr): + Task.Task.__init__(self,env,normal=1) + assert isinstance(command,(str,Node.Node)) + self.command=command + self.command_args=command_args + self.stdin=stdin + self.stdout=stdout + self.cwd=cwd + self.os_env=os_env + self.stderr=stderr + if command_node is not None:self.dep_nodes=[command_node] + self.dep_vars=[] + def run(self): + task=self + def input_path(node,template): + if task.cwd is None: + return template%node.bldpath(task.env) + else: + return template%node.abspath() + def output_path(node,template): + fun=node.abspath + if task.cwd is None:fun=node.bldpath + return template%fun(task.env) + if isinstance(task.command,Node.Node): + argv=[input_path(task.command,'%s')] + else: + argv=[task.command] + for arg in task.command_args: + if isinstance(arg,str): + argv.append(arg) + else: + assert isinstance(arg,cmd_arg) + argv.append(arg.get_path(task.env,(task.cwd is not None))) + if task.stdin: + stdin=open(input_path(task.stdin,'%s')) + else: + stdin=None + if task.stdout: + stdout=open(output_path(task.stdout,'%s'),"w") + else: + stdout=None + if task.stderr: + stderr=open(output_path(task.stderr,'%s'),"w") + else: + stderr=None + if task.cwd is None: + cwd=('None (actually %r)'%os.getcwd()) + else: + cwd=repr(task.cwd) + debug("command-output: cwd=%s, stdin=%r, stdout=%r, argv=%r"%(cwd,stdin,stdout,argv)) + if task.os_env is None: + os_env=os.environ + else: + os_env=task.os_env + command=Utils.pproc.Popen(argv,stdin=stdin,stdout=stdout,stderr=stderr,cwd=task.cwd,env=os_env) + return command.wait() +class cmd_output_taskgen(TaskGen.task_gen): + def __init__(self,*k,**kw): + TaskGen.task_gen.__init__(self,*k,**kw) +def init_cmd_output(self): + Utils.def_attrs(self,stdin=None,stdout=None,stderr=None,command=None,command_is_external=False,argv=[],dependencies=[],dep_vars=[],hidden_inputs=[],hidden_outputs=[],cwd=None,os_env=None) +def apply_cmd_output(self): + if self.command is None: + raise Utils.WafError("command-output missing command") + if self.command_is_external: + cmd=self.command + cmd_node=None + else: + cmd_node=self.path.find_resource(self.command) + assert cmd_node is not None,('''Could not find command '%s' in source tree. +Hint: if this is an external command, +use command_is_external=True''')%(self.command,) + cmd=cmd_node + if self.cwd is None: + cwd=None + else: + assert isinstance(cwd,CmdDirArg) + self.cwd.find_node(self.path) + args=[] + inputs=[] + outputs=[] + for arg in self.argv: + if isinstance(arg,cmd_arg): + arg.find_node(self.path) + if isinstance(arg,input_file): + inputs.append(arg.node) + if isinstance(arg,output_file): + outputs.append(arg.node) + if self.stdout is None: + stdout=None + else: + assert isinstance(self.stdout,str) + stdout=self.path.find_or_declare(self.stdout) + if stdout is None: + raise Utils.WafError("File %s not found"%(self.stdout,)) + outputs.append(stdout) + if self.stderr is None: + stderr=None + else: + assert isinstance(self.stderr,str) + stderr=self.path.find_or_declare(self.stderr) + if stderr is None: + raise Utils.WafError("File %s not found"%(self.stderr,)) + outputs.append(stderr) + if self.stdin is None: + stdin=None + else: + assert isinstance(self.stdin,str) + stdin=self.path.find_resource(self.stdin) + if stdin is None: + raise Utils.WafError("File %s not found"%(self.stdin,)) + inputs.append(stdin) + for hidden_input in self.to_list(self.hidden_inputs): + node=self.path.find_resource(hidden_input) + if node is None: + raise Utils.WafError("File %s not found in dir %s"%(hidden_input,self.path)) + inputs.append(node) + for hidden_output in self.to_list(self.hidden_outputs): + node=self.path.find_or_declare(hidden_output) + if node is None: + raise Utils.WafError("File %s not found in dir %s"%(hidden_output,self.path)) + outputs.append(node) + if not(inputs or getattr(self,'no_inputs',None)): + raise Utils.WafError('command-output objects must have at least one input file or give self.no_inputs') + if not(outputs or getattr(self,'no_outputs',None)): + raise Utils.WafError('command-output objects must have at least one output file or give self.no_outputs') + task=command_output(self.env,cmd,cmd_node,self.argv,stdin,stdout,cwd,self.os_env,stderr) + Utils.copy_attrs(self,task,'before after ext_in ext_out',only_if_set=True) + self.tasks.append(task) + task.inputs=inputs + task.outputs=outputs + task.dep_vars=self.to_list(self.dep_vars) + for dep in self.dependencies: + assert dep is not self + dep.post() + for dep_task in dep.tasks: + task.set_run_after(dep_task) + if not task.inputs: + task.runnable_status=type(Task.TaskBase.run)(runnable_status,task,task.__class__) + task.post_run=type(Task.TaskBase.run)(post_run,task,task.__class__) +def post_run(self): + for x in self.outputs: + h=Utils.h_file(x.abspath(self.env)) + self.generator.bld.node_sigs[self.env.variant()][x.id]=h +def runnable_status(self): + return Constants.RUN_ME +Task.task_type_from_func('copy',vars=[],func=action_process_file_func) +TaskGen.task_gen.classes['command-output']=cmd_output_taskgen + +feature('cmd')(apply_cmd) +feature('copy')(apply_copy) +before('apply_core')(apply_copy) +feature('subst')(apply_subst) +before('apply_core')(apply_subst) +feature('command-output')(init_cmd_output) +feature('command-output')(apply_cmd_output) +after('init_cmd_output')(apply_cmd_output) diff -Nru guitarix-0.22.4/wafadmin3/Tools/msvc.py guitarix-0.24.2/wafadmin3/Tools/msvc.py --- guitarix-0.22.4/wafadmin3/Tools/msvc.py 1970-01-01 00:00:00.000000000 +0000 +++ guitarix-0.24.2/wafadmin3/Tools/msvc.py 2012-10-20 03:56:02.000000000 +0000 @@ -0,0 +1,586 @@ +#! /usr/bin/env python +# encoding: utf-8 + +import os,sys,re,string,optparse +import Utils,TaskGen,Runner,Configure,Task,Options +from Logs import debug,info,warn,error +from TaskGen import after,before,feature +from Configure import conftest,conf +import ccroot,cc,cxx,ar,winres +from libtool import read_la_file +try: + import _winreg +except: + import winreg as _winreg +pproc=Utils.pproc +g_msvc_systemlibs=""" +aclui activeds ad1 adptif adsiid advapi32 asycfilt authz bhsupp bits bufferoverflowu cabinet +cap certadm certidl ciuuid clusapi comctl32 comdlg32 comsupp comsuppd comsuppw comsuppwd comsvcs +credui crypt32 cryptnet cryptui d3d8thk daouuid dbgeng dbghelp dciman32 ddao35 ddao35d +ddao35u ddao35ud delayimp dhcpcsvc dhcpsapi dlcapi dnsapi dsprop dsuiext dtchelp +faultrep fcachdll fci fdi framedyd framedyn gdi32 gdiplus glauxglu32 gpedit gpmuuid +gtrts32w gtrtst32hlink htmlhelp httpapi icm32 icmui imagehlp imm32 iphlpapi iprop +kernel32 ksguid ksproxy ksuser libcmt libcmtd libcpmt libcpmtd loadperf lz32 mapi +mapi32 mgmtapi minidump mmc mobsync mpr mprapi mqoa mqrt msacm32 mscms mscoree +msdasc msimg32 msrating mstask msvcmrt msvcurt msvcurtd mswsock msxml2 mtx mtxdm +netapi32 nmapinmsupp npptools ntdsapi ntdsbcli ntmsapi ntquery odbc32 odbcbcp +odbccp32 oldnames ole32 oleacc oleaut32 oledb oledlgolepro32 opends60 opengl32 +osptk parser pdh penter pgobootrun pgort powrprof psapi ptrustm ptrustmd ptrustu +ptrustud qosname rasapi32 rasdlg rassapi resutils riched20 rpcndr rpcns4 rpcrt4 rtm +rtutils runtmchk scarddlg scrnsave scrnsavw secur32 sensapi setupapi sfc shell32 +shfolder shlwapi sisbkup snmpapi sporder srclient sti strsafe svcguid tapi32 thunk32 +traffic unicows url urlmon user32 userenv usp10 uuid uxtheme vcomp vcompd vdmdbg +version vfw32 wbemuuid webpost wiaguid wininet winmm winscard winspool winstrm +wintrust wldap32 wmiutils wow32 ws2_32 wsnmp32 wsock32 wst wtsapi32 xaswitch xolehlp +""".split() +all_msvc_platforms=[('x64','amd64'),('x86','x86'),('ia64','ia64'),('x86_amd64','amd64'),('x86_ia64','ia64')] +all_wince_platforms=[('armv4','arm'),('armv4i','arm'),('mipsii','mips'),('mipsii_fp','mips'),('mipsiv','mips'),('mipsiv_fp','mips'),('sh4','sh'),('x86','cex86')] +all_icl_platforms=[('intel64','amd64'),('em64t','amd64'),('ia32','x86'),('Itanium','ia64')] +def setup_msvc(conf,versions): + platforms=Utils.to_list(conf.env['MSVC_TARGETS'])or[i for i,j in all_msvc_platforms+all_icl_platforms+all_wince_platforms] + desired_versions=conf.env['MSVC_VERSIONS']or[v for v,_ in versions][::-1] + versiondict=dict(versions) + for version in desired_versions: + try: + targets=dict(versiondict[version]) + for target in platforms: + try: + arch,(p1,p2,p3)=targets[target] + compiler,revision=version.split() + return compiler,revision,p1,p2,p3 + except KeyError:continue + except KeyError:continue + conf.fatal('msvc: Impossible to find a valid architecture for building (in setup_msvc)') +def get_msvc_version(conf,compiler,version,target,vcvars): + debug('msvc: get_msvc_version: %r %r %r',compiler,version,target) + batfile=os.path.join(conf.blddir,'waf-print-msvc.bat') + f=open(batfile,'w') + f.write("""@echo off +set INCLUDE= +set LIB= +call "%s" %s +echo PATH=%%PATH%% +echo INCLUDE=%%INCLUDE%% +echo LIB=%%LIB%% +"""%(vcvars,target)) + f.close() + sout=Utils.cmd_output(['cmd','/E:on','/V:on','/C',batfile]) + lines=sout.splitlines() + for x in('Setting environment','Setting SDK environment','Intel(R) C++ Compiler'): + if lines[0].find(x)!=-1: + break + else: + debug('msvc: get_msvc_version: %r %r %r -> not found',compiler,version,target) + conf.fatal('msvc: Impossible to find a valid architecture for building (in get_msvc_version)') + for line in lines[1:]: + if line.startswith('PATH='): + path=line[5:] + MSVC_PATH=path.split(';') + elif line.startswith('INCLUDE='): + MSVC_INCDIR=[i for i in line[8:].split(';')if i] + elif line.startswith('LIB='): + MSVC_LIBDIR=[i for i in line[4:].split(';')if i] + env={} + env.update(os.environ) + env.update(PATH=path) + compiler_name,linker_name,lib_name=_get_prog_names(conf,compiler) + cxx=conf.find_program(compiler_name,path_list=MSVC_PATH) + if env.has_key('CL'): + del(env['CL']) + try: + p=pproc.Popen([cxx,'/help'],env=env,stdout=pproc.PIPE,stderr=pproc.PIPE) + out,err=p.communicate() + if p.returncode!=0: + raise Exception('return code: %r: %r'%(p.returncode,err)) + except Exception as e: + debug('msvc: get_msvc_version: %r %r %r -> failure',compiler,version,target) + debug(str(e)) + conf.fatal('msvc: cannot run the compiler (in get_msvc_version)') + else: + debug('msvc: get_msvc_version: %r %r %r -> OK',compiler,version,target) + return(MSVC_PATH,MSVC_INCDIR,MSVC_LIBDIR) +def gather_wsdk_versions(conf,versions): + version_pattern=re.compile('^v..?.?\...?.?') + try: + all_versions=_winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE,'SOFTWARE\\Wow6432node\\Microsoft\\Microsoft SDKs\\Windows') + except WindowsError: + try: + all_versions=_winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE,'SOFTWARE\\Microsoft\\Microsoft SDKs\\Windows') + except WindowsError: + return + index=0 + while 1: + try: + version=_winreg.EnumKey(all_versions,index) + except WindowsError: + break + index=index+1 + if not version_pattern.match(version): + continue + try: + msvc_version=_winreg.OpenKey(all_versions,version) + path,type=_winreg.QueryValueEx(msvc_version,'InstallationFolder') + except WindowsError: + continue + if os.path.isfile(os.path.join(path,'bin','SetEnv.cmd')): + targets=[] + for target,arch in all_msvc_platforms: + try: + targets.append((target,(arch,conf.get_msvc_version('wsdk',version,'/'+target,os.path.join(path,'bin','SetEnv.cmd'))))) + except Configure.ConfigurationError: + pass + versions.append(('wsdk '+version[1:],targets)) +def gather_msvc_versions(conf,versions): + try: + ce_sdk=_winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE,'SOFTWARE\\Wow6432node\\Microsoft\\Windows CE Tools\\SDKs') + except WindowsError: + try: + ce_sdk=_winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE,'SOFTWARE\\Microsoft\\Windows CE Tools\\SDKs') + except WindowsError: + ce_sdk='' + if ce_sdk: + supported_wince_platforms=[] + ce_index=0 + while 1: + try: + sdk_device=_winreg.EnumKey(ce_sdk,ce_index) + except WindowsError: + break + ce_index=ce_index+1 + sdk=_winreg.OpenKey(ce_sdk,sdk_device) + path,type=_winreg.QueryValueEx(sdk,'SDKRootDir') + path=str(path) + path,device=os.path.split(path) + if not device: + path,device=os.path.split(path) + for arch,compiler in all_wince_platforms: + platforms=[] + if os.path.isdir(os.path.join(path,device,'Lib',arch)): + platforms.append((arch,compiler,os.path.join(path,device,'Include',arch),os.path.join(path,device,'Lib',arch))) + if platforms: + supported_wince_platforms.append((device,platforms)) + version_pattern=re.compile('^..?\...?') + for vcver,vcvar in[('VCExpress','exp'),('VisualStudio','')]: + try: + all_versions=_winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE,'SOFTWARE\\Wow6432node\\Microsoft\\'+vcver) + except WindowsError: + try: + all_versions=_winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE,'SOFTWARE\\Microsoft\\'+vcver) + except WindowsError: + continue + index=0 + while 1: + try: + version=_winreg.EnumKey(all_versions,index) + except WindowsError: + break + index=index+1 + if not version_pattern.match(version): + continue + try: + msvc_version=_winreg.OpenKey(all_versions,version+"\\Setup\\VS") + path,type=_winreg.QueryValueEx(msvc_version,'ProductDir') + path=str(path) + targets=[] + if ce_sdk: + for device,platforms in supported_wince_platforms: + cetargets=[] + for platform,compiler,include,lib in platforms: + winCEpath=os.path.join(path,'VC','ce') + if os.path.isdir(winCEpath): + common_bindirs,_1,_2=conf.get_msvc_version('msvc',version,'x86',os.path.join(path,'Common7','Tools','vsvars32.bat')) + if os.path.isdir(os.path.join(winCEpath,'lib',platform)): + bindirs=[os.path.join(winCEpath,'bin',compiler),os.path.join(winCEpath,'bin','x86_'+compiler)]+common_bindirs + incdirs=[include,os.path.join(winCEpath,'include'),os.path.join(winCEpath,'atlmfc','include')] + libdirs=[lib,os.path.join(winCEpath,'lib',platform),os.path.join(winCEpath,'atlmfc','lib',platform)] + cetargets.append((platform,(platform,(bindirs,incdirs,libdirs)))) + versions.append((device+' '+version,cetargets)) + if os.path.isfile(os.path.join(path,'VC','vcvarsall.bat')): + for target,realtarget in all_msvc_platforms[::-1]: + try: + targets.append((target,(realtarget,conf.get_msvc_version('msvc',version,target,os.path.join(path,'VC','vcvarsall.bat'))))) + except: + pass + elif os.path.isfile(os.path.join(path,'Common7','Tools','vsvars32.bat')): + try: + targets.append(('x86',('x86',conf.get_msvc_version('msvc',version,'x86',os.path.join(path,'Common7','Tools','vsvars32.bat'))))) + except Configure.ConfigurationError: + pass + versions.append(('msvc '+version,targets)) + except WindowsError: + continue +def gather_icl_versions(conf,versions): + version_pattern=re.compile('^...?.?\....?.?') + try: + all_versions=_winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE,'SOFTWARE\\Wow6432node\\Intel\\Compilers\\C++') + except WindowsError: + try: + all_versions=_winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE,'SOFTWARE\\Intel\\Compilers\\C++') + except WindowsError: + return + index=0 + while 1: + try: + version=_winreg.EnumKey(all_versions,index) + except WindowsError: + break + index=index+1 + if not version_pattern.match(version): + continue + targets=[] + for target,arch in all_icl_platforms: + try: + icl_version=_winreg.OpenKey(all_versions,version+'\\'+target) + path,type=_winreg.QueryValueEx(icl_version,'ProductDir') + if os.path.isfile(os.path.join(path,'bin','iclvars.bat')): + try: + targets.append((target,(arch,conf.get_msvc_version('intel',version,target,os.path.join(path,'bin','iclvars.bat'))))) + except Configure.ConfigurationError: + pass + except WindowsError: + continue + major=version[0:2] + versions.append(('intel '+major,targets)) +def get_msvc_versions(conf): + if not conf.env.MSVC_INSTALLED_VERSIONS: + lst=[] + conf.gather_msvc_versions(lst) + conf.gather_wsdk_versions(lst) + conf.gather_icl_versions(lst) + conf.env.MSVC_INSTALLED_VERSIONS=lst + return conf.env.MSVC_INSTALLED_VERSIONS +def print_all_msvc_detected(conf): + for version,targets in conf.env['MSVC_INSTALLED_VERSIONS']: + info(version) + for target,l in targets: + info("\t"+target) +def detect_msvc(conf): + versions=get_msvc_versions(conf) + return setup_msvc(conf,versions) +def find_lt_names_msvc(self,libname,is_static=False): + lt_names=['lib%s.la'%libname,'%s.la'%libname,] + for path in self.env['LIBPATH']: + for la in lt_names: + laf=os.path.join(path,la) + dll=None + if os.path.exists(laf): + ltdict=read_la_file(laf) + lt_libdir=None + if ltdict.get('libdir',''): + lt_libdir=ltdict['libdir'] + if not is_static and ltdict.get('library_names',''): + dllnames=ltdict['library_names'].split() + dll=dllnames[0].lower() + dll=re.sub('\.dll$','',dll) + return(lt_libdir,dll,False) + elif ltdict.get('old_library',''): + olib=ltdict['old_library'] + if os.path.exists(os.path.join(path,olib)): + return(path,olib,True) + elif lt_libdir!=''and os.path.exists(os.path.join(lt_libdir,olib)): + return(lt_libdir,olib,True) + else: + return(None,olib,True) + else: + raise Utils.WafError('invalid libtool object file: %s'%laf) + return(None,None,None) +def libname_msvc(self,libname,is_static=False,mandatory=False): + lib=libname.lower() + lib=re.sub('\.lib$','',lib) + if lib in g_msvc_systemlibs: + return lib + lib=re.sub('^lib','',lib) + if lib=='m': + return None + (lt_path,lt_libname,lt_static)=self.find_lt_names_msvc(lib,is_static) + if lt_path!=None and lt_libname!=None: + if lt_static==True: + return os.path.join(lt_path,lt_libname) + if lt_path!=None: + _libpaths=[lt_path]+self.env['LIBPATH'] + else: + _libpaths=self.env['LIBPATH'] + static_libs=['lib%ss.lib'%lib,'lib%s.lib'%lib,'%ss.lib'%lib,'%s.lib'%lib,] + dynamic_libs=['lib%s.dll.lib'%lib,'lib%s.dll.a'%lib,'%s.dll.lib'%lib,'%s.dll.a'%lib,'lib%s_d.lib'%lib,'%s_d.lib'%lib,'%s.lib'%lib,] + libnames=static_libs + if not is_static: + libnames=dynamic_libs+static_libs + for path in _libpaths: + for libn in libnames: + if os.path.exists(os.path.join(path,libn)): + debug('msvc: lib found: %s',os.path.join(path,libn)) + return re.sub('\.lib$','',libn) + if mandatory: + self.fatal("The library %r could not be found"%libname) + return re.sub('\.lib$','',libname) +def check_lib_msvc(self,libname,is_static=False,uselib_store=None,mandatory=False): + libn=self.libname_msvc(libname,is_static,mandatory) + if not uselib_store: + uselib_store=libname.upper() + if False and is_static: + self.env['STATICLIB_'+uselib_store]=[libn] + else: + self.env['LIB_'+uselib_store]=[libn] +def check_libs_msvc(self,libnames,is_static=False,mandatory=False): + for libname in Utils.to_list(libnames): + self.check_lib_msvc(libname,is_static,mandatory=mandatory) +def no_autodetect(conf): + conf.eval_rules(detect.replace('autodetect','')) +detect=''' +autodetect +find_msvc +msvc_common_flags +cc_load_tools +cxx_load_tools +cc_add_flags +cxx_add_flags +link_add_flags +''' +def autodetect(conf): + v=conf.env + compiler,version,path,includes,libdirs=detect_msvc(conf) + v['PATH']=path + v['CPPPATH']=includes + v['LIBPATH']=libdirs + v['MSVC_COMPILER']=compiler +def _get_prog_names(conf,compiler): + if compiler=='intel': + compiler_name='ICL' + linker_name='XILINK' + lib_name='XILIB' + else: + compiler_name='CL' + linker_name='LINK' + lib_name='LIB' + return compiler_name,linker_name,lib_name +def find_msvc(conf): + if sys.platform!='win32': + conf.fatal('MSVC module only works under native Win32 Python! cygwin is not supported yet') + v=conf.env + compiler,version,path,includes,libdirs=detect_msvc(conf) + compiler_name,linker_name,lib_name=_get_prog_names(conf,compiler) + has_msvc_manifest=(compiler=='msvc'and float(version)>=8)or(compiler=='wsdk'and float(version)>=6)or(compiler=='intel'and float(version)>=11) + cxx=None + if v.CXX:cxx=v.CXX + elif'CXX'in conf.environ:cxx=conf.environ['CXX'] + if not cxx:cxx=conf.find_program(compiler_name,var='CXX',path_list=path,mandatory=True) + cxx=conf.cmd_to_list(cxx) + env=dict(conf.environ) + env.update(PATH=';'.join(path)) + if not Utils.cmd_output([cxx,'/nologo','/?'],silent=True,env=env): + conf.fatal('the msvc compiler could not be identified') + link=v.LINK_CXX + if not link: + link=conf.find_program(linker_name,path_list=path,mandatory=True) + ar=v.AR + if not ar: + ar=conf.find_program(lib_name,path_list=path,mandatory=True) + mt=v.MT + if has_msvc_manifest: + mt=conf.find_program('MT',path_list=path,mandatory=True) + v.MSVC_MANIFEST=has_msvc_manifest + v.PATH=path + v.CPPPATH=includes + v.LIBPATH=libdirs + v.CC=v.CXX=cxx + v.CC_NAME=v.CXX_NAME='msvc' + v.LINK=v.LINK_CXX=link + if not v.LINK_CC: + v.LINK_CC=v.LINK_CXX + v.AR=ar + v.MT=mt + v.MTFLAGS=v.ARFLAGS=['/NOLOGO'] + conf.check_tool('winres') + if not conf.env.WINRC: + warn('Resource compiler not found. Compiling resource file is disabled') + try:v.prepend_value('CPPPATH',conf.environ['INCLUDE']) + except KeyError:pass + try:v.prepend_value('LIBPATH',conf.environ['LIB']) + except KeyError:pass +def msvc_common_flags(conf): + v=conf.env + v['CPPFLAGS']=['/W3','/nologo'] + v['CCDEFINES_ST']='/D%s' + v['CXXDEFINES_ST']='/D%s' + v['CCDEFINES']=['WIN32'] + v['CXXDEFINES']=['WIN32'] + v['_CCINCFLAGS']=[] + v['_CCDEFFLAGS']=[] + v['_CXXINCFLAGS']=[] + v['_CXXDEFFLAGS']=[] + v['CC_SRC_F']='' + v['CC_TGT_F']=['/c','/Fo'] + v['CXX_SRC_F']='' + v['CXX_TGT_F']=['/c','/Fo'] + v['CPPPATH_ST']='/I%s' + v['AR_TGT_F']=v['CCLNK_TGT_F']=v['CXXLNK_TGT_F']='/OUT:' + v['CPPFLAGS_CONSOLE']=['/SUBSYSTEM:CONSOLE'] + v['CPPFLAGS_NATIVE']=['/SUBSYSTEM:NATIVE'] + v['CPPFLAGS_POSIX']=['/SUBSYSTEM:POSIX'] + v['CPPFLAGS_WINDOWS']=['/SUBSYSTEM:WINDOWS'] + v['CPPFLAGS_WINDOWSCE']=['/SUBSYSTEM:WINDOWSCE'] + v['CPPFLAGS_CRT_MULTITHREADED']=['/MT'] + v['CPPFLAGS_CRT_MULTITHREADED_DLL']=['/MD'] + v['CPPDEFINES_CRT_MULTITHREADED']=['_MT'] + v['CPPDEFINES_CRT_MULTITHREADED_DLL']=['_MT','_DLL'] + v['CPPFLAGS_CRT_MULTITHREADED_DBG']=['/MTd'] + v['CPPFLAGS_CRT_MULTITHREADED_DLL_DBG']=['/MDd'] + v['CPPDEFINES_CRT_MULTITHREADED_DBG']=['_DEBUG','_MT'] + v['CPPDEFINES_CRT_MULTITHREADED_DLL_DBG']=['_DEBUG','_MT','_DLL'] + v['CCFLAGS']=['/TC'] + v['CCFLAGS_OPTIMIZED']=['/O2','/DNDEBUG'] + v['CCFLAGS_RELEASE']=['/O2','/DNDEBUG'] + v['CCFLAGS_DEBUG']=['/Od','/RTC1','/ZI'] + v['CCFLAGS_ULTRADEBUG']=['/Od','/RTC1','/ZI'] + v['CXXFLAGS']=['/TP','/EHsc'] + v['CXXFLAGS_OPTIMIZED']=['/O2','/DNDEBUG'] + v['CXXFLAGS_RELEASE']=['/O2','/DNDEBUG'] + v['CXXFLAGS_DEBUG']=['/Od','/RTC1','/ZI'] + v['CXXFLAGS_ULTRADEBUG']=['/Od','/RTC1','/ZI'] + v['LIB']=[] + v['LIB_ST']='%s.lib' + v['LIBPATH_ST']='/LIBPATH:%s' + v['STATICLIB_ST']='lib%s.lib' + v['STATICLIBPATH_ST']='/LIBPATH:%s' + v['LINKFLAGS']=['/NOLOGO'] + if v['MSVC_MANIFEST']: + v.append_value('LINKFLAGS','/MANIFEST') + v['LINKFLAGS_DEBUG']=['/DEBUG'] + v['LINKFLAGS_ULTRADEBUG']=['/DEBUG'] + v['shlib_CCFLAGS']=[''] + v['shlib_CXXFLAGS']=[''] + v['shlib_LINKFLAGS']=['/DLL'] + v['shlib_PATTERN']='%s.dll' + v['implib_PATTERN']='%s.lib' + v['IMPLIB_ST']='/IMPLIB:%s' + v['staticlib_LINKFLAGS']=[''] + v['staticlib_PATTERN']='lib%s.lib' + v['program_PATTERN']='%s.exe' +def apply_flags_msvc(self): + if self.env.CC_NAME!='msvc'or not self.link_task: + return + subsystem=getattr(self,'subsystem','') + if subsystem: + subsystem='/subsystem:%s'%subsystem + flags='cstaticlib'in self.features and'ARFLAGS'or'LINKFLAGS' + self.env.append_value(flags,subsystem) + if getattr(self,'link_task',None)and not'cstaticlib'in self.features: + for f in self.env.LINKFLAGS: + d=f.lower() + if d[1:]=='debug': + pdbnode=self.link_task.outputs[0].change_ext('.pdb') + pdbfile=pdbnode.bldpath(self.env) + self.link_task.outputs.append(pdbnode) + self.bld.install_files(self.install_path,[pdbnode],env=self.env) + break +def apply_obj_vars_msvc(self): + if self.env['CC_NAME']!='msvc': + return + try: + self.meths.remove('apply_obj_vars') + except ValueError: + pass + libpaths=getattr(self,'libpaths',[]) + if not libpaths:self.libpaths=libpaths + env=self.env + app=env.append_unique + cpppath_st=env['CPPPATH_ST'] + lib_st=env['LIB_ST'] + staticlib_st=env['STATICLIB_ST'] + libpath_st=env['LIBPATH_ST'] + staticlibpath_st=env['STATICLIBPATH_ST'] + for i in env['LIBPATH']: + app('LINKFLAGS',libpath_st%i) + if not libpaths.count(i): + libpaths.append(i) + for i in env['LIBPATH']: + app('LINKFLAGS',staticlibpath_st%i) + if not libpaths.count(i): + libpaths.append(i) + if not env['FULLSTATIC']: + if env['STATICLIB']or env['LIB']: + app('LINKFLAGS',env['SHLIB_MARKER']) + for i in env['STATICLIB']: + app('LINKFLAGS',staticlib_st%i) + for i in env['LIB']: + app('LINKFLAGS',lib_st%i) +def apply_manifest(self): + if self.env.CC_NAME=='msvc'and self.env.MSVC_MANIFEST: + out_node=self.link_task.outputs[0] + man_node=out_node.parent.find_or_declare(out_node.name+'.manifest') + self.link_task.outputs.append(man_node) + self.link_task.do_manifest=True +def exec_mf(self): + env=self.env + mtool=env['MT'] + if not mtool: + return 0 + self.do_manifest=False + outfile=self.outputs[0].bldpath(env) + manifest=None + for out_node in self.outputs: + if out_node.name.endswith('.manifest'): + manifest=out_node.bldpath(env) + break + if manifest is None: + return 0 + mode='' + if'cprogram'in self.generator.features: + mode='1' + elif'cshlib'in self.generator.features: + mode='2' + debug('msvc: embedding manifest') + lst=[] + lst.extend([env['MT']]) + lst.extend(Utils.to_list(env['MTFLAGS'])) + lst.extend(Utils.to_list("-manifest")) + lst.extend(Utils.to_list(manifest)) + lst.extend(Utils.to_list("-outputresource:%s;%s"%(outfile,mode))) + lst=[lst] + return self.exec_command(*lst) +def exec_command_msvc(self,*k,**kw): + if self.env['CC_NAME']=='msvc': + if isinstance(k[0],list): + lst=[] + carry='' + for a in k[0]: + if len(a)==3 and a.startswith('/F')or a=='/doc'or a[-1]==':': + carry=a + else: + lst.append(carry+a) + carry='' + k=[lst] + env=dict(os.environ) + env.update(PATH=';'.join(self.env['PATH'])) + kw['env']=env + ret=self.generator.bld.exec_command(*k,**kw) + if ret:return ret + if getattr(self,'do_manifest',None): + ret=exec_mf(self) + return ret +for k in'cc cxx winrc cc_link cxx_link static_link qxx'.split(): + cls=Task.TaskBase.classes.get(k,None) + if cls: + cls.exec_command=exec_command_msvc + +conf(get_msvc_version) +conf(gather_wsdk_versions) +conf(gather_msvc_versions) +conf(gather_icl_versions) +conf(get_msvc_versions) +conf(print_all_msvc_detected) +conf(find_lt_names_msvc) +conf(libname_msvc) +conf(check_lib_msvc) +conf(check_libs_msvc) +conftest(no_autodetect) +conftest(autodetect) +conftest(find_msvc) +conftest(msvc_common_flags) +after('apply_link')(apply_flags_msvc) +feature('cc','cxx')(apply_flags_msvc) +feature('cprogram','cshlib','cstaticlib')(apply_obj_vars_msvc) +after('apply_lib_vars')(apply_obj_vars_msvc) +before('apply_obj_vars')(apply_obj_vars_msvc) +feature('cprogram','cshlib')(apply_manifest) +after('apply_link')(apply_manifest) diff -Nru guitarix-0.22.4/wafadmin3/Tools/nasm.py guitarix-0.24.2/wafadmin3/Tools/nasm.py --- guitarix-0.22.4/wafadmin3/Tools/nasm.py 1970-01-01 00:00:00.000000000 +0000 +++ guitarix-0.24.2/wafadmin3/Tools/nasm.py 2012-10-20 03:56:02.000000000 +0000 @@ -0,0 +1,31 @@ +#! /usr/bin/env python +# encoding: utf-8 + +import os +import TaskGen,Task,Utils +from TaskGen import taskgen,before,extension +nasm_str='${NASM} ${NASM_FLAGS} ${NASM_INCLUDES} ${SRC} -o ${TGT}' +EXT_NASM=['.s','.S','.asm','.ASM','.spp','.SPP'] +def apply_nasm_vars(self): + if hasattr(self,'nasm_flags'): + for flag in self.to_list(self.nasm_flags): + self.env.append_value('NASM_FLAGS',flag) + if hasattr(self,'includes'): + for inc in self.to_list(self.includes): + node=self.path.find_dir(inc) + if not node: + raise Utils.WafError('cannot find the dir'+inc) + self.env.append_value('NASM_INCLUDES','-I%s'%node.srcpath(self.env)) + self.env.append_value('NASM_INCLUDES','-I%s'%node.bldpath(self.env)) +def nasm_file(self,node): + try:obj_ext=self.obj_ext + except AttributeError:obj_ext='_%d.o'%self.idx + task=self.create_task('nasm',node,node.change_ext(obj_ext)) + self.compiled_tasks.append(task) + self.meths.append('apply_nasm_vars') +Task.simple_task_type('nasm',nasm_str,color='BLUE',ext_out='.o',shell=False) +def detect(conf): + nasm=conf.find_program(['nasm','yasm'],var='NASM',mandatory=True) + +before('apply_link')(apply_nasm_vars) +extension(EXT_NASM)(nasm_file) diff -Nru guitarix-0.22.4/wafadmin3/Tools/ocaml.py guitarix-0.24.2/wafadmin3/Tools/ocaml.py --- guitarix-0.22.4/wafadmin3/Tools/ocaml.py 1970-01-01 00:00:00.000000000 +0000 +++ guitarix-0.24.2/wafadmin3/Tools/ocaml.py 2012-10-20 03:56:02.000000000 +0000 @@ -0,0 +1,225 @@ +#! /usr/bin/env python +# encoding: utf-8 + +import os,re +import TaskGen,Utils,Task,Build +from Logs import error +from TaskGen import taskgen,feature,before,after,extension +EXT_MLL=['.mll'] +EXT_MLY=['.mly'] +EXT_MLI=['.mli'] +EXT_MLC=['.c'] +EXT_ML=['.ml'] +open_re=re.compile('^\s*open\s+([a-zA-Z]+)(;;){0,1}$',re.M) +foo=re.compile(r"""(\(\*)|(\*\))|("(\\.|[^"\\])*"|'(\\.|[^'\\])*'|.[^()*"'\\]*)""",re.M) +def filter_comments(txt): + meh=[0] + def repl(m): + if m.group(1):meh[0]+=1 + elif m.group(2):meh[0]-=1 + elif not meh[0]:return m.group(0) + return'' + return foo.sub(repl,txt) +def scan(self): + node=self.inputs[0] + code=filter_comments(node.read(self.env)) + global open_re + names=[] + import_iterator=open_re.finditer(code) + if import_iterator: + for import_match in import_iterator: + names.append(import_match.group(1)) + found_lst=[] + raw_lst=[] + for name in names: + nd=None + for x in self.incpaths: + nd=x.find_resource(name.lower()+'.ml') + if not nd:nd=x.find_resource(name+'.ml') + if nd: + found_lst.append(nd) + break + else: + raw_lst.append(name) + return(found_lst,raw_lst) +native_lst=['native','all','c_object'] +bytecode_lst=['bytecode','all'] +class ocaml_taskgen(TaskGen.task_gen): + def __init__(self,*k,**kw): + TaskGen.task_gen.__init__(self,*k,**kw) +def init_ml(self): + Utils.def_attrs(self,type='all',incpaths_lst=[],bld_incpaths_lst=[],mlltasks=[],mlytasks=[],mlitasks=[],native_tasks=[],bytecode_tasks=[],linktasks=[],bytecode_env=None,native_env=None,compiled_tasks=[],includes='',uselib='',are_deps_set=0) +def init_envs_ml(self): + self.islibrary=getattr(self,'islibrary',False) + global native_lst,bytecode_lst + self.native_env=None + if self.type in native_lst: + self.native_env=self.env.copy() + if self.islibrary:self.native_env['OCALINKFLAGS']='-a' + self.bytecode_env=None + if self.type in bytecode_lst: + self.bytecode_env=self.env.copy() + if self.islibrary:self.bytecode_env['OCALINKFLAGS']='-a' + if self.type=='c_object': + self.native_env.append_unique('OCALINKFLAGS_OPT','-output-obj') +def apply_incpaths_ml(self): + inc_lst=self.includes.split() + lst=self.incpaths_lst + for dir in inc_lst: + node=self.path.find_dir(dir) + if not node: + error("node not found: "+str(dir)) + continue + self.bld.rescan(node) + if not node in lst:lst.append(node) + self.bld_incpaths_lst.append(node) +def apply_vars_ml(self): + for i in self.incpaths_lst: + if self.bytecode_env: + app=self.bytecode_env.append_value + app('OCAMLPATH','-I') + app('OCAMLPATH',i.srcpath(self.env)) + app('OCAMLPATH','-I') + app('OCAMLPATH',i.bldpath(self.env)) + if self.native_env: + app=self.native_env.append_value + app('OCAMLPATH','-I') + app('OCAMLPATH',i.bldpath(self.env)) + app('OCAMLPATH','-I') + app('OCAMLPATH',i.srcpath(self.env)) + varnames=['INCLUDES','OCAMLFLAGS','OCALINKFLAGS','OCALINKFLAGS_OPT'] + for name in self.uselib.split(): + for vname in varnames: + cnt=self.env[vname+'_'+name] + if cnt: + if self.bytecode_env:self.bytecode_env.append_value(vname,cnt) + if self.native_env:self.native_env.append_value(vname,cnt) +def apply_link_ml(self): + if self.bytecode_env: + ext=self.islibrary and'.cma'or'.run' + linktask=self.create_task('ocalink') + linktask.bytecode=1 + linktask.set_outputs(self.path.find_or_declare(self.target+ext)) + linktask.obj=self + linktask.env=self.bytecode_env + self.linktasks.append(linktask) + if self.native_env: + if self.type=='c_object':ext='.o' + elif self.islibrary:ext='.cmxa' + else:ext='' + linktask=self.create_task('ocalinkx') + linktask.set_outputs(self.path.find_or_declare(self.target+ext)) + linktask.obj=self + linktask.env=self.native_env + self.linktasks.append(linktask) + self.compiled_tasks.append(linktask) +def mll_hook(self,node): + mll_task=self.create_task('ocamllex',node,node.change_ext('.ml'),env=self.native_env) + self.mlltasks.append(mll_task) + self.allnodes.append(mll_task.outputs[0]) +def mly_hook(self,node): + mly_task=self.create_task('ocamlyacc',node,[node.change_ext('.ml'),node.change_ext('.mli')],env=self.native_env) + self.mlytasks.append(mly_task) + self.allnodes.append(mly_task.outputs[0]) + task=self.create_task('ocamlcmi',mly_task.outputs[1],mly_task.outputs[1].change_ext('.cmi'),env=self.native_env) +def mli_hook(self,node): + task=self.create_task('ocamlcmi',node,node.change_ext('.cmi'),env=self.native_env) + self.mlitasks.append(task) +def mlc_hook(self,node): + task=self.create_task('ocamlcc',node,node.change_ext('.o'),env=self.native_env) + self.compiled_tasks.append(task) +def ml_hook(self,node): + if self.native_env: + task=self.create_task('ocamlx',node,node.change_ext('.cmx'),env=self.native_env) + task.obj=self + task.incpaths=self.bld_incpaths_lst + self.native_tasks.append(task) + if self.bytecode_env: + task=self.create_task('ocaml',node,node.change_ext('.cmo'),env=self.bytecode_env) + task.obj=self + task.bytecode=1 + task.incpaths=self.bld_incpaths_lst + self.bytecode_tasks.append(task) +def compile_may_start(self): + if not getattr(self,'flag_deps',''): + self.flag_deps=1 + if getattr(self,'bytecode',''):alltasks=self.obj.bytecode_tasks + else:alltasks=self.obj.native_tasks + self.signature() + tree=self.generator.bld + env=self.env + for node in self.inputs: + lst=tree.node_deps[self.unique_id()] + for depnode in lst: + for t in alltasks: + if t==self:continue + if depnode in t.inputs: + self.set_run_after(t) + delattr(self,'cache_sig') + self.signature() + return Task.Task.runnable_status(self) +b=Task.simple_task_type +cls=b('ocamlx','${OCAMLOPT} ${OCAMLPATH} ${OCAMLFLAGS} ${INCLUDES} -c -o ${TGT} ${SRC}',color='GREEN',shell=False) +cls.runnable_status=compile_may_start +cls.scan=scan +b=Task.simple_task_type +cls=b('ocaml','${OCAMLC} ${OCAMLPATH} ${OCAMLFLAGS} ${INCLUDES} -c -o ${TGT} ${SRC}',color='GREEN',shell=False) +cls.runnable_status=compile_may_start +cls.scan=scan +b('ocamlcmi','${OCAMLC} ${OCAMLPATH} ${INCLUDES} -o ${TGT} -c ${SRC}',color='BLUE',before="ocaml ocamlcc ocamlx") +b('ocamlcc','cd ${TGT[0].bld_dir(env)} && ${OCAMLOPT} ${OCAMLFLAGS} ${OCAMLPATH} ${INCLUDES} -c ${SRC[0].abspath(env)}',color='GREEN') +b('ocamllex','${OCAMLLEX} ${SRC} -o ${TGT}',color='BLUE',before="ocamlcmi ocaml ocamlcc") +b('ocamlyacc','${OCAMLYACC} -b ${TGT[0].bld_base(env)} ${SRC}',color='BLUE',before="ocamlcmi ocaml ocamlcc") +def link_may_start(self): + if not getattr(self,'order',''): + if getattr(self,'bytecode',0):alltasks=self.obj.bytecode_tasks + else:alltasks=self.obj.native_tasks + seen=[] + pendant=[]+alltasks + while pendant: + task=pendant.pop(0) + if task in seen:continue + for x in task.run_after: + if not x in seen: + pendant.append(task) + break + else: + seen.append(task) + self.inputs=[x.outputs[0]for x in seen] + self.order=1 + return Task.Task.runnable_status(self) +act=b('ocalink','${OCAMLC} -o ${TGT} ${INCLUDES} ${OCALINKFLAGS} ${SRC}',color='YELLOW',after="ocaml ocamlcc") +act.runnable_status=link_may_start +act=b('ocalinkx','${OCAMLOPT} -o ${TGT} ${INCLUDES} ${OCALINKFLAGS_OPT} ${SRC}',color='YELLOW',after="ocamlx ocamlcc") +act.runnable_status=link_may_start +def detect(conf): + opt=conf.find_program('ocamlopt',var='OCAMLOPT') + occ=conf.find_program('ocamlc',var='OCAMLC') + if(not opt)or(not occ): + conf.fatal('The objective caml compiler was not found:\ninstall it or make it available in your PATH') + v=conf.env + v['OCAMLC']=occ + v['OCAMLOPT']=opt + v['OCAMLLEX']=conf.find_program('ocamllex',var='OCAMLLEX') + v['OCAMLYACC']=conf.find_program('ocamlyacc',var='OCAMLYACC') + v['OCAMLFLAGS']='' + v['OCAMLLIB']=Utils.cmd_output(conf.env['OCAMLC']+' -where').strip()+os.sep + v['LIBPATH_OCAML']=Utils.cmd_output(conf.env['OCAMLC']+' -where').strip()+os.sep + v['CPPPATH_OCAML']=Utils.cmd_output(conf.env['OCAMLC']+' -where').strip()+os.sep + v['LIB_OCAML']='camlrun' + +feature('ocaml')(init_ml) +feature('ocaml')(init_envs_ml) +after('init_ml')(init_envs_ml) +feature('ocaml')(apply_incpaths_ml) +before('apply_vars_ml')(apply_incpaths_ml) +after('init_envs_ml')(apply_incpaths_ml) +feature('ocaml')(apply_vars_ml) +before('apply_core')(apply_vars_ml) +feature('ocaml')(apply_link_ml) +after('apply_core')(apply_link_ml) +extension(EXT_MLL)(mll_hook) +extension(EXT_MLY)(mly_hook) +extension(EXT_MLI)(mli_hook) +extension(EXT_MLC)(mlc_hook) +extension(EXT_ML)(ml_hook) diff -Nru guitarix-0.22.4/wafadmin3/Tools/osx.py guitarix-0.24.2/wafadmin3/Tools/osx.py --- guitarix-0.22.4/wafadmin3/Tools/osx.py 1970-01-01 00:00:00.000000000 +0000 +++ guitarix-0.24.2/wafadmin3/Tools/osx.py 2012-10-20 03:56:02.000000000 +0000 @@ -0,0 +1,138 @@ +#! /usr/bin/env python +# encoding: utf-8 + +import os,shutil,sys,platform +import TaskGen,Task,Build,Options,Utils +from TaskGen import taskgen,feature,after,before +from Logs import error,debug +app_info=''' + + + + + CFBundlePackageType + APPL + CFBundleGetInfoString + Created by Waf + CFBundleSignature + ???? + NOTE + THIS IS A GENERATED FILE, DO NOT MODIFY + CFBundleExecutable + %s + + +''' +def set_macosx_deployment_target(self): + if self.env['MACOSX_DEPLOYMENT_TARGET']: + os.environ['MACOSX_DEPLOYMENT_TARGET']=self.env['MACOSX_DEPLOYMENT_TARGET'] + elif'MACOSX_DEPLOYMENT_TARGET'not in os.environ: + if sys.platform=='darwin': + os.environ['MACOSX_DEPLOYMENT_TARGET']='.'.join(platform.mac_ver()[0].split('.')[:2]) +def apply_framework(self): + for x in self.to_list(self.env['FRAMEWORKPATH']): + frameworkpath_st='-F%s' + self.env.append_unique('CXXFLAGS',frameworkpath_st%x) + self.env.append_unique('CCFLAGS',frameworkpath_st%x) + self.env.append_unique('LINKFLAGS',frameworkpath_st%x) + for x in self.to_list(self.env['FRAMEWORK']): + self.env.append_value('LINKFLAGS',['-framework',x]) +def create_bundle_dirs(self,name,out): + bld=self.bld + dir=out.parent.get_dir(name) + if not dir: + dir=out.__class__(name,out.parent,1) + bld.rescan(dir) + contents=out.__class__('Contents',dir,1) + bld.rescan(contents) + macos=out.__class__('MacOS',contents,1) + bld.rescan(macos) + return dir +def bundle_name_for_output(out): + name=out.name + k=name.rfind('.') + if k>=0: + name=name[:k]+'.app' + else: + name=name+'.app' + return name +def create_task_macapp(self): + if self.env['MACAPP']or getattr(self,'mac_app',False): + apptask=self.create_task('macapp') + apptask.set_inputs(self.link_task.outputs) + out=self.link_task.outputs[0] + name=bundle_name_for_output(out) + dir=self.create_bundle_dirs(name,out) + n1=dir.find_or_declare(['Contents','MacOS',out.name]) + apptask.set_outputs([n1]) + apptask.chmod=0755 + apptask.install_path=os.path.join(self.install_path,name,'Contents','MacOS') + self.apptask=apptask +def create_task_macplist(self): + if self.env['MACAPP']or getattr(self,'mac_app',False): + if not getattr(self,'mac_plist',False): + self.mac_plist=app_info + plisttask=self.create_task('macplist') + plisttask.set_inputs(self.link_task.outputs) + out=self.link_task.outputs[0] + self.mac_plist=self.mac_plist%(out.name) + name=bundle_name_for_output(out) + dir=self.create_bundle_dirs(name,out) + n1=dir.find_or_declare(['Contents','Info.plist']) + plisttask.set_outputs([n1]) + plisttask.mac_plist=self.mac_plist + plisttask.install_path=os.path.join(self.install_path,name,'Contents') + self.plisttask=plisttask +def apply_link_osx(self): + name=self.link_task.outputs[0].name + if not self.install_path: + return + if getattr(self,'vnum',None): + name=name.replace('.dylib','.%s.dylib'%self.vnum) + path=os.path.join(Utils.subst_vars(self.install_path,self.env),name) + if'-dynamiclib'in self.env['LINKFLAGS']: + self.env.append_value('LINKFLAGS','-install_name') + self.env.append_value('LINKFLAGS',path) +def apply_bundle(self): + if not('cshlib'in self.features or'shlib'in self.features):return + if self.env['MACBUNDLE']or getattr(self,'mac_bundle',False): + self.env['shlib_PATTERN']=self.env['macbundle_PATTERN'] + uselib=self.uselib=self.to_list(self.uselib) + if not'MACBUNDLE'in uselib:uselib.append('MACBUNDLE') +def apply_bundle_remove_dynamiclib(self): + if self.env['MACBUNDLE']or getattr(self,'mac_bundle',False): + if not getattr(self,'vnum',None): + try: + self.env['LINKFLAGS'].remove('-dynamiclib') + except ValueError: + pass +app_dirs=['Contents','Contents/MacOS','Contents/Resources'] +def app_build(task): + env=task.env + shutil.copy2(task.inputs[0].srcpath(env),task.outputs[0].abspath(env)) + return 0 +def plist_build(task): + env=task.env + f=open(task.outputs[0].abspath(env),"w") + f.write(task.mac_plist) + f.close() + return 0 +Task.task_type_from_func('macapp',vars=[],func=app_build,after="cxx_link cc_link static_link") +Task.task_type_from_func('macplist',vars=[],func=plist_build,after="cxx_link cc_link static_link") + +feature('cc','cxx')(set_macosx_deployment_target) +before('apply_lib_vars')(set_macosx_deployment_target) +feature('cc','cxx')(apply_framework) +after('apply_lib_vars')(apply_framework) +taskgen(create_bundle_dirs) +taskgen(create_task_macapp) +after('apply_link')(create_task_macapp) +feature('cprogram')(create_task_macapp) +after('apply_link')(create_task_macplist) +feature('cprogram')(create_task_macplist) +after('apply_link')(apply_link_osx) +feature('cshlib')(apply_link_osx) +before('apply_link','apply_lib_vars')(apply_bundle) +feature('cc','cxx')(apply_bundle) +after('apply_link')(apply_bundle_remove_dynamiclib) +feature('cshlib')(apply_bundle_remove_dynamiclib) diff -Nru guitarix-0.22.4/wafadmin3/Tools/perl.py guitarix-0.24.2/wafadmin3/Tools/perl.py --- guitarix-0.22.4/wafadmin3/Tools/perl.py 1970-01-01 00:00:00.000000000 +0000 +++ guitarix-0.24.2/wafadmin3/Tools/perl.py 2012-10-20 03:56:02.000000000 +0000 @@ -0,0 +1,69 @@ +#! /usr/bin/env python +# encoding: utf-8 + +import os +import Task,Options,Utils +from Configure import conf +from TaskGen import extension,taskgen,feature,before +xsubpp_str='${PERL} ${XSUBPP} -noprototypes -typemap ${EXTUTILS_TYPEMAP} ${SRC} > ${TGT}' +EXT_XS=['.xs'] +def init_perlext(self): + self.uselib=self.to_list(getattr(self,'uselib','')) + if not'PERL'in self.uselib:self.uselib.append('PERL') + if not'PERLEXT'in self.uselib:self.uselib.append('PERLEXT') + self.env['shlib_PATTERN']=self.env['perlext_PATTERN'] +def xsubpp_file(self,node): + outnode=node.change_ext('.c') + self.create_task('xsubpp',node,outnode) + self.allnodes.append(outnode) +Task.simple_task_type('xsubpp',xsubpp_str,color='BLUE',before='cc cxx',shell=False) +def check_perl_version(conf,minver=None): + if getattr(Options.options,'perlbinary',None): + conf.env.PERL=Options.options.perlbinary + else: + conf.find_program('perl',var='PERL',mandatory=True) + try: + version=Utils.cmd_output([conf.env.PERL,'-e','printf "%vd",$^V']) + except: + conf.fatal('could not determine the perl version') + conf.env.PERL_VERSION=version + cver='' + if minver: + try: + ver=tuple(map(int,version.split('.'))) + except: + conf.fatal('unsupported perl version %r'%version) + if ver",r'#~\|^[]{}')] +chr_esc={'0':0,'a':7,'b':8,'t':9,'n':10,'f':11,'v':12,'r':13,'\\':92,"'":39} +NUM='i' +OP='O' +IDENT='T' +STR='s' +CHAR='c' +tok_types=[NUM,STR,IDENT,OP] +exp_types=[r"""0[xX](?P[a-fA-F0-9]+)(?P[uUlL]*)|L*?'(?P(\\.|[^\\'])+)'|(?P\d+)[Ee](?P[+-]*?\d+)(?P[fFlL]*)|(?P\d*\.\d+)([Ee](?P[+-]*?\d+))?(?P[fFlL]*)|(?P\d+\.\d*)([Ee](?P[+-]*?\d+))?(?P[fFlL]*)|(?P0*)(?P\d+)(?P[uUlL]*)""",r'L?"([^"\\]|\\.)*"',r'[a-zA-Z_]\w*',r'%:%:|<<=|>>=|\.\.\.|<<|<%|<:|<=|>>|>=|\+\+|\+=|--|->|-=|\*=|/=|%:|%=|%>|==|&&|&=|\|\||\|=|\^=|:>|!=|##|[\(\)\{\}\[\]<>\?\|\^\*\+&=:!#;,%/\-\?\~\.]',] +re_clexer=re.compile('|'.join(["(?P<%s>%s)"%(name,part)for name,part in zip(tok_types,exp_types)]),re.M) +accepted='a' +ignored='i' +undefined='u' +skipped='s' +def repl(m): + s=m.group(1) + if s is not None:return' ' + s=m.group(3) + if s is None:return'' + return s +def filter_comments(filename): + code=Utils.readf(filename) + if use_trigraphs: + for(a,b)in trig_def:code=code.split(a).join(b) + code=re_nl.sub('',code) + code=re_cpp.sub(repl,code) + return[(m.group(2),m.group(3))for m in re.finditer(re_lines,code)] +prec={} +ops=['* / %','+ -','<< >>','< <= >= >','== !=','& | ^','&& ||',','] +for x in range(len(ops)): + syms=ops[x] + for u in syms.split(): + prec[u]=x +def reduce_nums(val_1,val_2,val_op): + try:a=0+val_1 + except TypeError:a=int(val_1) + try:b=0+val_2 + except TypeError:b=int(val_2) + d=val_op + if d=='%':c=a%b + elif d=='+':c=a+b + elif d=='-':c=a-b + elif d=='*':c=a*b + elif d=='/':c=a/b + elif d=='^':c=a^b + elif d=='|':c=a|b + elif d=='||':c=int(a or b) + elif d=='&':c=a&b + elif d=='&&':c=int(a and b) + elif d=='==':c=int(a==b) + elif d=='!=':c=int(a!=b) + elif d=='<=':c=int(a<=b) + elif d=='<':c=int(a':c=int(a>b) + elif d=='>=':c=int(a>=b) + elif d=='^':c=int(a^b) + elif d=='<<':c=a<>':c=a>>b + else:c=0 + return c +def get_num(lst): + if not lst:raise PreprocError("empty list for get_num") + (p,v)=lst[0] + if p==OP: + if v=='(': + count_par=1 + i=1 + while i=prec[v]: + num2=reduce_nums(num,num2,v) + return get_term([(NUM,num2)]+lst) + else: + num3,lst=get_num(lst[1:]) + num3=reduce_nums(num2,num3,v2) + return get_term([(NUM,num),(p,v),(NUM,num3)]+lst) + raise PreprocError("cannot reduce %r"%lst) +def reduce_eval(lst): + num,lst=get_term(lst) + return(NUM,num) +def stringize(lst): + lst=[str(v2)for(p2,v2)in lst] + return"".join(lst) +def paste_tokens(t1,t2): + p1=None + if t1[0]==OP and t2[0]==OP: + p1=OP + elif t1[0]==IDENT and(t2[0]==IDENT or t2[0]==NUM): + p1=IDENT + elif t1[0]==NUM and t2[0]==NUM: + p1=NUM + if not p1: + raise PreprocError('tokens do not make a valid paste %r and %r'%(t1,t2)) + return(p1,t1[1]+t2[1]) +def reduce_tokens(lst,defs,ban=[]): + i=0 + while i=len(lst): + raise PreprocError("expected '(' after %r (got nothing)"%v) + (p2,v2)=lst[i] + if p2!=OP or v2!='(': + raise PreprocError("expected '(' after %r"%v) + del lst[i] + one_param=[] + count_paren=0 + while i1: + (p3,v3)=accu[-1] + (p4,v4)=accu[-2] + if v3=='##': + accu.pop() + if v4==','and pt.*)>|"(?P.*)")') +def extract_include(txt,defs): + m=re_include.search(txt) + if m: + if m.group('a'):return'<',m.group('a') + if m.group('b'):return'"',m.group('b') + toks=tokenize(txt) + reduce_tokens(toks,defs,['waf_include']) + if not toks: + raise PreprocError("could not parse include %s"%txt) + if len(toks)==1: + if toks[0][0]==STR: + return'"',toks[0][1] + else: + if toks[0][1]=='<'and toks[-1][1]=='>': + return stringize(toks).lstrip('<').rstrip('>') + raise PreprocError("could not parse include %s."%txt) +def parse_char(txt): + if not txt:raise PreprocError("attempted to parse a null char") + if txt[0]!='\\': + return ord(txt) + c=txt[1] + if c=='x': + if len(txt)==4 and txt[3]in string.hexdigits:return int(txt[2:],16) + return int(txt[2:],16) + elif c.isdigit(): + if c=='0'and len(txt)==2:return 0 + for i in 3,2,1: + if len(txt)>i and txt[1:1+i].isdigit(): + return(1+i,int(txt[1:1+i],8)) + else: + try:return chr_esc[c] + except KeyError:raise PreprocError("could not parse char literal '%s'"%txt) +def tokenize(s): + ret=[] + for match in re_clexer.finditer(s): + m=match.group + for name in tok_types: + v=m(name) + if v: + if name==IDENT: + try:v=g_optrans[v];name=OP + except KeyError: + if v.lower()=="true": + v=1 + name=NUM + elif v.lower()=="false": + v=0 + name=NUM + elif name==NUM: + if m('oct'):v=int(v,8) + elif m('hex'):v=int(m('hex'),16) + elif m('n0'):v=m('n0') + else: + v=m('char') + if v:v=parse_char(v) + else:v=m('n2')or m('n4') + elif name==OP: + if v=='%:':v='#' + elif v=='%:%:':v='##' + elif name==STR: + v=v[1:-1] + ret.append((name,v)) + break + return ret +class c_parser(object): + def __init__(self,nodepaths=None,defines=None): + self.lines=[] + if defines is None: + self.defs={} + else: + self.defs=dict(defines) + self.state=[] + self.env=None + self.count_files=0 + self.currentnode_stack=[] + self.nodepaths=nodepaths or[] + self.nodes=[] + self.names=[] + self.curfile='' + self.ban_includes=[] + def tryfind(self,filename): + self.curfile=filename + found=self.currentnode_stack[-1].find_resource(filename) + for n in self.nodepaths: + if found: + break + found=n.find_resource(filename) + if not found: + if not filename in self.names: + self.names.append(filename) + else: + self.nodes.append(found) + if filename[-4:]!='.moc': + self.addlines(found) + return found + def addlines(self,node): + self.currentnode_stack.append(node.parent) + filepath=node.abspath(self.env) + self.count_files+=1 + if self.count_files>recursion_limit:raise PreprocError("recursion limit exceeded") + pc=self.parse_cache + debug('preproc: reading file %r',filepath) + try: + lns=pc[filepath] + except KeyError: + pass + else: + self.lines=lns+self.lines + return + try: + lines=filter_comments(filepath) + lines.append((POPFILE,'')) + pc[filepath]=lines + self.lines=lines+self.lines + except IOError: + raise PreprocError("could not read the file %s"%filepath) + except Exception: + if Logs.verbose>0: + error("parsing %s failed"%filepath) + traceback.print_exc() + def start(self,node,env): + debug('preproc: scanning %s (in %s)',node.name,node.parent.name) + self.env=env + variant=node.variant(env) + bld=node.__class__.bld + try: + self.parse_cache=bld.parse_cache + except AttributeError: + bld.parse_cache={} + self.parse_cache=bld.parse_cache + self.addlines(node) + if env['DEFLINES']: + self.lines=[('define',x)for x in env['DEFLINES']]+self.lines + while self.lines: + (kind,line)=self.lines.pop(0) + if kind==POPFILE: + self.currentnode_stack.pop() + continue + try: + self.process_line(kind,line) + except Exception as e: + if Logs.verbose: + debug('preproc: line parsing failed (%s): %s %s',e,line,Utils.ex_stack()) + def process_line(self,token,line): + ve=Logs.verbose + if ve:debug('preproc: line is %s - %s state is %s',token,line,self.state) + state=self.state + if token in['ifdef','ifndef','if']: + state.append(undefined) + elif token=='endif': + state.pop() + if not token in['else','elif','endif']: + if skipped in self.state or ignored in self.state: + return + if token=='if': + ret=eval_macro(tokenize(line),self.defs) + if ret:state[-1]=accepted + else:state[-1]=ignored + elif token=='ifdef': + m=re_mac.search(line) + if m and m.group(0)in self.defs:state[-1]=accepted + else:state[-1]=ignored + elif token=='ifndef': + m=re_mac.search(line) + if m and m.group(0)in self.defs:state[-1]=ignored + else:state[-1]=accepted + elif token=='include'or token=='import': + (kind,inc)=extract_include(line,self.defs) + if inc in self.ban_includes:return + if token=='import':self.ban_includes.append(inc) + if ve:debug('preproc: include found %s (%s) ',inc,kind) + if kind=='"'or not strict_quotes: + self.tryfind(inc) + elif token=='elif': + if state[-1]==accepted: + state[-1]=skipped + elif state[-1]==ignored: + if eval_macro(tokenize(line),self.defs): + state[-1]=accepted + elif token=='else': + if state[-1]==accepted:state[-1]=skipped + elif state[-1]==ignored:state[-1]=accepted + elif token=='define': + m=re_mac.search(line) + if m: + name=m.group(0) + if ve:debug('preproc: define %s %s',name,line) + self.defs[name]=line + else: + raise PreprocError("invalid define line %s"%line) + elif token=='undef': + m=re_mac.search(line) + if m and m.group(0)in self.defs: + self.defs.__delitem__(m.group(0)) + elif token=='pragma': + if re_pragma_once.search(line.lower()): + self.ban_includes.append(self.curfile) +def get_deps(node,env,nodepaths=[]): + gruik=c_parser(nodepaths) + gruik.start(node,env) + return(gruik.nodes,gruik.names) +re_inc=re.compile('^[ \t]*(#|%:)[ \t]*(include)[ \t]*(.*)\r*$',re.IGNORECASE|re.MULTILINE) +def lines_includes(filename): + code=Utils.readf(filename) + if use_trigraphs: + for(a,b)in trig_def:code=code.split(a).join(b) + code=re_nl.sub('',code) + code=re_cpp.sub(repl,code) + return[(m.group(2),m.group(3))for m in re.finditer(re_inc,code)] +def get_deps_simple(node,env,nodepaths=[],defines={}): + nodes=[] + names=[] + def find_deps(node): + lst=lines_includes(node.abspath(env)) + for(_,line)in lst: + (t,filename)=extract_include(line,defines) + if filename in names: + continue + if filename.endswith('.moc'): + names.append(filename) + found=None + for n in nodepaths: + if found: + break + found=n.find_resource(filename) + if not found: + if not filename in names: + names.append(filename) + elif not found in nodes: + nodes.append(found) + find_deps(node) + find_deps(node) + return(nodes,names) + diff -Nru guitarix-0.22.4/wafadmin3/Tools/python.py guitarix-0.24.2/wafadmin3/Tools/python.py --- guitarix-0.22.4/wafadmin3/Tools/python.py 1970-01-01 00:00:00.000000000 +0000 +++ guitarix-0.24.2/wafadmin3/Tools/python.py 2012-10-20 03:56:02.000000000 +0000 @@ -0,0 +1,278 @@ +#! /usr/bin/env python +# encoding: utf-8 + +import os,sys +import TaskGen,Utils,Utils,Runner,Options,Build +from Logs import debug,warn,info +from TaskGen import extension,taskgen,before,after,feature +from Configure import conf +EXT_PY=['.py'] +FRAG_2=''' +#include "Python.h" +#ifdef __cplusplus +extern "C" { +#endif + void Py_Initialize(void); + void Py_Finalize(void); +#ifdef __cplusplus +} +#endif +int main() +{ + Py_Initialize(); + Py_Finalize(); + return 0; +} +''' +def init_pyext(self): + self.default_install_path='${PYTHONDIR}' + self.uselib=self.to_list(getattr(self,'uselib','')) + if not'PYEXT'in self.uselib: + self.uselib.append('PYEXT') + self.env['MACBUNDLE']=True +def pyext_shlib_ext(self): + self.env['shlib_PATTERN']=self.env['pyext_PATTERN'] +def init_pyembed(self): + self.uselib=self.to_list(getattr(self,'uselib','')) + if not'PYEMBED'in self.uselib: + self.uselib.append('PYEMBED') +def process_py(self,node): + if not(self.bld.is_install and self.install_path): + return + def inst_py(ctx): + install_pyfile(self,node) + self.bld.add_post_fun(inst_py) +def install_pyfile(self,node): + path=self.bld.get_install_path(self.install_path+os.sep+node.name,self.env) + self.bld.install_files(self.install_path,[node],self.env,self.chmod,postpone=False) + if self.bld.is_install<0: + info("* removing byte compiled python files") + for x in'co': + try: + os.remove(path+x) + except OSError: + pass + if self.bld.is_install>0: + if self.env['PYC']or self.env['PYO']: + info("* byte compiling %r"%path) + if self.env['PYC']: + program=(""" +import sys, py_compile +for pyfile in sys.argv[1:]: + py_compile.compile(pyfile, pyfile + 'c') +""") + argv=[self.env['PYTHON'],'-c',program,path] + ret=Utils.pproc.Popen(argv).wait() + if ret: + raise Utils.WafError('bytecode compilation failed %r'%path) + if self.env['PYO']: + program=(""" +import sys, py_compile +for pyfile in sys.argv[1:]: + py_compile.compile(pyfile, pyfile + 'o') +""") + argv=[self.env['PYTHON'],self.env['PYFLAGS_OPT'],'-c',program,path] + ret=Utils.pproc.Popen(argv).wait() + if ret: + raise Utils.WafError('bytecode compilation failed %r'%path) +class py_taskgen(TaskGen.task_gen): + def __init__(self,*k,**kw): + TaskGen.task_gen.__init__(self,*k,**kw) +def init_py(self): + self.default_install_path='${PYTHONDIR}' +def _get_python_variables(python_exe,variables,imports=['import sys']): + program=list(imports) + program.append('') + for v in variables: + program.append("print(repr(%s))"%v) + os_env=dict(os.environ) + try: + del os_env['MACOSX_DEPLOYMENT_TARGET'] + except KeyError: + pass + proc=Utils.pproc.Popen([python_exe,"-c",'\n'.join(program)],stdout=Utils.pproc.PIPE,env=os_env) + output=proc.communicate()[0].decode("utf-8").split("\n") + if proc.returncode: + if Options.options.verbose: + warn("Python program to extract python configuration variables failed:\n%s"%'\n'.join(["line %03i: %s"%(lineno+1,line)for lineno,line in enumerate(program)])) + raise RuntimeError + return_values=[] + for s in output: + s=s.strip() + if not s: + continue + if s=='None': + return_values.append(None) + elif s[0]=="'"and s[-1]=="'": + return_values.append(s[1:-1]) + elif s[0].isdigit(): + return_values.append(int(s)) + else:break + return return_values +def check_python_headers(conf,mandatory=True): + if not conf.env['CC_NAME']and not conf.env['CXX_NAME']: + conf.fatal('load a compiler first (gcc, g++, ..)') + if not conf.env['PYTHON_VERSION']: + conf.check_python_version() + env=conf.env + python=env['PYTHON'] + if not python: + conf.fatal('could not find the python executable') + if Options.platform=='darwin': + conf.check_tool('osx') + try: + v='prefix SO SYSLIBS LDFLAGS SHLIBS LIBDIR LIBPL INCLUDEPY Py_ENABLE_SHARED MACOSX_DEPLOYMENT_TARGET'.split() + (python_prefix,python_SO,python_SYSLIBS,python_LDFLAGS,python_SHLIBS,python_LIBDIR,python_LIBPL,INCLUDEPY,Py_ENABLE_SHARED,python_MACOSX_DEPLOYMENT_TARGET)=_get_python_variables(python,["get_config_var('%s')"%x for x in v],['from distutils.sysconfig import get_config_var']) + except RuntimeError: + conf.fatal("Python development headers not found (-v for details).") + conf.log.write("""Configuration returned from %r: +python_prefix = %r +python_SO = %r +python_SYSLIBS = %r +python_LDFLAGS = %r +python_SHLIBS = %r +python_LIBDIR = %r +python_LIBPL = %r +INCLUDEPY = %r +Py_ENABLE_SHARED = %r +MACOSX_DEPLOYMENT_TARGET = %r +"""%(python,python_prefix,python_SO,python_SYSLIBS,python_LDFLAGS,python_SHLIBS,python_LIBDIR,python_LIBPL,INCLUDEPY,Py_ENABLE_SHARED,python_MACOSX_DEPLOYMENT_TARGET)) + if python_MACOSX_DEPLOYMENT_TARGET: + conf.env['MACOSX_DEPLOYMENT_TARGET']=python_MACOSX_DEPLOYMENT_TARGET + conf.environ['MACOSX_DEPLOYMENT_TARGET']=python_MACOSX_DEPLOYMENT_TARGET + env['pyext_PATTERN']='%s'+python_SO + if python_SYSLIBS is not None: + for lib in python_SYSLIBS.split(): + if lib.startswith('-l'): + lib=lib[2:] + env.append_value('LIB_PYEMBED',lib) + if python_SHLIBS is not None: + for lib in python_SHLIBS.split(): + if lib.startswith('-l'): + env.append_value('LIB_PYEMBED',lib[2:]) + else: + env.append_value('LINKFLAGS_PYEMBED',lib) + if Options.platform!='darwin'and python_LDFLAGS: + env.append_value('LINKFLAGS_PYEMBED',python_LDFLAGS.split()) + result=False + name='python'+env['PYTHON_VERSION'] + if python_LIBDIR is not None: + path=[python_LIBDIR] + conf.log.write("\n\n# Trying LIBDIR: %r\n"%path) + result=conf.check(lib=name,uselib='PYEMBED',libpath=path) + if not result and python_LIBPL is not None: + conf.log.write("\n\n# try again with -L$python_LIBPL (some systems don't install the python library in $prefix/lib)\n") + path=[python_LIBPL] + result=conf.check(lib=name,uselib='PYEMBED',libpath=path) + if not result: + conf.log.write("\n\n# try again with -L$prefix/libs, and pythonXY name rather than pythonX.Y (win32)\n") + path=[os.path.join(python_prefix,"libs")] + name='python'+env['PYTHON_VERSION'].replace('.','') + result=conf.check(lib=name,uselib='PYEMBED',libpath=path) + if result: + env['LIBPATH_PYEMBED']=path + env.append_value('LIB_PYEMBED',name) + else: + conf.log.write("\n\n### LIB NOT FOUND\n") + if(sys.platform=='win32'or sys.platform.startswith('os2')or sys.platform=='darwin'or Py_ENABLE_SHARED): + env['LIBPATH_PYEXT']=env['LIBPATH_PYEMBED'] + env['LIB_PYEXT']=env['LIB_PYEMBED'] + python_config=conf.find_program('python%s-config'%('.'.join(env['PYTHON_VERSION'].split('.')[:2])),var='PYTHON_CONFIG') + if not python_config: + python_config=conf.find_program('python-config-%s'%('.'.join(env['PYTHON_VERSION'].split('.')[:2])),var='PYTHON_CONFIG') + includes=[] + if python_config: + for incstr in Utils.cmd_output("%s %s --includes"%(python,python_config)).strip().split(): + if(incstr.startswith('-I')or incstr.startswith('/I')): + incstr=incstr[2:] + if incstr not in includes: + includes.append(incstr) + conf.log.write("Include path for Python extensions ""(found via python-config --includes): %r\n"%(includes,)) + env['CPPPATH_PYEXT']=includes + env['CPPPATH_PYEMBED']=includes + else: + conf.log.write("Include path for Python extensions ""(found via distutils module): %r\n"%(INCLUDEPY,)) + env['CPPPATH_PYEXT']=[INCLUDEPY] + env['CPPPATH_PYEMBED']=[INCLUDEPY] + if env['CC_NAME']=='gcc': + env.append_value('CCFLAGS_PYEMBED','-fno-strict-aliasing') + env.append_value('CCFLAGS_PYEXT','-fno-strict-aliasing') + if env['CXX_NAME']=='gcc': + env.append_value('CXXFLAGS_PYEMBED','-fno-strict-aliasing') + env.append_value('CXXFLAGS_PYEXT','-fno-strict-aliasing') + conf.check(define_name='HAVE_PYTHON_H',uselib='PYEMBED',fragment=FRAG_2,errmsg='Could not find the python development headers',mandatory=mandatory) +def check_python_version(conf,minver=None): + assert minver is None or isinstance(minver,tuple) + python=conf.env['PYTHON'] + if not python: + conf.fatal('could not find the python executable') + cmd=[python,"-c","import sys\nfor x in sys.version_info: print(str(x))"] + debug('python: Running python command %r'%cmd) + proc=Utils.pproc.Popen(cmd,stdout=Utils.pproc.PIPE) + lines=proc.communicate()[0].decode("utf-8").split() + assert len(lines)==5,"found %i lines, expected 5: %r"%(len(lines),lines) + pyver_tuple=(int(lines[0]),int(lines[1]),int(lines[2]),lines[3],int(lines[4])) + result=(minver is None)or(pyver_tuple>=minver) + if result: + pyver='.'.join([str(x)for x in pyver_tuple[:2]]) + conf.env['PYTHON_VERSION']=pyver + if'PYTHONDIR'in conf.environ: + pydir=conf.environ['PYTHONDIR'] + else: + if sys.platform=='win32': + (python_LIBDEST,pydir)=_get_python_variables(python,["get_config_var('LIBDEST')","get_python_lib(standard_lib=0, prefix=%r)"%conf.env['PREFIX']],['from distutils.sysconfig import get_config_var, get_python_lib']) + else: + python_LIBDEST=None + (pydir,)=_get_python_variables(python,["get_python_lib(standard_lib=0, prefix=%r)"%conf.env['PREFIX']],['from distutils.sysconfig import get_config_var, get_python_lib']) + if python_LIBDEST is None: + if conf.env['LIBDIR']: + python_LIBDEST=os.path.join(conf.env['LIBDIR'],"python"+pyver) + else: + python_LIBDEST=os.path.join(conf.env['PREFIX'],"lib","python"+pyver) + if hasattr(conf,'define'): + conf.define('PYTHONDIR',pydir) + conf.env['PYTHONDIR']=pydir + pyver_full='.'.join(map(str,pyver_tuple[:3])) + if minver is None: + conf.check_message_custom('Python version','',pyver_full) + else: + minver_str='.'.join(map(str,minver)) + conf.check_message('Python version',">= %s"%minver_str,result,option=pyver_full) + if not result: + conf.fatal('The python version is too old (%r)'%pyver_full) +def check_python_module(conf,module_name): + result=not Utils.pproc.Popen([conf.env['PYTHON'],"-c","import %s"%module_name],stderr=Utils.pproc.PIPE,stdout=Utils.pproc.PIPE).wait() + conf.check_message('Python module',module_name,result) + if not result: + conf.fatal('Could not find the python module %r'%module_name) +def detect(conf): + if not conf.env.PYTHON: + conf.env.PYTHON=sys.executable + python=conf.find_program('python',var='PYTHON') + if not python: + conf.fatal('Could not find the path of the python executable') + v=conf.env + v['PYCMD']='"import sys, py_compile;py_compile.compile(sys.argv[1], sys.argv[2])"' + v['PYFLAGS']='' + v['PYFLAGS_OPT']='-O' + v['PYC']=getattr(Options.options,'pyc',1) + v['PYO']=getattr(Options.options,'pyo',1) +def set_options(opt): + opt.add_option('--nopyc',action='store_false',default=1,help='Do not install bytecode compiled .pyc files (configuration) [Default:install]',dest='pyc') + opt.add_option('--nopyo',action='store_false',default=1,help='Do not install optimised compiled .pyo files (configuration) [Default:install]',dest='pyo') + +before('apply_incpaths','apply_lib_vars','apply_type_vars')(init_pyext) +feature('pyext')(init_pyext) +before('apply_bundle')(init_pyext) +before('apply_link','apply_lib_vars','apply_type_vars')(pyext_shlib_ext) +after('apply_bundle')(pyext_shlib_ext) +feature('pyext')(pyext_shlib_ext) +before('apply_incpaths','apply_lib_vars','apply_type_vars')(init_pyembed) +feature('pyembed')(init_pyembed) +extension(EXT_PY)(process_py) +before('apply_core')(init_py) +after('vars_target_cprogram','vars_target_cshlib')(init_py) +feature('py')(init_py) +conf(check_python_headers) +conf(check_python_version) +conf(check_python_module) diff -Nru guitarix-0.22.4/wafadmin3/Tools/qt4.py guitarix-0.24.2/wafadmin3/Tools/qt4.py --- guitarix-0.22.4/wafadmin3/Tools/qt4.py 1970-01-01 00:00:00.000000000 +0000 +++ guitarix-0.24.2/wafadmin3/Tools/qt4.py 2012-10-20 03:56:02.000000000 +0000 @@ -0,0 +1,376 @@ +#! /usr/bin/env python +# encoding: utf-8 + +try: + from xml.sax import make_parser + from xml.sax.handler import ContentHandler +except ImportError: + has_xml=False + ContentHandler=object +else: + has_xml=True +import os,sys +import ccroot,cxx +import TaskGen,Task,Utils,Runner,Options,Node,Configure +from TaskGen import taskgen,feature,after,extension +from Logs import error +from Constants import* +MOC_H=['.h','.hpp','.hxx','.hh'] +EXT_RCC=['.qrc'] +EXT_UI=['.ui'] +EXT_QT4=['.cpp','.cc','.cxx','.C'] +class qxx_task(Task.Task): + before=['cxx_link','static_link'] + def __init__(self,*k,**kw): + Task.Task.__init__(self,*k,**kw) + self.moc_done=0 + def scan(self): + (nodes,names)=ccroot.scan(self) + for x in nodes: + if x.name.endswith('.moc'): + nodes.remove(x) + names.append(x.relpath_gen(self.inputs[0].parent)) + return(nodes,names) + def runnable_status(self): + if self.moc_done: + for t in self.run_after: + if not t.hasrun: + return ASK_LATER + self.signature() + return Task.Task.runnable_status(self) + else: + for t in self.run_after: + if not t.hasrun: + return ASK_LATER + self.add_moc_tasks() + return ASK_LATER + def add_moc_tasks(self): + node=self.inputs[0] + tree=node.__class__.bld + try: + self.signature() + except KeyError: + pass + else: + delattr(self,'cache_sig') + moctasks=[] + mocfiles=[] + variant=node.variant(self.env) + try: + tmp_lst=tree.raw_deps[self.unique_id()] + tree.raw_deps[self.unique_id()]=[] + except KeyError: + tmp_lst=[] + for d in tmp_lst: + if not d.endswith('.moc'):continue + if d in mocfiles: + error("paranoia owns") + continue + mocfiles.append(d) + base2=d[:-4] + for path in[node.parent]+self.generator.env['INC_PATHS']: + tree.rescan(path) + vals=getattr(Options.options,'qt_header_ext','')or MOC_H + for ex in vals: + h_node=path.find_resource(base2+ex) + if h_node: + break + else: + continue + break + else: + raise Utils.WafError("no header found for %s which is a moc file"%str(d)) + m_node=h_node.change_ext('.moc') + tree.node_deps[(self.inputs[0].parent.id,self.env.variant(),m_node.name)]=h_node + task=Task.TaskBase.classes['moc'](self.env,normal=0) + task.set_inputs(h_node) + task.set_outputs(m_node) + generator=tree.generator + generator.outstanding.insert(0,task) + generator.total+=1 + moctasks.append(task) + tmp_lst=tree.raw_deps[self.unique_id()]=mocfiles + lst=tree.node_deps.get(self.unique_id(),()) + for d in lst: + name=d.name + if name.endswith('.moc'): + task=Task.TaskBase.classes['moc'](self.env,normal=0) + task.set_inputs(tree.node_deps[(self.inputs[0].parent.id,self.env.variant(),name)]) + task.set_outputs(d) + generator=tree.generator + generator.outstanding.insert(0,task) + generator.total+=1 + moctasks.append(task) + self.run_after=moctasks + self.moc_done=1 + run=Task.TaskBase.classes['cxx'].__dict__['run'] +def translation_update(task): + outs=[a.abspath(task.env)for a in task.outputs] + outs=" ".join(outs) + lupdate=task.env['QT_LUPDATE'] + for x in task.inputs: + file=x.abspath(task.env) + cmd="%s %s -ts %s"%(lupdate,file,outs) + Utils.pprint('BLUE',cmd) + task.generator.bld.exec_command(cmd) +class XMLHandler(ContentHandler): + def __init__(self): + self.buf=[] + self.files=[] + def startElement(self,name,attrs): + if name=='file': + self.buf=[] + def endElement(self,name): + if name=='file': + self.files.append(''.join(self.buf)) + def characters(self,cars): + self.buf.append(cars) +def scan(self): + node=self.inputs[0] + parser=make_parser() + curHandler=XMLHandler() + parser.setContentHandler(curHandler) + fi=open(self.inputs[0].abspath(self.env)) + parser.parse(fi) + fi.close() + nodes=[] + names=[] + root=self.inputs[0].parent + for x in curHandler.files: + nd=root.find_resource(x) + if nd:nodes.append(nd) + else:names.append(x) + return(nodes,names) +def create_rcc_task(self,node): + rcnode=node.change_ext('_rc.cpp') + rcctask=self.create_task('rcc',node,rcnode) + cpptask=self.create_task('cxx',rcnode,rcnode.change_ext('.o')) + self.compiled_tasks.append(cpptask) + return cpptask +def create_uic_task(self,node): + uictask=self.create_task('ui4',node) + uictask.outputs=[self.path.find_or_declare(self.env['ui_PATTERN']%node.name[:-3])] + return uictask +class qt4_taskgen(cxx.cxx_taskgen): + def __init__(self,*k,**kw): + cxx.cxx_taskgen.__init__(self,*k,**kw) + self.features.append('qt4') +def add_lang(self,node): + self.lang=self.to_list(getattr(self,'lang',[]))+[node] +def apply_qt4(self): + if getattr(self,'lang',None): + update=getattr(self,'update',None) + lst=[] + trans=[] + for l in self.to_list(self.lang): + if not isinstance(l,Node.Node): + l=self.path.find_resource(l+'.ts') + t=self.create_task('ts2qm',l,l.change_ext('.qm')) + lst.append(t.outputs[0]) + if update: + trans.append(t.inputs[0]) + trans_qt4=getattr(Options.options,'trans_qt4',False) + if update and trans_qt4: + u=Task.TaskCmd(translation_update,self.env,2) + u.inputs=[a.inputs[0]for a in self.compiled_tasks] + u.outputs=trans + if getattr(self,'langname',None): + t=Task.TaskBase.classes['qm2rcc'](self.env) + t.set_inputs(lst) + t.set_outputs(self.path.find_or_declare(self.langname+'.qrc')) + t.path=self.path + k=create_rcc_task(self,t.outputs[0]) + self.link_task.inputs.append(k.outputs[0]) + self.env.append_value('MOC_FLAGS',self.env._CXXDEFFLAGS) + self.env.append_value('MOC_FLAGS',self.env._CXXINCFLAGS) +def cxx_hook(self,node): + try:obj_ext=self.obj_ext + except AttributeError:obj_ext='_%d.o'%self.idx + task=self.create_task('qxx',node,node.change_ext(obj_ext)) + self.compiled_tasks.append(task) + return task +def process_qm2rcc(task): + outfile=task.outputs[0].abspath(task.env) + f=open(outfile,'w') + f.write('\n\n') + for k in task.inputs: + f.write(' ') + f.write(k.path_to_parent(task.path)) + f.write('\n') + f.write('\n') + f.close() +b=Task.simple_task_type +b('moc','${QT_MOC} ${MOC_FLAGS} ${SRC} ${MOC_ST} ${TGT}',color='BLUE',vars=['QT_MOC','MOC_FLAGS'],shell=False) +cls=b('rcc','${QT_RCC} -name ${SRC[0].name} ${SRC[0].abspath(env)} ${RCC_ST} -o ${TGT}',color='BLUE',before='cxx moc qxx_task',after="qm2rcc",shell=False) +cls.scan=scan +b('ui4','${QT_UIC} ${SRC} -o ${TGT}',color='BLUE',before='cxx moc qxx_task',shell=False) +b('ts2qm','${QT_LRELEASE} ${QT_LRELEASE_FLAGS} ${SRC} -qm ${TGT}',color='BLUE',before='qm2rcc',shell=False) +Task.task_type_from_func('qm2rcc',vars=[],func=process_qm2rcc,color='BLUE',before='rcc',after='ts2qm') +def detect_qt4(conf): + env=conf.env + opt=Options.options + qtdir=getattr(opt,'qtdir','') + qtbin=getattr(opt,'qtbin','') + qtlibs=getattr(opt,'qtlibs','') + useframework=getattr(opt,'use_qt4_osxframework',True) + paths=[] + if qtbin: + paths=[qtbin] + if not qtdir: + qtdir=conf.environ.get('QT4_ROOT','') + qtbin=os.path.join(qtdir,'bin') + paths=[qtbin] + if not qtdir: + paths=os.environ.get('PATH','').split(os.pathsep) + paths.append('/usr/share/qt4/bin/') + try: + lst=os.listdir('/usr/local/Trolltech/') + except OSError: + pass + else: + if lst: + lst.sort() + lst.reverse() + qtdir='/usr/local/Trolltech/%s/'%lst[0] + qtbin=os.path.join(qtdir,'bin') + paths.append(qtbin) + cand=None + prev_ver=['4','0','0'] + for qmk in['qmake-qt4','qmake4','qmake']: + qmake=conf.find_program(qmk,path_list=paths) + if qmake: + try: + version=Utils.cmd_output([qmake,'-query','QT_VERSION']).strip() + except ValueError: + pass + else: + if version: + new_ver=version.split('.') + if new_ver>prev_ver: + cand=qmake + prev_ver=new_ver + if cand: + qmake=cand + else: + conf.fatal('could not find qmake for qt4') + conf.env.QMAKE=qmake + qtincludes=Utils.cmd_output([qmake,'-query','QT_INSTALL_HEADERS']).strip() + qtdir=Utils.cmd_output([qmake,'-query','QT_INSTALL_PREFIX']).strip()+os.sep + qtbin=Utils.cmd_output([qmake,'-query','QT_INSTALL_BINS']).strip()+os.sep + if not qtlibs: + try: + qtlibs=Utils.cmd_output([qmake,'-query','QT_INSTALL_LIBS']).strip()+os.sep + except ValueError: + qtlibs=os.path.join(qtdir,'lib') + def find_bin(lst,var): + for f in lst: + ret=conf.find_program(f,path_list=paths) + if ret: + env[var]=ret + break + vars="QtCore QtGui QtUiTools QtNetwork QtOpenGL QtSql QtSvg QtTest QtXml QtWebKit Qt3Support".split() + find_bin(['uic-qt3','uic3'],'QT_UIC3') + find_bin(['uic-qt4','uic'],'QT_UIC') + if not env['QT_UIC']: + conf.fatal('cannot find the uic compiler for qt4') + try: + version=Utils.cmd_output(env['QT_UIC']+" -version 2>&1").strip() + except ValueError: + conf.fatal('your uic compiler is for qt3, add uic for qt4 to your path') + version=version.replace('Qt User Interface Compiler ','') + version=version.replace('User Interface Compiler for Qt','') + if version.find(" 3.")!=-1: + conf.check_message('uic version','(too old)',0,option='(%s)'%version) + sys.exit(1) + conf.check_message('uic version','',1,option='(%s)'%version) + find_bin(['moc-qt4','moc'],'QT_MOC') + find_bin(['rcc'],'QT_RCC') + find_bin(['lrelease-qt4','lrelease'],'QT_LRELEASE') + find_bin(['lupdate-qt4','lupdate'],'QT_LUPDATE') + env['UIC3_ST']='%s -o %s' + env['UIC_ST']='%s -o %s' + env['MOC_ST']='-o' + env['ui_PATTERN']='ui_%s.h' + env['QT_LRELEASE_FLAGS']=['-silent'] + vars_debug=[a+'_debug'for a in vars] + try: + conf.find_program('pkg-config',var='pkgconfig',path_list=paths,mandatory=True) + except Configure.ConfigurationError: + for lib in vars_debug+vars: + uselib=lib.upper() + d=(lib.find('_debug')>0)and'd'or'' + for(pat,kind)in((conf.env.staticlib_PATTERN,'STATIC'),(conf.env.shlib_PATTERN,'')): + conf.check_message_1('Checking for %s %s'%(lib,kind)) + for ext in['','4']: + path=os.path.join(qtlibs,pat%(lib+d+ext)) + if os.path.exists(path): + env.append_unique(kind+'LIB_'+uselib,lib+d+ext) + conf.check_message_2('ok '+path,'GREEN') + break + path=os.path.join(qtbin,pat%(lib+d+ext)) + if os.path.exists(path): + env.append_unique(kind+'LIB_'+uselib,lib+d+ext) + conf.check_message_2('ok '+path,'GREEN') + break + else: + conf.check_message_2('not found','YELLOW') + continue + break + env.append_unique('LIBPATH_'+uselib,qtlibs) + env.append_unique('CPPPATH_'+uselib,qtincludes) + env.append_unique('CPPPATH_'+uselib,qtincludes+os.sep+lib) + else: + for i in vars_debug+vars: + try: + conf.check_cfg(package=i,args='--cflags --libs --silence-errors',path=conf.env.pkgconfig) + except ValueError: + pass + def process_lib(vars_,coreval): + for d in vars_: + var=d.upper() + if var=='QTCORE':continue + value=env['LIBPATH_'+var] + if value: + core=env[coreval] + accu=[] + for lib in value: + if lib in core:continue + accu.append(lib) + env['LIBPATH_'+var]=accu + process_lib(vars,'LIBPATH_QTCORE') + process_lib(vars_debug,'LIBPATH_QTCORE_DEBUG') + want_rpath=getattr(Options.options,'want_rpath',1) + if want_rpath: + def process_rpath(vars_,coreval): + for d in vars_: + var=d.upper() + value=env['LIBPATH_'+var] + if value: + core=env[coreval] + accu=[] + for lib in value: + if var!='QTCORE': + if lib in core: + continue + accu.append('-Wl,--rpath='+lib) + env['RPATH_'+var]=accu + process_rpath(vars,'LIBPATH_QTCORE') + process_rpath(vars_debug,'LIBPATH_QTCORE_DEBUG') + env['QTLOCALE']=str(env['PREFIX'])+'/share/locale' +def detect(conf): + detect_qt4(conf) +def set_options(opt): + opt.add_option('--want-rpath',type='int',default=1,dest='want_rpath',help='set rpath to 1 or 0 [Default 1]') + opt.add_option('--header-ext',type='string',default='',help='header extension for moc files',dest='qt_header_ext') + for i in'qtdir qtbin qtlibs'.split(): + opt.add_option('--'+i,type='string',default='',dest=i) + if sys.platform=="darwin": + opt.add_option('--no-qt4-framework',action="store_false",help='do not use the framework version of Qt4 in OS X',dest='use_qt4_osxframework',default=True) + opt.add_option('--translate',action="store_true",help="collect translation strings",dest="trans_qt4",default=False) + +extension(EXT_RCC)(create_rcc_task) +extension(EXT_UI)(create_uic_task) +extension('.ts')(add_lang) +feature('qt4')(apply_qt4) +after('apply_link')(apply_qt4) +extension(EXT_QT4)(cxx_hook) diff -Nru guitarix-0.22.4/wafadmin3/Tools/ruby.py guitarix-0.24.2/wafadmin3/Tools/ruby.py --- guitarix-0.22.4/wafadmin3/Tools/ruby.py 1970-01-01 00:00:00.000000000 +0000 +++ guitarix-0.24.2/wafadmin3/Tools/ruby.py 2012-10-20 03:56:02.000000000 +0000 @@ -0,0 +1,88 @@ +#! /usr/bin/env python +# encoding: utf-8 + +import os +import Task,Options,Utils +from TaskGen import before,feature,after +from Configure import conf +def init_rubyext(self): + self.default_install_path='${ARCHDIR_RUBY}' + self.uselib=self.to_list(getattr(self,'uselib','')) + if not'RUBY'in self.uselib: + self.uselib.append('RUBY') + if not'RUBYEXT'in self.uselib: + self.uselib.append('RUBYEXT') +def apply_ruby_so_name(self): + self.env['shlib_PATTERN']=self.env['rubyext_PATTERN'] +def check_ruby_version(conf,minver=()): + if Options.options.rubybinary: + conf.env.RUBY=Options.options.rubybinary + else: + conf.find_program("ruby",var="RUBY",mandatory=True) + ruby=conf.env.RUBY + try: + version=Utils.cmd_output([ruby,'-e','puts defined?(VERSION) ? VERSION : RUBY_VERSION']).strip() + except: + conf.fatal('could not determine ruby version') + conf.env.RUBY_VERSION=version + try: + ver=tuple(map(int,version.split("."))) + except: + conf.fatal('unsupported ruby version %r'%version) + cver='' + if minver: + if ver=(1,9,0): + ruby_hdrdir=read_config('rubyhdrdir') + cpppath+=ruby_hdrdir + cpppath+=[os.path.join(ruby_hdrdir[0],read_config('arch')[0])] + conf.check(header_name='ruby.h',includes=cpppath,mandatory=True,errmsg='could not find ruby header file') + conf.env.LIBPATH_RUBYEXT=read_config('libdir') + conf.env.LIBPATH_RUBYEXT+=archdir + conf.env.CPPPATH_RUBYEXT=cpppath + conf.env.CCFLAGS_RUBYEXT=read_config("CCDLFLAGS") + conf.env.rubyext_PATTERN='%s.'+read_config('DLEXT')[0] + flags=read_config('LDSHARED') + while flags and flags[0][0]!='-': + flags=flags[1:] + if len(flags)>1 and flags[1]=="ppc": + flags=flags[2:] + conf.env.LINKFLAGS_RUBYEXT=flags + conf.env.LINKFLAGS_RUBYEXT+=read_config("LIBS") + conf.env.LINKFLAGS_RUBYEXT+=read_config("LIBRUBYARG_SHARED") + if Options.options.rubyarchdir: + conf.env.ARCHDIR_RUBY=Options.options.rubyarchdir + else: + conf.env.ARCHDIR_RUBY=read_config('sitearchdir')[0] + if Options.options.rubylibdir: + conf.env.LIBDIR_RUBY=Options.options.rubylibdir + else: + conf.env.LIBDIR_RUBY=read_config('sitelibdir')[0] +def set_options(opt): + opt.add_option('--with-ruby-archdir',type='string',dest='rubyarchdir',help='Specify directory where to install arch specific files') + opt.add_option('--with-ruby-libdir',type='string',dest='rubylibdir',help='Specify alternate ruby library path') + opt.add_option('--with-ruby-binary',type='string',dest='rubybinary',help='Specify alternate ruby binary') + +feature('rubyext')(init_rubyext) +before('apply_incpaths','apply_type_vars','apply_lib_vars','apply_bundle')(init_rubyext) +after('default_cc','vars_target_cshlib')(init_rubyext) +feature('rubyext')(apply_ruby_so_name) +before('apply_link')(apply_ruby_so_name) +conf(check_ruby_version) +conf(check_ruby_ext_devel) diff -Nru guitarix-0.22.4/wafadmin3/Tools/suncc.py guitarix-0.24.2/wafadmin3/Tools/suncc.py --- guitarix-0.22.4/wafadmin3/Tools/suncc.py 1970-01-01 00:00:00.000000000 +0000 +++ guitarix-0.24.2/wafadmin3/Tools/suncc.py 2012-10-20 03:56:02.000000000 +0000 @@ -0,0 +1,56 @@ +#! /usr/bin/env python +# encoding: utf-8 + +import os,optparse +import Utils,Options,Configure +import ccroot,ar +from Configure import conftest +def find_scc(conf): + v=conf.env + cc=None + if v['CC']:cc=v['CC'] + elif'CC'in conf.environ:cc=conf.environ['CC'] + if not cc:cc=conf.find_program('cc',var='CC') + if not cc:conf.fatal('suncc was not found') + cc=conf.cmd_to_list(cc) + try: + if not Utils.cmd_output(cc+['-flags']): + conf.fatal('suncc %r was not found'%cc) + except ValueError: + conf.fatal('suncc -flags could not be executed') + v['CC']=cc + v['CC_NAME']='sun' +def scc_common_flags(conf): + v=conf.env + v['CC_SRC_F']='' + v['CC_TGT_F']=['-c','-o',''] + v['CPPPATH_ST']='-I%s' + if not v['LINK_CC']:v['LINK_CC']=v['CC'] + v['CCLNK_SRC_F']='' + v['CCLNK_TGT_F']=['-o',''] + v['LIB_ST']='-l%s' + v['LIBPATH_ST']='-L%s' + v['STATICLIB_ST']='-l%s' + v['STATICLIBPATH_ST']='-L%s' + v['CCDEFINES_ST']='-D%s' + v['SONAME_ST']='-Wl,-h -Wl,%s' + v['SHLIB_MARKER']='-Bdynamic' + v['STATICLIB_MARKER']='-Bstatic' + v['program_PATTERN']='%s' + v['shlib_CCFLAGS']=['-Kpic','-DPIC'] + v['shlib_LINKFLAGS']=['-G'] + v['shlib_PATTERN']='lib%s.so' + v['staticlib_LINKFLAGS']=['-Bstatic'] + v['staticlib_PATTERN']='lib%s.a' +detect=''' +find_scc +find_cpp +find_ar +scc_common_flags +cc_load_tools +cc_add_flags +link_add_flags +''' + +conftest(find_scc) +conftest(scc_common_flags) diff -Nru guitarix-0.22.4/wafadmin3/Tools/suncxx.py guitarix-0.24.2/wafadmin3/Tools/suncxx.py --- guitarix-0.22.4/wafadmin3/Tools/suncxx.py 1970-01-01 00:00:00.000000000 +0000 +++ guitarix-0.24.2/wafadmin3/Tools/suncxx.py 2012-10-20 03:56:02.000000000 +0000 @@ -0,0 +1,55 @@ +#! /usr/bin/env python +# encoding: utf-8 + +import os,optparse +import Utils,Options,Configure +import ccroot,ar +from Configure import conftest +def find_sxx(conf): + v=conf.env + cc=None + if v['CXX']:cc=v['CXX'] + elif'CXX'in conf.environ:cc=conf.environ['CXX'] + if not cc:cc=conf.find_program('c++',var='CXX') + if not cc:conf.fatal('sunc++ was not found') + cc=conf.cmd_to_list(cc) + try: + if not Utils.cmd_output(cc+['-flags']): + conf.fatal('sunc++ %r was not found'%cc) + except ValueError: + conf.fatal('sunc++ -flags could not be executed') + v['CXX']=cc + v['CXX_NAME']='sun' +def sxx_common_flags(conf): + v=conf.env + v['CXX_SRC_F']='' + v['CXX_TGT_F']=['-c','-o',''] + v['CPPPATH_ST']='-I%s' + if not v['LINK_CXX']:v['LINK_CXX']=v['CXX'] + v['CXXLNK_SRC_F']='' + v['CXXLNK_TGT_F']=['-o',''] + v['LIB_ST']='-l%s' + v['LIBPATH_ST']='-L%s' + v['STATICLIB_ST']='-l%s' + v['STATICLIBPATH_ST']='-L%s' + v['CXXDEFINES_ST']='-D%s' + v['SONAME_ST']='-Wl,-h -Wl,%s' + v['SHLIB_MARKER']='-Bdynamic' + v['STATICLIB_MARKER']='-Bstatic' + v['program_PATTERN']='%s' + v['shlib_CXXFLAGS']=['-Kpic','-DPIC'] + v['shlib_LINKFLAGS']=['-G'] + v['shlib_PATTERN']='lib%s.so' + v['staticlib_LINKFLAGS']=['-Bstatic'] + v['staticlib_PATTERN']='lib%s.a' +detect=''' +find_sxx +find_cpp +find_ar +sxx_common_flags +cxx_load_tools +cxx_add_flags +''' + +conftest(find_sxx) +conftest(sxx_common_flags) diff -Nru guitarix-0.22.4/wafadmin3/Tools/tex.py guitarix-0.24.2/wafadmin3/Tools/tex.py --- guitarix-0.22.4/wafadmin3/Tools/tex.py 1970-01-01 00:00:00.000000000 +0000 +++ guitarix-0.24.2/wafadmin3/Tools/tex.py 2012-10-20 03:56:02.000000000 +0000 @@ -0,0 +1,186 @@ +#! /usr/bin/env python +# encoding: utf-8 + +import os,re +import Utils,TaskGen,Task,Runner,Build +from TaskGen import feature,before +from Logs import error,warn,debug +re_tex=re.compile(r'\\(?Pinclude|input|import|bringin){(?P[^{}]*)}',re.M) +def scan(self): + node=self.inputs[0] + env=self.env + nodes=[] + names=[] + if not node:return(nodes,names) + code=Utils.readf(node.abspath(env)) + curdirnode=self.curdirnode + abs=curdirnode.abspath() + for match in re_tex.finditer(code): + path=match.group('file') + if path: + for k in['','.tex','.ltx']: + debug('tex: trying %s%s'%(path,k)) + try: + os.stat(abs+os.sep+path+k) + except OSError: + continue + found=path+k + node=curdirnode.find_resource(found) + if node: + nodes.append(node) + else: + debug('tex: could not find %s'%path) + names.append(path) + debug("tex: found the following : %s and names %s"%(nodes,names)) + return(nodes,names) +latex_fun,_=Task.compile_fun('latex','${LATEX} ${LATEXFLAGS} ${SRCFILE}',shell=False) +pdflatex_fun,_=Task.compile_fun('pdflatex','${PDFLATEX} ${PDFLATEXFLAGS} ${SRCFILE}',shell=False) +bibtex_fun,_=Task.compile_fun('bibtex','${BIBTEX} ${BIBTEXFLAGS} ${SRCFILE}',shell=False) +makeindex_fun,_=Task.compile_fun('bibtex','${MAKEINDEX} ${MAKEINDEXFLAGS} ${SRCFILE}',shell=False) +g_bibtex_re=re.compile('bibdata',re.M) +def tex_build(task,command='LATEX'): + env=task.env + bld=task.generator.bld + if not env['PROMPT_LATEX']: + env.append_value('LATEXFLAGS','-interaction=batchmode') + env.append_value('PDFLATEXFLAGS','-interaction=batchmode') + fun=latex_fun + if command=='PDFLATEX': + fun=pdflatex_fun + node=task.inputs[0] + reldir=node.bld_dir(env) + lst=[] + for c in Utils.split_path(reldir): + if c:lst.append('..') + srcfile=os.path.join(*(lst+[node.srcpath(env)])) + sr2=os.path.join(*(lst+[node.parent.srcpath(env)])) + aux_node=node.change_ext('.aux') + idx_node=node.change_ext('.idx') + nm=aux_node.name + docuname=nm[:len(nm)-4] + task.cwd=task.inputs[0].parent.abspath(task.env) + warn('first pass on %s'%command) + task.env.env={'TEXINPUTS':sr2+os.pathsep} + task.env.SRCFILE=srcfile + ret=fun(task) + if ret: + return ret + try: + ct=Utils.readf(aux_node.abspath(env)) + except(OSError,IOError): + error('error bibtex scan') + else: + fo=g_bibtex_re.findall(ct) + if fo: + warn('calling bibtex') + task.env.env={'BIBINPUTS':sr2+os.pathsep,'BSTINPUTS':sr2+os.pathsep} + task.env.SRCFILE=docuname + ret=bibtex_fun(task) + if ret: + error('error when calling bibtex %s'%docuname) + return ret + try: + idx_path=idx_node.abspath(env) + os.stat(idx_path) + except OSError: + error('error file.idx scan') + else: + warn('calling makeindex') + task.env.SRCFILE=idx_node.name + task.env.env={} + ret=makeindex_fun(task) + if ret: + error('error when calling makeindex %s'%idx_path) + return ret + hash='' + i=0 + while i<10: + i+=1 + prev_hash=hash + try: + hash=Utils.h_file(aux_node.abspath(env)) + except KeyError: + error('could not read aux.h -> %s'%aux_node.abspath(env)) + pass + if hash and hash==prev_hash: + break + warn('calling %s'%command) + task.env.env={'TEXINPUTS':sr2+os.pathsep} + task.env.SRCFILE=srcfile + ret=fun(task) + if ret: + error('error when calling %s %s'%(command,latex_compile_cmd)) + return ret + return None +latex_vardeps=['LATEX','LATEXFLAGS'] +def latex_build(task): + return tex_build(task,'LATEX') +pdflatex_vardeps=['PDFLATEX','PDFLATEXFLAGS'] +def pdflatex_build(task): + return tex_build(task,'PDFLATEX') +class tex_taskgen(TaskGen.task_gen): + def __init__(self,*k,**kw): + TaskGen.task_gen.__init__(self,*k,**kw) +def apply_tex(self): + if not getattr(self,'type',None)in['latex','pdflatex']: + self.type='pdflatex' + tree=self.bld + outs=Utils.to_list(getattr(self,'outs',[])) + self.env['PROMPT_LATEX']=getattr(self,'prompt',1) + deps_lst=[] + if getattr(self,'deps',None): + deps=self.to_list(self.deps) + for filename in deps: + n=self.path.find_resource(filename) + if not n in deps_lst:deps_lst.append(n) + self.source=self.to_list(self.source) + for filename in self.source: + base,ext=os.path.splitext(filename) + node=self.path.find_resource(filename) + if not node:raise Utils.WafError('cannot find %s'%filename) + if self.type=='latex': + task=self.create_task('latex',node,node.change_ext('.dvi')) + elif self.type=='pdflatex': + task=self.create_task('pdflatex',node,node.change_ext('.pdf')) + task.env=self.env + task.curdirnode=self.path + if deps_lst: + variant=node.variant(self.env) + try: + lst=tree.node_deps[task.unique_id()] + for n in deps_lst: + if not n in lst: + lst.append(n) + except KeyError: + tree.node_deps[task.unique_id()]=deps_lst + if self.type=='latex': + if'ps'in outs: + tsk=self.create_task('dvips',task.outputs,node.change_ext('.ps')) + tsk.env.env={'TEXINPUTS':node.parent.abspath()+os.pathsep+self.path.abspath()+os.pathsep+self.path.abspath(self.env)} + if'pdf'in outs: + tsk=self.create_task('dvipdf',task.outputs,node.change_ext('.pdf')) + tsk.env.env={'TEXINPUTS':node.parent.abspath()+os.pathsep+self.path.abspath()+os.pathsep+self.path.abspath(self.env)} + elif self.type=='pdflatex': + if'ps'in outs: + self.create_task('pdf2ps',task.outputs,node.change_ext('.ps')) + self.source=[] +def detect(conf): + v=conf.env + for p in'tex latex pdflatex bibtex dvips dvipdf ps2pdf makeindex pdf2ps'.split(): + conf.find_program(p,var=p.upper()) + v[p.upper()+'FLAGS']='' + v['DVIPSFLAGS']='-Ppdf' +b=Task.simple_task_type +b('tex','${TEX} ${TEXFLAGS} ${SRC}',color='BLUE',shell=False) +b('bibtex','${BIBTEX} ${BIBTEXFLAGS} ${SRC}',color='BLUE',shell=False) +b('dvips','${DVIPS} ${DVIPSFLAGS} ${SRC} -o ${TGT}',color='BLUE',after="latex pdflatex tex bibtex",shell=False) +b('dvipdf','${DVIPDF} ${DVIPDFFLAGS} ${SRC} ${TGT}',color='BLUE',after="latex pdflatex tex bibtex",shell=False) +b('pdf2ps','${PDF2PS} ${PDF2PSFLAGS} ${SRC} ${TGT}',color='BLUE',after="dvipdf pdflatex",shell=False) +b=Task.task_type_from_func +cls=b('latex',latex_build,vars=latex_vardeps) +cls.scan=scan +cls=b('pdflatex',pdflatex_build,vars=pdflatex_vardeps) +cls.scan=scan + +feature('tex')(apply_tex) +before('apply_core')(apply_tex) diff -Nru guitarix-0.22.4/wafadmin3/Tools/unittestw.py guitarix-0.24.2/wafadmin3/Tools/unittestw.py --- guitarix-0.22.4/wafadmin3/Tools/unittestw.py 1970-01-01 00:00:00.000000000 +0000 +++ guitarix-0.24.2/wafadmin3/Tools/unittestw.py 2012-10-20 03:56:02.000000000 +0000 @@ -0,0 +1,210 @@ +#! /usr/bin/env python +# encoding: utf-8 + +import os,sys +import Build,TaskGen,Utils,Options,Logs,Task +from TaskGen import before,after,feature +from Constants import* +class unit_test(object): + def __init__(self): + self.returncode_ok=0 + self.num_tests_ok=0 + self.num_tests_failed=0 + self.num_tests_err=0 + self.total_num_tests=0 + self.max_label_length=0 + self.unit_tests=Utils.ordered_dict() + self.unit_test_results={} + self.unit_test_erroneous={} + self.change_to_testfile_dir=False + self.want_to_see_test_output=False + self.want_to_see_test_error=False + self.run_if_waf_does='check' + def run(self): + self.num_tests_ok=0 + self.num_tests_failed=0 + self.num_tests_err=0 + self.total_num_tests=0 + self.max_label_length=0 + self.unit_tests=Utils.ordered_dict() + self.unit_test_results={} + self.unit_test_erroneous={} + ld_library_path=[] + if not Options.commands[self.run_if_waf_does]:return + for obj in Build.bld.all_task_gen: + try: + link_task=obj.link_task + except AttributeError: + pass + else: + lib_path=link_task.outputs[0].parent.abspath(obj.env) + if lib_path not in ld_library_path: + ld_library_path.append(lib_path) + unit_test=getattr(obj,'unit_test','') + if unit_test and'cprogram'in obj.features: + try: + output=obj.path + filename=os.path.join(output.abspath(obj.env),obj.target) + srcdir=output.abspath() + label=os.path.join(output.bldpath(obj.env),obj.target) + self.max_label_length=max(self.max_label_length,len(label)) + self.unit_tests[label]=(filename,srcdir) + except KeyError: + pass + self.total_num_tests=len(self.unit_tests) + Utils.pprint('GREEN','Running the unit tests') + count=0 + result=1 + for label in self.unit_tests.allkeys: + file_and_src=self.unit_tests[label] + filename=file_and_src[0] + srcdir=file_and_src[1] + count+=1 + line=Build.bld.progress_line(count,self.total_num_tests,Logs.colors.GREEN,Logs.colors.NORMAL) + if Options.options.progress_bar and line: + sys.stderr.write(line) + sys.stderr.flush() + try: + kwargs={} + kwargs['env']=os.environ.copy() + if self.change_to_testfile_dir: + kwargs['cwd']=srcdir + if not self.want_to_see_test_output: + kwargs['stdout']=Utils.pproc.PIPE + if not self.want_to_see_test_error: + kwargs['stderr']=Utils.pproc.PIPE + if ld_library_path: + v=kwargs['env'] + def add_path(dct,path,var): + dct[var]=os.pathsep.join(Utils.to_list(path)+[os.environ.get(var,'')]) + if sys.platform=='win32': + add_path(v,ld_library_path,'PATH') + elif sys.platform=='darwin': + add_path(v,ld_library_path,'DYLD_LIBRARY_PATH') + add_path(v,ld_library_path,'LD_LIBRARY_PATH') + else: + add_path(v,ld_library_path,'LD_LIBRARY_PATH') + pp=Utils.pproc.Popen(filename,**kwargs) + pp.wait() + result=int(pp.returncode==self.returncode_ok) + if result: + self.num_tests_ok+=1 + else: + self.num_tests_failed+=1 + self.unit_test_results[label]=result + self.unit_test_erroneous[label]=0 + except OSError: + self.unit_test_erroneous[label]=1 + self.num_tests_err+=1 + except KeyboardInterrupt: + pass + if Options.options.progress_bar:sys.stdout.write(Logs.colors.cursor_on) + def print_results(self): + if not Options.commands[self.run_if_waf_does]:return + p=Utils.pprint + if self.total_num_tests==0: + p('YELLOW','No unit tests present') + return + for label in self.unit_tests.allkeys: + filename=self.unit_tests[label] + err=0 + result=0 + try:err=self.unit_test_erroneous[label] + except KeyError:pass + try:result=self.unit_test_results[label] + except KeyError:pass + n=self.max_label_length-len(label) + if err:n+=4 + elif result:n+=7 + else:n+=3 + line='%s %s'%(label,'.'*n) + if err:p('RED','%sERROR'%line) + elif result:p('GREEN','%sOK'%line) + else:p('YELLOW','%sFAILED'%line) + percentage_ok=float(self.num_tests_ok)/float(self.total_num_tests)*100.0 + percentage_failed=float(self.num_tests_failed)/float(self.total_num_tests)*100.0 + percentage_erroneous=float(self.num_tests_err)/float(self.total_num_tests)*100.0 + p('NORMAL',''' +Successful tests: %i (%.1f%%) +Failed tests: %i (%.1f%%) +Erroneous tests: %i (%.1f%%) + +Total number of tests: %i +'''%(self.num_tests_ok,percentage_ok,self.num_tests_failed,percentage_failed,self.num_tests_err,percentage_erroneous,self.total_num_tests)) + p('GREEN','Unit tests finished') +import threading +testlock=threading.Lock() +def set_options(opt): + opt.add_option('--alltests',action='store_true',default=True,help='Exec all unit tests',dest='all_tests') +def make_test(self): + if not'cprogram'in self.features: + Logs.error('test cannot be executed %s'%self) + return + self.default_install_path=None + self.create_task('utest',self.link_task.outputs) +def exec_test(self): + status=0 + variant=self.env.variant() + filename=self.inputs[0].abspath(self.env) + self.ut_exec=getattr(self,'ut_exec',[filename]) + if getattr(self.generator,'ut_fun',None): + self.generator.ut_fun(self) + try: + fu=getattr(self.generator.bld,'all_test_paths') + except AttributeError: + fu=os.environ.copy() + self.generator.bld.all_test_paths=fu + lst=[] + for obj in self.generator.bld.all_task_gen: + link_task=getattr(obj,'link_task',None) + if link_task and link_task.env.variant()==variant: + lst.append(link_task.outputs[0].parent.abspath(obj.env)) + def add_path(dct,path,var): + dct[var]=os.pathsep.join(Utils.to_list(path)+[os.environ.get(var,'')]) + if sys.platform=='win32': + add_path(fu,lst,'PATH') + elif sys.platform=='darwin': + add_path(fu,lst,'DYLD_LIBRARY_PATH') + add_path(fu,lst,'LD_LIBRARY_PATH') + else: + add_path(fu,lst,'LD_LIBRARY_PATH') + cwd=getattr(self.generator,'ut_cwd','')or self.inputs[0].parent.abspath(self.env) + proc=Utils.pproc.Popen(self.ut_exec,cwd=cwd,env=fu,stderr=Utils.pproc.PIPE,stdout=Utils.pproc.PIPE) + (stdout,stderr)=proc.communicate() + tup=(filename,proc.returncode,stdout,stderr) + self.generator.utest_result=tup + testlock.acquire() + try: + bld=self.generator.bld + Logs.debug("ut: %r",tup) + try: + bld.utest_results.append(tup) + except AttributeError: + bld.utest_results=[tup] + finally: + testlock.release() +cls=Task.task_type_from_func('utest',func=exec_test,color='PINK',ext_in='.bin') +old=cls.runnable_status +def test_status(self): + if getattr(Options.options,'all_tests',False): + return RUN_ME + return old(self) +cls.runnable_status=test_status +cls.quiet=1 +def summary(bld): + lst=getattr(bld,'utest_results',[]) + if lst: + Utils.pprint('CYAN','execution summary') + total=len(lst) + tfail=len([x for x in lst if x[1]]) + Utils.pprint('CYAN',' tests that pass %d/%d'%(total-tfail,total)) + for(f,code,out,err)in lst: + if not code: + Utils.pprint('CYAN',' %s'%f) + Utils.pprint('CYAN',' tests that fail %d/%d'%(tfail,total)) + for(f,code,out,err)in lst: + if code: + Utils.pprint('CYAN',' %s'%f) + +feature('test')(make_test) +after('apply_link','vars_target_cprogram')(make_test) diff -Nru guitarix-0.22.4/wafadmin3/Tools/vala.py guitarix-0.24.2/wafadmin3/Tools/vala.py --- guitarix-0.22.4/wafadmin3/Tools/vala.py 1970-01-01 00:00:00.000000000 +0000 +++ guitarix-0.24.2/wafadmin3/Tools/vala.py 2012-10-20 03:56:02.000000000 +0000 @@ -0,0 +1,235 @@ +#! /usr/bin/env python +# encoding: utf-8 + +import os.path,shutil +import Task,Runner,Utils,Logs,Build,Node,Options +from TaskGen import extension,after,before +EXT_VALA=['.vala','.gs'] +class valac_task(Task.Task): + vars=("VALAC","VALAC_VERSION","VALAFLAGS") + before=("cc","cxx") + def run(self): + env=self.env + inputs=[a.srcpath(env)for a in self.inputs] + valac=env['VALAC'] + vala_flags=env.get_flat('VALAFLAGS') + top_src=self.generator.bld.srcnode.abspath() + top_bld=self.generator.bld.srcnode.abspath(env) + if env['VALAC_VERSION']>(0,1,6): + cmd=[valac,'-C','--quiet',vala_flags] + else: + cmd=[valac,'-C',vala_flags] + if self.threading: + cmd.append('--thread') + if self.profile: + cmd.append('--profile=%s'%self.profile) + if self.target_glib: + cmd.append('--target-glib=%s'%self.target_glib) + features=self.generator.features + if'cshlib'in features or'cstaticlib'in features: + output_dir=self.outputs[0].bld_dir(env) + cmd.append('--library '+self.target) + if env['VALAC_VERSION']>=(0,7,0): + for x in self.outputs: + if x.name.endswith('.h'): + cmd.append('--header '+x.bldpath(self.env)) + cmd.append('--basedir '+top_src) + cmd.append('-d '+top_bld) + if env['VALAC_VERSION']>(0,7,2)and hasattr(self,'gir'): + cmd.append('--gir=%s.gir'%self.gir) + else: + output_dir=self.outputs[0].bld_dir(env) + cmd.append('-d %s'%output_dir) + for vapi_dir in self.vapi_dirs: + cmd.append('--vapidir=%s'%vapi_dir) + for package in self.packages: + cmd.append('--pkg %s'%package) + for package in self.packages_private: + cmd.append('--pkg %s'%package) + cmd.append(" ".join(inputs)) + result=self.generator.bld.exec_command(" ".join(cmd)) + if not'cprogram'in features: + if self.packages: + filename=os.path.join(self.generator.path.abspath(env),"%s.deps"%self.target) + deps=open(filename,'w') + for package in self.packages: + deps.write(package+'\n') + deps.close() + self._fix_output("../%s.vapi"%self.target) + self._fix_output("%s.vapi"%self.target) + self._fix_output("%s.gidl"%self.target) + self._fix_output("%s.gir"%self.target) + if hasattr(self,'gir'): + self._fix_output("%s.gir"%self.gir) + first=None + for node in self.outputs: + if not first: + first=node + else: + if first.parent.id!=node.parent.id: + if env['VALAC_VERSION']<(0,7,0): + shutil.move(first.parent.abspath(self.env)+os.sep+node.name,node.abspath(self.env)) + return result + def install(self): + bld=self.generator.bld + features=self.generator.features + if self.attr("install_path")and("cshlib"in features or"cstaticlib"in features): + headers_list=[o for o in self.outputs if o.suffix()==".h"] + vapi_list=[o for o in self.outputs if(o.suffix()in(".vapi",".deps"))] + gir_list=[o for o in self.outputs if o.suffix()==".gir"] + for header in headers_list: + top_src=self.generator.bld.srcnode + package=self.env['PACKAGE'] + try: + api_version=Utils.g_module.API_VERSION + except AttributeError: + version=Utils.g_module.VERSION.split(".") + if version[0]=="0": + api_version="0."+version[1] + else: + api_version=version[0]+".0" + install_path='${INCLUDEDIR}/%s-%s/%s'%(package,api_version,header.relpath_gen(top_src)) + bld.install_as(install_path,header,self.env) + bld.install_files('${DATAROOTDIR}/vala/vapi',vapi_list,self.env) + bld.install_files('${DATAROOTDIR}/gir-1.0',gir_list,self.env) + def _fix_output(self,output): + top_bld=self.generator.bld.srcnode.abspath(self.env) + try: + src=os.path.join(top_bld,output) + dst=self.generator.path.abspath(self.env) + shutil.move(src,dst) + except: + pass +def vala_file(self,node): + valatask=getattr(self,"valatask",None) + if not valatask: + valatask=self.create_task('valac') + self.valatask=valatask + self.includes=Utils.to_list(getattr(self,'includes',[])) + self.uselib=self.to_list(self.uselib) + valatask.packages=[] + valatask.packages_private=Utils.to_list(getattr(self,'packages_private',[])) + valatask.vapi_dirs=[] + valatask.target=self.target + valatask.threading=False + valatask.install_path=self.install_path + valatask.profile=getattr(self,'profile','gobject') + valatask.target_glib=None + packages=Utils.to_list(getattr(self,'packages',[])) + vapi_dirs=Utils.to_list(getattr(self,'vapi_dirs',[])) + includes=[] + if hasattr(self,'uselib_local'): + local_packages=Utils.to_list(self.uselib_local) + seen=[] + while len(local_packages)>0: + package=local_packages.pop() + if package in seen: + continue + seen.append(package) + package_obj=self.name_to_obj(package) + if not package_obj: + raise Utils.WafError("object '%s' was not found in uselib_local (required by '%s')"%(package,self.name)) + package_name=package_obj.target + package_node=package_obj.path + package_dir=package_node.relpath_gen(self.path) + for task in package_obj.tasks: + for output in task.outputs: + if output.name==package_name+".vapi": + valatask.set_run_after(task) + if package_name not in packages: + packages.append(package_name) + if package_dir not in vapi_dirs: + vapi_dirs.append(package_dir) + if package_dir not in includes: + includes.append(package_dir) + if hasattr(package_obj,'uselib_local'): + lst=self.to_list(package_obj.uselib_local) + lst.reverse() + local_packages=[pkg for pkg in lst if pkg not in seen]+local_packages + valatask.packages=packages + for vapi_dir in vapi_dirs: + try: + valatask.vapi_dirs.append(self.path.find_dir(vapi_dir).abspath()) + valatask.vapi_dirs.append(self.path.find_dir(vapi_dir).abspath(self.env)) + except AttributeError: + Logs.warn("Unable to locate Vala API directory: '%s'"%vapi_dir) + self.includes.append(node.bld.srcnode.abspath()) + self.includes.append(node.bld.srcnode.abspath(self.env)) + for include in includes: + try: + self.includes.append(self.path.find_dir(include).abspath()) + self.includes.append(self.path.find_dir(include).abspath(self.env)) + except AttributeError: + Logs.warn("Unable to locate include directory: '%s'"%include) + if valatask.profile=='gobject': + if hasattr(self,'target_glib'): + Logs.warn('target_glib on vala tasks is deprecated --vala-target-glib=MAJOR.MINOR from the vala tool options') + if getattr(Options.options,'vala_target_glib',None): + valatask.target_glib=Options.options.vala_target_glib + if not'GOBJECT'in self.uselib: + self.uselib.append('GOBJECT') + if hasattr(self,'threading'): + if valatask.profile=='gobject': + valatask.threading=self.threading + if not'GTHREAD'in self.uselib: + self.uselib.append('GTHREAD') + else: + Logs.warn("Profile %s does not have threading support"%valatask.profile) + if hasattr(self,'gir'): + valatask.gir=self.gir + env=valatask.env + output_nodes=[] + c_node=node.change_ext('.c') + output_nodes.append(c_node) + self.allnodes.append(c_node) + if env['VALAC_VERSION']<(0,7,0): + output_nodes.append(node.change_ext('.h')) + else: + if not'cprogram'in self.features: + output_nodes.append(self.path.find_or_declare('%s.h'%self.target)) + if not'cprogram'in self.features: + output_nodes.append(self.path.find_or_declare('%s.vapi'%self.target)) + if env['VALAC_VERSION']>(0,7,2): + if hasattr(self,'gir'): + output_nodes.append(self.path.find_or_declare('%s.gir'%self.gir)) + elif env['VALAC_VERSION']>(0,3,5): + output_nodes.append(self.path.find_or_declare('%s.gir'%self.target)) + elif env['VALAC_VERSION']>(0,1,7): + output_nodes.append(self.path.find_or_declare('%s.gidl'%self.target)) + if valatask.packages: + output_nodes.append(self.path.find_or_declare('%s.deps'%self.target)) + valatask.inputs.append(node) + valatask.outputs.extend(output_nodes) +def detect(conf): + min_version=(0,1,6) + min_version_str="%d.%d.%d"%min_version + valac=conf.find_program('valac',var='VALAC',mandatory=True) + if not conf.env["HAVE_GOBJECT"]: + pkg_args={'package':'gobject-2.0','uselib_store':'GOBJECT','args':'--cflags --libs'} + if getattr(Options.options,'vala_target_glib',None): + pkg_args['atleast_version']=Options.options.vala_target_glib + conf.check_cfg(**pkg_args) + if not conf.env["HAVE_GTHREAD"]: + pkg_args={'package':'gthread-2.0','uselib_store':'GTHREAD','args':'--cflags --libs'} + if getattr(Options.options,'vala_target_glib',None): + pkg_args['atleast_version']=Options.options.vala_target_glib + conf.check_cfg(**pkg_args) + try: + output=Utils.cmd_output(valac+" --version",silent=True) + version=output.split(' ',1)[-1].strip().split(".")[0:3] + version=[int(x)for x in version] + valac_version=tuple(version) + except Exception: + valac_version=(0,0,0) + conf.check_message('program version','valac >= '+min_version_str,valac_version>=min_version,"%d.%d.%d"%valac_version) + conf.check_tool('gnu_dirs') + if valac_version=0x2060000 or os.name=='java': + import subprocess as pproc +else: + import pproc +import Logs +from Constants import* +try: + from collections import deque +except ImportError: + class deque(list): + def popleft(self): + return self.pop(0) +is_win32=sys.platform=='win32' +try: + from collections import defaultdict as DefaultDict +except ImportError: + class DefaultDict(dict): + def __init__(self,default_factory): + super(DefaultDict,self).__init__() + self.default_factory=default_factory + def __getitem__(self,key): + try: + return super(DefaultDict,self).__getitem__(key) + except KeyError: + value=self.default_factory() + self[key]=value + return value +class WafError(Exception): + def __init__(self,*args): + self.args=args + try: + self.stack=traceback.extract_stack() + except: + pass + Exception.__init__(self,*args) + def __str__(self): + return str(len(self.args)==1 and self.args[0]or self.args) +class WscriptError(WafError): + def __init__(self,message,wscript_file=None): + if wscript_file: + self.wscript_file=wscript_file + self.wscript_line=None + else: + try: + (self.wscript_file,self.wscript_line)=self.locate_error() + except: + (self.wscript_file,self.wscript_line)=(None,None) + msg_file_line='' + if self.wscript_file: + msg_file_line="%s:"%self.wscript_file + if self.wscript_line: + msg_file_line+="%s:"%self.wscript_line + err_message="%s error: %s"%(msg_file_line,message) + WafError.__init__(self,err_message) + def locate_error(self): + stack=traceback.extract_stack() + stack.reverse() + for frame in stack: + file_name=os.path.basename(frame[0]) + is_wscript=(file_name==WSCRIPT_FILE or file_name==WSCRIPT_BUILD_FILE) + if is_wscript: + return(frame[0],frame[1]) + return(None,None) +indicator=is_win32 and'\x1b[A\x1b[K%s%s%s\r'or'\x1b[K%s%s%s\r' +try: + from fnv import new as md5 + import Constants + Constants.SIG_NIL='signofnv' + def h_file(filename): + m=md5() + try: + m.hfile(filename) + x=m.digest() + if x is None:raise OSError("not a file") + return x + except SystemError: + raise OSError("not a file"+filename) +except ImportError: + try: + try: + from hashlib import md5 + except ImportError: + from md5 import md5 + def h_file(filename): + f=open(filename,'rb') + m=md5() + while(filename): + filename=f.read(100000) + m.update(filename) + f.close() + return m.digest() + except ImportError: + md5=None +class ordered_dict(UserDict): + def __init__(self,dict=None): + self.allkeys=[] + UserDict.__init__(self,dict) + def __delitem__(self,key): + self.allkeys.remove(key) + UserDict.__delitem__(self,key) + def __setitem__(self,key,item): + if key not in self.allkeys:self.allkeys.append(key) + UserDict.__setitem__(self,key,item) +def exec_command(s,**kw): + if'log'in kw: + kw['stdout']=kw['stderr']=kw['log'] + del(kw['log']) + kw['shell']=isinstance(s,str) + try: + proc=pproc.Popen(s,**kw) + return proc.wait() + except OSError: + return-1 +if is_win32: + def exec_command(s,**kw): + if'log'in kw: + kw['stdout']=kw['stderr']=kw['log'] + del(kw['log']) + kw['shell']=isinstance(s,str) + if len(s)>2000: + startupinfo=pproc.STARTUPINFO() + startupinfo.dwFlags|=pproc.STARTF_USESHOWWINDOW + kw['startupinfo']=startupinfo + try: + if'stdout'not in kw: + kw['stdout']=pproc.PIPE + kw['stderr']=pproc.PIPE + kw['universal_newlines']=True + proc=pproc.Popen(s,**kw) + (stdout,stderr)=proc.communicate() + Logs.info(stdout) + if stderr: + Logs.error(stderr) + return proc.returncode + else: + proc=pproc.Popen(s,**kw) + return proc.wait() + except OSError: + return-1 +listdir=os.listdir +if is_win32: + def listdir_win32(s): + if re.match('^[A-Za-z]:$',s): + s+=os.sep + if not os.path.isdir(s): + e=OSError() + e.errno=errno.ENOENT + raise e + return os.listdir(s) + listdir=listdir_win32 +def waf_version(mini=0x010000,maxi=0x100000): + ver=HEXVERSION + try:min_val=mini+0 + except TypeError:min_val=int(mini.replace('.','0'),16) + if min_val>ver: + Logs.error("waf version should be at least %s (%s found)"%(mini,ver)) + sys.exit(1) + try:max_val=maxi+0 + except TypeError:max_val=int(maxi.replace('.','0'),16) + if max_val=0x3000000: + raise ImportError("Waf requires Python >= 2.3 but the raw source requires Python 2.4, 2.5 or 2.6") +def ex_stack(): + exc_type,exc_value,tb=sys.exc_info() + if Logs.verbose>1: + exc_lines=traceback.format_exception(exc_type,exc_value,tb) + return''.join(exc_lines) + return str(exc_value) +def to_list(sth): + if isinstance(sth,str): + return sth.split() + else: + return sth +g_loaded_modules={} +g_module=None +def load_module(file_path,name=WSCRIPT_FILE): + try: + return g_loaded_modules[file_path] + except KeyError: + pass + module=imp.new_module(name) + try: + code=readf(file_path,m='rU') + except(IOError,OSError): + raise WscriptError('Could not read the file %r'%file_path) + module.waf_hash_val=code + dt=os.path.dirname(file_path) + sys.path.insert(0,dt) + try: + exec(compile(code,file_path,'exec'),module.__dict__) + except Exception: + exc_type,exc_value,tb=sys.exc_info() + raise WscriptError("".join(traceback.format_exception(exc_type,exc_value,tb)),file_path) + sys.path.remove(dt) + g_loaded_modules[file_path]=module + return module +def set_main_module(file_path): + global g_module + g_module=load_module(file_path,'wscript_main') + g_module.root_path=file_path + try: + g_module.APPNAME + except: + g_module.APPNAME='noname' + try: + g_module.VERSION + except: + g_module.VERSION='1.0' +def to_hashtable(s): + tbl={} + lst=s.split('\n') + for line in lst: + if not line:continue + mems=line.split('=') + tbl[mems[0]]=mems[1] + return tbl +def get_term_cols(): + return 80 +try: + import struct,fcntl,termios +except ImportError: + pass +else: + if Logs.got_tty: + def myfun(): + dummy_lines,cols=struct.unpack("HHHH",fcntl.ioctl(sys.stderr.fileno(),termios.TIOCGWINSZ,struct.pack("HHHH",0,0,0,0)))[:2] + return cols + try: + myfun() + except: + pass + else: + get_term_cols=myfun +rot_idx=0 +rot_chr=['\\','|','/','-'] +def split_path(path): + return path.split('/') +def split_path_cygwin(path): + if path.startswith('//'): + ret=path.split('/')[2:] + ret[0]='/'+ret[0] + return ret + return path.split('/') +re_sp=re.compile('[/\\\\]') +def split_path_win32(path): + if path.startswith('\\\\'): + ret=re.split(re_sp,path)[2:] + ret[0]='\\'+ret[0] + return ret + return re.split(re_sp,path) +if sys.platform=='cygwin': + split_path=split_path_cygwin +elif is_win32: + split_path=split_path_win32 +def copy_attrs(orig,dest,names,only_if_set=False): + for a in to_list(names): + u=getattr(orig,a,()) + if u or not only_if_set: + setattr(dest,a,u) +def def_attrs(cls,**kw): + ''' + set attributes for class. + @param cls [any class]: the class to update the given attributes in. + @param kw [dictionary]: dictionary of attributes names and values. + + if the given class hasn't one (or more) of these attributes, add the attribute with its value to the class. + ''' + for k,v in kw.items(): + if not hasattr(cls,k): + setattr(cls,k,v) +def quote_define_name(path): + fu=re.compile("[^a-zA-Z0-9]").sub("_",path) + fu=fu.upper() + return fu +def quote_whitespace(path): + return(path.strip().find(' ')>0 and'"%s"'%path or path).replace('""','"') +def trimquotes(s): + if not s:return'' + s=s.rstrip() + if s[0]=="'"and s[-1]=="'":return s[1:-1] + return s +def h_list(lst): + m=md5() + m.update(str(lst).encode()) + return m.digest() +def h_fun(fun): + try: + return fun.code + except AttributeError: + try: + h=inspect.getsource(fun) + except IOError: + h="nocode" + try: + fun.code=h + except AttributeError: + pass + return h +def pprint(col,str,label='',sep='\n'): + sys.stderr.write("%s%s%s %s%s"%(Logs.colors(col),str,Logs.colors.NORMAL,label,sep)) +def check_dir(dir): + try: + os.stat(dir) + except OSError: + try: + os.makedirs(dir) + except OSError as e: + raise WafError("Cannot create folder '%s' (original error: %s)"%(dir,e)) +def cmd_output(cmd,**kw): + silent=False + if'silent'in kw: + silent=kw['silent'] + del(kw['silent']) + if'e'in kw: + tmp=kw['e'] + del(kw['e']) + kw['env']=tmp + kw['shell']=isinstance(cmd,str) + kw['stdout']=pproc.PIPE + if silent: + kw['stderr']=pproc.PIPE + try: + p=pproc.Popen(cmd,**kw) + output=p.communicate()[0].decode("utf-8") + except OSError as e: + raise ValueError(str(e)) + if p.returncode: + if not silent: + msg="command execution failed: %s -> %r"%(cmd,str(output)) + raise ValueError(msg) + output='' + return output +reg_subst=re.compile(r"(\\\\)|(\$\$)|\$\{([^}]+)\}") +def subst_vars(expr,params): + def repl_var(m): + if m.group(1): + return'\\' + if m.group(2): + return'$' + try: + return params.get_flat(m.group(3)) + except AttributeError: + return params[m.group(3)] + return reg_subst.sub(repl_var,expr) +def unversioned_sys_platform_to_binary_format(unversioned_sys_platform): + if unversioned_sys_platform in('linux','freebsd','netbsd','openbsd','sunos','gnu'): + return'elf' + elif unversioned_sys_platform=='darwin': + return'mac-o' + elif unversioned_sys_platform in('win32','cygwin','uwin','msys'): + return'pe' + return'elf' +def unversioned_sys_platform(): + s=sys.platform + if s=='java': + from java.lang import System + s=System.getProperty('os.name') + if s=='Mac OS X': + return'darwin' + elif s.startswith('Windows '): + return'win32' + elif s=='OS/2': + return'os2' + elif s=='HP-UX': + return'hpux' + elif s in('SunOS','Solaris'): + return'sunos' + else:s=s.lower() + if s=='win32'or s.endswith('os2')and s!='sunos2':return s + return re.split('\d+$',s)[0] +def detect_platform(): + s=sys.platform + for x in'cygwin linux irix sunos hpux aix darwin gnu'.split(): + if s.find(x)>=0: + return x + if os.name in'posix java os2'.split(): + return os.name + return s +def load_tool(tool,tooldir=None): + ''' + load_tool: import a Python module, optionally using several directories. + @param tool [string]: name of tool to import. + @param tooldir [list]: directories to look for the tool. + @return: the loaded module. + + Warning: this function is not thread-safe: plays with sys.path, + so must run in sequence. + ''' + if tooldir: + assert isinstance(tooldir,list) + sys.path=tooldir+sys.path + else: + tooldir=[] + try: + return __import__(tool) + finally: + for dt in tooldir: + sys.path.remove(dt) +def readf(fname,m='r'): + f=open(fname,m) + try: + txt=f.read() + finally: + f.close() + return txt +def nada(*k,**kw): + pass +def diff_path(top,subdir): + top=os.path.normpath(top).replace('\\','/').split('/') + subdir=os.path.normpath(subdir).replace('\\','/').split('/') + if len(top)==len(subdir):return'' + diff=subdir[len(top)-len(subdir):] + return os.path.join(*diff) +class Context(object): + def set_curdir(self,dir): + self.curdir_=dir + def get_curdir(self): + try: + return self.curdir_ + except AttributeError: + self.curdir_=os.getcwd() + return self.get_curdir() + curdir=property(get_curdir,set_curdir) + def recurse(self,dirs,name=''): + if not name: + name=inspect.stack()[1][3] + if isinstance(dirs,str): + dirs=to_list(dirs) + for x in dirs: + if os.path.isabs(x): + nexdir=x + else: + nexdir=os.path.join(self.curdir,x) + base=os.path.join(nexdir,WSCRIPT_FILE) + file_path=base+'_'+name + try: + txt=readf(file_path,m='rU') + except(OSError,IOError): + try: + module=load_module(base) + except OSError: + raise WscriptError('No such script %s'%base) + try: + f=module.__dict__[name] + except KeyError: + raise WscriptError('No function %s defined in %s'%(name,base)) + if getattr(self.__class__,'pre_recurse',None): + self.pre_recurse(f,base,nexdir) + old=self.curdir + self.curdir=nexdir + try: + f(self) + finally: + self.curdir=old + if getattr(self.__class__,'post_recurse',None): + self.post_recurse(module,base,nexdir) + else: + dc={'ctx':self} + if getattr(self.__class__,'pre_recurse',None): + dc=self.pre_recurse(txt,file_path,nexdir) + old=self.curdir + self.curdir=nexdir + try: + try: + exec(compile(txt,file_path,'exec'),dc) + except Exception: + exc_type,exc_value,tb=sys.exc_info() + raise WscriptError("".join(traceback.format_exception(exc_type,exc_value,tb)),base) + finally: + self.curdir=old + if getattr(self.__class__,'post_recurse',None): + self.post_recurse(txt,file_path,nexdir) +if is_win32: + old=shutil.copy2 + def copy2(src,dst): + old(src,dst) + shutil.copystat(src,src) + setattr(shutil,'copy2',copy2) +def zip_folder(dir,zip_file_name,prefix): + import zipfile + zip=zipfile.ZipFile(zip_file_name,'w',compression=zipfile.ZIP_DEFLATED) + base=os.path.abspath(dir) + if prefix: + if prefix[-1]!=os.sep: + prefix+=os.sep + n=len(base) + for root,dirs,files in os.walk(base): + for f in files: + archive_name=prefix+root[n:]+os.sep+f + zip.write(root+os.sep+f,archive_name,zipfile.ZIP_DEFLATED) + zip.close() +def get_elapsed_time(start): + delta=datetime.datetime.now()-start + days=int(delta.days) + hours=int(delta.seconds/3600) + minutes=int((delta.seconds-hours*3600)/60) + seconds=delta.seconds-hours*3600-minutes*60+float(delta.microseconds)/1000/1000 + result='' + if days: + result+='%dd'%days + if days or hours: + result+='%dh'%hours + if days or hours or minutes: + result+='%dm'%minutes + return'%s%.3fs'%(result,seconds) +if os.name=='java': + try: + gc.disable() + gc.enable() + except NotImplementedError: + gc.disable=gc.enable + diff -Nru guitarix-0.22.4/wafadmin3/__init__.py guitarix-0.24.2/wafadmin3/__init__.py --- guitarix-0.22.4/wafadmin3/__init__.py 1970-01-01 00:00:00.000000000 +0000 +++ guitarix-0.24.2/wafadmin3/__init__.py 2012-10-20 03:56:02.000000000 +0000 @@ -0,0 +1,4 @@ +#! /usr/bin/env python +# encoding: utf-8 + + diff -Nru guitarix-0.22.4/wafadmin3/ansiterm.py guitarix-0.24.2/wafadmin3/ansiterm.py --- guitarix-0.22.4/wafadmin3/ansiterm.py 1970-01-01 00:00:00.000000000 +0000 +++ guitarix-0.24.2/wafadmin3/ansiterm.py 2012-10-20 03:56:02.000000000 +0000 @@ -0,0 +1,156 @@ +#! /usr/bin/env python +# encoding: utf-8 + +import sys,os +try: + if(not sys.stderr.isatty())or(not sys.stdout.isatty()): + raise ValueError('not a tty') + from ctypes import* + class COORD(Structure): + _fields_=[("X",c_short),("Y",c_short)] + class SMALL_RECT(Structure): + _fields_=[("Left",c_short),("Top",c_short),("Right",c_short),("Bottom",c_short)] + class CONSOLE_SCREEN_BUFFER_INFO(Structure): + _fields_=[("Size",COORD),("CursorPosition",COORD),("Attributes",c_short),("Window",SMALL_RECT),("MaximumWindowSize",COORD)] + class CONSOLE_CURSOR_INFO(Structure): + _fields_=[('dwSize',c_ulong),('bVisible',c_int)] + sbinfo=CONSOLE_SCREEN_BUFFER_INFO() + csinfo=CONSOLE_CURSOR_INFO() + hconsole=windll.kernel32.GetStdHandle(-11) + windll.kernel32.GetConsoleScreenBufferInfo(hconsole,byref(sbinfo)) + if sbinfo.Size.X<10 or sbinfo.Size.Y<10:raise Exception('small console') + windll.kernel32.GetConsoleCursorInfo(hconsole,byref(csinfo)) +except Exception: + pass +else: + import re,threading + to_int=lambda number,default:number and int(number)or default + wlock=threading.Lock() + STD_OUTPUT_HANDLE=-11 + STD_ERROR_HANDLE=-12 + class AnsiTerm(object): + def __init__(self): + self.hconsole=windll.kernel32.GetStdHandle(STD_OUTPUT_HANDLE) + self.cursor_history=[] + self.orig_sbinfo=CONSOLE_SCREEN_BUFFER_INFO() + self.orig_csinfo=CONSOLE_CURSOR_INFO() + windll.kernel32.GetConsoleScreenBufferInfo(self.hconsole,byref(self.orig_sbinfo)) + windll.kernel32.GetConsoleCursorInfo(hconsole,byref(self.orig_csinfo)) + def screen_buffer_info(self): + sbinfo=CONSOLE_SCREEN_BUFFER_INFO() + windll.kernel32.GetConsoleScreenBufferInfo(self.hconsole,byref(sbinfo)) + return sbinfo + def clear_line(self,param): + mode=param and int(param)or 0 + sbinfo=self.screen_buffer_info() + if mode==1: + line_start=COORD(0,sbinfo.CursorPosition.Y) + line_length=sbinfo.Size.X + elif mode==2: + line_start=COORD(sbinfo.CursorPosition.X,sbinfo.CursorPosition.Y) + line_length=sbinfo.Size.X-sbinfo.CursorPosition.X + else: + line_start=sbinfo.CursorPosition + line_length=sbinfo.Size.X-sbinfo.CursorPosition.X + chars_written=c_int() + windll.kernel32.FillConsoleOutputCharacterA(self.hconsole,c_char(' '),line_length,line_start,byref(chars_written)) + windll.kernel32.FillConsoleOutputAttribute(self.hconsole,sbinfo.Attributes,line_length,line_start,byref(chars_written)) + def clear_screen(self,param): + mode=to_int(param,0) + sbinfo=self.screen_buffer_info() + if mode==1: + clear_start=COORD(0,0) + clear_length=sbinfo.CursorPosition.X*sbinfo.CursorPosition.Y + elif mode==2: + clear_start=COORD(0,0) + clear_length=sbinfo.Size.X*sbinfo.Size.Y + windll.kernel32.SetConsoleCursorPosition(self.hconsole,clear_start) + else: + clear_start=sbinfo.CursorPosition + clear_length=((sbinfo.Size.X-sbinfo.CursorPosition.X)+sbinfo.Size.X*(sbinfo.Size.Y-sbinfo.CursorPosition.Y)) + chars_written=c_int() + windll.kernel32.FillConsoleOutputCharacterA(self.hconsole,c_char(' '),clear_length,clear_start,byref(chars_written)) + windll.kernel32.FillConsoleOutputAttribute(self.hconsole,sbinfo.Attributes,clear_length,clear_start,byref(chars_written)) + def push_cursor(self,param): + sbinfo=self.screen_buffer_info() + self.cursor_history.push(sbinfo.CursorPosition) + def pop_cursor(self,param): + if self.cursor_history: + old_pos=self.cursor_history.pop() + windll.kernel32.SetConsoleCursorPosition(self.hconsole,old_pos) + def set_cursor(self,param): + x,sep,y=param.partition(';') + x=to_int(x,1)-1 + y=to_int(y,1)-1 + sbinfo=self.screen_buffer_info() + new_pos=COORD(min(max(0,x),sbinfo.Size.X),min(max(0,y),sbinfo.Size.Y)) + windll.kernel32.SetConsoleCursorPosition(self.hconsole,new_pos) + def set_column(self,param): + x=to_int(param,1)-1 + sbinfo=self.screen_buffer_info() + new_pos=COORD(min(max(0,x),sbinfo.Size.X),sbinfo.CursorPosition.Y) + windll.kernel32.SetConsoleCursorPosition(self.hconsole,new_pos) + def move_cursor(self,x_offset=0,y_offset=0): + sbinfo=self.screen_buffer_info() + new_pos=COORD(min(max(0,sbinfo.CursorPosition.X+x_offset),sbinfo.Size.X),min(max(0,sbinfo.CursorPosition.Y+y_offset),sbinfo.Size.Y)) + windll.kernel32.SetConsoleCursorPosition(self.hconsole,new_pos) + def move_up(self,param): + self.move_cursor(y_offset=-to_int(param,1)) + def move_down(self,param): + self.move_cursor(y_offset=to_int(param,1)) + def move_left(self,param): + self.move_cursor(x_offset=-to_int(param,1)) + def move_right(self,param): + self.move_cursor(x_offset=to_int(param,1)) + def next_line(self,param): + sbinfo=self.screen_buffer_info() + self.move_cursor(x_offset=-sbinfo.CursorPosition.X,y_offset=to_int(param,1)) + def prev_line(self,param): + sbinfo=self.screen_buffer_info() + self.move_cursor(x_offset=-sbinfo.CursorPosition.X,y_offset=-to_int(param,1)) + escape_to_color={(0,30):0x0,(0,31):0x4,(0,32):0x2,(0,33):0x4+0x2,(0,34):0x1,(0,35):0x1+0x4,(0,36):0x2+0x4,(0,37):0x1+0x2+0x4,(1,30):0x1+0x2+0x4,(1,31):0x4+0x8,(1,32):0x2+0x8,(1,33):0x4+0x2+0x8,(1,34):0x1+0x8,(1,35):0x1+0x4+0x8,(1,36):0x1+0x2+0x8,(1,37):0x1+0x2+0x4+0x8,} + def set_color(self,param): + cols=param.split(';') + attr=self.orig_sbinfo.Attributes + for c in cols: + c=to_int(c,0) + if c in range(30,38): + attr=(attr&0xf0)|(self.escape_to_color.get((0,c),0x7)) + elif c in range(40,48): + attr=(attr&0x0f)|(self.escape_to_color.get((0,c),0x7)<<8) + elif c in range(90,98): + attr=(attr&0xf0)|(self.escape_to_color.get((1,c-60),0x7)) + elif c in range(100,108): + attr=(attr&0x0f)|(self.escape_to_color.get((1,c-60),0x7)<<8) + elif c==1: + attr|=0x08 + windll.kernel32.SetConsoleTextAttribute(self.hconsole,attr) + def show_cursor(self,param): + csinfo.bVisible=1 + windll.kernel32.SetConsoleCursorInfo(self.hconsole,byref(csinfo)) + def hide_cursor(self,param): + csinfo.bVisible=0 + windll.kernel32.SetConsoleCursorInfo(self.hconsole,byref(csinfo)) + ansi_command_table={'A':move_up,'B':move_down,'C':move_right,'D':move_left,'E':next_line,'F':prev_line,'G':set_column,'H':set_cursor,'f':set_cursor,'J':clear_screen,'K':clear_line,'h':show_cursor,'l':hide_cursor,'m':set_color,'s':push_cursor,'u':pop_cursor,} + ansi_tokans=re.compile('(?:\x1b\[([0-9?;]*)([a-zA-Z])|([^\x1b]+))') + def write(self,text): + wlock.acquire() + for param,cmd,txt in self.ansi_tokans.findall(text): + if cmd: + cmd_func=self.ansi_command_table.get(cmd) + if cmd_func: + cmd_func(self,param) + else: + chars_written=c_int() + if isinstance(txt,str): + windll.kernel32.WriteConsoleW(self.hconsole,txt,len(txt),byref(chars_written),None) + else: + windll.kernel32.WriteConsoleA(self.hconsole,txt,len(txt),byref(chars_written),None) + wlock.release() + def flush(self): + pass + def isatty(self): + return True + sys.stderr=sys.stdout=AnsiTerm() + os.environ['TERM']='vt100' + diff -Nru guitarix-0.22.4/wafadmin3/pproc.py guitarix-0.24.2/wafadmin3/pproc.py --- guitarix-0.22.4/wafadmin3/pproc.py 1970-01-01 00:00:00.000000000 +0000 +++ guitarix-0.24.2/wafadmin3/pproc.py 2012-10-20 03:56:02.000000000 +0000 @@ -0,0 +1,496 @@ +#! /usr/bin/env python +# encoding: utf-8 + +import sys +mswindows=(sys.platform=="win32") +import os +import types +import traceback +import gc +class CalledProcessError(Exception): + def __init__(self,returncode,cmd): + self.returncode=returncode + self.cmd=cmd + def __str__(self): + return"Command '%s' returned non-zero exit status %d"%(self.cmd,self.returncode) +if mswindows: + import threading + import msvcrt + if 0: + import pywintypes + from win32api import GetStdHandle,STD_INPUT_HANDLE,STD_OUTPUT_HANDLE,STD_ERROR_HANDLE + from win32api import GetCurrentProcess,DuplicateHandle,GetModuleFileName,GetVersion + from win32con import DUPLICATE_SAME_ACCESS,SW_HIDE + from win32pipe import CreatePipe + from win32process import CreateProcess,STARTUPINFO,GetExitCodeProcess,STARTF_USESTDHANDLES,STARTF_USESHOWWINDOW,CREATE_NEW_CONSOLE + from win32event import WaitForSingleObject,INFINITE,WAIT_OBJECT_0 + else: + from _subprocess import* + class STARTUPINFO: + dwFlags=0 + hStdInput=None + hStdOutput=None + hStdError=None + wShowWindow=0 + class pywintypes: + error=IOError +else: + import select + import errno + import fcntl + import pickle +__all__=["Popen","PIPE","STDOUT","call","check_call","CalledProcessError"] +try: + MAXFD=os.sysconf("SC_OPEN_MAX") +except: + MAXFD=256 +try: + False +except NameError: + False=0 + True=1 +_active=[] +def _cleanup(): + for inst in _active[:]: + if inst.poll(_deadstate=sys.maxsize)>=0: + try: + _active.remove(inst) + except ValueError: + pass +PIPE=-1 +STDOUT=-2 +def call(*popenargs,**kwargs): + return Popen(*popenargs,**kwargs).wait() +def check_call(*popenargs,**kwargs): + retcode=call(*popenargs,**kwargs) + cmd=kwargs.get("args") + if cmd is None: + cmd=popenargs[0] + if retcode: + raise CalledProcessError(retcode,cmd) + return retcode +def list2cmdline(seq): + result=[] + needquote=False + for arg in seq: + bs_buf=[] + if result: + result.append(' ') + needquote=(" "in arg)or("\t"in arg)or arg=="" + if needquote: + result.append('"') + for c in arg: + if c=='\\': + bs_buf.append(c) + elif c=='"': + result.append('\\'*len(bs_buf)*2) + bs_buf=[] + result.append('\\"') + else: + if bs_buf: + result.extend(bs_buf) + bs_buf=[] + result.append(c) + if bs_buf: + result.extend(bs_buf) + if needquote: + result.extend(bs_buf) + result.append('"') + return''.join(result) +class Popen(object): + def __init__(self,args,bufsize=0,executable=None,stdin=None,stdout=None,stderr=None,preexec_fn=None,close_fds=False,shell=False,cwd=None,env=None,universal_newlines=False,startupinfo=None,creationflags=0): + _cleanup() + self._child_created=False + if not isinstance(bufsize,(int,long)): + raise TypeError("bufsize must be an integer") + if mswindows: + if preexec_fn is not None: + raise ValueError("preexec_fn is not supported on Windows platforms") + if close_fds: + raise ValueError("close_fds is not supported on Windows platforms") + else: + if startupinfo is not None: + raise ValueError("startupinfo is only supported on Windows platforms") + if creationflags!=0: + raise ValueError("creationflags is only supported on Windows platforms") + self.stdin=None + self.stdout=None + self.stderr=None + self.pid=None + self.returncode=None + self.universal_newlines=universal_newlines + (p2cread,p2cwrite,c2pread,c2pwrite,errread,errwrite)=self._get_handles(stdin,stdout,stderr) + self._execute_child(args,executable,preexec_fn,close_fds,cwd,env,universal_newlines,startupinfo,creationflags,shell,p2cread,p2cwrite,c2pread,c2pwrite,errread,errwrite) + if mswindows: + if stdin is None and p2cwrite is not None: + os.close(p2cwrite) + p2cwrite=None + if stdout is None and c2pread is not None: + os.close(c2pread) + c2pread=None + if stderr is None and errread is not None: + os.close(errread) + errread=None + if p2cwrite: + self.stdin=os.fdopen(p2cwrite,'wb',bufsize) + if c2pread: + if universal_newlines: + self.stdout=os.fdopen(c2pread,'rU',bufsize) + else: + self.stdout=os.fdopen(c2pread,'rb',bufsize) + if errread: + if universal_newlines: + self.stderr=os.fdopen(errread,'rU',bufsize) + else: + self.stderr=os.fdopen(errread,'rb',bufsize) + def _translate_newlines(self,data): + data=data.replace("\r\n","\n") + data=data.replace("\r","\n") + return data + def __del__(self,sys=sys): + if not self._child_created: + return + self.poll(_deadstate=sys.maxsize) + if self.returncode is None and _active is not None: + _active.append(self) + def communicate(self,input=None): + if[self.stdin,self.stdout,self.stderr].count(None)>=2: + stdout=None + stderr=None + if self.stdin: + if input: + self.stdin.write(input) + self.stdin.close() + elif self.stdout: + stdout=self.stdout.read() + elif self.stderr: + stderr=self.stderr.read() + self.wait() + return(stdout,stderr) + return self._communicate(input) + if mswindows: + def _get_handles(self,stdin,stdout,stderr): + if stdin is None and stdout is None and stderr is None: + return(None,None,None,None,None,None) + p2cread,p2cwrite=None,None + c2pread,c2pwrite=None,None + errread,errwrite=None,None + if stdin is None: + p2cread=GetStdHandle(STD_INPUT_HANDLE) + if p2cread is not None: + pass + elif stdin is None or stdin==PIPE: + p2cread,p2cwrite=CreatePipe(None,0) + p2cwrite=p2cwrite.Detach() + p2cwrite=msvcrt.open_osfhandle(p2cwrite,0) + elif isinstance(stdin,int): + p2cread=msvcrt.get_osfhandle(stdin) + else: + p2cread=msvcrt.get_osfhandle(stdin.fileno()) + p2cread=self._make_inheritable(p2cread) + if stdout is None: + c2pwrite=GetStdHandle(STD_OUTPUT_HANDLE) + if c2pwrite is not None: + pass + elif stdout is None or stdout==PIPE: + c2pread,c2pwrite=CreatePipe(None,0) + c2pread=c2pread.Detach() + c2pread=msvcrt.open_osfhandle(c2pread,0) + elif isinstance(stdout,int): + c2pwrite=msvcrt.get_osfhandle(stdout) + else: + c2pwrite=msvcrt.get_osfhandle(stdout.fileno()) + c2pwrite=self._make_inheritable(c2pwrite) + if stderr is None: + errwrite=GetStdHandle(STD_ERROR_HANDLE) + if errwrite is not None: + pass + elif stderr is None or stderr==PIPE: + errread,errwrite=CreatePipe(None,0) + errread=errread.Detach() + errread=msvcrt.open_osfhandle(errread,0) + elif stderr==STDOUT: + errwrite=c2pwrite + elif isinstance(stderr,int): + errwrite=msvcrt.get_osfhandle(stderr) + else: + errwrite=msvcrt.get_osfhandle(stderr.fileno()) + errwrite=self._make_inheritable(errwrite) + return(p2cread,p2cwrite,c2pread,c2pwrite,errread,errwrite) + def _make_inheritable(self,handle): + return DuplicateHandle(GetCurrentProcess(),handle,GetCurrentProcess(),0,1,DUPLICATE_SAME_ACCESS) + def _find_w9xpopen(self): + w9xpopen=os.path.join(os.path.dirname(GetModuleFileName(0)),"w9xpopen.exe") + if not os.path.exists(w9xpopen): + w9xpopen=os.path.join(os.path.dirname(sys.exec_prefix),"w9xpopen.exe") + if not os.path.exists(w9xpopen): + raise RuntimeError("Cannot locate w9xpopen.exe, which is needed for Popen to work with your shell or platform.") + return w9xpopen + def _execute_child(self,args,executable,preexec_fn,close_fds,cwd,env,universal_newlines,startupinfo,creationflags,shell,p2cread,p2cwrite,c2pread,c2pwrite,errread,errwrite): + if not isinstance(args,types.StringTypes): + args=list2cmdline(args) + if startupinfo is None: + startupinfo=STARTUPINFO() + if None not in(p2cread,c2pwrite,errwrite): + startupinfo.dwFlags|=STARTF_USESTDHANDLES + startupinfo.hStdInput=p2cread + startupinfo.hStdOutput=c2pwrite + startupinfo.hStdError=errwrite + if shell: + startupinfo.dwFlags|=STARTF_USESHOWWINDOW + startupinfo.wShowWindow=SW_HIDE + comspec=os.environ.get("COMSPEC","cmd.exe") + args=comspec+" /c "+args + if(GetVersion()>=0x80000000L or os.path.basename(comspec).lower()=="command.com"): + w9xpopen=self._find_w9xpopen() + args='"%s" %s'%(w9xpopen,args) + creationflags|=CREATE_NEW_CONSOLE + try: + hp,ht,pid,tid=CreateProcess(executable,args,None,None,1,creationflags,env,cwd,startupinfo) + except pywintypes.error,e: + raise WindowsError(*e.args) + self._child_created=True + self._handle=hp + self.pid=pid + ht.Close() + if p2cread is not None: + p2cread.Close() + if c2pwrite is not None: + c2pwrite.Close() + if errwrite is not None: + errwrite.Close() + def poll(self,_deadstate=None): + if self.returncode is None: + if WaitForSingleObject(self._handle,0)==WAIT_OBJECT_0: + self.returncode=GetExitCodeProcess(self._handle) + return self.returncode + def wait(self): + if self.returncode is None: + obj=WaitForSingleObject(self._handle,INFINITE) + self.returncode=GetExitCodeProcess(self._handle) + return self.returncode + def _readerthread(self,fh,buffer): + buffer.append(fh.read()) + def _communicate(self,input): + stdout=None + stderr=None + if self.stdout: + stdout=[] + stdout_thread=threading.Thread(target=self._readerthread,args=(self.stdout,stdout)) + stdout_thread.setDaemon(True) + stdout_thread.start() + if self.stderr: + stderr=[] + stderr_thread=threading.Thread(target=self._readerthread,args=(self.stderr,stderr)) + stderr_thread.setDaemon(True) + stderr_thread.start() + if self.stdin: + if input is not None: + self.stdin.write(input) + self.stdin.close() + if self.stdout: + stdout_thread.join() + if self.stderr: + stderr_thread.join() + if stdout is not None: + stdout=stdout[0] + if stderr is not None: + stderr=stderr[0] + if self.universal_newlines and hasattr(file,'newlines'): + if stdout: + stdout=self._translate_newlines(stdout) + if stderr: + stderr=self._translate_newlines(stderr) + self.wait() + return(stdout,stderr) + else: + def _get_handles(self,stdin,stdout,stderr): + p2cread,p2cwrite=None,None + c2pread,c2pwrite=None,None + errread,errwrite=None,None + if stdin is None: + pass + elif stdin==PIPE: + p2cread,p2cwrite=os.pipe() + elif isinstance(stdin,int): + p2cread=stdin + else: + p2cread=stdin.fileno() + if stdout is None: + pass + elif stdout==PIPE: + c2pread,c2pwrite=os.pipe() + elif isinstance(stdout,int): + c2pwrite=stdout + else: + c2pwrite=stdout.fileno() + if stderr is None: + pass + elif stderr==PIPE: + errread,errwrite=os.pipe() + elif stderr==STDOUT: + errwrite=c2pwrite + elif isinstance(stderr,int): + errwrite=stderr + else: + errwrite=stderr.fileno() + return(p2cread,p2cwrite,c2pread,c2pwrite,errread,errwrite) + def _set_cloexec_flag(self,fd): + try: + cloexec_flag=fcntl.FD_CLOEXEC + except AttributeError: + cloexec_flag=1 + old=fcntl.fcntl(fd,fcntl.F_GETFD) + fcntl.fcntl(fd,fcntl.F_SETFD,old|cloexec_flag) + def _close_fds(self,but): + for i in range(3,MAXFD): + if i==but: + continue + try: + os.close(i) + except: + pass + def _execute_child(self,args,executable,preexec_fn,close_fds,cwd,env,universal_newlines,startupinfo,creationflags,shell,p2cread,p2cwrite,c2pread,c2pwrite,errread,errwrite): + if isinstance(args,types.StringTypes): + args=[args] + else: + args=list(args) + if shell: + args=["/bin/sh","-c"]+args + if executable is None: + executable=args[0] + errpipe_read,errpipe_write=os.pipe() + self._set_cloexec_flag(errpipe_write) + gc_was_enabled=gc.isenabled() + gc.disable() + try: + self.pid=os.fork() + except: + if gc_was_enabled: + gc.enable() + raise + self._child_created=True + if self.pid==0: + try: + if p2cwrite: + os.close(p2cwrite) + if c2pread: + os.close(c2pread) + if errread: + os.close(errread) + os.close(errpipe_read) + if p2cread: + os.dup2(p2cread,0) + if c2pwrite: + os.dup2(c2pwrite,1) + if errwrite: + os.dup2(errwrite,2) + if p2cread and p2cread not in(0,): + os.close(p2cread) + if c2pwrite and c2pwrite not in(p2cread,1): + os.close(c2pwrite) + if errwrite and errwrite not in(p2cread,c2pwrite,2): + os.close(errwrite) + if close_fds: + self._close_fds(but=errpipe_write) + if cwd is not None: + os.chdir(cwd) + if preexec_fn: + apply(preexec_fn) + if env is None: + os.execvp(executable,args) + else: + os.execvpe(executable,args,env) + except: + exc_type,exc_value,tb=sys.exc_info() + exc_lines=traceback.format_exception(exc_type,exc_value,tb) + exc_value.child_traceback=''.join(exc_lines) + os.write(errpipe_write,pickle.dumps(exc_value)) + os._exit(255) + if gc_was_enabled: + gc.enable() + os.close(errpipe_write) + if p2cread and p2cwrite: + os.close(p2cread) + if c2pwrite and c2pread: + os.close(c2pwrite) + if errwrite and errread: + os.close(errwrite) + data=os.read(errpipe_read,1048576) + os.close(errpipe_read) + if data!="": + os.waitpid(self.pid,0) + child_exception=pickle.loads(data) + raise child_exception + def _handle_exitstatus(self,sts): + if os.WIFSIGNALED(sts): + self.returncode=-os.WTERMSIG(sts) + elif os.WIFEXITED(sts): + self.returncode=os.WEXITSTATUS(sts) + else: + raise RuntimeError("Unknown child exit status!") + def poll(self,_deadstate=None): + if self.returncode is None: + try: + pid,sts=os.waitpid(self.pid,os.WNOHANG) + if pid==self.pid: + self._handle_exitstatus(sts) + except os.error: + if _deadstate is not None: + self.returncode=_deadstate + return self.returncode + def wait(self): + if self.returncode is None: + pid,sts=os.waitpid(self.pid,0) + self._handle_exitstatus(sts) + return self.returncode + def _communicate(self,input): + read_set=[] + write_set=[] + stdout=None + stderr=None + if self.stdin: + self.stdin.flush() + if input: + write_set.append(self.stdin) + else: + self.stdin.close() + if self.stdout: + read_set.append(self.stdout) + stdout=[] + if self.stderr: + read_set.append(self.stderr) + stderr=[] + input_offset=0 + while read_set or write_set: + rlist,wlist,xlist=select.select(read_set,write_set,[]) + if self.stdin in wlist: + bytes_written=os.write(self.stdin.fileno(),buffer(input,input_offset,512)) + input_offset+=bytes_written + if input_offset>=len(input): + self.stdin.close() + write_set.remove(self.stdin) + if self.stdout in rlist: + data=os.read(self.stdout.fileno(),1024) + if data=="": + self.stdout.close() + read_set.remove(self.stdout) + stdout.append(data) + if self.stderr in rlist: + data=os.read(self.stderr.fileno(),1024) + if data=="": + self.stderr.close() + read_set.remove(self.stderr) + stderr.append(data) + if stdout is not None: + stdout=''.join(stdout) + if stderr is not None: + stderr=''.join(stderr) + if self.universal_newlines and hasattr(file,'newlines'): + if stdout: + stdout=self._translate_newlines(stdout) + if stderr: + stderr=self._translate_newlines(stderr) + self.wait() + return(stdout,stderr) + diff -Nru guitarix-0.22.4/wafadmin3/py3kfixes.py guitarix-0.24.2/wafadmin3/py3kfixes.py --- guitarix-0.22.4/wafadmin3/py3kfixes.py 1970-01-01 00:00:00.000000000 +0000 +++ guitarix-0.24.2/wafadmin3/py3kfixes.py 2012-10-20 03:56:02.000000000 +0000 @@ -0,0 +1,104 @@ +#! /usr/bin/env python +# encoding: utf-8 + +import os +all_modifs={} +def modif(dir,name,fun): + if name=='*': + lst=[] + for y in'. Tools 3rdparty'.split(): + for x in os.listdir(os.path.join(dir,y)): + if x.endswith('.py'): + lst.append(y+os.sep+x) + for x in lst: + modif(dir,x,fun) + return + filename=os.path.join(dir,name) + f=open(filename,'r') + txt=f.read() + f.close() + txt=fun(txt) + f=open(filename,'w') + f.write(txt) + f.close() +def subst(filename): + def do_subst(fun): + global all_modifs + try: + all_modifs[filename]+=fun + except KeyError: + all_modifs[filename]=[fun] + return fun + return do_subst +def r1(code): + code=code.replace("'iluvcuteoverload'","b'iluvcuteoverload'") + code=code.replace("ABI=7","ABI=37") + return code +def r2(code): + code=code.replace("p.stdin.write('\\n')","p.stdin.write(b'\\n')") + code=code.replace('p.communicate()[0]','p.communicate()[0].decode("utf-8")') + return code +def r3(code): + code=code.replace("m.update(str(lst))","m.update(str(lst).encode())") + code=code.replace('p.communicate()[0]','p.communicate()[0].decode("utf-8")') + return code +def r33(code): + code=code.replace('unicode','str') + return code +def r4(code): + code=code.replace("up(self.__class__.__name__)","up(self.__class__.__name__.encode())") + code=code.replace("up(self.env.variant())","up(self.env.variant().encode())") + code=code.replace("up(x.parent.abspath())","up(x.parent.abspath().encode())") + code=code.replace("up(x.name)","up(x.name.encode())") + code=code.replace('class TaskBase(object):\n\t__metaclass__=store_task_type','import binascii\n\nclass TaskBase(object, metaclass=store_task_type):') + code=code.replace('keys=self.cstr_groups.keys()','keys=list(self.cstr_groups.keys())') + code=code.replace("sig.encode('hex')",'binascii.hexlify(sig)') + code=code.replace("os.path.join(Options.cache_global,ssig)","os.path.join(Options.cache_global,ssig.decode())") + return code +def r5(code): + code=code.replace("cPickle.dump(data,file,-1)","cPickle.dump(data,file)") + code=code.replace('for node in src_dir_node.childs.values():','for node in list(src_dir_node.childs.values()):') + return code +def r6(code): + code=code.replace('range','range') + code=code.replace('items','items') + code=code.replace('maxsize','maxsize') + code=code.replace('keys','keys') + code=code.replace('Error as e:','Error as e:') + code=code.replace('Exception as e:','Exception as e:') + return code +def r7(code): + code=code.replace('class task_gen(object):\n\t__metaclass__=register_obj','class task_gen(object, metaclass=register_obj):') + return code +def r8(code): + code=code.replace('proc.communicate()[0]','proc.communicate()[0].decode("utf-8")') + return code +def r9(code): + code=code.replace('f.write(c)','f.write(c.encode("utf-8"))') + return code +def r10(code): + code=code.replace("key=kw['success']","key=kw['success']\n\t\t\t\ttry:\n\t\t\t\t\tkey=key.decode('utf-8')\n\t\t\t\texcept:\n\t\t\t\t\tpass") + code=code.replace('out=str(out)','out=out.decode("utf-8")') + code=code.replace('err=str(err)','err=err.decode("utf-8")') + return code +def r11(code): + code=code.replace('ret.strip()','ret.strip().decode("utf-8")') + return code +def fixdir(dir): + global all_modifs + for k in all_modifs: + for v in all_modifs[k]: + modif(os.path.join(dir,'wafadmin'),k,v) + +subst('Constants.py')(r1) +subst('Tools/ccroot.py')(r2) +subst('Utils.py')(r3) +subst('ansiterm.py')(r33) +subst('Task.py')(r4) +subst('Build.py')(r5) +subst('*')(r6) +subst('TaskGen.py')(r7) +subst('Tools/python.py')(r8) +subst('Tools/glib2.py')(r9) +subst('Tools/config_c.py')(r10) +subst('Tools/d.py')(r11) diff -Nru guitarix-0.22.4/wscript guitarix-0.24.2/wscript --- guitarix-0.22.4/wscript 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/wscript 2012-10-20 03:56:02.000000000 +0000 @@ -15,7 +15,7 @@ except: WAFVERSION='1.0.0' if WAFVERSION[:3] != '1.5': - print 'Incompatible Waf, use 1.5' + print('Incompatible Waf, use 1.5') sys.exit (1) # these variables are mandatory ('/' are converted automatically) @@ -24,10 +24,10 @@ use_2to3 = True # used by waf dist and waf build -VERSION='0.22.4' +VERSION='0.24.2' APPNAME='guitarix' -good_faust_versions = ['0.9.43'] +good_faust_versions = ['0.9.43','0.9.46'] g_maxlen = 40 # maximum width of message for 2-column display @@ -79,6 +79,12 @@ dest='cxxflags', help='C++ base compiler flags [Default: %default]') + comp.add_option('--ldflags', + type='string', + default='', + dest='ldflags', + help='C++ base linker flags ') + comp.add_option('--optimization', action='store_const', default=False, #'-fomit-frame-pointer -ffast-math -fstrength-reduce -pipe', @@ -214,7 +220,7 @@ cpu_model = None x86_flags = None try: - for line in file("/proc/cpuinfo"): + for line in open("/proc/cpuinfo"): if cpu_model is None: if line.startswith("model name"): cpu_model = line.split(":",1)[1].strip() @@ -268,6 +274,9 @@ elif "ssse3" in x86_flags: cxxflags.append ("-mssse3") cxxflags.append ("-mfpmath=sse") + elif "sse4a" in x86_flags: + cxxflags.append ("-msse4a") + cxxflags.append ("-mfpmath=sse") elif "sse4" in x86_flags: cxxflags.append ("-msse4") cxxflags.append ("-mfpmath=sse") @@ -334,6 +343,14 @@ conf.env['FAUST_DOUBLE'] = not Options.options.faust_float def check_boost(conf): + code=""" + #include + int main() { boost::system::error_code c; } + """ + msg = "Checking for boost-system " + conf.check_cxx(msg = msg, fragment=code, lib="boost_system", uselib_store="BOOST_SYSTEM", mandatory=1) + # some boost (>1.49) versions depend on boost-system so we will check for it first + # and later link against boost_system were boost headers are included. boost_atleast_version = 104200 boost_atleast_vermsg = "1.42" code=""" @@ -346,7 +363,7 @@ int main(){ return 0; } """ % boost_atleast_version msg = "Checking for boost >= %s" % boost_atleast_vermsg - conf.check_cxx(msg = msg, fragment=code, mandatory=1) + conf.check_cxx(msg = msg, fragment=code, lib="boost_system", mandatory=1) # not needed: with boost 1.42 Guitarix doesn't generate code which # references the boost threading lib #msg = "Checking for boost_thread%%s >= %s" % boost_atleast_vermsg @@ -427,7 +444,7 @@ ################################################################ # guitarix waf configuration # - + def configure(conf): opt = Options.options if 'LINGUAS' in os.environ: conf.env['LINGUAS'] = os.environ['LINGUAS'] @@ -475,6 +492,10 @@ if opt.python_wrapper or opt.glade_support: conf.check_tool('compiler_cc') conf.env['shlib_LINKFLAGS'].append("-fPIC") # error in waf 1.5.18? + # linker flags + conf.env.append_value('LDFLAGS', opt.ldflags) + conf.env['LINKFLAGS'] = conf.env['LDFLAGS'] + # needed libaries try: conf.check_cfg(package='jack', atleast_version='0.116.2', max_version='1.8.0', args='--cflags --libs', uselib_store='JACK', mandatory=1) @@ -492,6 +513,7 @@ conf.check_cfg(package='gtkmm-2.4', atleast_version='2.20', args='--cflags --libs', uselib_store='GTKMM', mandatory=1) conf.check_cfg(package='giomm-2.4', atleast_version='2.24', args='--cflags --libs', uselib_store='GIOMM', mandatory=1) conf.check_cfg(package='fftw3f', atleast_version='3.1.2', args='--cflags --libs', uselib_store='FFTW3', mandatory=1) + conf.check_cfg(package='lrdf', args='--cflags --libs', uselib_store='LRDF', mandatory=1) if not opt.no_ladspa: conf.check(header_name='ladspa.h', mandatory=1) @@ -566,7 +588,7 @@ conf.sub_config('rcstyles'); # some output - print + print("") display_msg("==================") version_msg = "GUITARIX II " + VERSION print_msg(version_msg) @@ -577,6 +599,7 @@ if cpu_model: display_msg("CPU version" , "%s" % cpu_model, "CYAN") display_msg("C++ flags", " ".join(conf.env['CXXFLAGS']), 'CYAN') + display_msg("Link flags", " ".join(conf.env['LINKFLAGS']), 'CYAN') display_msg("Compiler %s version" %conf.env["CXX"], "%s" % ".".join(conf.env["CC_VERSION"]), "CYAN") display_feature("Use prebuild faust files", not conf.env['FAUST']) if not opt.faust_float: @@ -642,18 +665,19 @@ bld.add_subdirs('src/gx_head') if bld.env["NEW_LADSPA"]: bld.add_subdirs('src/ladspa') - bld.install_files(bld.env['DESKAPPS_DIR'], 'guitarix.desktop', chmod=0644) - bld.install_files(bld.env['GX_FACTORY_DIR'], 'factorysettings/dirlist.js', chmod=0664) - bld.install_files(bld.env['GX_FACTORY_DIR'], 'factorysettings/funkmuscle.gx', chmod=0664) - bld.install_files(bld.env['GX_FACTORY_DIR'], 'factorysettings/dlp_ae.gx', chmod=0664) - bld.install_files(bld.env['GX_FACTORY_DIR'], 'factorysettings/zettberlin.gx', chmod=0664) - bld.install_files(bld.env['GX_FACTORY_DIR'], 'factorysettings/autoandimat.gx', chmod=0664) - bld.install_files(bld.env['GX_FACTORY_DIR'], 'factorysettings/jp_n_o_s.gx', chmod=0664) - bld.install_files(bld.env['GX_FACTORY_DIR'], 'factorysettings/univibe', chmod=0664) - bld.install_files(bld.env['GX_FACTORY_DIR'], 'factorysettings/univibe_mono', chmod=0664) - bld.install_files(bld.env['GX_FACTORY_DIR'], 'factorysettings/jconv', chmod=0664) + bld.install_files(bld.env['DESKAPPS_DIR'], 'guitarix.desktop', chmod=0o644) + bld.install_files(bld.env['GX_FACTORY_DIR'], 'factorysettings/dirlist.js', chmod=0o664) + bld.install_files(bld.env['GX_FACTORY_DIR'], 'factorysettings/funkmuscle.gx', chmod=0o664) + bld.install_files(bld.env['GX_FACTORY_DIR'], 'factorysettings/dlp_ae.gx', chmod=0o664) + bld.install_files(bld.env['GX_FACTORY_DIR'], 'factorysettings/zettberlin.gx', chmod=0o664) + bld.install_files(bld.env['GX_FACTORY_DIR'], 'factorysettings/autoandimat.gx', chmod=0o664) + bld.install_files(bld.env['GX_FACTORY_DIR'], 'factorysettings/jp_n_o_s.gx', chmod=0o664) + bld.install_files(bld.env['GX_FACTORY_DIR'], 'factorysettings/univibe', chmod=0o664) + bld.install_files(bld.env['GX_FACTORY_DIR'], 'factorysettings/univibe_mono', chmod=0o664) + bld.install_files(bld.env['GX_FACTORY_DIR'], 'factorysettings/flanger_mono_gx', chmod=0o664) + bld.install_files(bld.env['GX_FACTORY_DIR'], 'factorysettings/jconv', chmod=0o664) # "greathall.wav" is referenced in the source (keep in sync when changing) - bld.install_files(bld.env['GX_SOUND_DIR'], './IR/greathall.wav', chmod=0664) + bld.install_files(bld.env['GX_SOUND_DIR'], './IR/greathall.wav', chmod=0o664) gen_desktop = bld(features = "intltool_in", podir = "po", @@ -749,13 +773,13 @@ try: raw_input("%s exists, press enter to remove (stop with Ctrl-C)\n" % path) except KeyboardInterrupt: - print + print("") raise Utils.WafError('distcheck cancelled') return else: - print "removing %s" % path + print("removing %s" % path) shutil.rmtree(path) - print "creating tarball and extracting files into %s" % path + print("creating tarball and extracting files into %s" % path) dist(ctx) t = tarfile.open(tarball) for x in t: @@ -764,8 +788,8 @@ build_path = path instdir = tempfile.mkdtemp('.inst', path) cmdargs = [waf,'configure','build','install','uninstall','--destdir='+instdir] - print 'starting "%s"' % (" ".join(cmdargs)) - print + print('starting "%s"' % (" ".join(cmdargs))) + print("") ret = Utils.pproc.Popen(cmdargs, cwd=build_path).wait() if ret: raise Utils.WafError('distcheck failed with code %i'%ret) diff -Nru guitarix-0.22.4/wscript_dsp.py guitarix-0.24.2/wscript_dsp.py --- guitarix-0.22.4/wscript_dsp.py 2012-06-11 22:26:58.000000000 +0000 +++ guitarix-0.24.2/wscript_dsp.py 2012-10-20 03:56:02.000000000 +0000 @@ -31,7 +31,7 @@ shutil.copy2(dst, cpy) if cpy_h: shutil.copy2(dst_h, cpy_h) - except (OSError, IOError), e: + except (OSError, IOError) as e: Logs.error("runner: cannot copy file -> %s" % e) return e.errno return 0