Skip to content

Commit 8a42886

Browse files
committed
ALSA: seq: Fix missing bank setup between MIDI1/MIDI2 UMP conversion
When a UMP packet is converted between MIDI1 and MIDI2 protocols, the bank selection may be lost. The conversion from MIDI1 to MIDI2 needs the encoding of the bank into UMP_MSG_STATUS_PROGRAM bits, while the conversion from MIDI2 to MIDI1 needs the extraction from that instead. This patch implements the missing bank selection mechanism in those conversions. Fixes: e9e0281 ("ALSA: seq: Automatic conversion of UMP events") Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Takashi Iwai <[email protected]>
1 parent 2be4615 commit 8a42886

File tree

1 file changed

+38
-0
lines changed

1 file changed

+38
-0
lines changed

sound/core/seq/seq_ump_convert.c

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -368,6 +368,7 @@ static int cvt_ump_midi1_to_midi2(struct snd_seq_client *dest,
368368
struct snd_seq_ump_event ev_cvt;
369369
const union snd_ump_midi1_msg *midi1 = (const union snd_ump_midi1_msg *)event->ump;
370370
union snd_ump_midi2_msg *midi2 = (union snd_ump_midi2_msg *)ev_cvt.ump;
371+
struct snd_seq_ump_midi2_bank *cc;
371372

372373
ev_cvt = *event;
373374
memset(&ev_cvt.ump, 0, sizeof(ev_cvt.ump));
@@ -387,11 +388,29 @@ static int cvt_ump_midi1_to_midi2(struct snd_seq_client *dest,
387388
midi2->paf.data = upscale_7_to_32bit(midi1->paf.data);
388389
break;
389390
case UMP_MSG_STATUS_CC:
391+
cc = &dest_port->midi2_bank[midi1->note.channel];
392+
switch (midi1->cc.index) {
393+
case UMP_CC_BANK_SELECT:
394+
cc->bank_set = 1;
395+
cc->cc_bank_msb = midi1->cc.data;
396+
return 0; // skip
397+
case UMP_CC_BANK_SELECT_LSB:
398+
cc->bank_set = 1;
399+
cc->cc_bank_lsb = midi1->cc.data;
400+
return 0; // skip
401+
}
390402
midi2->cc.index = midi1->cc.index;
391403
midi2->cc.data = upscale_7_to_32bit(midi1->cc.data);
392404
break;
393405
case UMP_MSG_STATUS_PROGRAM:
394406
midi2->pg.program = midi1->pg.program;
407+
cc = &dest_port->midi2_bank[midi1->note.channel];
408+
if (cc->bank_set) {
409+
midi2->pg.bank_valid = 1;
410+
midi2->pg.bank_msb = cc->cc_bank_msb;
411+
midi2->pg.bank_lsb = cc->cc_bank_lsb;
412+
cc->bank_set = 0;
413+
}
395414
break;
396415
case UMP_MSG_STATUS_CHANNEL_PRESSURE:
397416
midi2->caf.data = upscale_7_to_32bit(midi1->caf.data);
@@ -419,6 +438,7 @@ static int cvt_ump_midi2_to_midi1(struct snd_seq_client *dest,
419438
struct snd_seq_ump_event ev_cvt;
420439
union snd_ump_midi1_msg *midi1 = (union snd_ump_midi1_msg *)ev_cvt.ump;
421440
const union snd_ump_midi2_msg *midi2 = (const union snd_ump_midi2_msg *)event->ump;
441+
int err;
422442
u16 v;
423443

424444
ev_cvt = *event;
@@ -443,6 +463,24 @@ static int cvt_ump_midi2_to_midi1(struct snd_seq_client *dest,
443463
midi1->cc.data = downscale_32_to_7bit(midi2->cc.data);
444464
break;
445465
case UMP_MSG_STATUS_PROGRAM:
466+
if (midi2->pg.bank_valid) {
467+
midi1->cc.status = UMP_MSG_STATUS_CC;
468+
midi1->cc.index = UMP_CC_BANK_SELECT;
469+
midi1->cc.data = midi2->pg.bank_msb;
470+
err = __snd_seq_deliver_single_event(dest, dest_port,
471+
(struct snd_seq_event *)&ev_cvt,
472+
atomic, hop);
473+
if (err < 0)
474+
return err;
475+
midi1->cc.index = UMP_CC_BANK_SELECT_LSB;
476+
midi1->cc.data = midi2->pg.bank_lsb;
477+
err = __snd_seq_deliver_single_event(dest, dest_port,
478+
(struct snd_seq_event *)&ev_cvt,
479+
atomic, hop);
480+
if (err < 0)
481+
return err;
482+
midi1->note.status = midi2->note.status;
483+
}
446484
midi1->pg.program = midi2->pg.program;
447485
break;
448486
case UMP_MSG_STATUS_CHANNEL_PRESSURE:

0 commit comments

Comments
 (0)