98 |
}; |
}; |
99 |
|
|
100 |
static int extra_decode_ctrl14(snd_midi_event_t *dev, unsigned char *buf, int len, snd_seq_event_t *ev); |
static int extra_decode_ctrl14(snd_midi_event_t *dev, unsigned char *buf, int len, snd_seq_event_t *ev); |
101 |
|
static int extra_decode_xrpn(snd_midi_event_t *dev, unsigned char *buf, int count, snd_seq_event_t *ev); |
102 |
|
|
103 |
static struct extra_event_list_t { |
static struct extra_event_list_t { |
104 |
int event; |
int event; |
105 |
int (*decode)(snd_midi_event_t *dev, unsigned char *buf, int len, snd_seq_event_t *ev); |
int (*decode)(snd_midi_event_t *dev, unsigned char *buf, int len, snd_seq_event_t *ev); |
106 |
} extra_event[] = { |
} extra_event[] = { |
107 |
{SNDRV_SEQ_EVENT_CONTROL14, extra_decode_ctrl14}, |
{SNDRV_SEQ_EVENT_CONTROL14, extra_decode_ctrl14}, |
108 |
/*{SNDRV_SEQ_EVENT_NONREGPARAM, extra_decode_nrpn},*/ |
{SNDRV_SEQ_EVENT_NONREGPARAM, extra_decode_xrpn}, |
109 |
/*{SNDRV_SEQ_EVENT_REGPARAM, extra_decode_rpn},*/ |
{SNDRV_SEQ_EVENT_REGPARAM, extra_decode_xrpn}, |
110 |
}; |
}; |
111 |
|
|
112 |
/* |
/* |
442 |
unsigned char cmd; |
unsigned char cmd; |
443 |
int idx = 0; |
int idx = 0; |
444 |
|
|
445 |
if (ev->data.control.param < 32) { |
cmd = MIDI_CMD_CONTROL|(ev->data.control.channel & 0x0f); |
446 |
|
if (ev->data.control.param < 0x20) { |
447 |
if (count < 4) |
if (count < 4) |
448 |
return -ENOMEM; |
return -ENOMEM; |
449 |
if (dev->nostat && count < 6) |
if (dev->nostat && count < 6) |
450 |
return -ENOMEM; |
return -ENOMEM; |
|
cmd = MIDI_CMD_CONTROL|(ev->data.control.channel & 0x0f); |
|
451 |
if (cmd != dev->lastcmd || dev->nostat) { |
if (cmd != dev->lastcmd || dev->nostat) { |
452 |
if (count < 5) |
if (count < 5) |
453 |
return -ENOMEM; |
return -ENOMEM; |
457 |
buf[idx++] = (ev->data.control.value >> 7) & 0x7f; |
buf[idx++] = (ev->data.control.value >> 7) & 0x7f; |
458 |
if (dev->nostat) |
if (dev->nostat) |
459 |
buf[idx++] = cmd; |
buf[idx++] = cmd; |
460 |
buf[idx++] = ev->data.control.param + 32; |
buf[idx++] = ev->data.control.param + 0x20; |
461 |
buf[idx++] = ev->data.control.value & 0x7f; |
buf[idx++] = ev->data.control.value & 0x7f; |
|
return idx; |
|
462 |
} else { |
} else { |
463 |
if (count < 2) |
if (count < 2) |
464 |
return -ENOMEM; |
return -ENOMEM; |
|
cmd = MIDI_CMD_CONTROL|(ev->data.control.channel & 0x0f); |
|
465 |
if (cmd != dev->lastcmd || dev->nostat) { |
if (cmd != dev->lastcmd || dev->nostat) { |
466 |
if (count < 3) |
if (count < 3) |
467 |
return -ENOMEM; |
return -ENOMEM; |
469 |
} |
} |
470 |
buf[idx++] = ev->data.control.param & 0x7f; |
buf[idx++] = ev->data.control.param & 0x7f; |
471 |
buf[idx++] = ev->data.control.value & 0x7f; |
buf[idx++] = ev->data.control.value & 0x7f; |
|
return idx; |
|
472 |
} |
} |
473 |
|
return idx; |
474 |
|
} |
475 |
|
|
476 |
|
/* decode reg/nonreg param */ |
477 |
|
static int extra_decode_xrpn(snd_midi_event_t *dev, unsigned char *buf, int count, snd_seq_event_t *ev) |
478 |
|
{ |
479 |
|
unsigned char cmd; |
480 |
|
char *cbytes; |
481 |
|
static char cbytes_nrpn[4] = { MIDI_CTL_NONREG_PARM_NUM_MSB, |
482 |
|
MIDI_CTL_NONREG_PARM_NUM_LSB, |
483 |
|
MIDI_CTL_MSB_DATA_ENTRY, |
484 |
|
MIDI_CTL_LSB_DATA_ENTRY }; |
485 |
|
static char cbytes_rpn[4] = { MIDI_CTL_REGIST_PARM_NUM_MSB, |
486 |
|
MIDI_CTL_REGIST_PARM_NUM_LSB, |
487 |
|
MIDI_CTL_MSB_DATA_ENTRY, |
488 |
|
MIDI_CTL_LSB_DATA_ENTRY }; |
489 |
|
unsigned char bytes[4]; |
490 |
|
int idx = 0, i; |
491 |
|
|
492 |
|
if (count < 8) |
493 |
|
return -ENOMEM; |
494 |
|
if (dev->nostat && count < 12) |
495 |
|
return -ENOMEM; |
496 |
|
cmd = MIDI_CMD_CONTROL|(ev->data.control.channel & 0x0f); |
497 |
|
bytes[0] = ev->data.control.param & 0x007f; |
498 |
|
bytes[1] = (ev->data.control.param & 0x3f80) >> 7; |
499 |
|
bytes[2] = ev->data.control.value & 0x007f; |
500 |
|
bytes[3] = (ev->data.control.value & 0x3f80) >> 7; |
501 |
|
if (cmd != dev->lastcmd && !dev->nostat) { |
502 |
|
if (count < 9) |
503 |
|
return -ENOMEM; |
504 |
|
buf[idx++] = dev->lastcmd = cmd; |
505 |
|
} |
506 |
|
cbytes = ev->type == SNDRV_SEQ_EVENT_NONREGPARAM ? cbytes_nrpn : cbytes_rpn; |
507 |
|
for (i = 0; i < 4; i++) { |
508 |
|
if (dev->nostat) |
509 |
|
buf[idx++] = dev->lastcmd = cmd; |
510 |
|
buf[idx++] = cbytes[i]; |
511 |
|
buf[idx++] = bytes[i]; |
512 |
|
} |
513 |
|
return idx; |
514 |
} |
} |
515 |
|
|
516 |
/* |
/* |