@@ -790,27 +790,39 @@ static int paf_ev_to_ump_midi2(const struct snd_seq_event *event,
790
790
}
791
791
792
792
/* set up the MIDI2 RPN/NRPN packet data from the parsed info */
793
- static void fill_rpn (struct ump_cvt_to_ump_bank * cc ,
794
- union snd_ump_midi2_msg * data ,
795
- unsigned char channel )
793
+ static int fill_rpn (struct ump_cvt_to_ump_bank * cc ,
794
+ union snd_ump_midi2_msg * data ,
795
+ unsigned char channel ,
796
+ bool flush )
796
797
{
798
+ if (!(cc -> cc_data_lsb_set || cc -> cc_data_msb_set ))
799
+ return 0 ; // skip
800
+ /* when not flushing, wait for complete data set */
801
+ if (!flush && (!cc -> cc_data_lsb_set || !cc -> cc_data_msb_set ))
802
+ return 0 ; // skip
803
+
797
804
if (cc -> rpn_set ) {
798
805
data -> rpn .status = UMP_MSG_STATUS_RPN ;
799
806
data -> rpn .bank = cc -> cc_rpn_msb ;
800
807
data -> rpn .index = cc -> cc_rpn_lsb ;
801
- cc -> rpn_set = 0 ;
802
- cc -> cc_rpn_msb = cc -> cc_rpn_lsb = 0 ;
803
- } else {
808
+ } else if (cc -> nrpn_set ) {
804
809
data -> rpn .status = UMP_MSG_STATUS_NRPN ;
805
810
data -> rpn .bank = cc -> cc_nrpn_msb ;
806
811
data -> rpn .index = cc -> cc_nrpn_lsb ;
807
- cc -> nrpn_set = 0 ;
808
- cc -> cc_nrpn_msb = cc -> cc_nrpn_lsb = 0 ;
812
+ } else {
813
+ return 0 ; // skip
809
814
}
815
+
810
816
data -> rpn .data = upscale_14_to_32bit ((cc -> cc_data_msb << 7 ) |
811
817
cc -> cc_data_lsb );
812
818
data -> rpn .channel = channel ;
819
+
820
+ cc -> rpn_set = 0 ;
821
+ cc -> nrpn_set = 0 ;
822
+ cc -> cc_rpn_msb = cc -> cc_rpn_lsb = 0 ;
813
823
cc -> cc_data_msb = cc -> cc_data_lsb = 0 ;
824
+ cc -> cc_data_msb_set = cc -> cc_data_lsb_set = 0 ;
825
+ return 1 ;
814
826
}
815
827
816
828
/* convert CC event to MIDI 2.0 UMP */
@@ -823,28 +835,34 @@ static int cc_ev_to_ump_midi2(const struct snd_seq_event *event,
823
835
unsigned char index = event -> data .control .param & 0x7f ;
824
836
unsigned char val = event -> data .control .value & 0x7f ;
825
837
struct ump_cvt_to_ump_bank * cc = & dest_port -> midi2_bank [channel ];
838
+ int ret ;
826
839
827
840
/* process special CC's (bank/rpn/nrpn) */
828
841
switch (index ) {
829
842
case UMP_CC_RPN_MSB :
843
+ ret = fill_rpn (cc , data , channel , true);
830
844
cc -> rpn_set = 1 ;
831
845
cc -> cc_rpn_msb = val ;
832
- return 0 ; // skip
846
+ return ret ;
833
847
case UMP_CC_RPN_LSB :
848
+ ret = fill_rpn (cc , data , channel , true);
834
849
cc -> rpn_set = 1 ;
835
850
cc -> cc_rpn_lsb = val ;
836
- return 0 ; // skip
851
+ return ret ;
837
852
case UMP_CC_NRPN_MSB :
853
+ ret = fill_rpn (cc , data , channel , true);
838
854
cc -> nrpn_set = 1 ;
839
855
cc -> cc_nrpn_msb = val ;
840
- return 0 ; // skip
856
+ return ret ;
841
857
case UMP_CC_NRPN_LSB :
858
+ ret = fill_rpn (cc , data , channel , true);
842
859
cc -> nrpn_set = 1 ;
843
860
cc -> cc_nrpn_lsb = val ;
844
- return 0 ; // skip
861
+ return ret ;
845
862
case UMP_CC_DATA :
863
+ cc -> cc_data_msb_set = 1 ;
846
864
cc -> cc_data_msb = val ;
847
- return 0 ; // skip
865
+ return fill_rpn ( cc , data , channel , false);
848
866
case UMP_CC_BANK_SELECT :
849
867
cc -> bank_set = 1 ;
850
868
cc -> cc_bank_msb = val ;
@@ -854,11 +872,9 @@ static int cc_ev_to_ump_midi2(const struct snd_seq_event *event,
854
872
cc -> cc_bank_lsb = val ;
855
873
return 0 ; // skip
856
874
case UMP_CC_DATA_LSB :
875
+ cc -> cc_data_lsb_set = 1 ;
857
876
cc -> cc_data_lsb = val ;
858
- if (!(cc -> rpn_set || cc -> nrpn_set ))
859
- return 0 ; // skip
860
- fill_rpn (cc , data , channel );
861
- return 1 ;
877
+ return fill_rpn (cc , data , channel , false);
862
878
}
863
879
864
880
data -> cc .status = status ;
@@ -926,6 +942,7 @@ static int ctrl14_ev_to_ump_midi2(const struct snd_seq_event *event,
926
942
unsigned char index = event -> data .control .param & 0x7f ;
927
943
struct ump_cvt_to_ump_bank * cc = & dest_port -> midi2_bank [channel ];
928
944
unsigned char msb , lsb ;
945
+ int ret ;
929
946
930
947
msb = (event -> data .control .value >> 7 ) & 0x7f ;
931
948
lsb = event -> data .control .value & 0x7f ;
@@ -939,28 +956,25 @@ static int ctrl14_ev_to_ump_midi2(const struct snd_seq_event *event,
939
956
cc -> cc_bank_lsb = lsb ;
940
957
return 0 ; // skip
941
958
case UMP_CC_RPN_MSB :
942
- cc -> cc_rpn_msb = msb ;
943
- fallthrough ;
944
959
case UMP_CC_RPN_LSB :
945
- cc -> rpn_set = 1 ;
960
+ ret = fill_rpn (cc , data , channel , true);
961
+ cc -> cc_rpn_msb = msb ;
946
962
cc -> cc_rpn_lsb = lsb ;
947
- return 0 ; // skip
963
+ cc -> rpn_set = 1 ;
964
+ return ret ;
948
965
case UMP_CC_NRPN_MSB :
949
- cc -> cc_nrpn_msb = msb ;
950
- fallthrough ;
951
966
case UMP_CC_NRPN_LSB :
967
+ ret = fill_rpn (cc , data , channel , true);
968
+ cc -> cc_nrpn_msb = msb ;
952
969
cc -> nrpn_set = 1 ;
953
970
cc -> cc_nrpn_lsb = lsb ;
954
- return 0 ; // skip
971
+ return ret ;
955
972
case UMP_CC_DATA :
956
- cc -> cc_data_msb = msb ;
957
- fallthrough ;
958
973
case UMP_CC_DATA_LSB :
974
+ cc -> cc_data_msb_set = cc -> cc_data_lsb_set = 1 ;
975
+ cc -> cc_data_msb = msb ;
959
976
cc -> cc_data_lsb = lsb ;
960
- if (!(cc -> rpn_set || cc -> nrpn_set ))
961
- return 0 ; // skip
962
- fill_rpn (cc , data , channel );
963
- return 1 ;
977
+ return fill_rpn (cc , data , channel , false);
964
978
}
965
979
966
980
data -> cc .status = UMP_MSG_STATUS_CC ;
0 commit comments