[PATCH 10/10] winecoreaudio: Move midi_in_reset to the unixlib.

Andrew Eikum aeikum at codeweavers.com
Mon Nov 29 09:41:33 CST 2021


Signed-off-by: Andrew Eikum <aeikum at 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 at 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, &params);
> -
> -    if (!err && notify.send_notify) notify_client(&notify);
> +    do
> +    {
> +        UNIX_CALL(midi_in_message, &params);
> +        if ((!err || err == ERROR_RETRY) && notify.send_notify) notify_client(&notify);
> +    } while (err == ERROR_RETRY);
>  
>      return err;
>  }
> -- 
> 2.23.0
> 
> 



More information about the wine-devel mailing list