Fixes MIDI playback on 64 bit Windows

Fix is based https://www.mail-archive.com/media_api@create.ucsb.edu/msg00514.html
This commit is contained in:
Dmitry Vedenko 2021-06-17 13:47:05 +03:00 committed by Dmitry Vedenko
parent 7a0de2ee23
commit 07187ad789
1 changed files with 19 additions and 21 deletions

View File

@ -37,16 +37,16 @@
#define MIDI_EOX 0xf7
/* callback routines */
static void CALLBACK winmm_in_callback(HMIDIIN hMidiIn,
WORD wMsg, DWORD dwInstance,
DWORD dwParam1, DWORD dwParam2);
static void CALLBACK winmm_streamout_callback(HMIDIOUT hmo, UINT wMsg,
DWORD dwInstance, DWORD dwParam1,
DWORD dwParam2);
static void CALLBACK winmm_in_callback(
HMIDIIN hMidiIn, UINT wMsg, DWORD_PTR dwInstance, DWORD_PTR dwParam1,
DWORD_PTR dwParam2);
static void CALLBACK winmm_streamout_callback(
HMIDIOUT hmo, UINT wMsg, DWORD_PTR dwInstance, DWORD_PTR dwParam1,
DWORD_PTR dwParam2);
#ifdef USE_SYSEX_BUFFERS
static void CALLBACK winmm_out_callback(HMIDIOUT hmo, UINT wMsg,
DWORD dwInstance, DWORD dwParam1,
DWORD dwParam2);
static void CALLBACK winmm_out_callback(
HMIDIOUT hmo, UINT wMsg, DWORD_PTR dwInstance, DWORD_PTR dwParam1,
DWORD_PTR dwParam2);
#endif
extern pm_fns_node pm_winmm_in_dictionary;
@ -666,10 +666,10 @@ static PmError winmm_in_close(PmInternal *midi)
/* Callback function executed via midiInput SW interrupt (via midiInOpen). */
static void FAR PASCAL winmm_in_callback(
HMIDIIN hMidiIn, /* midiInput device Handle */
WORD wMsg, /* midi msg */
DWORD dwInstance, /* application data */
DWORD dwParam1, /* MIDI data */
DWORD dwParam2) /* device timestamp (wrt most recent midiInStart) */
UINT wMsg, /* midi msg */
DWORD_PTR dwInstance, /* application data */
DWORD_PTR dwParam1, /* MIDI data */
DWORD_PTR dwParam2) /* device timestamp (wrt most recent midiInStart) */
{
static int entry = 0;
PmInternal *midi = (PmInternal *) dwInstance;
@ -688,7 +688,6 @@ static void FAR PASCAL winmm_in_callback(
* hardware interrupt? -- but I've seen reentrant behavior
* using a debugger, so it happens.
*/
long new_driver_time;
EnterCriticalSection(&m->lock);
/* dwParam1 is MIDI data received, packed into DWORD w/ 1st byte of
@ -697,8 +696,6 @@ static void FAR PASCAL winmm_in_callback(
in [ms] from when midiInStart called.
each message is expanded to include the status byte */
new_driver_time = dwParam2;
if ((dwParam1 & 0x80) == 0) {
/* not a status byte -- ignore it. This happened running the
sysex.c test under Win2K with MidiMan USB 1x1 interface,
@ -709,8 +706,8 @@ static void FAR PASCAL winmm_in_callback(
PmEvent event;
if (midi->time_proc)
dwParam2 = (*midi->time_proc)(midi->time_info);
event.timestamp = dwParam2;
event.message = dwParam1;
event.timestamp = (PmTimestamp)dwParam2;
event.message = (PmMessage)dwParam1;
pm_read_short(midi, &event);
}
LeaveCriticalSection(&m->lock);
@ -731,7 +728,7 @@ static void FAR PASCAL winmm_in_callback(
/* assume yes and iterate through them */
while (remaining > 0) {
unsigned int amt = pm_read_bytes(midi, data + processed,
remaining, dwParam2);
remaining, (PmTimestamp)dwParam2);
remaining -= amt;
processed += amt;
}
@ -1327,8 +1324,9 @@ static void CALLBACK winmm_out_callback(HMIDIOUT hmo, UINT wMsg,
#endif
/* winmm_streamout_callback -- unprepare (free) buffer header */
static void CALLBACK winmm_streamout_callback(HMIDIOUT hmo, UINT wMsg,
DWORD dwInstance, DWORD dwParam1, DWORD dwParam2)
static void CALLBACK winmm_streamout_callback(
HMIDIOUT hmo, UINT wMsg, DWORD_PTR dwInstance, DWORD_PTR dwParam1,
DWORD_PTR dwParam2)
{
PmInternal *midi = (PmInternal *) dwInstance;
midiwinmm_type m = (midiwinmm_type) midi->descriptor;