Update of /cvsroot/alsa/alsa-lib/src/seq In directory sc8-pr-cvs1:/tmp/cvs-serv6215/src/seq
Modified Files: seq_midi_event.c Log Message: Reverted back (N)RPN decoding - it is difficult to do this job here Index: seq_midi_event.c =================================================================== RCS file: /cvsroot/alsa/alsa-lib/src/seq/seq_midi_event.c,v retrieving revision 1.18 retrieving revision 1.19 diff -u -r1.18 -r1.19 --- seq_midi_event.c 16 Jun 2003 11:00:30 -0000 1.18 +++ seq_midi_event.c 16 Jun 2003 18:53:25 -0000 1.19 @@ -35,12 +35,11 @@ /* midi status */ struct snd_midi_event { - size_t qlen; /* queue length */ - size_t read; /* chars read */ - int type; /* current event type */ + size_t qlen; /* queue length */ + size_t read; /* chars read */ + int type; /* current event type */ unsigned char lastcmd; unsigned char nostat; - unsigned char xreg_hit; size_t bufsize; unsigned char *buf; /* input buffer */ }; @@ -50,11 +49,9 @@ /* from 0 to 7 are normal commands (note off, on, etc.) */ #define ST_NOTEOFF 0 #define ST_NOTEON 1 -#define ST_CONTROLLER 3 #define ST_SPECIAL 8 #define ST_SYSEX ST_SPECIAL /* from 8 to 15 are events for 0xf0-0xf7 */ -#define ST_XREG_PARM 16 /* status event types */ @@ -72,8 +69,6 @@ static void two_param_ctrl_event(snd_midi_event_t *dev, snd_seq_event_t *ev); static void one_param_event(snd_midi_event_t *dev, snd_seq_event_t *ev); static void songpos_event(snd_midi_event_t *dev, snd_seq_event_t *ev); -static unsigned char get_xreg_hit_bit(unsigned char c); -static void xreg_event(snd_midi_event_t *dev, snd_seq_event_t *ev); static void note_decode(snd_seq_event_t *ev, unsigned char *buf); static void one_param_decode(snd_seq_event_t *ev, unsigned char *buf); static void pitchbend_decode(snd_seq_event_t *ev, unsigned char *buf); @@ -305,7 +300,7 @@ */ int snd_midi_event_encode_byte(snd_midi_event_t *dev, int c, snd_seq_event_t *ev) { - int tmp = 0; + int rc = 0; c &= 0xff; @@ -319,20 +314,11 @@ if (dev->qlen > 0) { /* rest of command */ - if (c & 0x80) { /* error? state inside data? */ - if (dev->type == ST_XREG_PARM) { - if (c != dev->buf[0]) - goto __new_command; - return 0; - } - goto __new_command; - } dev->buf[dev->read++] = c; if (dev->type != ST_SYSEX) dev->qlen--; } else { /* new command */ - __new_command: dev->read = 1; if (c & 0x80) { dev->buf[0] = c; @@ -348,39 +334,13 @@ } } if (dev->qlen == 0) { - /* handle xrpn special case here */ - if (dev->type == ST_CONTROLLER && - dev->buf[1] >= MIDI_CTL_NONREG_PARM_NUM_LSB && - dev->buf[1] <= MIDI_CTL_REGIST_PARM_NUM_MSB) { - dev->type = ST_XREG_PARM; - dev->xreg_hit = get_xreg_hit_bit(dev->buf[1]); - dev->qlen = 2; /* we need more bytes */ - return 0; - } - if (dev->type == ST_XREG_PARM) { - tmp = get_xreg_hit_bit(dev->buf[1]); - if (tmp == 0 || (tmp & dev->xreg_hit)) { - reset_encode(dev); - dev->type = ST_CONTROLLER; - dev->read = 1; - return 0; - } - dev->xreg_hit |= tmp; - if (dev->xreg_hit == 0x0f) { /* finished */ - xreg_event(dev, ev); - return 1; - } - dev->qlen = 2; /* we need more bytes */ - return 0; - } - /* handle standard midi events */ ev->type = status_event[dev->type].event; ev->flags &= ~SNDRV_SEQ_EVENT_LENGTH_MASK; ev->flags |= SNDRV_SEQ_EVENT_LENGTH_FIXED; if (status_event[dev->type].encode) /* set data values */ status_event[dev->type].encode(dev, ev); - return 1; - } else if (dev->type == ST_SYSEX) { + rc = 1; + } else if (dev->type == ST_SYSEX) { if (c == MIDI_CMD_COMMON_SYSEX_END || dev->read >= dev->bufsize) { ev->flags &= ~SNDRV_SEQ_EVENT_LENGTH_MASK; @@ -392,11 +352,11 @@ dev->read = 0; /* continue to parse */ else reset_encode(dev); /* all parsed */ - return 1; + rc = 1; } } - return 0; + return rc; } /* encode note event */ @@ -439,44 +399,6 @@ static void songpos_event(snd_midi_event_t *dev, snd_seq_event_t *ev) { ev->data.control.value = (int)dev->buf[2] * 128 + (int)dev->buf[1]; -} - -static unsigned char get_xreg_hit_bit(unsigned char c) -{ - switch (c) { - case MIDI_CTL_NONREG_PARM_NUM_MSB: - case MIDI_CTL_REGIST_PARM_NUM_MSB: - return 1; - case MIDI_CTL_NONREG_PARM_NUM_LSB: - case MIDI_CTL_REGIST_PARM_NUM_LSB: - return 2; - case MIDI_CTL_MSB_DATA_ENTRY: - return 4; - case MIDI_CTL_LSB_DATA_ENTRY: - return 8; - default: - return 0; - } -} - -/* encode xreg event */ -static void xreg_event(snd_midi_event_t *dev, snd_seq_event_t *ev) -{ - int i; - - ev->type = (dev->buf[1] == MIDI_CTL_NONREG_PARM_NUM_MSB || - dev->buf[1] == MIDI_CTL_NONREG_PARM_NUM_LSB) ? - SND_SEQ_EVENT_NONREGPARAM : SND_SEQ_EVENT_REGPARAM; - ev->data.control.param = 0; - ev->data.control.value = 0; - for (i = 1; i < 9; i += 2) { - switch (get_xreg_hit_bit(dev->buf[i])) { - case 1: ev->data.control.param |= dev->buf[i+1] << 7; break; - case 2: ev->data.control.param |= dev->buf[i+1]; break; - case 4: ev->data.control.value |= dev->buf[i+1] << 7; break; - case 8: ev->data.control.value |= dev->buf[i+1]; break; - } - } } /** ------------------------------------------------------- This SF.NET email is sponsored by: eBay Great deals on office technology -- on eBay now! Click here: http://adfarm.mediaplex.com/ad/ck/711-11697-6916-5 _______________________________________________ Alsa-cvslog mailing list [EMAIL PROTECTED] https://lists.sourceforge.net/lists/listinfo/alsa-cvslog