diff options
author | Jaroslav Kysela <perex@perex.cz> | 2003-06-16 18:53:25 +0000 |
---|---|---|
committer | Jaroslav Kysela <perex@perex.cz> | 2003-06-16 18:53:25 +0000 |
commit | ea8feb43e29989c638abe5624617160abfb91105 (patch) | |
tree | f8baba285cb0d9e29017eb93919468be6bfb48da /src/seq | |
parent | 8f78ae3b849a7380c5acfaa9c6c28fa3b22ddc7f (diff) |
Reverted back (N)RPN decoding - it is difficult to do this job here
Diffstat (limited to 'src/seq')
-rw-r--r-- | src/seq/seq_midi_event.c | 94 |
1 files changed, 8 insertions, 86 deletions
diff --git a/src/seq/seq_midi_event.c b/src/seq/seq_midi_event.c index 9e96da36..4338849b 100644 --- a/src/seq/seq_midi_event.c +++ b/src/seq/seq_midi_event.c @@ -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 @@ struct snd_midi_event { /* 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 pitchbend_ctrl_event(snd_midi_event_t *dev, snd_seq_event_t *ev); 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 @@ long snd_midi_event_encode(snd_midi_event_t *dev, unsigned char *buf, long count */ 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 @@ int snd_midi_event_encode_byte(snd_midi_event_t *dev, int c, snd_seq_event_t *ev 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 @@ int snd_midi_event_encode_byte(snd_midi_event_t *dev, int c, snd_seq_event_t *ev } } 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 @@ int snd_midi_event_encode_byte(snd_midi_event_t *dev, int c, snd_seq_event_t *ev dev->read = 0; /* continue to parse */ else reset_encode(dev); /* all parsed */ - return 1; + rc = 1; } } - return 0; + return rc; } /* encode note event */ @@ -441,44 +401,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; - } - } -} - /** * \brief Decode sequencer event to MIDI byte stream * \param dev MIDI event parser |