10 Commits
0.1.6 ... 0.1.7

Author SHA1 Message Date
Tomasz Moń
29124043ba add RP500 distortion settings 2009-04-14 23:23:41 +02:00
Tomasz Moń
e93e6bd16b add compability mode dialog 2009-04-14 21:00:10 +02:00
Tomasz Moń
f7ddd5e0d6 add RP500 chorusfx settings 2009-04-14 18:22:32 +02:00
Tomasz Moń
6a082acc53 add RP500 delay settings 2009-04-13 11:42:15 +02:00
Tomasz Moń
1abcc82829 add RP500 equalizer settings 2009-04-12 20:55:17 +02:00
Tomasz Moń
c964d38c17 add RP500 compressor and amp settings 2009-04-12 18:36:41 +02:00
Tomasz Moń
12c2ccc87f Use single header includes 2009-04-11 22:32:21 +02:00
Tomasz Moń
a6d07fd802 disconnect adjustment signals on gtk_knob_destroy 2009-04-10 14:23:23 +02:00
Tomasz Moń
215683b167 actually g_type_class_peek_parent makes more sense 2009-04-10 13:32:03 +02:00
Tomasz Moń
741482afd4 Added tag 0.1.6 for changeset 80e56807413b 2009-03-26 15:21:18 +01:00
10 changed files with 1038 additions and 105 deletions

1
TODO
View File

@@ -4,3 +4,4 @@
-buildsystem (install knob.png to share dir, don't use inline knob pixbuf)
-add expression pedal settings to gui
-read asynchronously from MIDI IN
-guess device port when user doesn't explicitly provide it (don't use hardcoded "hw:1,0,0")

780
effects.c

File diff suppressed because it is too large Load Diff

View File

