dsound: Send CaptureBuffer stop notification whenever stopping.
Signed-off-by: Shawn M. Chapla <schapla@codeweavers.com> Signed-off-by: Andrew Eikum <aeikum@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
fc50ea2351
commit
c0026b5cf3
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue