propset.c

来自「Wine-20031016」· C语言 代码 · 共 322 行

C
322
字号
/* * Unit tests for CLSID_DirectSoundPrivate property set functions (used by dxdiag) * * Copyright (c) 2003 Robert Reif * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */#define NONAMELESSSTRUCT#define NONAMELESSUNION#include <windows.h>#include <math.h>#include <stdlib.h>#include "wine/test.h"#include "windef.h"#include "wingdi.h"#include "dsound.h"#include "dsconf.h"#include "initguid.h"DEFINE_GUID(DSPROPSETID_VoiceManager,0x62A69BAE,0xDF9D,0x11D1,0x99,0xA6,0x00,0xC0,0x4F,0xC9,0x9D,0x46);DEFINE_GUID(DSPROPSETID_EAX20_ListenerProperties,0x306a6a8,0xb224,0x11d2,0x99,0xe5,0x0,0x0,0xe8,0xd8,0xc7,0x22);DEFINE_GUID(DSPROPSETID_EAX20_BufferProperties,0x306a6a7,0xb224,0x11d2,0x99,0xe5,0x0,0x0,0xe8,0xd8,0xc7,0x22);DEFINE_GUID(DSPROPSETID_I3DL2_ListenerProperties,0xDA0F0520,0x300A,0x11D3,0x8A,0x2B,0x00,0x60,0x97,0x0D,0xB0,0x11);DEFINE_GUID(DSPROPSETID_I3DL2_BufferProperties,0xDA0F0521,0x300A,0x11D3,0x8A,0x2B,0x00,0x60,0x97,0x0D,0xB0,0x11);DEFINE_GUID(DSPROPSETID_ZOOMFX_BufferProperties,0xCD5368E0,0x3450,0x11D3,0x8B,0x6E,0x00,0x10,0x5A,0x9B,0x7B,0xBC);typedef HRESULT  (CALLBACK * MYPROC)(REFCLSID, REFIID, LPVOID *);BOOL CALLBACK callback(PDSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_DATA data, LPVOID context){	trace("found device:\n");	trace("\tType: %s\n", 		data->Type == DIRECTSOUNDDEVICE_TYPE_EMULATED ? "Emulated" :		data->Type == DIRECTSOUNDDEVICE_TYPE_VXD ? "VxD" :        	data->Type == DIRECTSOUNDDEVICE_TYPE_WDM ? "WDM" : "Unknown");	trace("\tDataFlow: %s\n",        	data->DataFlow == DIRECTSOUNDDEVICE_DATAFLOW_RENDER ? "Render" :        	data->DataFlow == DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE ? "Capture" : "Unknown");	trace("\tDeviceId: {%08lx-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x}\n",		data->DeviceId.Data1,data->DeviceId.Data2,data->DeviceId.Data3,		data->DeviceId.Data4[0],data->DeviceId.Data4[1],data->DeviceId.Data4[2],data->DeviceId.Data4[3],		data->DeviceId.Data4[4],data->DeviceId.Data4[5],data->DeviceId.Data4[6],data->DeviceId.Data4[7]);	trace("\tDescription: %s\n", data->Description);	trace("\tModule: %s\n", data->Module);	trace("\tInterface: %s\n", data->Interface);	trace("\tWaveDeviceId: %ld\n", data->WaveDeviceId);	return TRUE;}static void propset_private_tests(){	HMODULE	hDsound;	HRESULT hr;	IClassFactory	* pcf;	IKsPropertySet	* pps;	MYPROC fProc;	ULONG	support;	hDsound = LoadLibrary("dsound.dll");	ok(hDsound!=0,"LoadLibrary(dsound.dll) failed\n");	if (hDsound==0)		return;	fProc = (MYPROC)GetProcAddress(hDsound, "DllGetClassObject");	/* try direct sound first */	hr = (fProc)(&CLSID_DirectSound, &IID_IClassFactory, (void **)0);	ok(hr==DSERR_INVALIDPARAM,"DllGetClassObject(CLSID_DirectSound, IID_IClassFactory) should have failed: 0x%lx\n",hr);	hr = (fProc)(&CLSID_DirectSound, &IID_IClassFactory, (void **)(&pcf));	ok(pcf!=0, "DllGetClassObject(CLSID_DirectSound, IID_IClassFactory) failed: 0x%lx\n",hr);	if (pcf==0)		goto error;	/* direct sound doesn't have an IKsPropertySet */	hr = pcf->lpVtbl->CreateInstance(pcf, NULL, &IID_IKsPropertySet, (void **)0);	ok(hr==DSERR_INVALIDPARAM, "CreateInstance(IID_IKsPropertySet) should have failed: 0x%lx\n",hr);	hr = pcf->lpVtbl->CreateInstance(pcf, NULL, &IID_IKsPropertySet, (void **)(&pps));	ok(hr==E_NOINTERFACE, "CreateInstance(IID_IKsPropertySet) should have failed: 0x%lx\n",hr);	/* and the direct sound 8 version */	hr = (fProc)(&CLSID_DirectSound8, &IID_IClassFactory, (void **)(&pcf));	ok(pcf!=0, "DllGetClassObject(CLSID_DirectSound8, IID_IClassFactory) failed: 0x%lx\n",hr);	if (pcf==0)		goto error;	/* direct sound 8 doesn't have an IKsPropertySet */	hr = pcf->lpVtbl->CreateInstance(pcf, NULL, &IID_IKsPropertySet, (void **)(&pps));	ok(hr==E_NOINTERFACE, "CreateInstance(IID_IKsPropertySet) should have failed: 0x%lx\n",hr);	/* try direct sound capture next */	hr = (fProc)(&CLSID_DirectSoundCapture, &IID_IClassFactory, (void **)(&pcf));	ok(pcf!=0, "DllGetClassObject(CLSID_DirectSoundCapture, IID_IClassFactory) failed: 0x%lx\n",hr);	if (pcf==0)		goto error;	/* direct sound capture doesn't have an IKsPropertySet */	hr = pcf->lpVtbl->CreateInstance(pcf, NULL, &IID_IKsPropertySet, (void **)(&pps));	ok(hr==E_NOINTERFACE, "CreateInstance(IID_IKsPropertySet) should have failed: 0x%lx\n",hr);	/* and the direct sound capture 8 version */	hr = (fProc)(&CLSID_DirectSoundCapture8, &IID_IClassFactory, (void **)(&pcf));	ok(pcf!=0, "DllGetClassObject(CLSID_DirectSoundCapture8, IID_IClassFactory) failed: 0x%lx\n",hr);	if (pcf==0)		goto error;	/* direct sound capture 8 doesn't have an IKsPropertySet */	hr = pcf->lpVtbl->CreateInstance(pcf, NULL, &IID_IKsPropertySet, (void **)(&pps));	ok(hr==E_NOINTERFACE, "CreateInstance(IID_IKsPropertySet) should have failed: 0x%lx\n",hr);	/* try direct sound full duplex next */	hr = (fProc)(&CLSID_DirectSoundFullDuplex, &IID_IClassFactory, (void **)(&pcf));	ok(pcf!=0, "DllGetClassObject(CLSID_DirectSoundFullDuplex, IID_IClassFactory) failed: 0x%lx\n",hr);	if (pcf==0)		goto error;	/* direct sound full duplex doesn't have an IKsPropertySet */	hr = pcf->lpVtbl->CreateInstance(pcf, NULL, &IID_IKsPropertySet, (void **)(&pps));	ok(hr==E_NOINTERFACE, "CreateInstance(IID_IKsPropertySet) should have failed: 0x%lx\n",hr);	/* try direct sound private last */	hr = (fProc)(&CLSID_DirectSoundPrivate, &IID_IClassFactory, (void **)(&pcf));	ok(pcf!=0, "DllGetClassObject(CLSID_DirectSoundPrivate, IID_IClassFactory) failed: 0x%lx\n",hr);	if (pcf==0)		goto error;	/* direct sound private does have an IKsPropertySet */	hr = pcf->lpVtbl->CreateInstance(pcf, NULL, &IID_IKsPropertySet, (void **)(&pps));	ok(hr==DS_OK, "CreateInstance(IID_IKsPropertySet) failed: 0x%lx\n",hr);	if (hr!=DS_OK)		goto error;	hr = pps->lpVtbl->QuerySupport(pps, &DSPROPSETID_DirectSoundDevice, DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION, &support);	ok(hr==DS_OK, "QuerySupport(DSPROPSETID_DirectSoundDevice, DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION) failed: 0x%lx\n",hr);	if (hr!=DS_OK)		goto error;	ok (support & KSPROPERTY_SUPPORT_GET, "Couldn't get DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION: support = 0x%lx\n",support);	ok (!(support & KSPROPERTY_SUPPORT_SET), "Shouldn't be able to set DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION: support = 0x%lx\n",support);	hr = pps->lpVtbl->QuerySupport(pps, &DSPROPSETID_DirectSoundDevice, DSPROPERTY_DIRECTSOUNDDEVICE_WAVEDEVICEMAPPING, &support);	ok(hr==DS_OK, "QuerySupport(DSPROPSETID_DirectSoundDevice, DSPROPERTY_DIRECTSOUNDDEVICE_WAVEDEVICEMAPPING) failed: 0x%lx\n",hr);	if (hr!=DS_OK)		goto error;	ok (support & KSPROPERTY_SUPPORT_GET, "Couldn't get DSPROPERTY_DIRECTSOUNDDEVICE_WAVEDEVICEMAPPING: support = 0x%lx\n",support);	ok (!(support & KSPROPERTY_SUPPORT_SET), "Shouldn't be able to set DSPROPERTY_DIRECTSOUNDDEVICE_WAVEDEVICEMAPPING: support = 0x%lx\n",support);	hr = pps->lpVtbl->QuerySupport(pps, &DSPROPSETID_DirectSoundDevice, DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE, &support);	ok(hr==DS_OK, "QuerySupport(DSPROPSETID_DirectSoundDevice, DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE) failed: 0x%lx\n",hr);	if (hr!=DS_OK)		goto error;	ok (support & KSPROPERTY_SUPPORT_GET, "Couldn't get DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE: support = 0x%lx\n",support);	ok (!(support & KSPROPERTY_SUPPORT_SET), "Shouldn't be able to set DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE: support = 0x%lx\n",support);	if (support & KSPROPERTY_SUPPORT_GET)	{		DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_DATA data;		ULONG bytes;		data.Callback = callback;		data.Context = 0;		hr = pps->lpVtbl->Get(pps, &DSPROPSETID_DirectSoundDevice, 					  DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE,					  NULL,					  0,					  &data, 					  sizeof(data), 					  &bytes);		ok(hr==DS_OK, "Couldn't enumerate: 0x%lx\n",hr);	}error:	FreeLibrary(hDsound);}static HWND get_hwnd(){    HWND hwnd=GetForegroundWindow();    if (!hwnd)        hwnd=GetDesktopWindow();    return hwnd;}                                                                                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;                                                                                    rc=DirectSoundCreate(lpGuid,&dso,NULL);    ok(rc==DS_OK,"DirectSoundCreate failed: 0x%lx\n",rc);    if (rc!=DS_OK)        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,"SetCooperativeLevel failed: 0x%lx\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,"CreateSoundBuffer failed to create a hardware 3D primary buffer: 0x%lx\n",rc);    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 %ldx%dx%d\n",            wfx.nSamplesPerSec,wfx.wBitsPerSample,wfx.nChannels);        rc=IDirectSound_CreateSoundBuffer(dso,&bufdesc,&secondary,NULL);        ok(rc==DS_OK&&secondary!=NULL,"CreateSoundBuffer failed to create a secondary buffer 0x%lx\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 1;} static void propset_buffer_tests(){    HRESULT rc;    rc=DirectSoundEnumerateA(&dsenum_callback,NULL);    ok(rc==DS_OK,"DirectSoundEnumerate failed: %ld\n",rc);}START_TEST(propset){    propset_private_tests();    propset_buffer_tests();}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?