int I2_Init() { DSBUFFERDESC desc; LPDIRECTSOUNDBUFFER bufTemp; if(initOk) return true; // Don't init a second time. if(FAILED(hr = EAXDirectSoundCreate(NULL, &dsound, NULL))) { // EAX can't be initialized. Use normal DS, then. ST_Message("I2_Init: EAX 2 couldn't be initialized (result: %i).\n", hr & 0xffff); if(FAILED(hr = DirectSoundCreate(NULL, &dsound, NULL))) { ST_Message("I2_Init: Couldn't create dsound (result: %i).\n", hr & 0xffff); return false; } } // Set the cooperative level. if(FAILED(hr = IDirectSound_SetCooperativeLevel(dsound, hWndMain, DSSCL_PRIORITY))) { ST_Message("I2_Init: Couldn't set dSound cooperative level (result: %i).\n", hr & 0xffff); return false; } // Get the listener. memset(&desc, 0, sizeof(desc)); desc.dwSize = sizeof(desc); desc.dwFlags = DSBCAPS_CTRL3D | DSBCAPS_PRIMARYBUFFER; if(SUCCEEDED(IDirectSound_CreateSoundBuffer(dsound, &desc, &bufTemp, NULL))) { // Query the listener interface. IDirectSoundBuffer_QueryInterface(bufTemp, &IID_IDirectSound3DListener, &dsListener); } // Release the primary buffer interface, we won't need it. IDirectSoundBuffer_Release(bufTemp); // Try to get the EAX listener property set. Create a temporary secondary buffer for it. if(SUCCEEDED( createDSBuffer(DSBCAPS_STATIC | DSBCAPS_CTRL3D, DSBSIZE_MIN, 22050, 8, 1, &bufTemp) )) { // Now try to get the property set. if(SUCCEEDED(hr = IDirectSoundBuffer_QueryInterface(bufTemp, &IID_IKsPropertySet, &eaxListener))) { DWORD support = 0, revsize = 0; // Check for support. if(FAILED(hr = IKsPropertySet_QuerySupport(eaxListener, &DSPROPSETID_EAX_ListenerProperties, DSPROPERTY_EAXLISTENER_ENVIRONMENT, &support)) || ((support & NEEDED_SUPPORT) != NEEDED_SUPPORT)) { ST_Message("I2_Init: Property set acquired, but EAX 2 not supported.\n Result:%i, support:%x\n", hr&0xffff, support); IKsPropertySet_Release(eaxListener); eaxListener = NULL; } else { // EAX is supported! ST_Message("I2_Init: EAX 2 available.\n"); } } // Release the temporary buffer interface. IDirectSoundBuffer_Release(bufTemp); } // Get the caps. dsCaps.dwSize = sizeof(dsCaps); IDirectSound_GetCaps(dsound, &dsCaps); ST_Message("I2_Init: Number of hardware 3D buffers: %i\n", dsCaps.dwMaxHw3DAllBuffers); // Configure the DS3D listener. if(dsListener) { IDirectSound3DListener_SetDistanceFactor(dsListener, 1/36.0f, DS3D_DEFERRED); IDirectSound3DListener_SetDopplerFactor(dsListener, 2, DS3D_DEFERRED); } // Success! initOk = true; return true; }
static void propset_private_tests(void) { HRESULT rc; IClassFactory * pcf; IKsPropertySet * pps; ULONG support; /* try direct sound first */ /* DSOUND: Error: Invalid interface buffer */ rc = (pDllGetClassObject)(&CLSID_DirectSound, &IID_IClassFactory, NULL); ok(rc==DSERR_INVALIDPARAM,"DllGetClassObject(CLSID_DirectSound, " "IID_IClassFactory) should have returned DSERR_INVALIDPARAM, " "returned: %08x\n",rc); rc = (pDllGetClassObject)(&CLSID_DirectSound, &IID_IDirectSound, (void **)(&pcf)); ok(rc==E_NOINTERFACE,"DllGetClassObject(CLSID_DirectSound, " "IID_IDirectSound) should have returned E_NOINTERFACE, " "returned: %08x\n",rc); rc = (pDllGetClassObject)(&CLSID_DirectSound, &IID_IUnknown, (void **)(&pcf)); ok(rc==DS_OK,"DllGetClassObject(CLSID_DirectSound, " "IID_IUnknown) failed: %08x\n",rc); rc = (pDllGetClassObject)(&CLSID_DirectSound, &IID_IClassFactory, (void **)(&pcf)); ok(pcf!=0, "DllGetClassObject(CLSID_DirectSound, IID_IClassFactory) " "failed: %08x\n",rc); if (pcf==0) return; /* direct sound doesn't have an IKsPropertySet */ /* DSOUND: Error: Invalid interface buffer */ rc = IClassFactory_CreateInstance(pcf, NULL, &IID_IKsPropertySet, NULL); ok(rc==DSERR_INVALIDPARAM, "CreateInstance(IID_IKsPropertySet) should have " "returned DSERR_INVALIDPARAM, returned: %08x\n",rc); rc = IClassFactory_CreateInstance(pcf, NULL, &IID_IKsPropertySet, (void **)(&pps)); ok(rc==E_NOINTERFACE, "CreateInstance(IID_IKsPropertySet) should have " "returned E_NOINTERFACE, returned: %08x\n",rc); /* and the direct sound 8 version */ if (pDirectSoundCreate8) { rc = (pDllGetClassObject)(&CLSID_DirectSound8, &IID_IClassFactory, (void **)(&pcf)); ok(pcf!=0, "DllGetClassObject(CLSID_DirectSound8, IID_IClassFactory) " "failed: %08x\n",rc); if (pcf==0) return; /* direct sound 8 doesn't have an IKsPropertySet */ rc = IClassFactory_CreateInstance(pcf, NULL, &IID_IKsPropertySet, (void **)(&pps)); ok(rc==E_NOINTERFACE, "CreateInstance(IID_IKsPropertySet) should have " "returned E_NOINTERFACE, returned: %08x\n",rc); } /* try direct sound capture next */ if (pDirectSoundCaptureCreate) { rc = (pDllGetClassObject)(&CLSID_DirectSoundCapture, &IID_IClassFactory, (void **)(&pcf)); ok(pcf!=0, "DllGetClassObject(CLSID_DirectSoundCapture, IID_IClassFactory) " "failed: %08x\n",rc); if (pcf==0) return; /* direct sound capture doesn't have an IKsPropertySet */ rc = IClassFactory_CreateInstance(pcf, NULL, &IID_IKsPropertySet, (void **)(&pps)); ok(rc==E_NOINTERFACE, "CreateInstance(IID_IKsPropertySet) should have " "returned E_NOINTERFACE,returned: %08x\n",rc); } /* and the direct sound capture 8 version */ if (pDirectSoundCaptureCreate8) { rc = (pDllGetClassObject)(&CLSID_DirectSoundCapture8, &IID_IClassFactory, (void **)(&pcf)); ok(pcf!=0, "DllGetClassObject(CLSID_DirectSoundCapture8, " "IID_IClassFactory) failed: %08x\n",rc); if (pcf==0) return; /* direct sound capture 8 doesn't have an IKsPropertySet */ rc = IClassFactory_CreateInstance(pcf, NULL, &IID_IKsPropertySet, (void **)(&pps)); ok(rc==E_NOINTERFACE, "CreateInstance(IID_IKsPropertySet) should have " "returned E_NOINTERFACE, returned: %08x\n",rc); } /* try direct sound full duplex next */ if (pDirectSoundFullDuplexCreate) { rc = (pDllGetClassObject)(&CLSID_DirectSoundFullDuplex, &IID_IClassFactory, (void **)(&pcf)); ok(pcf!=0, "DllGetClassObject(CLSID_DirectSoundFullDuplex, " "IID_IClassFactory) failed: %08x\n",rc); if (pcf==0) return; /* direct sound full duplex doesn't have an IKsPropertySet */ rc = IClassFactory_CreateInstance(pcf, NULL, &IID_IKsPropertySet, (void **)(&pps)); ok(rc==E_NOINTERFACE, "CreateInstance(IID_IKsPropertySet) should have " "returned NOINTERFACE, returned: %08x\n",rc); } /* try direct sound private last */ rc = (pDllGetClassObject)(&CLSID_DirectSoundPrivate, &IID_IClassFactory, (void **)(&pcf)); /* some early versions of Direct Sound do not have this */ if (rc==CLASS_E_CLASSNOTAVAILABLE) return; /* direct sound private does have an IKsPropertySet */ rc = IClassFactory_CreateInstance(pcf, NULL, &IID_IKsPropertySet, (void **)(&pps)); ok(rc==DS_OK, "CreateInstance(IID_IKsPropertySet) failed: %08x\n", rc); if (rc!=DS_OK) return; /* test generic DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION */ rc = IKsPropertySet_QuerySupport(pps, &DSPROPSETID_DirectSoundDevice, DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION, &support); ok(rc==DS_OK||rc==E_INVALIDARG, "QuerySupport(DSPROPSETID_DirectSoundDevice, " "DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION) failed: %08x\n", rc); if (rc!=DS_OK) { if (rc==E_INVALIDARG) trace(" Not Supported\n"); return; } ok(support & KSPROPERTY_SUPPORT_GET, "Couldn't get DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION: " "support = 0x%x\n",support); ok(!(support & KSPROPERTY_SUPPORT_SET), "Shouldn't be able to set DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION: " "support = 0x%x\n",support); /* test DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_1 */ rc = IKsPropertySet_QuerySupport(pps, &DSPROPSETID_DirectSoundDevice, DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_1, &support); ok(rc==DS_OK||rc==E_INVALIDARG, "QuerySupport(DSPROPSETID_DirectSoundDevice, " "DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_1) failed: %08x\n", rc); if (rc!=DS_OK) { if (rc==E_INVALIDARG) trace(" Not Supported\n"); return; } ok(support & KSPROPERTY_SUPPORT_GET, "Couldn't get DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_1: " "support = 0x%x\n",support); ok(!(support & KSPROPERTY_SUPPORT_SET), "Shouldn't be able to set DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_1: " "support = 0x%x\n",support); /* test DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_A */ rc = IKsPropertySet_QuerySupport(pps, &DSPROPSETID_DirectSoundDevice, DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_A, &support); ok(rc==DS_OK||rc==E_INVALIDARG, "QuerySupport(DSPROPSETID_DirectSoundDevice, " "DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_A) failed: %08x\n", rc); if (rc!=DS_OK) { if (rc==E_INVALIDARG) trace(" Not Supported\n"); return; } ok(support & KSPROPERTY_SUPPORT_GET, "Couldn't get DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_A: " "support = 0x%x\n",support); ok(!(support & KSPROPERTY_SUPPORT_SET), "Shouldn't be able to set DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_A: " "support = 0x%x\n",support); /* test DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_W */ rc = IKsPropertySet_QuerySupport(pps, &DSPROPSETID_DirectSoundDevice, DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_W, &support); ok(rc==DS_OK||rc==E_INVALIDARG, "QuerySupport(DSPROPSETID_DirectSoundDevice, " "DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_W) failed: %08x\n", rc); if (rc!=DS_OK) { if (rc==E_INVALIDARG) trace(" Not Supported\n"); return; } ok(support & KSPROPERTY_SUPPORT_GET, "Couldn't get DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_W: " "support = 0x%x\n",support); ok(!(support & KSPROPERTY_SUPPORT_SET), "Shouldn't be able to set DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_W: " "support = 0x%x\n",support); /* test generic DSPROPERTY_DIRECTSOUNDDEVICE_WAVEDEVICEMAPPING */ rc = IKsPropertySet_QuerySupport(pps, &DSPROPSETID_DirectSoundDevice, DSPROPERTY_DIRECTSOUNDDEVICE_WAVEDEVICEMAPPING, &support); ok(rc==DS_OK, "QuerySupport(DSPROPSETID_DirectSoundDevice, " "DSPROPERTY_DIRECTSOUNDDEVICE_WAVEDEVICEMAPPING) failed: %08x\n", rc); if (rc!=DS_OK) return; ok(support & KSPROPERTY_SUPPORT_GET, "Couldn't get DSPROPERTY_DIRECTSOUNDDEVICE_WAVEDEVICEMAPPING: " "support = 0x%x\n",support); ok(!(support & KSPROPERTY_SUPPORT_SET), "Shouldn't be able to set " "DSPROPERTY_DIRECTSOUNDDEVICE_WAVEDEVICEMAPPING: support = " "0x%x\n",support); /* test DSPROPERTY_DIRECTSOUNDDEVICE_WAVEDEVICEMAPPING_A */ rc = IKsPropertySet_QuerySupport(pps, &DSPROPSETID_DirectSoundDevice, DSPROPERTY_DIRECTSOUNDDEVICE_WAVEDEVICEMAPPING_A, &support); ok(rc==DS_OK, "QuerySupport(DSPROPSETID_DirectSoundDevice, " "DSPROPERTY_DIRECTSOUNDDEVICE_WAVEDEVICEMAPPING_A) failed: %08x\n", rc); if (rc!=DS_OK) return; ok(support & KSPROPERTY_SUPPORT_GET, "Couldn't get DSPROPERTY_DIRECTSOUNDDEVICE_WAVEDEVICEMAPPING_A: " "support = 0x%x\n",support); ok(!(support & KSPROPERTY_SUPPORT_SET), "Shouldn't be able to set " "DSPROPERTY_DIRECTSOUNDDEVICE_WAVEDEVICEMAPPING_A: support = " "0x%x\n",support); /* test DSPROPERTY_DIRECTSOUNDDEVICE_WAVEDEVICEMAPPING_W */ rc = IKsPropertySet_QuerySupport(pps, &DSPROPSETID_DirectSoundDevice, DSPROPERTY_DIRECTSOUNDDEVICE_WAVEDEVICEMAPPING_W, &support); ok(rc==DS_OK, "QuerySupport(DSPROPSETID_DirectSoundDevice, " "DSPROPERTY_DIRECTSOUNDDEVICE_WAVEDEVICEMAPPING_W) failed: %08x\n", rc); if (rc!=DS_OK) return; ok(support & KSPROPERTY_SUPPORT_GET, "Couldn't get DSPROPERTY_DIRECTSOUNDDEVICE_WAVEDEVICEMAPPING_W: " "support = 0x%x\n",support); ok(!(support & KSPROPERTY_SUPPORT_SET), "Shouldn't be able to set " "DSPROPERTY_DIRECTSOUNDDEVICE_WAVEDEVICEMAPPING_W: support = " "0x%x\n",support); /* test generic DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE */ trace("*** Testing DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE ***\n"); rc = IKsPropertySet_QuerySupport(pps, &DSPROPSETID_DirectSoundDevice, DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE, &support); ok(rc==DS_OK, "QuerySupport(DSPROPSETID_DirectSoundDevice, " "DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE) failed: %08x\n", rc); if (rc!=DS_OK) return; ok(support & KSPROPERTY_SUPPORT_GET, "Couldn't get DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE: " "support = 0x%x\n",support); ok(!(support & KSPROPERTY_SUPPORT_SET),"Shouldn't be able to set " "DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE: support = 0x%x\n",support); if (support & KSPROPERTY_SUPPORT_GET) { DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_DATA data; ULONG bytes; data.Callback = callback; data.Context = 0; rc = IKsPropertySet_Get(pps, &DSPROPSETID_DirectSoundDevice, DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE, NULL, 0, &data, sizeof(data), &bytes); ok(rc==DS_OK, "Couldn't enumerate: 0x%x\n",rc); } /* test DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_1 */ trace("*** Testing DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_1 ***\n"); rc = IKsPropertySet_QuerySupport(pps, &DSPROPSETID_DirectSoundDevice, DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_1, &support); ok(rc==DS_OK, "QuerySupport(DSPROPSETID_DirectSoundDevice, " "DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_1) failed: %08x\n", rc); if (rc!=DS_OK) return; ok(support & KSPROPERTY_SUPPORT_GET, "Couldn't get DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_1: " "support = 0x%x\n",support); ok(!(support & KSPROPERTY_SUPPORT_SET),"Shouldn't be able to set " "DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_1: support = 0x%x\n",support); if (support & KSPROPERTY_SUPPORT_GET) { DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_1_DATA data; ULONG bytes; data.Callback = callback1; data.Context = 0; rc = IKsPropertySet_Get(pps, &DSPROPSETID_DirectSoundDevice, DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_1, NULL, 0, &data, sizeof(data), &bytes); ok(rc==DS_OK, "Couldn't enumerate: 0x%x\n",rc); } /* test DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_A */ trace("*** Testing DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_A ***\n"); rc = IKsPropertySet_QuerySupport(pps, &DSPROPSETID_DirectSoundDevice, DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_A, &support); ok(rc==DS_OK, "QuerySupport(DSPROPSETID_DirectSoundDevice, " "DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_A) failed: %08x\n", rc); if (rc!=DS_OK) return; ok(support & KSPROPERTY_SUPPORT_GET, "Couldn't get DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_A: " "support = 0x%x\n",support); ok(!(support & KSPROPERTY_SUPPORT_SET),"Shouldn't be able to set " "DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_A: support = 0x%x\n",support); if (support & KSPROPERTY_SUPPORT_GET) { DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_A_DATA data; ULONG bytes; data.Callback = callbackA; data.Context = 0; rc = IKsPropertySet_Get(pps, &DSPROPSETID_DirectSoundDevice, DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_A, NULL, 0, &data, sizeof(data), &bytes); ok(rc==DS_OK, "Couldn't enumerate: 0x%x\n",rc); } /* test DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_W */ trace("*** Testing DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_W ***\n"); rc = IKsPropertySet_QuerySupport(pps, &DSPROPSETID_DirectSoundDevice, DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_W, &support); ok(rc==DS_OK, "QuerySupport(DSPROPSETID_DirectSoundDevice, " "DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_W) failed: %08x\n", rc); if (rc!=DS_OK) return; ok(support & KSPROPERTY_SUPPORT_GET, "Couldn't get DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_W: " "support = 0x%x\n",support); ok(!(support & KSPROPERTY_SUPPORT_SET),"Shouldn't be able to set " "DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_W: support = 0x%x\n",support); if (support & KSPROPERTY_SUPPORT_GET) { DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_W_DATA data; ULONG bytes; data.Callback = callbackW; data.Context = 0; rc = IKsPropertySet_Get(pps, &DSPROPSETID_DirectSoundDevice, DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_W, NULL, 0, &data, sizeof(data), &bytes); ok(rc==DS_OK, "Couldn't enumerate: 0x%x\n",rc); } IKsPropertySet_Release(pps); }
static BOOL WINAPI dsenum_callback(LPGUID lpGuid, LPCSTR lpcstrDescription, LPCSTR lpcstrModule, LPVOID lpContext) { HRESULT rc; LPDIRECTSOUND dso=NULL; LPDIRECTSOUNDBUFFER primary=NULL,secondary=NULL; DSBUFFERDESC bufdesc; WAVEFORMATEX wfx; int ref; trace("*** Testing %s - %s ***\n",lpcstrDescription,lpcstrModule); driver_count++; rc=pDirectSoundCreate(lpGuid,&dso,NULL); ok(rc==DS_OK||rc==DSERR_NODRIVER||rc==DSERR_ALLOCATED||rc==E_FAIL, "DirectSoundCreate() failed: %08x\n",rc); if (rc!=DS_OK) { if (rc==DSERR_NODRIVER) trace(" No Driver\n"); else if (rc == DSERR_ALLOCATED) trace(" Already In Use\n"); else if (rc == E_FAIL) trace(" No Device\n"); goto EXIT; } /* We must call SetCooperativeLevel before calling CreateSoundBuffer */ /* 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; /* Testing 3D buffers */ primary=NULL; ZeroMemory(&bufdesc, sizeof(bufdesc)); bufdesc.dwSize=sizeof(bufdesc); bufdesc.dwFlags=DSBCAPS_PRIMARYBUFFER|DSBCAPS_LOCHARDWARE|DSBCAPS_CTRL3D; rc=IDirectSound_CreateSoundBuffer(dso,&bufdesc,&primary,NULL); ok((rc==DS_OK&&primary!=NULL) || broken(rc==DSERR_INVALIDPARAM), "IDirectSound_CreateSoundBuffer() failed to " "create a hardware 3D primary buffer: %08x\n",rc); if(rc==DSERR_INVALIDPARAM) { skip("broken driver\n"); goto EXIT; } if (rc==DS_OK&&primary!=NULL) { ZeroMemory(&wfx, sizeof(wfx)); wfx.wFormatTag=WAVE_FORMAT_PCM; wfx.nChannels=1; wfx.wBitsPerSample=16; wfx.nSamplesPerSec=44100; wfx.nBlockAlign=wfx.nChannels*wfx.wBitsPerSample/8; wfx.nAvgBytesPerSec=wfx.nSamplesPerSec*wfx.nBlockAlign; ZeroMemory(&bufdesc, sizeof(bufdesc)); bufdesc.dwSize=sizeof(bufdesc); bufdesc.dwFlags=DSBCAPS_CTRLDEFAULT|DSBCAPS_GETCURRENTPOSITION2; bufdesc.dwBufferBytes=wfx.nAvgBytesPerSec; bufdesc.lpwfxFormat=&wfx; trace(" Testing a secondary buffer at %dx%dx%d\n", wfx.nSamplesPerSec,wfx.wBitsPerSample,wfx.nChannels); rc=IDirectSound_CreateSoundBuffer(dso,&bufdesc,&secondary,NULL); ok((rc==DS_OK && secondary!=NULL) || broken(rc == DSERR_CONTROLUNAVAIL), /* vmware drivers on w2k */ "IDirectSound_CreateSoundBuffer() failed to create a secondary buffer: %08x\n",rc); if (rc==DS_OK&&secondary!=NULL) { IKsPropertySet * pPropertySet=NULL; rc=IDirectSoundBuffer_QueryInterface(secondary, &IID_IKsPropertySet, (void **)&pPropertySet); /* it's not an error for this to fail */ if(rc==DS_OK) { ULONG ulTypeSupport; trace(" Supports property sets\n"); /* it's not an error for these to fail */ rc=IKsPropertySet_QuerySupport(pPropertySet, &DSPROPSETID_VoiceManager, 0,&ulTypeSupport); if((rc==DS_OK)&&(ulTypeSupport&(KSPROPERTY_SUPPORT_GET| KSPROPERTY_SUPPORT_SET))) trace(" DSPROPSETID_VoiceManager supported\n"); else trace(" DSPROPSETID_VoiceManager not supported\n"); rc=IKsPropertySet_QuerySupport(pPropertySet, &DSPROPSETID_EAX20_ListenerProperties,0,&ulTypeSupport); if((rc==DS_OK)&&(ulTypeSupport&(KSPROPERTY_SUPPORT_GET| KSPROPERTY_SUPPORT_SET))) trace(" DSPROPSETID_EAX20_ListenerProperties " "supported\n"); else trace(" DSPROPSETID_EAX20_ListenerProperties not " "supported\n"); rc=IKsPropertySet_QuerySupport(pPropertySet, &DSPROPSETID_EAX20_BufferProperties,0,&ulTypeSupport); if((rc==DS_OK)&&(ulTypeSupport&(KSPROPERTY_SUPPORT_GET| KSPROPERTY_SUPPORT_SET))) trace(" DSPROPSETID_EAX20_BufferProperties supported\n"); else trace(" DSPROPSETID_EAX20_BufferProperties not " "supported\n"); rc=IKsPropertySet_QuerySupport(pPropertySet, &DSPROPSETID_I3DL2_ListenerProperties,0,&ulTypeSupport); if((rc==DS_OK)&&(ulTypeSupport&(KSPROPERTY_SUPPORT_GET| KSPROPERTY_SUPPORT_SET))) trace(" DSPROPSETID_I3DL2_ListenerProperties " "supported\n"); else trace(" DSPROPSETID_I3DL2_ListenerProperties not " "supported\n"); rc=IKsPropertySet_QuerySupport(pPropertySet, &DSPROPSETID_I3DL2_BufferProperties,0,&ulTypeSupport); if((rc==DS_OK)&&(ulTypeSupport&(KSPROPERTY_SUPPORT_GET| KSPROPERTY_SUPPORT_SET))) trace(" DSPROPSETID_I3DL2_BufferProperties supported\n"); else trace(" DSPROPSETID_I3DL2_BufferProperties not " "supported\n"); rc=IKsPropertySet_QuerySupport(pPropertySet, &DSPROPSETID_ZOOMFX_BufferProperties,0,&ulTypeSupport); if((rc==DS_OK)&&(ulTypeSupport&(KSPROPERTY_SUPPORT_GET| KSPROPERTY_SUPPORT_SET))) trace(" DSPROPSETID_ZOOMFX_BufferProperties " "supported\n"); else trace(" DSPROPSETID_ZOOMFX_BufferProperties not " "supported\n"); ref=IKsPropertySet_Release(pPropertySet); /* try a few common ones */ ok(ref==0,"IKsPropertySet_Release() secondary has %d " "references, should have 0\n",ref); } else trace(" Doesn't support property sets\n"); ref=IDirectSoundBuffer_Release(secondary); ok(ref==0,"IDirectSoundBuffer_Release() secondary has %d " "references, should have 0\n",ref); } ref=IDirectSoundBuffer_Release(primary); ok(ref==0,"IDirectSoundBuffer_Release() primary has %d references, " "should have 0\n",ref); } EXIT: if (dso!=NULL) { ref=IDirectSound_Release(dso); ok(ref==0,"IDirectSound_Release() has %d references, should have 0\n", ref); } return TRUE; }
/* Test for support of appropriate EAX Version */ ALboolean CheckEAXSupport(const ALchar *szEAXName) { ALCcontext *ALContext; ALCdevice *ALCDevice; ALsource *ALSource; LPKSPROPERTYSET lpPropertySet = NULL; GUID ListenerGuid, BufferGuid; ALuint ListenerProperty, BufferProperty; ALuint i, ulSupport; ALuint property, size; ALint value = 0xFFFFFFFF; ALfloat fvalue; ALboolean bSourceGenerated = AL_FALSE; ALboolean bEAXSupported = AL_FALSE; ALint iSWReverbMixer = 0; ALContext = alcGetCurrentContext(); ALCDevice = alcGetContextsDevice(ALContext); SuspendContext(ALContext); if (iSWReverbMixer) { } else { // To test for EAX support we will need a valid Source ALSource = ALContext->Source; // See if one has already been created for (i=0;i<ALContext->SourceCount;i++) { if (ALSource->uservalue3) { lpPropertySet = ALSource->uservalue3; break; } ALSource = ALSource->next; } // If we didn't find a valid source, create one now if (lpPropertySet == NULL) { ALuint alsource = 0; alGenSources(1, ((ALuint *)(&alsource))); if (alGetError() == AL_NO_ERROR) { ALSource = (ALsource*)ALTHUNK_LOOKUPENTRY(alsource); lpPropertySet = ALSource->uservalue3; bSourceGenerated = AL_TRUE; } } // If Property Set Interface hasn't been obtained, EAX support is not available if (lpPropertySet) { if ( (_stricmp(szEAXName, "EAX") == 0) || (_stricmp(szEAXName, "EAX2.0") == 0) ) { ListenerGuid = DSPROPSETID_EAX20_ListenerProperties; BufferGuid = DSPROPSETID_EAX20_BufferProperties; ListenerProperty = 1; // LISTENER_ALL BufferProperty = 1; // BUFFER_ALL property = 2; // ROOM size = sizeof(ALint); value = -10000; } else { // Unknown EAX Name if (bSourceGenerated) alDeleteSources(1, ((ALuint *)&ALSource->source)); ProcessContext(ALContext); return AL_FALSE; } if (SUCCEEDED(IKsPropertySet_QuerySupport(lpPropertySet, &ListenerGuid, ListenerProperty, &ulSupport))) { if ( (ulSupport & KSPROPERTY_SUPPORT_GET) && (ulSupport & KSPROPERTY_SUPPORT_SET)) { if (SUCCEEDED(IKsPropertySet_QuerySupport(lpPropertySet, &BufferGuid, BufferProperty, &ulSupport))) { if ( (ulSupport & KSPROPERTY_SUPPORT_GET) && (ulSupport & KSPROPERTY_SUPPORT_SET) ) { // Fully supported ! bEAXSupported = AL_TRUE; // Set Default Property if (value != 0xFFFFFFFF) IKsPropertySet_Set(lpPropertySet, &ListenerGuid, property, NULL, 0, &value, sizeof(ALint)); else IKsPropertySet_Set(lpPropertySet, &ListenerGuid, property, NULL, 0, &fvalue, sizeof(ALfloat)); } } } } } if (bSourceGenerated) alDeleteSources(1, ((ALuint *)&ALSource->source)); } ProcessContext(ALContext); return bEAXSupported; }