Le 10/12/2013 18:26, olivier tristan a écrit :
Hi guys,
Please find enclosed a patch on PortMIDI regarding a crash on 64bits
version of Windows.
It was previously reported here and I came across it when upgrading to
Windows 8.1
http://sourceforge.net/p/portmedia/discussion/697912/thread/c2de24fd/?limit=50
The signature of some callback was wrong casting 64bits value in
32bits especially some pointer.
The definition of callbacks are the following:
http://msdn.microsoft.com/en-us/library/windows/desktop/dd798460(v=vs.85).aspx
<http://msdn.microsoft.com/en-us/library/windows/desktop/dd798460%28v=vs.85%29.aspx>
http://msdn.microsoft.com/en-us/library/windows/desktop/dd798478(v=vs.85).aspx
<http://msdn.microsoft.com/en-us/library/windows/desktop/dd798478%28v=vs.85%29.aspx>
Regards,
Any news about this ?
Patch inlined
Thanks,
Index: pm_win/pmwinmm.c
===================================================================
--- pm_win/pmwinmm.c (revision 227)
+++ pm_win/pmwinmm.c (working copy)
@@ -38,11 +38,11 @@
/* callback routines */
static void CALLBACK winmm_in_callback(HMIDIIN hMidiIn,
- WORD wMsg, DWORD dwInstance,
- DWORD dwParam1, DWORD dwParam2);
+ UINT wMsg, DWORD_PTR dwInstance,
+ DWORD_PTR dwParam1, DWORD_PTR
dwParam2);
static void CALLBACK winmm_streamout_callback(HMIDIOUT hmo, UINT wMsg,
- DWORD dwInstance, DWORD
dwParam1,
- DWORD dwParam2);
+ 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,
@@ -666,10 +666,10 @@
/* 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 @@
* 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 @@
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 @@
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 @@
/* 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;
}
@@ -1328,7 +1325,7 @@
/* winmm_streamout_callback -- unprepare (free) buffer header */
static void CALLBACK winmm_streamout_callback(HMIDIOUT hmo, UINT wMsg,
- DWORD dwInstance, DWORD dwParam1, DWORD dwParam2)
+ DWORD_PTR dwInstance, DWORD_PTR dwParam1, DWORD_PTR dwParam2)
{
PmInternal *midi = (PmInternal *) dwInstance;
midiwinmm_type m = (midiwinmm_type) midi->descriptor;
--
Olivier TRISTAN
uvi.net
--
Olivier Tristan
www.uvi.net
_______________________________________________
media_api mailing list
media_api@create.ucsb.edu
http://lists.create.ucsb.edu/mailman/listinfo/media_api