Added better tests for volume and pan.
Added capture notification test. Fixed capture query notification test bug.
This commit is contained in:
parent
725d8c39aa
commit
f4866fed8b
|
@ -30,10 +30,6 @@
|
||||||
#include "wingdi.h"
|
#include "wingdi.h"
|
||||||
#include "dsound.h"
|
#include "dsound.h"
|
||||||
|
|
||||||
#ifndef DSBCAPS_CTRLDEFAULT
|
|
||||||
#define DSBCAPS_CTRLDEFAULT 0x000000E0
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static const unsigned int formats[][3]={
|
static const unsigned int formats[][3]={
|
||||||
{ 8000, 8, 1},
|
{ 8000, 8, 1},
|
||||||
{ 8000, 8, 2},
|
{ 8000, 8, 2},
|
||||||
|
@ -307,7 +303,8 @@ static void test_buffer(LPDIRECTSOUND dso, LPDIRECTSOUNDBUFFER dsbo,
|
||||||
|
|
||||||
/* DSOUND: Error: Primary buffers don't support CTRLFREQUENCY */
|
/* DSOUND: Error: Primary buffers don't support CTRLFREQUENCY */
|
||||||
rc=IDirectSoundBuffer_GetFrequency(dsbo,&freq);
|
rc=IDirectSoundBuffer_GetFrequency(dsbo,&freq);
|
||||||
ok((rc==DS_OK&&!is_primary) || (rc==DSERR_CONTROLUNAVAIL&&is_primary),
|
ok((rc==DS_OK&&!is_primary) || (rc==DSERR_CONTROLUNAVAIL&&is_primary) ||
|
||||||
|
(rc==DSERR_CONTROLUNAVAIL&&!(dsbcaps.dwFlags&DSBCAPS_CTRLFREQUENCY)),
|
||||||
"GetFrequency failed: 0x%lx\n",rc);
|
"GetFrequency failed: 0x%lx\n",rc);
|
||||||
if (rc==DS_OK) {
|
if (rc==DS_OK) {
|
||||||
ok(freq==wfx.nSamplesPerSec,
|
ok(freq==wfx.nSamplesPerSec,
|
||||||
|
@ -361,7 +358,7 @@ static void test_buffer(LPDIRECTSOUND dso, LPDIRECTSOUNDBUFFER dsbo,
|
||||||
|
|
||||||
if (play) {
|
if (play) {
|
||||||
play_state_t state;
|
play_state_t state;
|
||||||
LONG volume;
|
LONG volume,pan;
|
||||||
LPDIRECTSOUND3DBUFFER buffer=NULL;
|
LPDIRECTSOUND3DBUFFER buffer=NULL;
|
||||||
DS3DBUFFER buffer_param;
|
DS3DBUFFER buffer_param;
|
||||||
DS3DLISTENER listener_param;
|
DS3DLISTENER listener_param;
|
||||||
|
@ -426,13 +423,28 @@ static void test_buffer(LPDIRECTSOUND dso, LPDIRECTSOUNDBUFFER dsbo,
|
||||||
|
|
||||||
rc=IDirectSoundBuffer_SetVolume(dsbo,-300);
|
rc=IDirectSoundBuffer_SetVolume(dsbo,-300);
|
||||||
ok(rc==DS_OK,"SetVolume failed: 0x%lx\n",rc);
|
ok(rc==DS_OK,"SetVolume failed: 0x%lx\n",rc);
|
||||||
|
|
||||||
|
rc=IDirectSoundBuffer_GetVolume(dsbo,&volume);
|
||||||
|
trace(" volume=%ld\n",volume);
|
||||||
|
} else {
|
||||||
|
/* DSOUND: Error: Buffer does not have CTRLVOLUME */
|
||||||
|
rc=IDirectSoundBuffer_GetVolume(dsbo,&volume);
|
||||||
|
ok(rc==DSERR_CONTROLUNAVAIL,"GetVolume should have failed: 0x%lx\n",rc);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* DSOUND: Error: Buffer does not have CTRLVOLUME */
|
if (dsbcaps.dwFlags & DSBCAPS_CTRLPAN) {
|
||||||
rc=IDirectSoundBuffer_GetVolume(dsbo,&volume);
|
rc=IDirectSoundBuffer_GetPan(dsbo,&pan);
|
||||||
ok((rc==DS_OK&&!is_primary) || (rc==DSERR_CONTROLUNAVAIL&&is_primary),"GetVolume failed: 0x%lx\n",rc);
|
ok(rc==DS_OK,"GetPan failed: 0x%lx\n",rc);
|
||||||
if (rc==DS_OK) {
|
|
||||||
trace(" volume=%ld\n",volume);
|
rc=IDirectSoundBuffer_SetPan(dsbo,0);
|
||||||
|
ok(rc==DS_OK,"SetPan failed: 0x%lx\n",rc);
|
||||||
|
|
||||||
|
rc=IDirectSoundBuffer_GetPan(dsbo,&pan);
|
||||||
|
trace(" pan=%ld\n",pan);
|
||||||
|
} else {
|
||||||
|
/* DSOUND: Error: Buffer does not have CTRLPAN */
|
||||||
|
rc=IDirectSoundBuffer_GetPan(dsbo,&pan);
|
||||||
|
ok(rc==DSERR_CONTROLUNAVAIL,"GetPan should have failed: 0x%lx\n",rc);
|
||||||
}
|
}
|
||||||
|
|
||||||
state.wave=wave_generate_la(&wfx,((double)TONE_DURATION)/1000,&state.wave_len);
|
state.wave=wave_generate_la(&wfx,((double)TONE_DURATION)/1000,&state.wave_len);
|
||||||
|
@ -546,9 +558,11 @@ static HRESULT test_secondary(LPGUID lpGuid, int play,
|
||||||
|
|
||||||
ZeroMemory(&bufdesc, sizeof(bufdesc));
|
ZeroMemory(&bufdesc, sizeof(bufdesc));
|
||||||
bufdesc.dwSize=sizeof(bufdesc);
|
bufdesc.dwSize=sizeof(bufdesc);
|
||||||
bufdesc.dwFlags=DSBCAPS_PRIMARYBUFFER|DSBCAPS_CTRL3D;
|
bufdesc.dwFlags=DSBCAPS_PRIMARYBUFFER;
|
||||||
if (has_3d)
|
if (has_3d)
|
||||||
bufdesc.dwFlags|=DSBCAPS_CTRL3D;
|
bufdesc.dwFlags|=DSBCAPS_CTRL3D;
|
||||||
|
else
|
||||||
|
bufdesc.dwFlags|=(DSBCAPS_CTRLVOLUME|DSBCAPS_CTRLPAN);
|
||||||
rc=IDirectSound_CreateSoundBuffer(dso,&bufdesc,&primary,NULL);
|
rc=IDirectSound_CreateSoundBuffer(dso,&bufdesc,&primary,NULL);
|
||||||
ok(rc==DS_OK&&primary!=NULL,"CreateSoundBuffer failed to create a %sprimary buffer 0x%lx\n",has_3d?"3D ":"", rc);
|
ok(rc==DS_OK&&primary!=NULL,"CreateSoundBuffer failed to create a %sprimary buffer 0x%lx\n",has_3d?"3D ":"", rc);
|
||||||
if (rc==DS_OK&&primary!=NULL) {
|
if (rc==DS_OK&&primary!=NULL) {
|
||||||
|
@ -580,9 +594,11 @@ static HRESULT test_secondary(LPGUID lpGuid, int play,
|
||||||
secondary=NULL;
|
secondary=NULL;
|
||||||
ZeroMemory(&bufdesc, sizeof(bufdesc));
|
ZeroMemory(&bufdesc, sizeof(bufdesc));
|
||||||
bufdesc.dwSize=sizeof(bufdesc);
|
bufdesc.dwSize=sizeof(bufdesc);
|
||||||
bufdesc.dwFlags=DSBCAPS_CTRLDEFAULT|DSBCAPS_GETCURRENTPOSITION2|DSBCAPS_CTRL3D;
|
bufdesc.dwFlags=DSBCAPS_GETCURRENTPOSITION2;
|
||||||
if (has_3d)
|
if (has_3d)
|
||||||
bufdesc.dwFlags|=DSBCAPS_CTRL3D;
|
bufdesc.dwFlags|=DSBCAPS_CTRL3D;
|
||||||
|
else
|
||||||
|
bufdesc.dwFlags|=(DSBCAPS_CTRLFREQUENCY|DSBCAPS_CTRLVOLUME|DSBCAPS_CTRLPAN);
|
||||||
bufdesc.dwBufferBytes=wfx.nAvgBytesPerSec*BUFFER_LEN/1000;
|
bufdesc.dwBufferBytes=wfx.nAvgBytesPerSec*BUFFER_LEN/1000;
|
||||||
bufdesc.lpwfxFormat=&wfx;
|
bufdesc.lpwfxFormat=&wfx;
|
||||||
trace(" Testing a %s%ssecondary buffer %s%s%s%sat %ldx%dx%d\n",
|
trace(" Testing a %s%ssecondary buffer %s%s%s%sat %ldx%dx%d\n",
|
||||||
|
@ -798,7 +814,7 @@ static HRESULT test_primary(LPGUID lpGuid)
|
||||||
primary=NULL;
|
primary=NULL;
|
||||||
ZeroMemory(&bufdesc, sizeof(bufdesc));
|
ZeroMemory(&bufdesc, sizeof(bufdesc));
|
||||||
bufdesc.dwSize=sizeof(bufdesc);
|
bufdesc.dwSize=sizeof(bufdesc);
|
||||||
bufdesc.dwFlags=DSBCAPS_PRIMARYBUFFER;
|
bufdesc.dwFlags=DSBCAPS_PRIMARYBUFFER|DSBCAPS_CTRLVOLUME|DSBCAPS_CTRLPAN;
|
||||||
rc=IDirectSound_CreateSoundBuffer(dso,&bufdesc,&primary,NULL);
|
rc=IDirectSound_CreateSoundBuffer(dso,&bufdesc,&primary,NULL);
|
||||||
ok(rc==DS_OK&&primary!=NULL,"CreateSoundBuffer failed to create a primary buffer: 0x%lx\n",rc);
|
ok(rc==DS_OK&&primary!=NULL,"CreateSoundBuffer failed to create a primary buffer: 0x%lx\n",rc);
|
||||||
if (rc==DS_OK&&primary!=NULL) {
|
if (rc==DS_OK&&primary!=NULL) {
|
||||||
|
@ -817,6 +833,7 @@ static HRESULT test_primary(LPGUID lpGuid)
|
||||||
ref=IDirectSoundBuffer_Release(primary);
|
ref=IDirectSoundBuffer_Release(primary);
|
||||||
ok(ref==0,"IDirectSoundBuffer_Release primary has %d references, should have 0\n",ref);
|
ok(ref==0,"IDirectSoundBuffer_Release primary has %d references, should have 0\n",ref);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Set the CooperativeLevel back to normal */
|
/* Set the CooperativeLevel back to normal */
|
||||||
/* DSOUND: Setting DirectSound cooperative level to DSSCL_NORMAL */
|
/* DSOUND: Setting DirectSound cooperative level to DSSCL_NORMAL */
|
||||||
rc=IDirectSound_SetCooperativeLevel(dso,get_hwnd(),DSSCL_NORMAL);
|
rc=IDirectSound_SetCooperativeLevel(dso,get_hwnd(),DSSCL_NORMAL);
|
||||||
|
@ -860,6 +877,7 @@ static HRESULT test_primary_3d(LPGUID lpGuid)
|
||||||
ok(rc==DS_OK,"SetCooperativeLevel failed: 0x%lx\n",rc);
|
ok(rc==DS_OK,"SetCooperativeLevel failed: 0x%lx\n",rc);
|
||||||
if (rc!=DS_OK)
|
if (rc!=DS_OK)
|
||||||
goto EXIT;
|
goto EXIT;
|
||||||
|
|
||||||
primary=NULL;
|
primary=NULL;
|
||||||
ZeroMemory(&bufdesc, sizeof(bufdesc));
|
ZeroMemory(&bufdesc, sizeof(bufdesc));
|
||||||
bufdesc.dwSize=sizeof(bufdesc);
|
bufdesc.dwSize=sizeof(bufdesc);
|
||||||
|
@ -1031,7 +1049,7 @@ typedef struct {
|
||||||
LPDIRECTSOUNDCAPTUREBUFFER dscbo;
|
LPDIRECTSOUNDCAPTUREBUFFER dscbo;
|
||||||
LPWAVEFORMATEX wfx;
|
LPWAVEFORMATEX wfx;
|
||||||
DSBPOSITIONNOTIFY posnotify[NOTIFICATIONS];
|
DSBPOSITIONNOTIFY posnotify[NOTIFICATIONS];
|
||||||
HANDLE event;
|
HANDLE event[NOTIFICATIONS];
|
||||||
LPDIRECTSOUNDNOTIFY notify;
|
LPDIRECTSOUNDNOTIFY notify;
|
||||||
|
|
||||||
DWORD buffer_size;
|
DWORD buffer_size;
|
||||||
|
@ -1130,17 +1148,18 @@ 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;
|
||||||
state.event = CreateEvent( NULL, FALSE, FALSE, NULL );
|
for (i = 0; i < NOTIFICATIONS; i++)
|
||||||
|
state.event[i] = CreateEvent( NULL, FALSE, FALSE, NULL );
|
||||||
state.size = dscbcaps.dwBufferBytes / NOTIFICATIONS;
|
state.size = dscbcaps.dwBufferBytes / NOTIFICATIONS;
|
||||||
|
|
||||||
rc=IDirectSoundCapture_QueryInterface(dscbo,&IID_IDirectSoundNotify,(void **)&(state.notify));
|
rc=IDirectSoundCaptureBuffer_QueryInterface(dscbo,&IID_IDirectSoundNotify,(void **)&(state.notify));
|
||||||
ok(rc==DS_OK,"QueryInterface failed: 0x%lx\n",rc);
|
ok((rc==DS_OK)&&(state.notify!=NULL),"QueryInterface failed: 0x%lx\n",rc);
|
||||||
if (rc!=DS_OK)
|
if (rc!=DS_OK)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
for (i = 0; i < NOTIFICATIONS; i++) {
|
for (i = 0; i < 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;
|
state.posnotify[i].hEventNotify = state.event[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
rc=IDirectSoundNotify_SetNotificationPositions(state.notify,NOTIFICATIONS,state.posnotify);
|
rc=IDirectSoundNotify_SetNotificationPositions(state.notify,NOTIFICATIONS,state.posnotify);
|
||||||
|
@ -1148,6 +1167,11 @@ static void test_capture_buffer(LPDIRECTSOUNDCAPTURE dsco,
|
||||||
if (rc!=DS_OK)
|
if (rc!=DS_OK)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
rc=IDirectSoundNotify_Release(state.notify);
|
||||||
|
ok(rc==0,"Release: 0x%lx\n",rc);
|
||||||
|
if (rc!=0)
|
||||||
|
return;
|
||||||
|
|
||||||
if (record) {
|
if (record) {
|
||||||
rc=IDirectSoundCaptureBuffer_Start(dscbo,DSCBSTART_LOOPING);
|
rc=IDirectSoundCaptureBuffer_Start(dscbo,DSCBSTART_LOOPING);
|
||||||
ok(rc==DS_OK,"Start: 0x%lx\n",rc);
|
ok(rc==DS_OK,"Start: 0x%lx\n",rc);
|
||||||
|
@ -1163,9 +1187,12 @@ static void test_capture_buffer(LPDIRECTSOUNDCAPTURE dsco,
|
||||||
|
|
||||||
/* wait for the notifications */
|
/* wait for the notifications */
|
||||||
for (i = 0; i < (NOTIFICATIONS * 2); i++) {
|
for (i = 0; i < (NOTIFICATIONS * 2); i++) {
|
||||||
rc=MsgWaitForMultipleObjects( 1, &(state.event), FALSE, 3000, QS_ALLEVENTS );
|
rc=MsgWaitForMultipleObjects( NOTIFICATIONS, state.event, FALSE, 3000, QS_ALLEVENTS );
|
||||||
ok(rc==WAIT_OBJECT_0,"MsgWaitForMultipleObjects failed: 0x%lx\n",rc);
|
ok(rc==(WAIT_OBJECT_0+(i%NOTIFICATIONS)),"MsgWaitForMultipleObjects failed: 0x%lx\n",rc);
|
||||||
if (rc!=WAIT_OBJECT_0)
|
if (rc!=(WAIT_OBJECT_0+(i%NOTIFICATIONS))) {
|
||||||
|
ok((rc==WAIT_TIMEOUT)||(rc==WAIT_FAILED),"Wrong notification: should be %d, got %ld\n",
|
||||||
|
i%NOTIFICATIONS,rc-WAIT_OBJECT_0);
|
||||||
|
} else
|
||||||
break;
|
break;
|
||||||
if (!capture_buffer_service(&state))
|
if (!capture_buffer_service(&state))
|
||||||
break;
|
break;
|
||||||
|
@ -1176,11 +1203,6 @@ static void test_capture_buffer(LPDIRECTSOUNDCAPTURE dsco,
|
||||||
if (rc!=DS_OK)
|
if (rc!=DS_OK)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
rc=IDirectSoundNotify_Release(state.notify);
|
|
||||||
ok(rc==0,"Release: 0x%lx\n",rc);
|
|
||||||
if (rc!=0)
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static BOOL WINAPI dscenum_callback(LPGUID lpGuid, LPCSTR lpcstrDescription,
|
static BOOL WINAPI dscenum_callback(LPGUID lpGuid, LPCSTR lpcstrDescription,
|
||||||
|
@ -1288,6 +1310,7 @@ static BOOL WINAPI dscenum_callback(LPGUID lpGuid, LPCSTR lpcstrDescription,
|
||||||
}
|
}
|
||||||
|
|
||||||
for (f=0;f<NB_FORMATS;f++) {
|
for (f=0;f<NB_FORMATS;f++) {
|
||||||
|
dscbo=NULL;
|
||||||
init_format(&wfx,formats[f][0],formats[f][1],formats[f][2]);
|
init_format(&wfx,formats[f][0],formats[f][1],formats[f][2]);
|
||||||
ZeroMemory(&bufdesc, sizeof(bufdesc));
|
ZeroMemory(&bufdesc, sizeof(bufdesc));
|
||||||
bufdesc.dwSize=sizeof(bufdesc);
|
bufdesc.dwSize=sizeof(bufdesc);
|
||||||
|
@ -1298,7 +1321,7 @@ static BOOL WINAPI dscenum_callback(LPGUID lpGuid, LPCSTR lpcstrDescription,
|
||||||
trace(" Testing the capture buffer at %ldx%dx%d\n",
|
trace(" Testing the capture buffer at %ldx%dx%d\n",
|
||||||
wfx.nSamplesPerSec,wfx.wBitsPerSample,wfx.nChannels);
|
wfx.nSamplesPerSec,wfx.wBitsPerSample,wfx.nChannels);
|
||||||
rc=IDirectSoundCapture_CreateCaptureBuffer(dsco,&bufdesc,&dscbo,NULL);
|
rc=IDirectSoundCapture_CreateCaptureBuffer(dsco,&bufdesc,&dscbo,NULL);
|
||||||
ok(rc==DS_OK,"CreateCaptureBuffer failed to create a capture buffer 0x%lx\n",rc);
|
ok((rc==DS_OK)&&(dscbo!=NULL),"CreateCaptureBuffer failed to create a capture buffer 0x%lx\n",rc);
|
||||||
if (rc==DS_OK) {
|
if (rc==DS_OK) {
|
||||||
test_capture_buffer(dsco, dscbo, winetest_interactive);
|
test_capture_buffer(dsco, dscbo, winetest_interactive);
|
||||||
ref=IDirectSoundCaptureBuffer_Release(dscbo);
|
ref=IDirectSoundCaptureBuffer_Release(dscbo);
|
||||||
|
|
Loading…
Reference in New Issue