The headers are removed one at a time so that each notification can be reported back to the client-side. If there are remaining headers, the unixlib will return ERROR_RETRY to request that the client calls again.
Signed-off-by: Huw Davies huw@codeweavers.com --- dlls/winecoreaudio.drv/coremidi.c | 36 +++++++++++++++++++++++++++++++ dlls/winecoreaudio.drv/midi.c | 36 +++++-------------------------- 2 files changed, 41 insertions(+), 31 deletions(-)
diff --git a/dlls/winecoreaudio.drv/coremidi.c b/dlls/winecoreaudio.drv/coremidi.c index 5d89b69e007..9dc9f452c29 100644 --- a/dlls/winecoreaudio.drv/coremidi.c +++ b/dlls/winecoreaudio.drv/coremidi.c @@ -934,6 +934,39 @@ static DWORD midi_in_stop(WORD dev_id) return MMSYSERR_NOERROR; }
+static DWORD midi_in_reset(WORD dev_id, struct notify_context *notify) +{ + DWORD cur_time = NtGetTickCount(); + DWORD err = MMSYSERR_NOERROR; + struct midi_src *src; + MIDIHDR *hdr; + + TRACE("%d\n", dev_id); + + if (dev_id >= num_srcs) + { + WARN("bad device ID : %d\n", dev_id); + return MMSYSERR_BADDEVICEID; + } + src = srcs + dev_id; + + midi_in_lock((void *)TRUE); + + if (src->lpQueueHdr) + { + hdr = src->lpQueueHdr; + src->lpQueueHdr = hdr->lpNext; + hdr->dwFlags &= ~MHDR_INQUEUE; + hdr->dwFlags |= MHDR_DONE; + set_in_notify(notify, src, dev_id, MIM_LONGDATA, (DWORD_PTR)hdr, cur_time - src->startTime); + if (src->lpQueueHdr) err = ERROR_RETRY; /* ask the client to call again */ + } + + midi_in_lock((void *)FALSE); + + return err; +} + NTSTATUS midi_out_message(void *args) { struct midi_out_message_params *params = args; @@ -1030,6 +1063,9 @@ NTSTATUS midi_in_message(void *args) case MIDM_STOP: *params->err = midi_in_stop(params->dev_id); break; + case MIDM_RESET: + *params->err = midi_in_reset(params->dev_id, params->notify); + break; default: TRACE("Unsupported message\n"); *params->err = MMSYSERR_NOTSUPPORTED; diff --git a/dlls/winecoreaudio.drv/midi.c b/dlls/winecoreaudio.drv/midi.c index ab861d44525..dcb9a7e1b69 100644 --- a/dlls/winecoreaudio.drv/midi.c +++ b/dlls/winecoreaudio.drv/midi.c @@ -142,30 +142,6 @@ static void midi_lock( BOOL lock ) UNIX_CALL(midi_in_lock, (void *)lock); }
-static DWORD MIDIIn_Reset(WORD wDevID) -{ - DWORD dwTime = GetTickCount(); - - TRACE("%d\n", wDevID); - if (wDevID >= MIDIIn_NumDevs) { - WARN("bad device ID : %d\n", wDevID); - return MMSYSERR_BADDEVICEID; - } - - midi_lock( TRUE ); - while (sources[wDevID].lpQueueHdr) { - LPMIDIHDR lpMidiHdr = sources[wDevID].lpQueueHdr; - sources[wDevID].lpQueueHdr = lpMidiHdr->lpNext; - lpMidiHdr->dwFlags &= ~MHDR_INQUEUE; - lpMidiHdr->dwFlags |= MHDR_DONE; - /* FIXME: when called from 16 bit, lpQueueHdr needs to be a segmented ptr */ - MIDI_NotifyClient(wDevID, MIM_LONGDATA, (DWORD_PTR)lpMidiHdr, dwTime - sources[wDevID].startTime); - } - midi_lock( FALSE ); - - return MMSYSERR_NOERROR; -} - /* * MIDI In Mach message handling */ @@ -335,10 +311,6 @@ DWORD WINAPI CoreAudio_midMessage(UINT wDevID, UINT wMsg, DWORD_PTR dwUser, DWOR DWORD err;
TRACE("%d %08x %08lx %08lx %08lx\n", wDevID, wMsg, dwUser, dwParam1, dwParam2); - switch (wMsg) { - case MIDM_RESET: - return MIDIIn_Reset(wDevID); - }
params.dev_id = wDevID; params.msg = wMsg; @@ -348,9 +320,11 @@ DWORD WINAPI CoreAudio_midMessage(UINT wDevID, UINT wMsg, DWORD_PTR dwUser, DWOR params.err = &err; params.notify = ¬ify;
- UNIX_CALL(midi_in_message, ¶ms); - - if (!err && notify.send_notify) notify_client(¬ify); + do + { + UNIX_CALL(midi_in_message, ¶ms); + if ((!err || err == ERROR_RETRY) && notify.send_notify) notify_client(¬ify); + } while (err == ERROR_RETRY);
return err; }
Signed-off-by: Andrew Eikum aeikum@codeweavers.com
On Mon, Nov 29, 2021 at 11:26:48AM +0000, Huw Davies wrote:
The headers are removed one at a time so that each notification can be reported back to the client-side. If there are remaining headers, the unixlib will return ERROR_RETRY to request that the client calls again.
Signed-off-by: Huw Davies huw@codeweavers.com
dlls/winecoreaudio.drv/coremidi.c | 36 +++++++++++++++++++++++++++++++ dlls/winecoreaudio.drv/midi.c | 36 +++++-------------------------- 2 files changed, 41 insertions(+), 31 deletions(-)
diff --git a/dlls/winecoreaudio.drv/coremidi.c b/dlls/winecoreaudio.drv/coremidi.c index 5d89b69e007..9dc9f452c29 100644 --- a/dlls/winecoreaudio.drv/coremidi.c +++ b/dlls/winecoreaudio.drv/coremidi.c @@ -934,6 +934,39 @@ static DWORD midi_in_stop(WORD dev_id) return MMSYSERR_NOERROR; }
+static DWORD midi_in_reset(WORD dev_id, struct notify_context *notify) +{
- DWORD cur_time = NtGetTickCount();
- DWORD err = MMSYSERR_NOERROR;
- struct midi_src *src;
- MIDIHDR *hdr;
- TRACE("%d\n", dev_id);
- if (dev_id >= num_srcs)
- {
WARN("bad device ID : %d\n", dev_id);
return MMSYSERR_BADDEVICEID;
- }
- src = srcs + dev_id;
- midi_in_lock((void *)TRUE);
- if (src->lpQueueHdr)
- {
hdr = src->lpQueueHdr;
src->lpQueueHdr = hdr->lpNext;
hdr->dwFlags &= ~MHDR_INQUEUE;
hdr->dwFlags |= MHDR_DONE;
set_in_notify(notify, src, dev_id, MIM_LONGDATA, (DWORD_PTR)hdr, cur_time - src->startTime);
if (src->lpQueueHdr) err = ERROR_RETRY; /* ask the client to call again */
- }
- midi_in_lock((void *)FALSE);
- return err;
+}
NTSTATUS midi_out_message(void *args) { struct midi_out_message_params *params = args; @@ -1030,6 +1063,9 @@ NTSTATUS midi_in_message(void *args) case MIDM_STOP: *params->err = midi_in_stop(params->dev_id); break;
- case MIDM_RESET:
*params->err = midi_in_reset(params->dev_id, params->notify);
default: TRACE("Unsupported message\n"); *params->err = MMSYSERR_NOTSUPPORTED;break;
diff --git a/dlls/winecoreaudio.drv/midi.c b/dlls/winecoreaudio.drv/midi.c index ab861d44525..dcb9a7e1b69 100644 --- a/dlls/winecoreaudio.drv/midi.c +++ b/dlls/winecoreaudio.drv/midi.c @@ -142,30 +142,6 @@ static void midi_lock( BOOL lock ) UNIX_CALL(midi_in_lock, (void *)lock); }
-static DWORD MIDIIn_Reset(WORD wDevID) -{
- DWORD dwTime = GetTickCount();
- TRACE("%d\n", wDevID);
- if (wDevID >= MIDIIn_NumDevs) {
WARN("bad device ID : %d\n", wDevID);
- return MMSYSERR_BADDEVICEID;
- }
- midi_lock( TRUE );
- while (sources[wDevID].lpQueueHdr) {
- LPMIDIHDR lpMidiHdr = sources[wDevID].lpQueueHdr;
- sources[wDevID].lpQueueHdr = lpMidiHdr->lpNext;
- lpMidiHdr->dwFlags &= ~MHDR_INQUEUE;
- lpMidiHdr->dwFlags |= MHDR_DONE;
- /* FIXME: when called from 16 bit, lpQueueHdr needs to be a segmented ptr */
- MIDI_NotifyClient(wDevID, MIM_LONGDATA, (DWORD_PTR)lpMidiHdr, dwTime - sources[wDevID].startTime);
- }
- midi_lock( FALSE );
- return MMSYSERR_NOERROR;
-}
/*
- MIDI In Mach message handling
*/ @@ -335,10 +311,6 @@ DWORD WINAPI CoreAudio_midMessage(UINT wDevID, UINT wMsg, DWORD_PTR dwUser, DWOR DWORD err;
TRACE("%d %08x %08lx %08lx %08lx\n", wDevID, wMsg, dwUser, dwParam1, dwParam2);
switch (wMsg) {
case MIDM_RESET:
return MIDIIn_Reset(wDevID);
}
params.dev_id = wDevID; params.msg = wMsg;
@@ -348,9 +320,11 @@ DWORD WINAPI CoreAudio_midMessage(UINT wDevID, UINT wMsg, DWORD_PTR dwUser, DWOR params.err = &err; params.notify = ¬ify;
- UNIX_CALL(midi_in_message, ¶ms);
- if (!err && notify.send_notify) notify_client(¬ify);
do
{
UNIX_CALL(midi_in_message, ¶ms);
if ((!err || err == ERROR_RETRY) && notify.send_notify) notify_client(¬ify);
} while (err == ERROR_RETRY);
return err;
}
2.23.0