11/*
2- * Copyright (c) 1999, 2012 , Oracle and/or its affiliates. All rights reserved.
2+ * Copyright (c) 1999, 2023 , Oracle and/or its affiliates. All rights reserved.
33 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
44 *
55 * This code is free software; you can redistribute it and/or modify it
@@ -161,7 +161,7 @@ INT32 unprepareLongBuffers(MidiDeviceHandle* handle) {
161161 }
162162 sysex = (SysExQueue * ) handle -> longBuffers ;
163163 for (i = 0 ; i < sysex -> count ; i ++ ) {
164- MIDIHDR * hdr = & (sysex -> header [i ]);
164+ MIDIHDR * hdr = & (sysex -> headerInfo [i ]. header );
165165 if (hdr -> dwFlags ) {
166166 err = midiOutUnprepareHeader ((HMIDIOUT ) handle -> deviceHandle , hdr , sizeof (MIDIHDR ));
167167 }
@@ -170,8 +170,9 @@ INT32 unprepareLongBuffers(MidiDeviceHandle* handle) {
170170 return (INT32 ) err ;
171171}
172172
173- INT32 freeLongBuffer (MIDIHDR * hdr , HMIDIOUT deviceHandle , INT32 minToLeaveData ) {
173+ INT32 freeLongBuffer (MidiHeaderInfo * info , HMIDIOUT deviceHandle , INT32 minToLeaveData ) {
174174 MMRESULT err = MMSYSERR_NOERROR ;
175+ MIDIHDR * hdr = & (info -> header );
175176
176177 if (!hdr ) {
177178 ERROR0 ("MIDI_OUT_freeLongBuffer: hdr == NULL\n" );
@@ -180,10 +181,11 @@ INT32 freeLongBuffer(MIDIHDR* hdr, HMIDIOUT deviceHandle, INT32 minToLeaveData)
180181 if (hdr -> dwFlags && deviceHandle ) {
181182 err = midiOutUnprepareHeader (deviceHandle , hdr , sizeof (MIDIHDR ));
182183 }
183- if (hdr -> lpData && ((( INT32 ) hdr -> dwBufferLength ) < minToLeaveData || minToLeaveData < 0 )) {
184+ if (hdr -> lpData && (info -> bufferLength < minToLeaveData || minToLeaveData < 0 )) {
184185 free (hdr -> lpData );
185186 hdr -> lpData = NULL ;
186187 hdr -> dwBufferLength = 0 ;
188+ info -> bufferLength = 0 ;
187189 }
188190 hdr -> dwBytesRecorded = 0 ;
189191 hdr -> dwFlags = 0 ;
@@ -201,7 +203,7 @@ INT32 freeLongBuffers(MidiDeviceHandle* handle) {
201203 }
202204 sysex = (SysExQueue * ) handle -> longBuffers ;
203205 for (i = 0 ; i < sysex -> count ; i ++ ) {
204- err = freeLongBuffer (& (sysex -> header [i ]), (HMIDIOUT ) handle -> deviceHandle , -1 );
206+ err = freeLongBuffer (& (sysex -> headerInfo [i ]), (HMIDIOUT ) handle -> deviceHandle , -1 );
205207 }
206208 MIDIOUT_CHECK_ERROR ;
207209 return (INT32 ) err ;
@@ -352,6 +354,7 @@ INT32 MIDI_OUT_SendShortMessage(MidiDeviceHandle* handle, UINT32 packedMsg, UINT
352354INT32 MIDI_OUT_SendLongMessage (MidiDeviceHandle * handle , UBYTE * data , UINT32 size , UINT32 timestamp ) {
353355 MMRESULT err ;
354356 SysExQueue * sysex ;
357+ MidiHeaderInfo * info = NULL ;
355358 MIDIHDR * hdr = NULL ;
356359 INT32 remainingSize ;
357360 int i ;
@@ -378,10 +381,12 @@ INT32 MIDI_OUT_SendLongMessage(MidiDeviceHandle* handle, UBYTE* data, UINT32 siz
378381 while (!hdr && handle -> platformData ) {
379382 /* find a non-queued header */
380383 for (i = 0 ; i < sysex -> count ; i ++ ) {
381- hdr = & (sysex -> header [i ]);
384+ info = & (sysex -> headerInfo [i ]);
385+ hdr = & (info -> header );
382386 if ((hdr -> dwFlags & MHDR_DONE ) || (hdr -> dwFlags == 0 )) {
383387 break ;
384388 }
389+ info = NULL ;
385390 hdr = NULL ;
386391 }
387392 /* wait for a buffer to free up */
@@ -404,22 +409,26 @@ INT32 MIDI_OUT_SendLongMessage(MidiDeviceHandle* handle, UBYTE* data, UINT32 siz
404409 }
405410
406411 TRACE2 ("-> sending %d bytes with buffer index=%d\n" , (int ) size , (int ) hdr -> dwUser );
407- freeLongBuffer (hdr , handle -> deviceHandle , (INT32 ) size );
412+ freeLongBuffer (info , handle -> deviceHandle , (INT32 ) size );
408413 if (hdr -> lpData == NULL ) {
409414 hdr -> lpData = malloc (size );
410- hdr -> dwBufferLength = size ;
415+ info -> bufferLength = size ;
411416 }
417+ // Because midiOutLongMsg() ignores dwBytesRecorded, set both
418+ // dwBufferLength to the size of the data. The actual buffer
419+ // size is recorded in info->bufferLength.
420+ hdr -> dwBufferLength = size ;
412421 hdr -> dwBytesRecorded = size ;
413422 memcpy (hdr -> lpData , data , size );
414423 err = midiOutPrepareHeader ((HMIDIOUT ) handle -> deviceHandle , hdr , sizeof (MIDIHDR ));
415424 if (err != MMSYSERR_NOERROR ) {
416- freeLongBuffer (hdr , handle -> deviceHandle , -1 );
425+ freeLongBuffer (info , handle -> deviceHandle , -1 );
417426 MIDIOUT_CHECK_ERROR ;
418427 return (INT32 ) err ;
419428 }
420429 err = midiOutLongMsg ((HMIDIOUT ) handle -> deviceHandle , hdr , sizeof (MIDIHDR ));
421430 if (err != MMSYSERR_NOERROR ) {
422- freeLongBuffer (hdr , handle -> deviceHandle , -1 );
431+ freeLongBuffer (info , handle -> deviceHandle , -1 );
423432 ERROR0 ("ERROR: MIDI_OUT_SendLongMessage: midiOutLongMsg returned error:\n" );
424433 MIDIOUT_CHECK_ERROR ;
425434 return (INT32 ) err ;
0 commit comments