@@ -17,7 +17,7 @@
#ifndef GDIGI_EFFECTS_H
#define GDIGI_EFFECTS_H
#include <glib/gtypes.h>
#include <glib.h>
typedef struct {
gdouble min; /**< Minumum value */
@@ -60,7 +60,16 @@ typedef struct {
gint group_amt;
} ModifierGroup;
typedef struct {
gchar *name;
EffectList *list;
int n_list;
} SupportedDevices;
ModifierGroup *modifier_linkable_list();
void modifier_group_free(ModifierGroup *modifier_group);
gboolean get_effect_list(unsigned char device_id, unsigned char family_id,
unsigned char product_id,
EffectList **list, int *n_list);
#endif /* GDIGI_EFFECTS_H */

17
gdigi.c
View File

@@ -566,9 +566,20 @@ int main(int argc, char *argv[]) {
if (request_who_am_i(&device_id, &family_id, &product_id) == FALSE) {
show_error_message(NULL, "No suitable reply from device");
} else {
gui_create();
gtk_main();
gui_free();
EffectList *list = NULL;
int n_list = -1;
if (get_effect_list(device_id, family_id, product_id, &list, &n_list) == FALSE) {
if (unsupported_device_dialog(&list, &n_list) == FALSE) {
g_message("Shutting down");
}
}
if (list != NULL && n_list != -1) {
gui_create(list, n_list);
gtk_main();
gui_free();
}
}
}

186
gdigi.h
View File

@@ -41,7 +41,8 @@ enum {
enum {
COMP_TYPE_DIGI = 195,
COMP_TYPE_CS = 196
COMP_TYPE_CS = 196,
COMP_TYPE_DYNA = 197
};
#define COMP_TYPE 207
@@ -52,6 +53,8 @@ enum {
#define COMP_TONE 209
#define COMP_ATTACK 211
#define COMP_LEVEL 210
#define COMP_SENSITIVITY 213
#define COMP_OUTPUT 212
enum {
PICKUP_TYPE_HB_SC = 66,
@@ -65,8 +68,10 @@ enum {
enum {
DIST_TYPE_SCREAMER = 1280,
DIST_TYPE_808 = 1292,
DIST_TYPE_SPARKDRIVE = 1286,
DIST_TYPE_GUYOD = 1285,
DIST_TYPE_DOD250 = 1283,
DIST_TYPE_REDLINE = 1297,
DIST_TYPE_RODENT = 1281,
DIST_TYPE_MX = 1291,
DIST_TYPE_DS = 1282,
@@ -74,6 +79,9 @@ enum {
DIST_TYPE_ZONE = 1289,
DIST_TYPE_DEATH = 1294,
DIST_TYPE_GONK = 1293,
DIST_TYPE_8TAVIA = 1290,
DIST_TYPE_FUZZLATOR = 1295,
DIST_TYPE_CLASSIC_FUZZ = 1296,
DIST_TYPE_FUZZY = 1288,
DIST_TYPE_MP = 1284
};
@@ -85,41 +93,74 @@ enum {
#define DIST_SCREAMER_DRIVE 2434
#define DIST_SCREAMER_TONE 2435
#define DIST_SCREAMER_LVL 2436
#define DIST_808_OVERDRIVE 2473
#define DIST_808_TONE 2474
#define DIST_808_LVL 2475
#define DIST_SPARKDRIVE_GAIN 2450
#define DIST_SPARKDRIVE_TONE 2451
#define DIST_SPARKDRIVE_CLEAN 2452
#define DIST_SPARKDRIVE_VOLUME 2453
#define DIST_GUYOD_DRIVE 2448
#define DIST_GUYOD_LVL 2449
#define DIST_DOD250_GAIN 2443
#define DIST_DOD250_LVL 2444
#define DIST_REDLINE_GAIN 2488
#define DIST_REDLINE_LOW 2489
#define DIST_REDLINE_HIGH 2490
#define DIST_REDLINE_LEVEL 2491
#define DIST_RODENT_DIST 2437
#define DIST_RODENT_FILTER 2438
#define DIST_RODENT_LVL 2439
#define DIST_MX_DIST 2468
#define DIST_MX_OUTPUT 2469
#define DIST_DS_GAIN 2440
#define DIST_DS_TONE 2441
#define DIST_DS_LVL 2442
#define DIST_GRUNGE_GRUNGE 2454
#define DIST_GRUNGE_FACE 2456
#define DIST_GRUNGE_LOUD 2457
#define DIST_GRUNGE_BUTT 2455
#define DIST_ZONE_GAIN 2460
#define DIST_ZONE_LOW 2463
#define DIST_ZONE_MID_LVL 2462
#define DIST_ZONE_MID_FREQ 2461
#define DIST_ZONE_HIGH 2464
#define DIST_ZONE_LEVEL 2465
#define DIST_DEATH_LOW 2477
#define DIST_DEATH_MID 2476
#define DIST_DEATH_HIGH 2479
#define DIST_DEATH_LVL 2478
#define DIST_GONK_GONK 2480
#define DIST_GONK_SMEAR 2471
#define DIST_GONK_SUCK 2470
#define DIST_GONK_HEAVE 2472
#define DIST_8TAVIA_DRIVE 2466
#define DIST_8TAVIA_VOLUME 2467
#define DIST_FUZZLATOR_FUZZ 2481
#define DIST_FUZZLATOR_TONE 2482
#define DIST_FUZZLATOR_LOOSETIGHT 2483
#define DIST_FUZZLATOR_VOLUME 2484
#define DIST_CLASSIC_FUZZ_FUZZ 2485
#define DIST_CLASSIC_FUZZ_TONE 2486
#define DIST_CLASSIC_FUZZ_VOLUME 2487
#define DIST_FUZZY_FUZZ 2458
#define DIST_FUZZY_VOLUME 2459
#define DIST_MP_SUSTAIN 2445
#define DIST_MP_TONE 2446
#define DIST_MP_VOLUME 2447
@@ -131,24 +172,55 @@ enum {
AMP_TYPE_TWEED_CHAMP = 307,
AMP_TYPE_TWEED_DELUXE = 308,
AMP_TYPE_TWEED_BASSMAN = 309,
AMP_TYPE_BROWN_BASSMAN = 310,
AMP_TYPE_BLACKFACE_TWIN = 311,
AMP_TYPE_BLACKFACE_DELUXE = 312,
AMP_TYPE_PLEXI_JTM_45 = 313,
AMP_TYPE_SUPER_LEAD_PLEXI = 314,
AMP_TYPE_PLEXI_JUMP_PANEL = 315,
AMP_TYPE_MASTER_VOLUME = 316,
AMP_TYPE_JCM800 = 317,
AMP_TYPE_JCM900 = 318,
AMP_TYPE_JCM2000 = 319,
AMP_TYPE_AC15 = 322,
AMP_TYPE_AC30TB = 323,
AMP_TYPE_HIWATT_100 = 324,
AMP_TYPE_BOOGIE_MARK_II = 320,
AMP_TYPE_BOOGIE_MARK_IV = 371,
AMP_TYPE_DUAL_RECTIFIER = 321,
AMP_TYPE_TRIPLE_RECTIFIER = 370,
AMP_TYPE_LEGACY_VL100 = 327,
AMP_TYPE_MATCHLESS_HC30 = 326,
AMP_TYPE_SOLDANO_100 = 325,
AMP_TYPE_SUPERGROUP = 381,
AMP_TYPE_GA40 = 380,
AMP_TYPE_OR120 = 372,
AMP_TYPE_PV5150II = 373,
AMP_TYPE_RG100 = 374,
AMP_TYPE_JC120_JAZZ = 375,
AMP_TYPE_SOLAR100 = 376,
AMP_TYPE_SOLO = 331,
AMP_TYPE_METAL = 332,
AMP_TYPE_BRIGHT = 333,
AMP_TYPE_CHUNK = 334,
AMP_TYPE_CLEAN = 335,
AMP_TYPE_HIGH_GAIN = 337,
AMP_TYPE_BLUES = 338,
AMP_TYPE_FUZZ = 339,
AMP_TYPE_SPANK = 330,
AMP_TYPE_GSP2101_CLEAN_TUBE = 328,
AMP_TYPE_GSP2101_SAT_TUBE = 329,
AMP_TYPE_CRUNCH = 336,
AMP_TYPE_MONSTER = 377,
AMP_TYPE_TWEEDFACE = 378,
AMP_TYPE_BLACKBASS = 379,
AMP_TYPE_STONER_ROCK = 368,
AMP_TYPE_DARK_METAL = 369,
AMP_TYPE_TRANSISTOR = 382,
AMP_TYPE_BROWN_SOUND = 383,
AMP_TYPE_MOSH = 384,
AMP_TYPE_ACOUSTIC = 341,
AMP_TYPE_JUMBO_ACOUSTIC = 340,
AMP_TYPE_DIRECT = 306
};
@@ -165,6 +237,9 @@ enum {
#define AMP_GAIN 2497
#define AMP_LEVEL 2498
#define AMP_BASS 2507
#define AMP_MID 2508
#define AMP_TREBLE 2509
#define AMP_CAB_TYPE 2560
#define AMP_CAB_POSITION 9
@@ -173,18 +248,29 @@ enum {
#define AMP_CAB_DIRECT 570
#define AMP_CAB_CHAMP 571
#define AMP_CAB_DELUXE 572
#define AMP_CAB_DELUXE_REVERB 573
#define AMP_CAB_BRITISH1_12 623
#define AMP_CAB_GA1_12 624
#define AMP_CAB_BLONDE2_12 577
#define AMP_CAB_TWIN 576
#define AMP_CAB_BRITISH2_12 613
#define AMP_CAB_JAZZ2_12 626
#define AMP_CAB_BASSMAN 579
#define AMP_CAB_BRITISH4_12 614
#define AMP_CAB_BRITISH_GREEN 616
#define AMP_CAB_FANE4_12 584
#define AMP_CAB_BOUTIQUE4_12 583
#define AMP_CAB_VINTAGE 622
#define AMP_CAB_RECTO4_12 625
#define AMP_CAB_DIGI_SOLO 609
#define AMP_CAB_DIGI_BRIGHT 611
#define AMP_CAB_DIGI_METAL 618
#define AMP_CAB_DIGI_ROCK 619
#define AMP_CAB_DIGI_ALT 620
#define AMP_CAB_DIGI_VNTG 621
#define AMP_CAB_DIGI_CHUNK 612
#define AMP_CAB_DIGI_SPANK2_12 608
#define AMP_CAB_DIGI_SPKR_COMP 585
#define EQ_TYPE 3202
#define EQ_ON_OFF 3212
@@ -195,6 +281,15 @@ enum {
#define EQ_MID_HZ 3206
#define EQ_TREBLE 3205
#define EQ_TREBLE_HZ 3211
#define EQ_LOW_LEVEL 3203
#define EQ_MID_LEVEL 3204
#define EQ_HIGH_LEVEL 3205
#define EQ_LOW_FREQ 3213
#define EQ_MID_FREQ 3214
#define EQ_HIGH_FREQ 3215
#define EQ_LOW_BANDWIDTH 3216
#define EQ_MID_BANDWIDTH 3217
#define EQ_HIGH_BANDWIDTH 3218
enum {
NOISEGATE_GATE = 768,
@@ -216,24 +311,40 @@ enum {
enum {
CHORUS_TYPE_CE = 0x37B,
CHORUS_TYPE_TC = 0x37C,
CHORUS_TYPE_DUAL = 0x379,
CHORUS_TYPE_GLISTEN = 0x392,
CHORUS_TYPE_MULTI = 0x37a,
CHORUS_TYPE_FLANGER = 0x37d,
CHORUS_TYPE_TRIGGERED_FLANGER = 0x37e,
CHORUS_TYPE_MXR_FLANGER = 0x37f,
CHORUS_TYPE_EH_FLANGER = 0x380,
CHORUS_TYPE_AD_FLANGER = 0x393,
CHORUS_TYPE_PHASER = 0x381,
CHORUS_TYPE_TRIGGERED_PHASER = 0x382,
CHORUS_TYPE_MX_PHASER = 0x383,
CHORUS_TYPE_EH_PHASER = 0x384,
CHORUS_TYPE_VIBRATO = 0x360,
CHORUS_TYPE_ROTARY = 0x361,
CHORUS_TYPE_VIBROPAN = 0x38f,
CHORUS_TYPE_UNOVIBE = 0x390,
CHORUS_TYPE_TREMOLO = 0x35e,
CHORUS_TYPE_SCATTER_TREM = 0x394,
CHORUS_TYPE_OPTO_TREMOLO = 0x388,
CHORUS_TYPE_BIAS_TREMOLO = 0x389,
CHORUS_TYPE_PANNER = 0x35f,
CHORUS_TYPE_ENVELOPE = 0x38a,
CHORUS_TYPE_FX25 = 0x38e,
CHORUS_TYPE_AUTOYA = 0x38b,
CHORUS_TYPE_YAYA = 0x38c,
CHORUS_TYPE_SYNTH_TALK = 0x391,
CHORUS_TYPE_STEP_FILTER = 0x38d,
CHORUS_TYPE_SAMPLE_HOLD = 0x395,
CHORUS_TYPE_WHAMMY = 0x540,
CHORUS_TYPE_PITCH_SHIFT = 0x543,
CHORUS_TYPE_DETUNE = 0x542,
CHORUS_TYPE_IPS = 0x541
CHORUS_TYPE_IPS = 0x541,
CHORUS_TYPE_OCTAVER = 0x385,
};
#define CHORUSFX_TYPE 768
@@ -243,6 +354,9 @@ enum {
#define CE_CHORUS_SPEED 837
#define CE_CHORUS_DEPTH 838
#define CHORUS_WIDTH 848
#define CHORUS_INTENSITY 849
#define DUAL_CHORUS_SPEED 837
#define DUAL_CHORUS_DEPTH 838
#define DUAL_CHORUS_LEVEL 836
@@ -259,17 +373,39 @@ enum {
#define FLANGER_LEVEL 901
#define FLANGER_WAVE 905
#define TRIG_FLANGER_SPEED 1030
#define TRIG_FLANGER_SENS 1031
#define TRIG_FLANGER_LFO_START 1028
#define TRIG_FLANGER_LEVEL 1032
#define MXR_FLANGER_SPEED 902
#define MXR_FLANGER_WIDTH 914
#define MXR_FLANGER_REGEN 904
#define MXR_FLANGER_MANUAL 917
#define EH_FLANGER_RATE 918
#define EH_FLANGER_RANGE 919
#define EH_FLANGER_COLOR 916
#define AD_FLANGER_ENHANCE 920
#define AD_FLANGER_HARMONICS 921
#define PHASER_SPEED 962
#define PHASER_DEPTH 963
#define PHASER_REGEN 966
#define PHASER_LEVEL 965
#define PHASER_WAVE 967
#define TRIG_PHASER_SPEED 1094
#define TRIG_PHASER_SENS 1095
#define TRIG_PHASER_LFO_START 1092
#define TRIG_PHASER_LEVEL 1096
#define MX_PHASER_INTENSITY 976
#define EH_PHASER_RATE 979
#define EH_PHASER_COLOR 977
#define VIBRATO_SPEED 1284
#define VIBRATO_DEPTH 1285
@@ -283,6 +419,11 @@ enum {
#define VIBROPAN_VIBRA 1316
#define VIBROPAN_WAVE 1317
#define UNOVIBE_PEDAL_SPEED 2884
#define UNOVIBE_INTENSITY 2883
#define UNOVIBE_CHORUS_VIBRATO 2882
#define UNOVIBE_VOLUME 2885
#define TREMOLO_SPEED 1156
#define TREMOLO_DEPTH 1155
#define TREMOLO_WAVE 1157
@@ -293,6 +434,7 @@ enum {
#define ENVELOPE_SENSITIVITY 1606
#define ENVELOPE_RANGE 1605
#define ENVELOPE_BLEND 1608
#define AUTOYA_SPEED 1478
#define AUTOYA_INTENSITY 1482
@@ -302,9 +444,18 @@ enum {
#define YAYA_INTENSITY 1417
#define YAYA_RANGE 1418
#define SYNTH_TALK_ATTACK 1542
#define SYNTH_TALK_RELEASE 1547
#define SYNTH_TALK_SENS 1544
#define SYNTH_TALK_VOX 1540
#define SYNTH_TALK_BALANCE 1545
#define STEP_FILTER_SPEED 3010
#define STEP_FILTER_INTENSITY 3011
#define SAMPLE_HOLD_SPEED 3012
#define SAMPLE_HOLD_INTENSITY 3013
#define WHAMMY_AMOUNT 1797
#define WHAMMY_PEDAL 1795
#define WHAMMY_MIX 1796
@@ -320,6 +471,10 @@ enum {
#define IPS_SCALE 2755
#define IPS_LEVEL 2757
#define OCTAVER_OCTAVE1 1746
#define OCTAVER_OCTAVE2 1747
#define OCTAVER_DRY_LEVEL 1748
/* DUAL_CHORUS_WAVE, MULTI_CHORUS_WAVE, FLANGER_WAVE, PHASER_WAVE,
VIBROPAN_WAVE, TREMOLO_WAVE, PANNER_WAVE valid values */
#define WAVE_TRI 0x00
@@ -387,7 +542,16 @@ enum {
DELAY_TYPE_DIGITAL = 1045,
DELAY_TYPE_MODULATED = 1047,
DELAY_TYPE_PONG = 1048,
DELAY_TYPE_TAPE = 1049
DELAY_TYPE_TAPE = 1049,
DELAY_RP500_TYPE_DIGITAL = 1052,
DELAY_RP500_TYPE_ANALOG = 1053,
DELAY_RP500_TYPE_DM = 1058,
DELAY_RP500_TYPE_ECHOPLEX = 1057,
DELAY_RP500_TYPE_MODULATED = 1054,
DELAY_RP500_TYPE_PONG = 1055,
DELAY_RP500_TYPE_REVERSE = 1064,
DELAY_RP500_TYPE_TAPE = 1056,
};
#define DELAY_TYPE 1856
@@ -418,6 +582,22 @@ enum {
#define TAPE_WOW 1891
#define TAPE_FLUTTER 1892
#define DELAY_LEVEL 1860
#define DELAY_REPEATS 1863
#define DELAY_TAP_TIME 1868
#define DELAY_DUCK_THRESH 1889
#define DELAY_DUCK_LEVEL 1890
#define DELAY_REPEAT_RATE 1898
#define DELAY_ECHO 1895
#define DELAY_INTENSITY 1896
#define DELAY_TIME_0_760 1899
#define DELAY_VOLUME 1893
#define DELAY_REPEATS_0_99 1874
#define DELAY_DEPTH 1873
#define DELAY_TAP_TIME_0_4990 1900
#define DELAY_MIX 1902
#define DELAY_TIME_0_4650 1901
enum {
REVERB_TYPE_TWIN = 1146,
REVERB_TYPE_LEX_AMBIENCE = 1150,

View File

@@ -20,12 +20,10 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*****************************************************************************/
#include <math.h>
#include <stdio.h>
#include <gtk/gtkmain.h>
#include <gtk/gtksignal.h>
#include <gdk/gdkkeysyms.h>
#include <math.h>
#include <gtk/gtk.h>
#include <gdk/gdkkeysyms.h>
#include "gtkknob.h"
@@ -103,14 +101,14 @@ gtk_knob_get_type(void) {
*
*****************************************************************************/
static void
gtk_knob_class_init (GtkKnobClass *class) {
gtk_knob_class_init (GtkKnobClass *klass) {
GtkObjectClass *object_class;
GtkWidgetClass *widget_class;
object_class = (GtkObjectClass*) class;
widget_class = (GtkWidgetClass*) class;
object_class = (GtkObjectClass*) klass;
widget_class = (GtkWidgetClass*) klass;
parent_class = g_type_class_ref (GTK_TYPE_WIDGET);
parent_class = g_type_class_peek_parent(klass);
object_class->destroy = gtk_knob_destroy;
@@ -190,10 +188,7 @@ gtk_knob_destroy(GtkObject *object) {
knob = GTK_KNOB (object);
if (knob->adjustment) {
g_object_unref (knob->adjustment);
knob->adjustment = NULL;
}
gtk_knob_set_adjustment (knob, NULL);
/* FIXME: needs ref counting for automatic GtkKnobAnim cleanup
if (knob->anim) {
gtk_knob_anim_unref (knob->anim);
@@ -271,21 +266,22 @@ gtk_knob_set_adjustment(GtkKnob *knob, GtkAdjustment *adjustment) {
}
knob->adjustment = adjustment;
g_object_ref (GTK_OBJECT (knob->adjustment));
g_object_ref_sink (GTK_OBJECT (knob->adjustment));
if (adjustment) {
g_object_ref_sink (adjustment);
g_signal_connect (adjustment, "changed",
(GCallback) gtk_knob_adjustment_changed,
knob);
g_signal_connect (adjustment, "value_changed",
(GCallback) gtk_knob_adjustment_value_changed,
knob);
g_signal_connect (adjustment, "changed",
G_CALLBACK(gtk_knob_adjustment_changed),
knob);
g_signal_connect (adjustment, "value_changed",
G_CALLBACK(gtk_knob_adjustment_value_changed),
knob);
knob->old_value = adjustment->value;
knob->old_lower = adjustment->lower;
knob->old_upper = adjustment->upper;
knob->old_value = adjustment->value;
knob->old_lower = adjustment->lower;
knob->old_upper = adjustment->upper;
gtk_knob_update (knob);
gtk_knob_update (knob);
}
}
@@ -398,6 +394,7 @@ gtk_knob_expose(GtkWidget *widget, GdkEventExpose *event) {
g_return_val_if_fail (widget != NULL, FALSE);
g_return_val_if_fail (GTK_IS_KNOB (widget), FALSE);
g_return_val_if_fail (event != NULL, FALSE);
g_return_val_if_fail (GTK_IS_ADJUSTMENT (GTK_KNOB (widget)->adjustment), FALSE);
if (event->count > 0)
return FALSE;
@@ -436,6 +433,7 @@ gtk_knob_scroll(GtkWidget *widget, GdkEventScroll *event) {
g_return_val_if_fail (widget != NULL, FALSE);
g_return_val_if_fail (GTK_IS_KNOB (widget), FALSE);
g_return_val_if_fail (event != NULL, FALSE);
g_return_val_if_fail (GTK_IS_ADJUSTMENT (GTK_KNOB (widget)->adjustment), FALSE);
knob = GTK_KNOB (widget);
@@ -468,6 +466,7 @@ gtk_knob_button_press(GtkWidget *widget, GdkEventButton *event) {
g_return_val_if_fail (widget != NULL, FALSE);
g_return_val_if_fail (GTK_IS_KNOB (widget), FALSE);
g_return_val_if_fail (event != NULL, FALSE);
g_return_val_if_fail (GTK_IS_ADJUSTMENT (GTK_KNOB (widget)->adjustment), FALSE);
knob = GTK_KNOB (widget);
@@ -508,6 +507,7 @@ gtk_knob_button_release(GtkWidget *widget, GdkEventButton *event) {
g_return_val_if_fail (widget != NULL, FALSE);
g_return_val_if_fail (GTK_IS_KNOB (widget), FALSE);
g_return_val_if_fail (event != NULL, FALSE);
g_return_val_if_fail (GTK_IS_ADJUSTMENT (GTK_KNOB (widget)->adjustment), FALSE);
knob = GTK_KNOB (widget);
@@ -544,6 +544,7 @@ static gint gtk_knob_key_press(GtkWidget *widget, GdkEventKey *event)
g_return_val_if_fail (widget != NULL, FALSE);
g_return_val_if_fail (GTK_IS_KNOB (widget), FALSE);
g_return_val_if_fail (event != NULL, FALSE);
g_return_val_if_fail (GTK_IS_ADJUSTMENT (GTK_KNOB (widget)->adjustment), FALSE);
knob = GTK_KNOB (widget);
@@ -629,6 +630,7 @@ gtk_knob_timer(GtkKnob *knob) {
g_return_val_if_fail (knob != NULL, FALSE);
g_return_val_if_fail (GTK_IS_KNOB (knob), FALSE);
g_return_val_if_fail (GTK_IS_ADJUSTMENT (knob->adjustment), FALSE);
if (knob->policy == GTK_UPDATE_DELAYED) {
g_signal_emit_by_name (knob->adjustment, "value_changed");
@@ -646,6 +648,7 @@ gtk_knob_timer(GtkKnob *knob) {
*****************************************************************************/
static void
gtk_knob_update_mouse_update(GtkKnob *knob) {
g_return_if_fail(GTK_IS_ADJUSTMENT (knob->adjustment));
if (knob->policy == GTK_UPDATE_CONTINUOUS) {
g_signal_emit_by_name (knob->adjustment, "value_changed");
@@ -677,6 +680,7 @@ gtk_knob_update_mouse(GtkKnob *knob, gint x, gint y, gboolean step) {
g_return_if_fail (knob != NULL);
g_return_if_fail (GTK_IS_KNOB (knob));
g_return_if_fail (GTK_IS_ADJUSTMENT (knob->adjustment));
old_value = knob->adjustment->value;
@@ -722,6 +726,7 @@ gtk_knob_update(GtkKnob *knob) {
g_return_if_fail (knob != NULL);
g_return_if_fail (GTK_IS_KNOB (knob));
g_return_if_fail (GTK_IS_ADJUSTMENT (knob->adjustment));
if (knob->adjustment->step_increment == 1) {
new_value = floor (knob->adjustment->value + 0.5);

View File

@@ -3,7 +3,7 @@
* Most of this code comes from gAlan 0.2.0, copyright (C) 1999
* Tony Garnock-Jones, with modifications by Sean Bolton,
* copyright (C) 2004, and minor modifications by William Weston,
* copyright (C) 2007.
* copyright (C) 2007, Tomasz Moń, copyright (C) 2009
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
@@ -22,9 +22,7 @@
#ifndef __GTK_KNOB_H__
#define __GTK_KNOB_H__
#include <gdk/gdk.h>
#include <gtk/gtkadjustment.h>
#include <gtk/gtkwidget.h>
#include <gtk/gtk.h>
#ifdef __cplusplus
extern "C" {

79
gui.c
View File

@@ -22,13 +22,6 @@
#include "gtkknob.h"
#include "knob.h"
#ifndef DOXYGEN_SHOULD_SKIP_THIS
extern EffectList effects[];
extern int n_effects;
#endif /* DOXYGEN_SHOULD_SKIP_THIS */
typedef struct {
GtkObject *widget;
gint id;
@@ -245,7 +238,11 @@ GtkWidget *create_table(EffectSettings *settings, gint amt)
**/
GtkWidget *create_on_off_button(Effect *effect)
{
GtkWidget *button = gtk_check_button_new();
GtkWidget *button;
if (effect->label == NULL)
button = gtk_check_button_new();
else
button = gtk_check_button_new_with_label(effect->label);
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), FALSE);
g_signal_connect(G_OBJECT(button), "toggled", G_CALLBACK(toggled_cb), effect);
widget_list_add(GTK_OBJECT(button), effect->id, effect->position, -1, -1);
@@ -389,6 +386,7 @@ GtkWidget *create_vbox(Effect *widgets, gint amt, gchar *label)
GtkWidget *container;
GtkWidget *frame;
int x;
int y;
frame = gtk_frame_new(label);
@@ -401,13 +399,19 @@ GtkWidget *create_vbox(Effect *widgets, gint amt, gchar *label)
if ((widgets[x].id != -1) && (widgets[x].position != -1)) {
widget = create_on_off_button(&widgets[x]);
gtk_table_attach_defaults(GTK_TABLE(table), widget, 0, 1, x, x+1);
if (widgets[x].label)
y = 1;
else
y = 0;
} else if (widgets[x].label) {
widget = gtk_label_new(widgets[x].label);
gtk_table_attach_defaults(GTK_TABLE(table), widget, 0, 1, x, x+1);
}
container = create_widget_container(widgets[x].group, widgets[x].group_amt);
gtk_table_attach_defaults(GTK_TABLE(table), container, 1, 2, x, x+1);
gtk_table_attach_defaults(GTK_TABLE(table), container, 1-y, 2-y, x+y, x+y+1);
}
gtk_box_pack_start(GTK_BOX(vbox), table, FALSE, FALSE, 2);
@@ -620,6 +624,7 @@ typedef struct {
static SupportedFileTypes file_types[] = {
{"RP250Preset", "*.rp250p"},
{"RP500Preset", "*.rp500p"},
};
static guint n_file_types = G_N_ELEMENTS(file_types);
@@ -838,7 +843,7 @@ static void add_menubar(GtkWidget *window, GtkWidget *vbox)
/**
* Creates main window.
**/
void gui_create()
void gui_create(EffectList *effects, int n_effects)
{
GtkWidget *window;
GtkWidget *vbox;
@@ -896,3 +901,57 @@ void gui_free()
gtk_knob_animation_free(knob_anim);
knob_anim = NULL;
}
/**
* \param list Variable to hold effect list
* \param n_list Variable to hold length of effect list
*
* Displays dialogbox stating that device is unsupported.
*
* \return TRUE if user selects "compability mode", otherwise FALSE.
**/
gboolean unsupported_device_dialog(EffectList **list, int *n_list)
{
extern SupportedDevices supported_devices[];
extern int n_supported_devices;
GtkWidget *dialog;
GtkWidget *label;
GtkWidget *combo_box;
int x;
dialog = gtk_dialog_new_with_buttons("Unsupported device",
NULL, GTK_DIALOG_MODAL,
GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
GTK_STOCK_OK, GTK_RESPONSE_ACCEPT,
NULL);
label = gtk_label_new("Your device appears to be unsupported by gdigi.\n"
"As some of the settings may be common between different devices,\n"
"you can now select compability mode with one of the supported devices.\n"
"Please take a look at gdigi's HACKING file.");
gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->vbox), label);
combo_box = gtk_combo_box_new_text();
for (x=0; x<n_supported_devices; x++) {
gtk_combo_box_append_text(GTK_COMBO_BOX(combo_box), supported_devices[x].name);
}
gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->vbox), combo_box);
gtk_widget_show_all(GTK_DIALOG(dialog)->vbox);
if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) {
gint number = gtk_combo_box_get_active(GTK_COMBO_BOX(combo_box));
if (number != -1 && number <n_supported_devices) {
g_message("Starting %s compability mode", supported_devices[number].name);
*list = supported_devices[number].list;
*n_list = supported_devices[number].n_list;
gtk_widget_destroy(dialog);
return TRUE;
}
}
gtk_widget_destroy(dialog);
return FALSE;
}

6
gui.h
View File

@@ -17,8 +17,12 @@
#ifndef GDIGI_GUI_H
#define GDIGI_GUI_H
#include <glib.h>
#include "effects.h"
void show_error_message(GtkWidget *parent, gchar *message);
void gui_create();
void gui_create(EffectList *list, int n_list);
void gui_free();
gboolean unsupported_device_dialog(EffectList **list, int *n_list);
#endif /* GDIGI_GUI_H */

View File

@@ -191,6 +191,8 @@ Preset *create_preset_from_data(GString *data)
gint x;
gint tmp;
g_return_val_if_fail(data != NULL, NULL);
x = 0x09;
n = 0;
total = (unsigned char)data->str[x];