Akihiro Sagawa : dsound/tests: Add tests to check notifications after duplicate.
Alexandre Julliard
julliard at winehq.org
Fri Jul 22 10:15:59 CDT 2011
Module: wine
Branch: master
Commit: 223406fa17a57af3d6420b1a9d60ad5e282cd35f
URL: http://source.winehq.org/git/wine.git/?a=commit;h=223406fa17a57af3d6420b1a9d60ad5e282cd35f
Author: Akihiro Sagawa <sagawa.aki at gmail.com>
Date: Thu Jul 21 21:53:43 2011 +0900
dsound/tests: Add tests to check notifications after duplicate.
---
dlls/dsound/tests/dsound.c | 186 ++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 186 insertions(+), 0 deletions(-)
diff --git a/dlls/dsound/tests/dsound.c b/dlls/dsound/tests/dsound.c
index f8b7aeb..7eb882d 100644
--- a/dlls/dsound/tests/dsound.c
+++ b/dlls/dsound/tests/dsound.c
@@ -1039,6 +1039,191 @@ EXIT:
return rc;
}
+static HRESULT test_notify(LPDIRECTSOUNDBUFFER dsb,
+ DWORD count, LPHANDLE event,
+ DWORD expected)
+{
+ HRESULT rc;
+ DWORD ret;
+
+ rc=IDirectSoundBuffer_SetCurrentPosition(dsb,0);
+ ok(rc==DS_OK,
+ "IDirectSoundBuffer_SetCurrentPosition failed %08x\n",rc);
+ if(rc!=DS_OK)
+ return rc;
+
+ rc=IDirectSoundBuffer_Play(dsb,0,0,0);
+ ok(rc==DS_OK,"IDirectSoundBuffer_Play failed %08x\n",rc);
+ if(rc!=DS_OK)
+ return rc;
+
+ rc=IDirectSoundBuffer_Stop(dsb);
+ ok(rc==DS_OK,"IDirectSoundBuffer_Stop failed %08x\n",rc);
+ if(rc!=DS_OK)
+ return rc;
+
+ ret=WaitForMultipleObjects(count,event,FALSE,0);
+ if (expected != WAIT_OBJECT_0+1) {
+ todo_wine
+ ok(ret==expected,"expected %d. got %d\n",expected,ret);
+ }
+ else
+ ok(ret==expected,"expected %d. got %d\n",expected,ret);
+ return rc;
+}
+
+static HRESULT test_duplicate(LPGUID lpGuid)
+{
+ HRESULT rc;
+ LPDIRECTSOUND dso=NULL;
+ LPDIRECTSOUNDBUFFER primary=NULL;
+ DSBUFFERDESC bufdesc;
+ int ref;
+
+ /* Create the DirectSound object */
+ rc=pDirectSoundCreate(lpGuid,&dso,NULL);
+ ok(rc==DS_OK||rc==DSERR_NODRIVER||rc==DSERR_ALLOCATED,
+ "DirectSoundCreate() failed: %08x\n",rc);
+ if (rc!=DS_OK)
+ return rc;
+
+ /* We must call SetCooperativeLevel before creating primary buffer */
+ /* DSOUND: Setting DirectSound cooperative level to DSSCL_PRIORITY */
+ rc=IDirectSound_SetCooperativeLevel(dso,get_hwnd(),DSSCL_PRIORITY);
+ ok(rc==DS_OK,"IDirectSound_SetCooperativeLevel() failed: %08x\n", rc);
+ if (rc!=DS_OK)
+ goto EXIT;
+
+ ZeroMemory(&bufdesc, sizeof(bufdesc));
+ bufdesc.dwSize=sizeof(bufdesc);
+ bufdesc.dwFlags=DSBCAPS_PRIMARYBUFFER;
+ rc=IDirectSound_CreateSoundBuffer(dso,&bufdesc,&primary,NULL);
+ ok(rc==DS_OK && primary!=NULL,"IDirectSound_CreateSoundBuffer() failed "
+ "to create a primary buffer %08x\n",rc);
+
+ if (rc==DS_OK && primary!=NULL) {
+ LPDIRECTSOUNDBUFFER original=NULL;
+ WAVEFORMATEX wfx;
+
+ init_format(&wfx,WAVE_FORMAT_PCM,22050,16,1);
+ ZeroMemory(&bufdesc, sizeof(bufdesc));
+ bufdesc.dwSize=sizeof(bufdesc);
+ bufdesc.dwFlags=DSBCAPS_GETCURRENTPOSITION2|DSBCAPS_CTRLPOSITIONNOTIFY;
+ bufdesc.dwBufferBytes=wfx.nAvgBytesPerSec/100; /* very short buffer */
+ bufdesc.lpwfxFormat=&wfx;
+ rc=IDirectSound_CreateSoundBuffer(dso,&bufdesc,&original,NULL);
+ ok(rc==DS_OK && original!=NULL,
+ "IDirectSound_CreateSoundBuffer() failed to create a original "
+ "buffer %08x\n",rc);
+ if (rc==DS_OK && original!=NULL) {
+ LPDIRECTSOUNDBUFFER duplicated=NULL;
+ LPDIRECTSOUNDNOTIFY notify=NULL;
+ HANDLE event[2];
+ LPVOID buf=NULL;
+ DWORD bufsize;
+ int i;
+
+ /* Prepare notify events */
+ for (i=0;i<sizeof(event)/sizeof(event[0]);i++) {
+ event[i] = CreateEvent(NULL,FALSE,FALSE,NULL);
+ }
+
+ /* Make silent buffer */
+ rc=IDirectSoundBuffer_Lock(original,0,0,&buf,&bufsize,
+ NULL,NULL,DSBLOCK_ENTIREBUFFER);
+ ok(rc==DS_OK && buf!=NULL,
+ "IDirectSoundBuffer_Lock failed to lock the buffer %08x\n",rc);
+ if (rc==DS_OK && buf!=NULL) {
+ ZeroMemory(buf,bufsize);
+ rc=IDirectSoundBuffer_Unlock(original,buf,bufsize,
+ NULL,0);
+ ok(rc==DS_OK,"IDirectSoundBuffer_Unlock failed to unlock "
+ "%08x\n",rc);
+ }
+
+ rc=IDirectSoundBuffer_QueryInterface(original,
+ &IID_IDirectSoundNotify,
+ (void**)¬ify);
+ ok(rc==DS_OK && notify!=NULL,
+ "IDirectSoundBuffer_QueryInterface() failed to create a "
+ "notification %08x\n",rc);
+ if (rc==DS_OK && notify!=NULL) {
+ DSBPOSITIONNOTIFY dsbpn;
+ LPDIRECTSOUNDNOTIFY dup_notify=NULL;
+
+ dsbpn.dwOffset=DSBPN_OFFSETSTOP;
+ dsbpn.hEventNotify=event[0];
+ rc=IDirectSoundNotify_SetNotificationPositions(notify,
+ 1,&dsbpn);
+ ok(rc==DS_OK,"IDirectSoundNotify_SetNotificationPositions "
+ "failed %08x\n",rc);
+
+ rc=IDirectSound_DuplicateSoundBuffer(dso,original,&duplicated);
+ ok(rc==DS_OK && duplicated!=NULL,
+ "IDirectSound_DuplicateSoundBuffer failed %08x\n",rc);
+
+ trace("testing duplicated buffer without notifications.\n");
+ test_notify(duplicated,sizeof(event)/sizeof(event[0]),
+ event,WAIT_TIMEOUT);
+
+ rc=IDirectSoundBuffer_QueryInterface(duplicated,
+ &IID_IDirectSoundNotify,
+ (void**)&dup_notify);
+ ok(rc==DS_OK&&dup_notify!=NULL,
+ "IDirectSoundBuffer_QueryInterface() failed to create a "
+ "notification %08x\n",rc);
+ if(rc==DS_OK&&dup_notify!=NULL) {
+ dsbpn.dwOffset=DSBPN_OFFSETSTOP;
+ dsbpn.hEventNotify=event[1];
+ rc=IDirectSoundNotify_SetNotificationPositions(dup_notify,
+ 1,&dsbpn);
+ ok(rc==DS_OK,"IDirectSoundNotify_SetNotificationPositions "
+ "failed %08x\n",rc);
+
+ trace("testing duplicated buffer with a notification.\n");
+ test_notify(duplicated,sizeof(event)/sizeof(event[0]),
+ event,WAIT_OBJECT_0+1);
+
+ ref=IDirectSoundNotify_Release(dup_notify);
+ todo_wine
+ ok(ref==0,"IDirectSoundNotify_Release() has %d references, "
+ "should have 0\n",ref);
+ }
+ ref=IDirectSoundNotify_Release(notify);
+ ok(ref==0,"IDirectSoundNotify_Release() has %d references, "
+ "should have 0\n",ref);
+
+ trace("testing original buffer with a notification.\n");
+ test_notify(original,sizeof(event)/sizeof(event[0]),
+ event,WAIT_OBJECT_0);
+
+ ref=IDirectSoundBuffer_Release(duplicated);
+ ok(ref==0,"IDirectSoundBuffer_Release() has %d references, "
+ "should have 0\n",ref);
+ }
+ ref=IDirectSoundBuffer_Release(original);
+ ok(ref==0,"IDirectSoundBuffer_Release() has %d references, "
+ "should have 0\n",ref);
+ }
+ ref=IDirectSoundBuffer_Release(primary);
+ ok(ref==0,"IDirectSoundBuffer_Release() has %d references, "
+ "should have 0\n",ref);
+ }
+
+ /* Set the CooperativeLevel back to normal */
+ /* DSOUND: Setting DirectSound cooperative level to DSSCL_NORMAL */
+ rc=IDirectSound_SetCooperativeLevel(dso,get_hwnd(),DSSCL_NORMAL);
+ ok(rc==DS_OK,"IDirectSound_SetCooperativeLevel() failed: %08x\n", rc);
+
+EXIT:
+ ref=IDirectSound_Release(dso);
+ ok(ref==0,"IDirectSound_Release() has %d references, should have 0\n",ref);
+ if (ref!=0)
+ return DSERR_GENERIC;
+
+ return rc;
+}
+
static unsigned int number;
static BOOL WINAPI dsenum_callback(LPGUID lpGuid, LPCSTR lpcstrDescription,
@@ -1067,6 +1252,7 @@ static BOOL WINAPI dsenum_callback(LPGUID lpGuid, LPCSTR lpcstrDescription,
test_primary_secondary(lpGuid);
test_secondary(lpGuid);
test_frequency(lpGuid);
+ test_duplicate(lpGuid);
}
return 1;
More information about the wine-cvs
mailing list