Shawn M. Chapla : dsound: Send CaptureBuffer stop notification whenever stopping.

Alexandre Julliard julliard at winehq.org
Mon Jan 18 17:00:38 CST 2021


Module: wine
Branch: master
Commit: c0026b5cf3e82840f5df6b7c5b16f723bbc2cc92
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=c0026b5cf3e82840f5df6b7c5b16f723bbc2cc92

Author: Shawn M. Chapla <schapla at codeweavers.com>
Date:   Fri Jan 15 12:33:44 2021 -0500

dsound: Send CaptureBuffer stop notification whenever stopping.

Signed-off-by: Shawn M. Chapla <schapla at codeweavers.com>
Signed-off-by: Andrew Eikum <aeikum at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 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);
 }




More information about the wine-cvs mailing list