ALSA: ump: Explicitly reset RPN with Null RPN

RPN with 127:127 is treated as a Null RPN, just to reset the
parameters, and it's not translated to MIDI2.  Although the current
code can work as is in most cases, better to implement the RPN reset
explicitly for Null message.

Link: https://patch.msgid.link/20240731130528.12600-3-tiwai@suse.de
Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
Takashi Iwai 2024-07-31 15:05:23 +02:00
parent e6ce8a28c7
commit 50a6dd19dc

View File

@ -287,6 +287,15 @@ static int cvt_legacy_system_to_ump(struct ump_cvt_to_ump *cvt,
return 4; return 4;
} }
static void reset_rpn(struct ump_cvt_to_ump_bank *cc)
{
cc->rpn_set = 0;
cc->nrpn_set = 0;
cc->cc_rpn_msb = cc->cc_rpn_lsb = 0;
cc->cc_data_msb = cc->cc_data_lsb = 0;
cc->cc_data_msb_set = cc->cc_data_lsb_set = 0;
}
static int fill_rpn(struct ump_cvt_to_ump_bank *cc, static int fill_rpn(struct ump_cvt_to_ump_bank *cc,
union snd_ump_midi2_msg *midi2, union snd_ump_midi2_msg *midi2,
bool flush) bool flush)
@ -312,11 +321,7 @@ static int fill_rpn(struct ump_cvt_to_ump_bank *cc,
midi2->rpn.data = upscale_14_to_32bit((cc->cc_data_msb << 7) | midi2->rpn.data = upscale_14_to_32bit((cc->cc_data_msb << 7) |
cc->cc_data_lsb); cc->cc_data_lsb);
cc->rpn_set = 0; reset_rpn(cc);
cc->nrpn_set = 0;
cc->cc_rpn_msb = cc->cc_rpn_lsb = 0;
cc->cc_data_msb = cc->cc_data_lsb = 0;
cc->cc_data_msb_set = cc->cc_data_lsb_set = 0;
return 1; return 1;
} }
@ -374,11 +379,15 @@ static int cvt_legacy_cmd_to_ump(struct ump_cvt_to_ump *cvt,
ret = fill_rpn(cc, midi2, true); ret = fill_rpn(cc, midi2, true);
cc->rpn_set = 1; cc->rpn_set = 1;
cc->cc_rpn_msb = buf[2]; cc->cc_rpn_msb = buf[2];
if (cc->cc_rpn_msb == 0x7f && cc->cc_rpn_lsb == 0x7f)
reset_rpn(cc);
return ret; return ret;
case UMP_CC_RPN_LSB: case UMP_CC_RPN_LSB:
ret = fill_rpn(cc, midi2, true); ret = fill_rpn(cc, midi2, true);
cc->rpn_set = 1; cc->rpn_set = 1;
cc->cc_rpn_lsb = buf[2]; cc->cc_rpn_lsb = buf[2];
if (cc->cc_rpn_msb == 0x7f && cc->cc_rpn_lsb == 0x7f)
reset_rpn(cc);
return ret; return ret;
case UMP_CC_NRPN_MSB: case UMP_CC_NRPN_MSB:
ret = fill_rpn(cc, midi2, true); ret = fill_rpn(cc, midi2, true);