[PATCH v2] dsound: Send CaptureBuffer stop notification whenever stopping.

Andrew Eikum aeikum at codeweavers.com
Mon Jan 18 10:13:07 CST 2021


Signed-off-by: Andrew Eikum <aeikum at codeweavers.com>

On Fri, Jan 15, 2021 at 12:33:44PM -0500, Shawn M. Chapla wrote:
> Signed-off-by: Shawn M. Chapla <schapla at codeweavers.com>
> ---
>  dlls/dsound/capture.c       |  7 ++++++-
>  dlls/dsound/tests/capture.c | 34 +++++++++++++++++++++-------------
>  2 files changed, 27 insertions(+), 14 deletions(-)
> 
> diff --git a/dlls/dsound/capture.c b/dlls/dsound/capture.c
> index 10690f7df0d..2fb3ce8c4a6 100644
> --- a/dlls/dsound/capture.c
> +++ b/dlls/dsound/capture.c
> @@ -527,6 +527,8 @@ out:
>      return DS_OK;
>  }
>  
> +static void capture_CheckNotify(IDirectSoundCaptureBufferImpl *This, DWORD from, DWORD len);
> +
>  static HRESULT WINAPI IDirectSoundCaptureBufferImpl_Stop(IDirectSoundCaptureBuffer8 *iface)
>  {
>      IDirectSoundCaptureBufferImpl *This = impl_from_IDirectSoundCaptureBuffer8(iface);
> @@ -544,8 +546,10 @@ static HRESULT WINAPI IDirectSoundCaptureBufferImpl_Stop(IDirectSoundCaptureBuff
>      TRACE("old This->device->state=%s\n",captureStateString[This->device->state]);
>      if (This->device->state == STATE_CAPTURING)
>  	This->device->state = STATE_STOPPING;
> -    else if (This->device->state == STATE_STARTING)
> +    else if (This->device->state == STATE_STARTING) {
>  	This->device->state = STATE_STOPPED;
> +	capture_CheckNotify(This->device->capture_buffer, 0, 0);
> +    }
>      TRACE("new This->device->state=%s\n",captureStateString[This->device->state]);
>  
>      if(This->device->client){
> @@ -880,6 +884,7 @@ static HRESULT DSOUND_capture_data(DirectSoundCaptureDevice *device)
>  
>      if(device->state == STATE_STOPPING){
>          device->state = STATE_STOPPED;
> +        capture_CheckNotify(device->capture_buffer, 0, 0);
>          return S_FALSE;
>      }
>  
> diff --git a/dlls/dsound/tests/capture.c b/dlls/dsound/tests/capture.c
> index e326fe8d839..2d8138aa19e 100644
> --- a/dlls/dsound/tests/capture.c
> +++ b/dlls/dsound/tests/capture.c
> @@ -30,7 +30,8 @@
>  
>  #include "dsound_test.h"
>  
> -#define NOTIFICATIONS    5
> +#define TIMESTAMP_NOTIFICATIONS     5
> +#define TOTAL_NOTIFICATIONS         (TIMESTAMP_NOTIFICATIONS + 1)
>  
>  static const char * get_format_str(WORD format)
>  {
> @@ -264,8 +265,8 @@ typedef struct {
>  
>      LPDIRECTSOUNDCAPTUREBUFFER dscbo;
>      LPWAVEFORMATEX wfx;
> -    DSBPOSITIONNOTIFY posnotify[NOTIFICATIONS];
> -    HANDLE event[NOTIFICATIONS];
> +    DSBPOSITIONNOTIFY posnotify[TOTAL_NOTIFICATIONS];
> +    HANDLE event[TOTAL_NOTIFICATIONS];
>      LPDIRECTSOUNDNOTIFY notify;
>  
>      DWORD buffer_size;
> @@ -369,21 +370,24 @@ static void test_capture_buffer(LPDIRECTSOUNDCAPTURE dsco,
>      state.dscbo=dscbo;
>      state.wfx=&wfx;
>      state.buffer_size = dscbcaps.dwBufferBytes;
> -    for (i = 0; i < NOTIFICATIONS; i++)
> +    for (i = 0; i < TOTAL_NOTIFICATIONS; i++)
>          state.event[i] = CreateEventW(NULL, FALSE, FALSE, NULL);
> -    state.size = dscbcaps.dwBufferBytes / NOTIFICATIONS;
> +    state.size = dscbcaps.dwBufferBytes / TIMESTAMP_NOTIFICATIONS;
>  
>      rc=IDirectSoundCaptureBuffer_QueryInterface(dscbo,&IID_IDirectSoundNotify,
>                                                  (void **)&(state.notify));
>      ok((rc==DS_OK)&&(state.notify!=NULL),
>         "IDirectSoundCaptureBuffer_QueryInterface() failed: %08x\n", rc);
>  
> -    for (i = 0; i < NOTIFICATIONS; i++) {
> +    for (i = 0; i < TIMESTAMP_NOTIFICATIONS; i++) {
>  	state.posnotify[i].dwOffset = (i * state.size) + state.size - 1;
>  	state.posnotify[i].hEventNotify = state.event[i];
>      }
>  
> -    rc=IDirectSoundNotify_SetNotificationPositions(state.notify,NOTIFICATIONS,
> +    state.posnotify[i].dwOffset = DSBPN_OFFSETSTOP;
> +    state.posnotify[i].hEventNotify = state.event[i];
> +
> +    rc = IDirectSoundNotify_SetNotificationPositions(state.notify, TOTAL_NOTIFICATIONS,
>                                                     state.posnotify);
>      ok(rc==DS_OK,"IDirectSoundNotify_SetNotificationPositions() failed: %08x\n", rc);
>  
> @@ -403,15 +407,15 @@ static void test_capture_buffer(LPDIRECTSOUNDCAPTURE dsco,
>         "GetStatus: bad status: %x\n",status);
>  
>      if (record) {
> -	/* wait for the notifications */
> -	for (i = 0; i < (NOTIFICATIONS * 2); i++) {
> -	    rc=WaitForMultipleObjects(NOTIFICATIONS,state.event,FALSE,3000);
> -	    ok(rc==(WAIT_OBJECT_0+(i%NOTIFICATIONS)),
> +	/* wait for timestamp notifications */
> +	for (i = 0; i < (TIMESTAMP_NOTIFICATIONS * 2); i++) {
> +	    rc = WaitForMultipleObjects(TOTAL_NOTIFICATIONS, state.event, FALSE, 3000);
> +	    ok(rc == (WAIT_OBJECT_0 + (i % TIMESTAMP_NOTIFICATIONS)),
>                 "WaitForMultipleObjects failed: 0x%x\n",rc);
> -	    if (rc!=(WAIT_OBJECT_0+(i%NOTIFICATIONS))) {
> +	    if (rc != (WAIT_OBJECT_0 + (i % TIMESTAMP_NOTIFICATIONS))) {
>  		ok((rc==WAIT_TIMEOUT)||(rc==WAIT_FAILED),
>                     "Wrong notification: should be %d, got %d\n",
> -		    i%NOTIFICATIONS,rc-WAIT_OBJECT_0);
> +		    i % TIMESTAMP_NOTIFICATIONS, rc - WAIT_OBJECT_0);
>  	    }
>  	    if (!capture_buffer_service(&state))
>  		break;
> @@ -421,6 +425,10 @@ static void test_capture_buffer(LPDIRECTSOUNDCAPTURE dsco,
>      rc=IDirectSoundCaptureBuffer_Stop(dscbo);
>      ok(rc==DS_OK,"IDirectSoundCaptureBuffer_Stop() failed: %08x\n", rc);
>  
> +    /* wait for stop notification */
> +    rc = WaitForSingleObject(state.event[TIMESTAMP_NOTIFICATIONS], 3000);
> +    ok(rc == WAIT_OBJECT_0, "WaitForSingleObject failed: 0x%x\n", rc);
> +
>      rc=IDirectSoundCaptureBuffer_Stop(dscbo);
>      ok(rc==DS_OK,"IDirectSoundCaptureBuffer_Stop() failed: %08x\n", rc);
>  }
> -- 
> 2.28.0
> 



More information about the wine-devel mailing list