Commit c0026b5c authored by Shawn M. Chapla's avatar Shawn M. Chapla Committed by Alexandre Julliard

dsound: Send CaptureBuffer stop notification whenever stopping.

parent fc50ea23
...@@ -527,6 +527,8 @@ out: ...@@ -527,6 +527,8 @@ out:
return DS_OK; return DS_OK;
} }
static void capture_CheckNotify(IDirectSoundCaptureBufferImpl *This, DWORD from, DWORD len);
static HRESULT WINAPI IDirectSoundCaptureBufferImpl_Stop(IDirectSoundCaptureBuffer8 *iface) static HRESULT WINAPI IDirectSoundCaptureBufferImpl_Stop(IDirectSoundCaptureBuffer8 *iface)
{ {
IDirectSoundCaptureBufferImpl *This = impl_from_IDirectSoundCaptureBuffer8(iface); IDirectSoundCaptureBufferImpl *This = impl_from_IDirectSoundCaptureBuffer8(iface);
...@@ -544,8 +546,10 @@ static HRESULT WINAPI IDirectSoundCaptureBufferImpl_Stop(IDirectSoundCaptureBuff ...@@ -544,8 +546,10 @@ static HRESULT WINAPI IDirectSoundCaptureBufferImpl_Stop(IDirectSoundCaptureBuff
TRACE("old This->device->state=%s\n",captureStateString[This->device->state]); TRACE("old This->device->state=%s\n",captureStateString[This->device->state]);
if (This->device->state == STATE_CAPTURING) if (This->device->state == STATE_CAPTURING)
This->device->state = STATE_STOPPING; This->device->state = STATE_STOPPING;
else if (This->device->state == STATE_STARTING) else if (This->device->state == STATE_STARTING) {
This->device->state = STATE_STOPPED; This->device->state = STATE_STOPPED;
capture_CheckNotify(This->device->capture_buffer, 0, 0);
}
TRACE("new This->device->state=%s\n",captureStateString[This->device->state]); TRACE("new This->device->state=%s\n",captureStateString[This->device->state]);
if(This->device->client){ if(This->device->client){
...@@ -880,6 +884,7 @@ static HRESULT DSOUND_capture_data(DirectSoundCaptureDevice *device) ...@@ -880,6 +884,7 @@ static HRESULT DSOUND_capture_data(DirectSoundCaptureDevice *device)
if(device->state == STATE_STOPPING){ if(device->state == STATE_STOPPING){
device->state = STATE_STOPPED; device->state = STATE_STOPPED;
capture_CheckNotify(device->capture_buffer, 0, 0);
return S_FALSE; return S_FALSE;
} }
......
...@@ -30,7 +30,8 @@ ...@@ -30,7 +30,8 @@
#include "dsound_test.h" #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) static const char * get_format_str(WORD format)
{ {
...@@ -264,8 +265,8 @@ typedef struct { ...@@ -264,8 +265,8 @@ typedef struct {
LPDIRECTSOUNDCAPTUREBUFFER dscbo; LPDIRECTSOUNDCAPTUREBUFFER dscbo;
LPWAVEFORMATEX wfx; LPWAVEFORMATEX wfx;
DSBPOSITIONNOTIFY posnotify[NOTIFICATIONS]; DSBPOSITIONNOTIFY posnotify[TOTAL_NOTIFICATIONS];
HANDLE event[NOTIFICATIONS]; HANDLE event[TOTAL_NOTIFICATIONS];
LPDIRECTSOUNDNOTIFY notify; LPDIRECTSOUNDNOTIFY notify;
DWORD buffer_size; DWORD buffer_size;
...@@ -369,21 +370,24 @@ static void test_capture_buffer(LPDIRECTSOUNDCAPTURE dsco, ...@@ -369,21 +370,24 @@ static void test_capture_buffer(LPDIRECTSOUNDCAPTURE dsco,
state.dscbo=dscbo; state.dscbo=dscbo;
state.wfx=&wfx; state.wfx=&wfx;
state.buffer_size = dscbcaps.dwBufferBytes; 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.event[i] = CreateEventW(NULL, FALSE, FALSE, NULL);
state.size = dscbcaps.dwBufferBytes / NOTIFICATIONS; state.size = dscbcaps.dwBufferBytes / TIMESTAMP_NOTIFICATIONS;
rc=IDirectSoundCaptureBuffer_QueryInterface(dscbo,&IID_IDirectSoundNotify, rc=IDirectSoundCaptureBuffer_QueryInterface(dscbo,&IID_IDirectSoundNotify,
(void **)&(state.notify)); (void **)&(state.notify));
ok((rc==DS_OK)&&(state.notify!=NULL), ok((rc==DS_OK)&&(state.notify!=NULL),
"IDirectSoundCaptureBuffer_QueryInterface() failed: %08x\n", rc); "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].dwOffset = (i * state.size) + state.size - 1;
state.posnotify[i].hEventNotify = state.event[i]; 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); state.posnotify);
ok(rc==DS_OK,"IDirectSoundNotify_SetNotificationPositions() failed: %08x\n", rc); ok(rc==DS_OK,"IDirectSoundNotify_SetNotificationPositions() failed: %08x\n", rc);
...@@ -403,15 +407,15 @@ static void test_capture_buffer(LPDIRECTSOUNDCAPTURE dsco, ...@@ -403,15 +407,15 @@ static void test_capture_buffer(LPDIRECTSOUNDCAPTURE dsco,
"GetStatus: bad status: %x\n",status); "GetStatus: bad status: %x\n",status);
if (record) { if (record) {
/* wait for the notifications */ /* wait for timestamp notifications */
for (i = 0; i < (NOTIFICATIONS * 2); i++) { for (i = 0; i < (TIMESTAMP_NOTIFICATIONS * 2); i++) {
rc=WaitForMultipleObjects(NOTIFICATIONS,state.event,FALSE,3000); rc = WaitForMultipleObjects(TOTAL_NOTIFICATIONS, state.event, FALSE, 3000);
ok(rc==(WAIT_OBJECT_0+(i%NOTIFICATIONS)), ok(rc == (WAIT_OBJECT_0 + (i % TIMESTAMP_NOTIFICATIONS)),
"WaitForMultipleObjects failed: 0x%x\n",rc); "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), ok((rc==WAIT_TIMEOUT)||(rc==WAIT_FAILED),
"Wrong notification: should be %d, got %d\n", "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)) if (!capture_buffer_service(&state))
break; break;
...@@ -421,6 +425,10 @@ static void test_capture_buffer(LPDIRECTSOUNDCAPTURE dsco, ...@@ -421,6 +425,10 @@ static void test_capture_buffer(LPDIRECTSOUNDCAPTURE dsco,
rc=IDirectSoundCaptureBuffer_Stop(dscbo); rc=IDirectSoundCaptureBuffer_Stop(dscbo);
ok(rc==DS_OK,"IDirectSoundCaptureBuffer_Stop() failed: %08x\n", rc); 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); rc=IDirectSoundCaptureBuffer_Stop(dscbo);
ok(rc==DS_OK,"IDirectSoundCaptureBuffer_Stop() failed: %08x\n", rc); ok(rc==DS_OK,"IDirectSoundCaptureBuffer_Stop() failed: %08x\n", rc);
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment