@@ -129,7 +129,7 @@ static const struct snd_rawmidi_global_ops upisnd_midi_ops = {
129
129
130
130
static void upisnd_midi_in_handler (struct work_struct * work )
131
131
{
132
- int i , n , err ;
132
+ int n , err ;
133
133
134
134
printd ("In handler" );
135
135
struct upisnd_instance * instance = container_of (work ,
@@ -153,8 +153,7 @@ static void upisnd_midi_in_handler(struct work_struct *work)
153
153
instance -> midi .rx_cnt += err ;
154
154
}
155
155
156
- for (i = 0 ; i < err ; ++ i )
157
- kfifo_skip (& instance -> midi .midi_in_fifo );
156
+ kfifo_skip_count (& instance -> midi .midi_in_fifo , err );
158
157
159
158
if (!kfifo_is_empty (& instance -> midi .midi_in_fifo ) &&
160
159
!work_pending (& instance -> midi .midi_in_handler )) {
@@ -193,25 +192,37 @@ static void upisnd_midi_out_handler(struct work_struct *work)
193
192
instance -> midi .output_buffer_used_in_millibytes ) / 1000 ;
194
193
195
194
u8 buffer [UPISND_MAX_PACKET_LENGTH - 1 ];
195
+ int n , batch , err ;
196
196
197
197
printd ("Available: %u" , output_buffer_available );
198
- int n = snd_rawmidi_transmit_peek (instance -> midi .midi_output ,
199
- buffer ,
200
- min (output_buffer_available , sizeof (buffer )));
201
-
202
- if (n > 0 ) {
203
- printd ("Peeked: %d" , n );
204
- snd_rawmidi_transmit_ack (instance -> midi .midi_output , n );
205
- n = upisnd_comm_send_midi (instance , buffer , (unsigned int )n );
206
- if (n < 0 )
207
- printe ("Error occurred when sending MIDI data over I2C! (%d)" , n );
208
- } else {
209
- printe ("snd_rawmidi_transmit_peek returned error %d!" , n );
210
- goto cleanup ;
211
- }
212
198
213
- instance -> midi .tx_cnt += n ;
214
- instance -> midi .output_buffer_used_in_millibytes += n * 1000 ;
199
+ for (batch = 0 ; batch < 3 ; ++ batch ) {
200
+ if (output_buffer_available == 0 )
201
+ break ;
202
+
203
+ n = snd_rawmidi_transmit_peek (instance -> midi .midi_output ,
204
+ buffer ,
205
+ min (output_buffer_available , sizeof (buffer )));
206
+
207
+ if (n > 0 ) {
208
+ printd ("Peeked: %d (batch %d)" , n , batch );
209
+ err = upisnd_comm_send_midi (instance , buffer , (unsigned int )n );
210
+ if (err < 0 ) {
211
+ printe ("Error occurred when sending MIDI data over I2C! (%d)" , n );
212
+ goto cleanup ;
213
+ }
214
+ snd_rawmidi_transmit_ack (instance -> midi .midi_output , n );
215
+
216
+ instance -> midi .tx_cnt += n ;
217
+ instance -> midi .output_buffer_used_in_millibytes += n * 1000 ;
218
+ output_buffer_available -= n ;
219
+ } else if (n < 0 ) {
220
+ printe ("snd_rawmidi_transmit_peek returned error %d!" , n );
221
+ goto cleanup ;
222
+ } else {
223
+ break ;
224
+ }
225
+ }
215
226
216
227
printd ("Checking if empty %p" , instance -> midi .midi_output );
217
228
if (!snd_rawmidi_transmit_empty (instance -> midi .midi_output )) {
0 commit comments