From 9cfb4e16e3b255c1fb7b63d04abc47e070646e01 Mon Sep 17 00:00:00 2001 From: Yair K Date: Wed, 16 May 2012 17:22:23 +0200 Subject: [PATCH] xaw-interface: Fix crash when MAX_CHANNELS > 32 Signed-off-by: Hans de Goede --- interface/x_trace.c | 15 ++++++++++----- interface/xaw_c.c | 22 +++++++++++----------- 2 files changed, 21 insertions(+), 16 deletions(-) diff --git a/interface/x_trace.c b/interface/x_trace.c index edea2602..1a9b5962 100644 --- a/interface/x_trace.c +++ b/interface/x_trace.c @@ -637,6 +637,11 @@ int handleTraceinput(char *local_buf) { char c; int ch, i, n; +#define EXTRACT_CH(s,off) do { \ + ch = atoi(s+off); \ + local_buf = strchr(s, '|') - off; \ +} while(0) + switch (local_buf[0]) { case 'R': redrawTrace(True); @@ -651,7 +656,7 @@ int handleTraceinput(char *local_buf) { drawVoices(); break; case 'M': - ch = *(local_buf+1) - 'A'; + EXTRACT_CH(local_buf, 1); n = atoi(local_buf+2); drawMute(ch, n); break; @@ -659,7 +664,7 @@ int handleTraceinput(char *local_buf) { { int note; - ch = *(local_buf+1) - 'A'; + EXTRACT_CH(local_buf, 1); c = *(local_buf+2); note = (*(local_buf+3) - '0') * 100 + (*(local_buf+4) - '0') * 10 + *(local_buf+5) - '0'; @@ -676,20 +681,20 @@ int handleTraceinput(char *local_buf) { } break; case 'I': - ch = *(local_buf+1) - 'A'; + EXTRACT_CH(local_buf, 1); strlcpy(Panel->inst_name[ch], (char *)&local_buf[2], INST_NAME_SIZE); if (!XAWLIMIT(ch)) break; drawInstname(ch, Panel->inst_name[ch]); break; case 'i': - ch = *(local_buf+1) - 'A'; + EXTRACT_CH(local_buf, 1); Panel->is_drum[ch] = *(local_buf+2) - 'A'; if (!XAWLIMIT(ch)) break; drawDrumPart(ch, Panel->is_drum[ch]); break; case 'P': c = *(local_buf+1); - ch = *(local_buf+2)-'A'; + EXTRACT_CH(local_buf, 2); n = atoi(local_buf+3); switch(c) { case 'A': /* panning */ diff --git a/interface/xaw_c.c b/interface/xaw_c.c index 97bee414..94258886 100644 --- a/interface/xaw_c.c +++ b/interface/xaw_c.c @@ -226,31 +226,31 @@ ctl_master_volume(int mv) { static void ctl_volume(int ch, int val) { if ((!ctl.trace_playing) || (ch >= MAX_XAW_MIDI_CHANNELS)) return; - a_pipe_write("PV%c%d", ch+'A', val); + a_pipe_write("PV%d|%d", ch, val); } static void ctl_expression(int ch, int val) { if ((!ctl.trace_playing) || (ch >= MAX_XAW_MIDI_CHANNELS)) return; - a_pipe_write("PE%c%d", ch+'A', val); + a_pipe_write("PE%d|%d", ch, val); } static void ctl_panning(int ch, int val) { if ((!ctl.trace_playing) || (ch >= MAX_XAW_MIDI_CHANNELS)) return; - a_pipe_write("PA%c%d", ch+'A', val); + a_pipe_write("PA%d|%d", ch, val); } static void ctl_sustain(int ch, int val) { if ((!ctl.trace_playing) || (ch >= MAX_XAW_MIDI_CHANNELS)) return; - a_pipe_write("PS%c%d", ch+'A', val); + a_pipe_write("PS%d|%d", ch, val); } static void ctl_pitch_bend(int ch, int val) { if ((!ctl.trace_playing) || (ch >= MAX_XAW_MIDI_CHANNELS)) return; - a_pipe_write("PB%c%d", ch+'A', val); + a_pipe_write("PB%d|%d", ch, val); } #ifdef WIDGET_IS_LABEL_WIDGET @@ -904,7 +904,7 @@ ctl_note(int status, int ch, int note, int velocity) { c = '.'; break; } - a_pipe_write("Y%c%c%03d%d", ch+'A', c, (unsigned char)note, velocity); + a_pipe_write("Y%d|%c%03d%d", ch, c, (unsigned char)note, velocity); if (active[ch] == 0) { active[ch] = 1; @@ -920,9 +920,9 @@ ctl_program(int ch, int val, void *comm) { (!ISDRUMCHANNEL(ch))) return; active[ch] = 1; if (!IS_CURRENT_MOD_FILE) val += progbase; - a_pipe_write("PP%c%d", ch+'A', val); + a_pipe_write("PP%d|%d", ch, val); if (comm != NULL) { - a_pipe_write("I%c%s", ch+'A', (!strlen((char *)comm) && + a_pipe_write("I%d|%s", ch, (!strlen((char *)comm) && (ISDRUMCHANNEL(ch)))? "":(char *)comm); } } @@ -931,7 +931,7 @@ static void ctl_drumpart(int ch, int is_drum) { if ((!ctl.trace_playing) || (ch >= MAX_XAW_MIDI_CHANNELS)) return; - a_pipe_write("i%c%c", ch+'A', is_drum+'A'); + a_pipe_write("i%d|%c", ch, is_drum+'A'); } static void @@ -1018,7 +1018,7 @@ ctl_refresh(void) { } static void set_otherinfo(int ch, int val, char c) { if ((!ctl.trace_playing) || (ch >= MAX_XAW_MIDI_CHANNELS)) return; - a_pipe_write("P%c%c%d", c, ch+'A', val); + a_pipe_write("P%c%d|%d", c, ch, val); } static void @@ -1070,7 +1070,7 @@ update_indicator(void) { static void ctl_mute(int ch, int mute) { if ((!ctl.trace_playing) || (ch >= MAX_XAW_MIDI_CHANNELS)) return; - a_pipe_write("M%c%d", ch+'A', mute); + a_pipe_write("M%d|%d", ch, mute); return; } -- 2.11.0