📄 ds3d.c
字号:
now-start_time,1000*duration);
free(state.wave);
if (is_primary) {
/* 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(DSSCL_NORMAL) "
"failed: %s\n",DXGetErrorString8(rc));
}
if (buffer3d) {
ref=IDirectSound3DBuffer_Release(buffer);
ok(ref==0,"IDirectSound3DBuffer_Release() has %d references, "
"should have 0\n",ref);
}
}
}
static HRESULT test_secondary(LPGUID lpGuid, int play,
int has_3d, int has_3dbuffer,
int has_listener, int has_duplicate,
int move_listener, int move_sound)
{
HRESULT rc;
LPDIRECTSOUND dso=NULL;
LPDIRECTSOUNDBUFFER primary=NULL,secondary=NULL;
LPDIRECTSOUND3DLISTENER listener=NULL;
DSBUFFERDESC bufdesc;
WAVEFORMATEX wfx, wfx1;
int ref;
/* Create the DirectSound object */
rc=DirectSoundCreate(lpGuid,&dso,NULL);
ok(rc==DS_OK||rc==DSERR_NODRIVER,"DirectSoundCreate() failed: %s\n",
DXGetErrorString8(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(DSSCL_PRIORITY) failed: "
"%s\n",DXGetErrorString8(rc));
if (rc!=DS_OK)
goto EXIT;
ZeroMemory(&bufdesc, sizeof(bufdesc));
bufdesc.dwSize=sizeof(bufdesc);
bufdesc.dwFlags=DSBCAPS_PRIMARYBUFFER;
if (has_3d)
bufdesc.dwFlags|=DSBCAPS_CTRL3D;
else
bufdesc.dwFlags|=(DSBCAPS_CTRLVOLUME|DSBCAPS_CTRLPAN);
rc=IDirectSound_CreateSoundBuffer(dso,&bufdesc,&primary,NULL);
ok((rc==DS_OK && primary!=NULL) || (rc==DSERR_CONTROLUNAVAIL),
"IDirectSound_CreateSoundBuffer() failed to create a %sprimary buffer: "
"%s\n",has_3d?"3D ":"", DXGetErrorString8(rc));
if (rc==DSERR_CONTROLUNAVAIL)
trace(" No Primary\n");
else if (rc==DS_OK && primary!=NULL) {
rc=IDirectSoundBuffer_GetFormat(primary,&wfx1,sizeof(wfx1),NULL);
ok(rc==DS_OK,"IDirectSoundBuffer8_Getformat() failed: %s\n",
DXGetErrorString8(rc));
if (rc!=DS_OK)
goto EXIT1;
if (has_listener) {
rc=IDirectSoundBuffer_QueryInterface(primary,
&IID_IDirectSound3DListener,
(void **)&listener);
ok(rc==DS_OK && listener!=NULL,
"IDirectSoundBuffer_QueryInterface() failed to get a 3D "
"listener: %s\n",DXGetErrorString8(rc));
ref=IDirectSoundBuffer_Release(primary);
ok(ref==0,"IDirectSoundBuffer_Release() primary has %d references, "
"should have 0\n",ref);
if (rc==DS_OK && listener!=NULL) {
DS3DLISTENER listener_param;
ZeroMemory(&listener_param,sizeof(listener_param));
/* DSOUND: Error: Invalid buffer */
rc=IDirectSound3DListener_GetAllParameters(listener,0);
ok(rc==DSERR_INVALIDPARAM,
"IDirectSound3dListener_GetAllParameters() should have "
"returned DSERR_INVALIDPARAM, returned: %s\n",
DXGetErrorString8(rc));
/* DSOUND: Error: Invalid buffer */
rc=IDirectSound3DListener_GetAllParameters(listener,
&listener_param);
ok(rc==DSERR_INVALIDPARAM,
"IDirectSound3dListener_GetAllParameters() should have "
"returned DSERR_INVALIDPARAM, returned: %s\n",
DXGetErrorString8(rc));
listener_param.dwSize=sizeof(listener_param);
rc=IDirectSound3DListener_GetAllParameters(listener,
&listener_param);
ok(rc==DS_OK,"IDirectSound3dListener_GetAllParameters() "
"failed: %s\n",DXGetErrorString8(rc));
}
else
goto EXIT;
}
init_format(&wfx,WAVE_FORMAT_PCM,22050,16,2);
secondary=NULL;
ZeroMemory(&bufdesc, sizeof(bufdesc));
bufdesc.dwSize=sizeof(bufdesc);
bufdesc.dwFlags=DSBCAPS_GETCURRENTPOSITION2;
if (has_3d)
bufdesc.dwFlags|=DSBCAPS_CTRL3D;
else
bufdesc.dwFlags|=
(DSBCAPS_CTRLFREQUENCY|DSBCAPS_CTRLVOLUME|DSBCAPS_CTRLPAN);
bufdesc.dwBufferBytes=align(wfx.nAvgBytesPerSec*BUFFER_LEN/1000,
wfx.nBlockAlign);
bufdesc.lpwfxFormat=&wfx;
if (winetest_interactive) {
trace(" Testing a %s%ssecondary buffer %s%s%s%sat %ldx%dx%d "
"with a primary buffer at %ldx%dx%d\n",
has_3dbuffer?"3D ":"",
has_duplicate?"duplicated ":"",
listener!=NULL||move_sound?"with ":"",
move_listener?"moving ":"",
listener!=NULL?"listener ":"",
listener&&move_sound?"and moving sound ":move_sound?
"moving sound ":"",
wfx.nSamplesPerSec,wfx.wBitsPerSample,wfx.nChannels,
wfx1.nSamplesPerSec,wfx1.wBitsPerSample,wfx1.nChannels);
}
rc=IDirectSound_CreateSoundBuffer(dso,&bufdesc,&secondary,NULL);
ok(rc==DS_OK && secondary!=NULL,"IDirectSound_CreateSoundBuffer() "
"failed to create a %s%ssecondary buffer %s%s%s%sat %ldx%dx%d (%s): %s\n",
has_3dbuffer?"3D ":"", has_duplicate?"duplicated ":"",
listener!=NULL||move_sound?"with ":"", move_listener?"moving ":"",
listener!=NULL?"listener ":"",
listener&&move_sound?"and moving sound ":move_sound?
"moving sound ":"",
wfx.nSamplesPerSec,wfx.wBitsPerSample,wfx.nChannels,
getDSBCAPS(bufdesc.dwFlags),DXGetErrorString8(rc));
if (rc==DS_OK && secondary!=NULL) {
if (!has_3d) {
LONG refvol,vol,refpan,pan;
/* Check the initial secondary buffer's volume and pan */
rc=IDirectSoundBuffer_GetVolume(secondary,&vol);
ok(rc==DS_OK,"IDirectSoundBuffer_GetVolume(secondary) failed: "
"%s\n",DXGetErrorString8(rc));
ok(vol==0,"wrong volume for a new secondary buffer: %ld\n",vol);
rc=IDirectSoundBuffer_GetPan(secondary,&pan);
ok(rc==DS_OK,"IDirectSoundBuffer_GetPan(secondary) failed: "
"%s\n",DXGetErrorString8(rc));
ok(pan==0,"wrong pan for a new secondary buffer: %ld\n",pan);
/* Check that changing the secondary buffer's volume and pan
* does not impact the primary buffer's volume and pan
*/
rc=IDirectSoundBuffer_GetVolume(primary,&refvol);
ok(rc==DS_OK,"IDirectSoundBuffer_GetVolume(primary) failed: "
"%s\n",DXGetErrorString8(rc));
rc=IDirectSoundBuffer_GetPan(primary,&refpan);
ok(rc==DS_OK,"IDirectSoundBuffer_GetPan(primary) failed: %s\n",
DXGetErrorString8(rc));
rc=IDirectSoundBuffer_SetVolume(secondary,-1000);
ok(rc==DS_OK,"IDirectSoundBuffer_SetVolume(secondary) failed: "
"%s\n",DXGetErrorString8(rc));
rc=IDirectSoundBuffer_GetVolume(secondary,&vol);
ok(rc==DS_OK,"IDirectSoundBuffer_SetVolume(secondary) failed: "
"%s\n",DXGetErrorString8(rc));
ok(vol==-1000,"secondary: wrong volume %ld instead of -1000\n",
vol);
rc=IDirectSoundBuffer_SetPan(secondary,-1000);
ok(rc==DS_OK,"IDirectSoundBuffer_SetPan(secondary) failed: "
"%s\n",DXGetErrorString8(rc));
rc=IDirectSoundBuffer_GetPan(secondary,&pan);
ok(rc==DS_OK,"IDirectSoundBuffer_SetPan(secondary) failed: "
"%s\n",DXGetErrorString8(rc));
ok(pan==-1000,"secondary: wrong pan %ld instead of -1000\n",
pan);
rc=IDirectSoundBuffer_GetVolume(primary,&vol);
ok(rc==DS_OK,"IDirectSoundBuffer_GetVolume(primary) failed: "
"%s\n",DXGetErrorString8(rc));
ok(vol==refvol,"The primary volume changed from %ld to %ld\n",
refvol,vol);
rc=IDirectSoundBuffer_GetPan(primary,&pan);
ok(rc==DS_OK,"IDirectSoundBuffer_GetPan(primary) failed: %s\n",
DXGetErrorString8(rc));
ok(pan==refpan,"The primary pan changed from %ld to %ld\n",
refpan,pan);
rc=IDirectSoundBuffer_SetVolume(secondary,0);
ok(rc==DS_OK,"IDirectSoundBuffer_SetVolume(secondary) failed: "
"%s\n",DXGetErrorString8(rc));
rc=IDirectSoundBuffer_SetPan(secondary,0);
ok(rc==DS_OK,"IDirectSoundBuffer_SetPan(secondary) failed: "
"%s\n",DXGetErrorString8(rc));
}
if (has_duplicate) {
LPDIRECTSOUNDBUFFER duplicated=NULL;
/* DSOUND: Error: Invalid source buffer */
rc=IDirectSound_DuplicateSoundBuffer(dso,0,0);
ok(rc==DSERR_INVALIDPARAM,
"IDirectSound_DuplicateSoundBuffer() should have returned "
"DSERR_INVALIDPARAM, returned: %s\n",DXGetErrorString8(rc));
/* DSOUND: Error: Invalid dest buffer */
rc=IDirectSound_DuplicateSoundBuffer(dso,secondary,0);
ok(rc==DSERR_INVALIDPARAM,
"IDirectSound_DuplicateSoundBuffer() should have returned "
"DSERR_INVALIDPARAM, returned: %s\n",DXGetErrorString8(rc));
/* DSOUND: Error: Invalid source buffer */
rc=IDirectSound_DuplicateSoundBuffer(dso,0,&duplicated);
ok(rc==DSERR_INVALIDPARAM,
"IDirectSound_DuplicateSoundBuffer() should have returned "
"DSERR_INVALIDPARAM, returned: %s\n",DXGetErrorString8(rc));
duplicated=NULL;
rc=IDirectSound_DuplicateSoundBuffer(dso,secondary,
&duplicated);
ok(rc==DS_OK && duplicated!=NULL,
"IDirectSound_DuplicateSoundBuffer() failed to duplicate "
"a secondary buffer: %s\n",DXGetErrorString8(rc));
if (rc==DS_OK && duplicated!=NULL) {
ref=IDirectSoundBuffer_Release(secondary);
ok(ref==0,"IDirectSoundBuffer_Release() secondary has %d "
"references, should have 0\n",ref);
secondary=duplicated;
}
}
if (rc==DS_OK && secondary!=NULL) {
double duration;
duration=(move_listener || move_sound?4.0:1.0);
test_buffer(dso,secondary,0,FALSE,0,FALSE,0,
winetest_interactive,duration,has_3dbuffer,
listener,move_listener,move_sound,FALSE,0);
ref=IDirectSoundBuffer_Release(secondary);
ok(ref==0,"IDirectSoundBuffer_Release() %s has %d references, "
"should have 0\n",has_duplicate?"duplicated":"secondary",
ref);
}
}
}
EXIT1:
if (has_listener) {
ref=IDirectSound3DListener_Release(listener);
ok(ref==0,"IDirectSound3dListener_Release() listener has %d "
"references, should have 0\n",ref);
} else {
ref=IDirectSoundBuffer_Release(primary);
ok(ref==0,"IDirectSoundBuffer_Release() primary 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(DSSCL_NORMAL) failed: %s\n",
DXGetErrorString8(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 HRESULT test_for_driver(LPGUID lpGuid)
{
HRESULT rc;
LPDIRECTSOUND dso=NULL;
int ref;
/* Create the DirectSound object */
rc=DirectSoundCreate(lpGuid,&dso,NULL);
ok(rc==DS_OK||rc==DSERR_NODRIVER||rc==DSERR_ALLOCATED||rc==E_FAIL,
"DirectSoundCreate() failed: %s\n",DXGetErrorString8(rc));
if (rc!=DS_OK)
return rc;
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 HRESULT test_primary(LPGUID lpGuid)
{
HRESULT rc;
LPDIRECTSOUND dso=NULL;
LPDIRECTSOUNDBUFFER primary=NULL;
DSBUFFERDESC bufdesc;
DSCAPS dscaps;
int ref, i;
/* Create the DirectSound object */
rc=DirectSoundCreate(lpGuid,&dso,NULL);
ok(rc==DS_OK||rc==DSERR_NODRIVER,"DirectSoundCreate() failed: %s\n",
DXGetErrorString8(rc));
if (rc!=DS_OK)
return rc;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -