⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 capture.c

📁 一个类似windows
💻 C
📖 第 1 页 / 共 2 页
字号:
    ok(rc==DS_OK,"IDirectSoundCaptureBuffer_GetFormat() failed: %s\n",       DXGetErrorString8(rc));    if (rc==DS_OK && winetest_debug > 1) {	trace("    Format: tag=0x%04x %ldx%dx%d avg.B/s=%ld align=%d\n",	      wfx.wFormatTag,wfx.nSamplesPerSec,wfx.wBitsPerSample,	      wfx.nChannels,wfx.nAvgBytesPerSec,wfx.nBlockAlign);    }    /* Private dsound.dll: Error: Invalid status pointer */    rc=IDirectSoundCaptureBuffer_GetStatus(dscbo,0);    ok(rc==DSERR_INVALIDPARAM,"IDirectSoundCaptureBuffer_GetStatus() should "       "have returned DSERR_INVALIDPARAM, returned: %s\n",       DXGetErrorString8(rc));    rc=IDirectSoundCaptureBuffer_GetStatus(dscbo,&status);    ok(rc==DS_OK,"IDirectSoundCaptureBuffer_GetStatus() failed: %s\n",       DXGetErrorString8(rc));    if (rc==DS_OK && winetest_debug > 1) {	trace("    Status=0x%04lx\n",status);    }    ZeroMemory(&state, sizeof(state));    state.dscbo=dscbo;    state.wfx=&wfx;    state.buffer_size = dscbcaps.dwBufferBytes;    for (i = 0; i < NOTIFICATIONS; i++)	state.event[i] = CreateEvent( NULL, FALSE, FALSE, NULL );    state.size = dscbcaps.dwBufferBytes / NOTIFICATIONS;    rc=IDirectSoundCaptureBuffer_QueryInterface(dscbo,&IID_IDirectSoundNotify,                                                (void **)&(state.notify));    ok((rc==DS_OK)&&(state.notify!=NULL),       "IDirectSoundCaptureBuffer_QueryInterface() failed: %s\n",       DXGetErrorString8(rc));    if (rc!=DS_OK)	return;    for (i = 0; i < NOTIFICATIONS; i++) {	state.posnotify[i].dwOffset = (i * state.size) + state.size - 1;	state.posnotify[i].hEventNotify = state.event[i];    }    rc=IDirectSoundNotify_SetNotificationPositions(state.notify,NOTIFICATIONS,                                                   state.posnotify);    ok(rc==DS_OK,"IDirectSoundNotify_SetNotificationPositions() failed: %s\n",       DXGetErrorString8(rc));    if (rc!=DS_OK)	return;    ref=IDirectSoundNotify_Release(state.notify);    ok(ref==0,"IDirectSoundNotify_Release(): has %d references, should have "       "0\n",ref);    if (ref!=0)	return;    if (record) {	rc=IDirectSoundCaptureBuffer_Start(dscbo,DSCBSTART_LOOPING);	ok(rc==DS_OK,"IDirectSoundCaptureBuffer_Start() failed: %s\n",           DXGetErrorString8(rc));	if (rc!=DS_OK)	    return;	rc=IDirectSoundCaptureBuffer_GetStatus(dscbo,&status);	ok(rc==DS_OK,"IDirectSoundCaptureBuffer_GetStatus() failed: %s\n",           DXGetErrorString8(rc));	ok(status==(DSCBSTATUS_CAPTURING|DSCBSTATUS_LOOPING),	   "GetStatus: bad status: %lx\n",status);	if (rc!=DS_OK)	    return;	/* wait for the notifications */	for (i = 0; i < (NOTIFICATIONS * 2); i++) {	    rc=WaitForMultipleObjects(NOTIFICATIONS,state.event,FALSE,3000);	    ok(rc==(WAIT_OBJECT_0+(i%NOTIFICATIONS)),               "WaitForMultipleObjects failed: 0x%lx\n",rc);	    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);	    }	    if (!capture_buffer_service(&state))		break;	}	rc=IDirectSoundCaptureBuffer_Stop(dscbo);	ok(rc==DS_OK,"IDirectSoundCaptureBuffer_Stop() failed: %s\n",           DXGetErrorString8(rc));	if (rc!=DS_OK)	    return;    }}static BOOL WINAPI dscenum_callback(LPGUID lpGuid, LPCSTR lpcstrDescription,				    LPCSTR lpcstrModule, LPVOID lpContext){    HRESULT rc;    LPDIRECTSOUNDCAPTURE dsco=NULL;    LPDIRECTSOUNDCAPTUREBUFFER dscbo=NULL;    DSCBUFFERDESC bufdesc;    WAVEFORMATEX wfx;    DSCCAPS dsccaps;    DWORD f;    int ref;    /* Private dsound.dll: Error: Invalid interface buffer */    trace("*** Testing %s - %s ***\n",lpcstrDescription,lpcstrModule);    rc=pDirectSoundCaptureCreate(lpGuid,NULL,NULL);    ok(rc==DSERR_INVALIDPARAM,"DirectSoundCaptureCreate() should have "       "returned DSERR_INVALIDPARAM, returned: %s\n",DXGetErrorString8(rc));    if (rc==DS_OK) {	ref=IDirectSoundCapture_Release(dsco);	ok(ref==0,"IDirectSoundCapture_Release() has %d references, should "           "have 0\n",ref);    }    rc=pDirectSoundCaptureCreate(lpGuid,&dsco,NULL);    ok((rc==DS_OK)||(rc==DSERR_NODRIVER)||(rc==E_FAIL)||(rc==DSERR_ALLOCATED),       "DirectSoundCaptureCreate() failed: %s\n",DXGetErrorString8(rc));    if (rc!=DS_OK) {        if (rc==DSERR_NODRIVER)            trace("  No Driver\n");        else if (rc==E_FAIL)            trace("  No Device\n");        else if (rc==DSERR_ALLOCATED)            trace("  Already In Use\n");	goto EXIT;    }    /* Private dsound.dll: Error: Invalid caps buffer */    rc=IDirectSoundCapture_GetCaps(dsco,NULL);    ok(rc==DSERR_INVALIDPARAM,"IDirectSoundCapture_GetCaps() should have "       "returned DSERR_INVALIDPARAM, returned: %s\n",DXGetErrorString8(rc));    /* Private dsound.dll: Error: Invalid caps buffer */    dsccaps.dwSize=0;    rc=IDirectSoundCapture_GetCaps(dsco,&dsccaps);    ok(rc==DSERR_INVALIDPARAM,"IDirectSoundCapture_GetCaps() should have "       "returned DSERR_INVALIDPARAM, returned: %s\n",DXGetErrorString8(rc));    dsccaps.dwSize=sizeof(dsccaps);    rc=IDirectSoundCapture_GetCaps(dsco,&dsccaps);    ok(rc==DS_OK,"IDirectSoundCapture_GetCaps() failed: %s\n",       DXGetErrorString8(rc));    if (rc==DS_OK && winetest_debug > 1) {	trace("  Caps: size=%ld flags=0x%08lx formats=%05lx channels=%ld\n",	      dsccaps.dwSize,dsccaps.dwFlags,dsccaps.dwFormats,              dsccaps.dwChannels);    }    /* Private dsound.dll: Error: Invalid size */    /* Private dsound.dll: Error: Invalid capture buffer description */    ZeroMemory(&bufdesc, sizeof(bufdesc));    bufdesc.dwSize=0;    bufdesc.dwFlags=0;    bufdesc.dwBufferBytes=0;    bufdesc.dwReserved=0;    bufdesc.lpwfxFormat=NULL;    rc=IDirectSoundCapture_CreateCaptureBuffer(dsco,&bufdesc,&dscbo,NULL);    ok(rc==DSERR_INVALIDPARAM,"IDirectSoundCapture_CreateCaptureBuffer() "       "should have returned DSERR_INVALIDPARAM, returned: %s\n",       DXGetErrorString8(rc));    if (rc==DS_OK) {	ref=IDirectSoundCaptureBuffer_Release(dscbo);	ok(ref==0,"IDirectSoundCaptureBuffer_Release() has %d references, "           "should have 0\n",ref);    }    /* Private dsound.dll: Error: Invalid buffer size */    /* Private dsound.dll: Error: Invalid capture buffer description */    ZeroMemory(&bufdesc, sizeof(bufdesc));    bufdesc.dwSize=sizeof(bufdesc);    bufdesc.dwFlags=0;    bufdesc.dwBufferBytes=0;    bufdesc.dwReserved=0;    bufdesc.lpwfxFormat=NULL;    rc=IDirectSoundCapture_CreateCaptureBuffer(dsco,&bufdesc,&dscbo,NULL);    ok(rc==DSERR_INVALIDPARAM,"IDirectSoundCapture_CreateCaptureBuffer() "       "should have returned DSERR_INVALIDPARAM, returned %s\n",       DXGetErrorString8(rc));    if (rc==DS_OK) {	ref=IDirectSoundCaptureBuffer_Release(dscbo);	ok(ref==0,"IDirectSoundCaptureBuffer_Release() has %d references, "           "should have 0\n",ref);    }    /* Private dsound.dll: Error: Invalid buffer size */    /* Private dsound.dll: Error: Invalid capture buffer description */    ZeroMemory(&bufdesc, sizeof(bufdesc));    ZeroMemory(&wfx, sizeof(wfx));    bufdesc.dwSize=sizeof(bufdesc);    bufdesc.dwFlags=0;    bufdesc.dwBufferBytes=0;    bufdesc.dwReserved=0;    bufdesc.lpwfxFormat=&wfx;    rc=IDirectSoundCapture_CreateCaptureBuffer(dsco,&bufdesc,&dscbo,NULL);    ok(rc==DSERR_INVALIDPARAM,"IDirectSoundCapture_CreateCaptureBuffer() "       "should have returned DSERR_INVALIDPARAM, returned :%s\n",       DXGetErrorString8(rc));    if (rc==DS_OK) {	ref=IDirectSoundCaptureBuffer_Release(dscbo);	ok(ref==0,"IDirectSoundCaptureBuffer_Release() has %d references, "           "should have 0\n",ref);    }    /* Private dsound.dll: Error: Invalid buffer size */    /* Private dsound.dll: Error: Invalid capture buffer description */    init_format(&wfx,WAVE_FORMAT_PCM,11025,8,1);    ZeroMemory(&bufdesc, sizeof(bufdesc));    bufdesc.dwSize=sizeof(bufdesc);    bufdesc.dwFlags=0;    bufdesc.dwBufferBytes=0;    bufdesc.dwReserved=0;    bufdesc.lpwfxFormat=&wfx;    rc=IDirectSoundCapture_CreateCaptureBuffer(dsco,&bufdesc,&dscbo,NULL);    ok(rc==DSERR_INVALIDPARAM,"IDirectSoundCapture_CreateCaptureBuffer() "       "should have returned DSERR_INVALIDPARAM, returned: %s\n",       DXGetErrorString8(rc));    if (rc==DS_OK) {	ref=IDirectSoundCaptureBuffer_Release(dscbo);	ok(ref==0,"IDirectSoundCaptureBuffer_Release() has %d references, "           "should have 0\n",ref);    }    for (f=0;f<NB_FORMATS;f++) {	dscbo=NULL;	init_format(&wfx,WAVE_FORMAT_PCM,formats[f][0],formats[f][1],                    formats[f][2]);	ZeroMemory(&bufdesc, sizeof(bufdesc));	bufdesc.dwSize=sizeof(bufdesc);	bufdesc.dwFlags=0;	bufdesc.dwBufferBytes=wfx.nAvgBytesPerSec;	bufdesc.dwReserved=0;	bufdesc.lpwfxFormat=&wfx;        if (winetest_interactive)	    trace("  Testing the capture buffer at %s\n", format_string(&wfx));	rc=IDirectSoundCapture_CreateCaptureBuffer(dsco,&bufdesc,&dscbo,NULL);	ok(((rc==DS_OK)&&(dscbo!=NULL))||(rc==DSERR_BADFORMAT)||           ((rc==DSERR_NODRIVER))||(rc==DSERR_ALLOCATED)||(rc==E_INVALIDARG),           "IDirectSoundCapture_CreateCaptureBuffer() failed to create a "           "%s capture buffer: %s\n",format_string(&wfx),DXGetErrorString8(rc));	if (rc==DS_OK) {	    test_capture_buffer(dsco, dscbo, winetest_interactive);	    ref=IDirectSoundCaptureBuffer_Release(dscbo);	    ok(ref==0,"IDirectSoundCaptureBuffer_Release() has %d references, "               "should have 0\n",ref);	} else if (rc==DSERR_BADFORMAT) {            ok(!(dsccaps.dwFormats & formats[f][3]),               "IDirectSoundCapture_CreateCaptureBuffer() failed to create a "               "capture buffer: format listed as supported but using it failed\n");            if (!(dsccaps.dwFormats & formats[f][3]))                trace("  Format not supported: %s\n", format_string(&wfx));        } else if (rc==DSERR_NODRIVER) {            trace("  No Driver\n");        } else if (rc==DSERR_ALLOCATED) {            trace("  Already In Use\n");        } else if (rc==E_INVALIDARG) { /* try the old version struct */            DSCBUFFERDESC1 bufdesc1;	    ZeroMemory(&bufdesc1, sizeof(bufdesc1));	    bufdesc1.dwSize=sizeof(bufdesc1);	    bufdesc1.dwFlags=0;	    bufdesc1.dwBufferBytes=wfx.nAvgBytesPerSec;	    bufdesc1.dwReserved=0;	    bufdesc1.lpwfxFormat=&wfx;	    rc=IDirectSoundCapture_CreateCaptureBuffer(dsco,                (DSCBUFFERDESC*)&bufdesc1,&dscbo,NULL);	    ok(rc==DS_OK,               "IDirectSoundCapture_CreateCaptureBuffer() failed to create a "               "%s capture buffer: %s\n",format_string(&wfx),               DXGetErrorString8(rc));            if (rc==DS_OK) {	        test_capture_buffer(dsco, dscbo, winetest_interactive);	        ref=IDirectSoundCaptureBuffer_Release(dscbo);	        ok(ref==0,"IDirectSoundCaptureBuffer_Release() has %d "                   "references, should have 0\n",ref);            }        }    }    /* try a non PCM format */#if 0    init_format(&wfx,WAVE_FORMAT_MULAW,8000,8,1);    ZeroMemory(&bufdesc, sizeof(bufdesc));    bufdesc.dwSize=sizeof(bufdesc);    bufdesc.dwFlags=DSCBCAPS_WAVEMAPPED;    bufdesc.dwBufferBytes=wfx.nAvgBytesPerSec;    bufdesc.dwReserved=0;    bufdesc.lpwfxFormat=&wfx;    if (winetest_interactive)        trace("  Testing the capture buffer at %s\n", format_string(&wfx));    rc=IDirectSoundCapture_CreateCaptureBuffer(dsco,&bufdesc,&dscbo,NULL);    ok((rc==DS_OK)&&(dscbo!=NULL),"IDirectSoundCapture_CreateCaptureBuffer() "       "failed to create a capture buffer: %s\n",DXGetErrorString8(rc));    if ((rc==DS_OK)&&(dscbo!=NULL)) {	test_capture_buffer(dsco, dscbo, winetest_interactive);	ref=IDirectSoundCaptureBuffer_Release(dscbo);	ok(ref==0,"IDirectSoundCaptureBuffer_Release() has %d references, "           "should have 0\n",ref);    }#endif    /* Try an invalid format to test error handling */#if 0    init_format(&wfx,WAVE_FORMAT_PCM,2000000,16,2);    ZeroMemory(&bufdesc, sizeof(bufdesc));    bufdesc.dwSize=sizeof(bufdesc);    bufdesc.dwFlags=DSCBCAPS_WAVEMAPPED;    bufdesc.dwBufferBytes=wfx.nAvgBytesPerSec;    bufdesc.dwReserved=0;    bufdesc.lpwfxFormat=&wfx;    if (winetest_interactive)        trace("  Testing the capture buffer at %s\n", format_string(&wfx));    rc=IDirectSoundCapture_CreateCaptureBuffer(dsco,&bufdesc,&dscbo,NULL);    ok(rc!=DS_OK,"IDirectSoundCapture_CreateCaptureBuffer() should have failed "       "at 2 MHz %s\n",DXGetErrorString8(rc));#endifEXIT:    if (dsco!=NULL) {	ref=IDirectSoundCapture_Release(dsco);	ok(ref==0,"IDirectSoundCapture_Release() has %d references, should "           "have 0\n",ref);    }    return TRUE;}static void capture_tests(void){    HRESULT rc;    rc=pDirectSoundCaptureEnumerateA(&dscenum_callback,NULL);    ok(rc==DS_OK,"DirectSoundCaptureEnumerateA() failed: %s\n",       DXGetErrorString8(rc));}START_TEST(capture){    HMODULE hDsound;    CoInitialize(NULL);    hDsound = LoadLibraryA("dsound.dll");    if (!hDsound) {        trace("dsound.dll not found\n");        return;    }    trace("DLL Version: %s\n", get_file_version("dsound.dll"));    pDirectSoundCaptureCreate=(void*)GetProcAddress(hDsound,"DirectSoundCaptureCreate");    pDirectSoundCaptureEnumerateA=(void*)GetProcAddress(hDsound,"DirectSoundCaptureEnumerateA");    if (!pDirectSoundCaptureCreate || !pDirectSoundCaptureEnumerateA)    {        trace("capture test skipped\n");        return;    }    IDirectSoundCapture_tests();    capture_tests();    CoUninitialize();}

⌨️ 快捷键说明

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