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

📄 ds3d.c

📁 一个类似windows
💻 C
📖 第 1 页 / 共 4 页
字号:
    dsbcaps.dwSize=sizeof(dsbcaps);    rc=IDirectSoundBuffer_GetCaps(dsbo,&dsbcaps);    ok(rc==DS_OK,"IDirectSoundBuffer_GetCaps() failed: %s\n",       DXGetErrorString8(rc));    if (rc==DS_OK && winetest_debug > 1) {        trace("    Caps: flags=0x%08lx size=%ld\n",dsbcaps.dwFlags,              dsbcaps.dwBufferBytes);    }    /* Query the format size. Note that it may not match sizeof(wfx) */    size=0;    rc=IDirectSoundBuffer_GetFormat(dsbo,NULL,0,&size);    ok(rc==DS_OK && size!=0,"IDirectSoundBuffer_GetFormat() should have "       "returned the needed size: rc=%s size=%ld\n",DXGetErrorString8(rc),size);    rc=IDirectSoundBuffer_GetFormat(dsbo,&wfx,sizeof(wfx),NULL);    ok(rc==DS_OK,"IDirectSoundBuffer_GetFormat() failed: %s\n",       DXGetErrorString8(rc));    if (rc==DS_OK && winetest_debug > 1) {        trace("    Format: %s tag=0x%04x %ldx%dx%d avg.B/s=%ld align=%d\n",              is_primary ? "Primary" : "Secondary",              wfx.wFormatTag,wfx.nSamplesPerSec,wfx.wBitsPerSample,              wfx.nChannels,wfx.nAvgBytesPerSec,wfx.nBlockAlign);    }    /* DSOUND: Error: Invalid frequency buffer */    rc=IDirectSoundBuffer_GetFrequency(dsbo,0);    ok(rc==DSERR_INVALIDPARAM,"IDirectSoundBuffer_GetFrequency() should have "       "returned DSERR_INVALIDPARAM, returned: %s\n",DXGetErrorString8(rc));    /* DSOUND: Error: Primary buffers don't support CTRLFREQUENCY */    rc=IDirectSoundBuffer_GetFrequency(dsbo,&freq);    ok((rc==DS_OK && !is_primary) || (rc==DSERR_CONTROLUNAVAIL&&is_primary) ||       (rc==DSERR_CONTROLUNAVAIL&&!(dsbcaps.dwFlags&DSBCAPS_CTRLFREQUENCY)),       "IDirectSoundBuffer_GetFrequency() failed: %s\n",DXGetErrorString8(rc));    if (rc==DS_OK) {        DWORD f = set_frequency?frequency:wfx.nSamplesPerSec;        ok(freq==f,"The frequency returned by GetFrequency "           "%ld does not match the format %ld\n",freq,f);    }    /* DSOUND: Error: Invalid status pointer */    rc=IDirectSoundBuffer_GetStatus(dsbo,0);    ok(rc==DSERR_INVALIDPARAM,"IDirectSoundBuffer_GetStatus() should have "       "returned DSERR_INVALIDPARAM, returned: %s\n",DXGetErrorString8(rc));    rc=IDirectSoundBuffer_GetStatus(dsbo,&status);    ok(rc==DS_OK,"IDirectSoundBuffer_GetStatus() failed: %s\n",       DXGetErrorString8(rc));    ok(status==0,"status=0x%lx instead of 0\n",status);    if (is_primary) {        /* We must call SetCooperativeLevel to be allowed to call SetFormat */        /* 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)            return;        /* DSOUND: Error: Invalid format pointer */        rc=IDirectSoundBuffer_SetFormat(dsbo,0);        ok(rc==DSERR_INVALIDPARAM,"IDirectSoundBuffer_SetFormat() should have "           "returned DSERR_INVALIDPARAM, returned: %s\n",DXGetErrorString8(rc));        init_format(&wfx2,WAVE_FORMAT_PCM,11025,16,2);        rc=IDirectSoundBuffer_SetFormat(dsbo,&wfx2);        ok(rc==DS_OK,"IDirectSoundBuffer_SetFormat() failed: %s\n",           DXGetErrorString8(rc));        /* There is no garantee that SetFormat will actually change the	 * format to what we asked for. It depends on what the soundcard	 * supports. So we must re-query the format.	 */        rc=IDirectSoundBuffer_GetFormat(dsbo,&wfx,sizeof(wfx),NULL);        ok(rc==DS_OK,"IDirectSoundBuffer_GetFormat() failed: %s\n",           DXGetErrorString8(rc));        if (rc==DS_OK &&            (wfx.wFormatTag!=wfx2.wFormatTag ||             wfx.nSamplesPerSec!=wfx2.nSamplesPerSec ||             wfx.wBitsPerSample!=wfx2.wBitsPerSample ||             wfx.nChannels!=wfx2.nChannels)) {            trace("Requested format tag=0x%04x %ldx%dx%d avg.B/s=%ld align=%d\n",                  wfx2.wFormatTag,wfx2.nSamplesPerSec,wfx2.wBitsPerSample,                  wfx2.nChannels,wfx2.nAvgBytesPerSec,wfx2.nBlockAlign);            trace("Got 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);        }        /* 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 (play) {        play_state_t state;        DS3DLISTENER listener_param;        LPDIRECTSOUND3DBUFFER buffer=NULL;        DS3DBUFFER buffer_param;        DWORD start_time,now;        if (winetest_interactive) {            if (set_frequency)                trace("    Playing %g second 440Hz tone at %ldx%dx%d with a "                      "frequency of %ld (%ldHz)\n", duration,                      wfx.nSamplesPerSec, wfx.wBitsPerSample, wfx.nChannels,                      frequency, (440 * frequency) / wfx.nSamplesPerSec);            else                trace("    Playing %g second 440Hz tone at %ldx%dx%d\n", duration,                      wfx.nSamplesPerSec, wfx.wBitsPerSample, wfx.nChannels);        }        if (is_primary) {            /* We must call SetCooperativeLevel to be allowed to call Lock */            /* DSOUND: Setting DirectSound cooperative level to             * DSSCL_WRITEPRIMARY */            rc=IDirectSound_SetCooperativeLevel(dso,get_hwnd(),                                                DSSCL_WRITEPRIMARY);            ok(rc==DS_OK,"IDirectSound_SetCooperativeLevel(DSSCL_WRITEPRIMARY) "               "failed: %s\n",DXGetErrorString8(rc));            if (rc!=DS_OK)                return;        }        if (buffer3d) {            LPDIRECTSOUNDBUFFER temp_buffer;            rc=IDirectSoundBuffer_QueryInterface(dsbo,&IID_IDirectSound3DBuffer,                                                 (LPVOID *)&buffer);            ok(rc==DS_OK,"IDirectSoundBuffer_QueryInterface() failed: %s\n",               DXGetErrorString8(rc));            if (rc!=DS_OK)                return;            /* check the COM interface */            rc=IDirectSoundBuffer_QueryInterface(dsbo, &IID_IDirectSoundBuffer,                                                 (LPVOID *)&temp_buffer);            ok(rc==DS_OK && temp_buffer!=NULL,               "IDirectSoundBuffer_QueryInterface() failed: %s\n",               DXGetErrorString8(rc));            ok(temp_buffer==dsbo,"COM interface broken: %p != %p\n",               temp_buffer,dsbo);            ref=IDirectSoundBuffer_Release(temp_buffer);            ok(ref==1,"IDirectSoundBuffer_Release() has %d references, "               "should have 1\n",ref);            temp_buffer=NULL;            rc=IDirectSound3DBuffer_QueryInterface(dsbo,                                                   &IID_IDirectSoundBuffer,                                                   (LPVOID *)&temp_buffer);            ok(rc==DS_OK && temp_buffer!=NULL,               "IDirectSound3DBuffer_QueryInterface() failed: %s\n",               DXGetErrorString8(rc));            ok(temp_buffer==dsbo,"COM interface broken: %p != %p\n",               temp_buffer,dsbo);            ref=IDirectSoundBuffer_Release(temp_buffer);            ok(ref==1,"IDirectSoundBuffer_Release() has %d references, "               "should have 1\n",ref);#if 0            /* FIXME: this works on windows */            ref=IDirectSoundBuffer_Release(dsbo);            ok(ref==0,"IDirectSoundBuffer_Release() has %d references, "               "should have 0\n",ref);            rc=IDirectSound3DBuffer_QueryInterface(buffer,                                                   &IID_IDirectSoundBuffer,                                                   (LPVOID *)&dsbo);            ok(rc==DS_OK && dsbo!=NULL,"IDirectSound3DBuffer_QueryInterface() "               "failed: %s\n",DXGetErrorString8(rc));#endif            /* DSOUND: Error: Invalid buffer */            rc=IDirectSound3DBuffer_GetAllParameters(buffer,0);            ok(rc==DSERR_INVALIDPARAM,"IDirectSound3DBuffer_GetAllParameters() "               "failed: %s\n",DXGetErrorString8(rc));            ZeroMemory(&buffer_param, sizeof(buffer_param));            /* DSOUND: Error: Invalid buffer */            rc=IDirectSound3DBuffer_GetAllParameters(buffer,&buffer_param);            ok(rc==DSERR_INVALIDPARAM,"IDirectSound3DBuffer_GetAllParameters() "               "failed: %s\n",DXGetErrorString8(rc));            buffer_param.dwSize=sizeof(buffer_param);            rc=IDirectSound3DBuffer_GetAllParameters(buffer,&buffer_param);            ok(rc==DS_OK,"IDirectSound3DBuffer_GetAllParameters() failed: %s\n",               DXGetErrorString8(rc));        }        if (set_volume) {            if (dsbcaps.dwFlags & DSBCAPS_CTRLVOLUME) {                LONG val;                rc=IDirectSoundBuffer_GetVolume(dsbo,&val);                ok(rc==DS_OK,"IDirectSoundBuffer_GetVolume() failed: %s\n",                   DXGetErrorString8(rc));                rc=IDirectSoundBuffer_SetVolume(dsbo,volume);                ok(rc==DS_OK,"IDirectSoundBuffer_SetVolume() failed: %s\n",                   DXGetErrorString8(rc));            } else {                /* DSOUND: Error: Buffer does not have CTRLVOLUME */                rc=IDirectSoundBuffer_GetVolume(dsbo,&volume);                ok(rc==DSERR_CONTROLUNAVAIL,"IDirectSoundBuffer_GetVolume() "                   "should have returned DSERR_CONTROLUNAVAIL, returned: %s\n",                   DXGetErrorString8(rc));            }        }        if (set_pan) {            if (dsbcaps.dwFlags & DSBCAPS_CTRLPAN) {                LONG val;                rc=IDirectSoundBuffer_GetPan(dsbo,&val);                ok(rc==DS_OK,"IDirectSoundBuffer_GetPan() failed: %s\n",                   DXGetErrorString8(rc));                rc=IDirectSoundBuffer_SetPan(dsbo,pan);                ok(rc==DS_OK,"IDirectSoundBuffer_SetPan() failed: %s\n",                   DXGetErrorString8(rc));            } else {                /* DSOUND: Error: Buffer does not have CTRLPAN */                rc=IDirectSoundBuffer_GetPan(dsbo,&pan);                ok(rc==DSERR_CONTROLUNAVAIL,"IDirectSoundBuffer_GetPan() "                   "should have returned DSERR_CONTROLUNAVAIL, returned: %s\n",                   DXGetErrorString8(rc));            }        }        if (set_frequency)            state.wave=wave_generate_la(&wfx,(duration*frequency)/wfx.nSamplesPerSec,&state.wave_len);        else            state.wave=wave_generate_la(&wfx,duration,&state.wave_len);        state.dsbo=dsbo;        state.wfx=&wfx;        state.buffer_size=dsbcaps.dwBufferBytes;        state.played=state.written=state.offset=0;        buffer_refill(&state,state.buffer_size);        rc=IDirectSoundBuffer_Play(dsbo,0,0,DSBPLAY_LOOPING);        ok(rc==DS_OK,"IDirectSoundBuffer_Play() failed: %s\n",           DXGetErrorString8(rc));        rc=IDirectSoundBuffer_GetStatus(dsbo,&status);        ok(rc==DS_OK,"IDirectSoundBuffer_GetStatus() failed: %s\n",           DXGetErrorString8(rc));        ok(status==(DSBSTATUS_PLAYING|DSBSTATUS_LOOPING),           "GetStatus: bad status: %lx\n",status);        if (listener) {            ZeroMemory(&listener_param,sizeof(listener_param));            listener_param.dwSize=sizeof(listener_param);            rc=IDirectSound3DListener_GetAllParameters(listener,                                                       &listener_param);            ok(rc==DS_OK,"IDirectSound3dListener_GetAllParameters() "               "failed: %s\n",DXGetErrorString8(rc));            if (move_listener) {                listener_param.vPosition.x = -5.0;                listener_param.vVelocity.x = 10.0/duration;            }            rc=IDirectSound3DListener_SetAllParameters(listener,                                                       &listener_param,                                                       DS3D_IMMEDIATE);            ok(rc==DS_OK,"IDirectSound3dListener_SetPosition() failed: %s\n",               DXGetErrorString8(rc));        }        if (buffer3d) {            if (move_sound) {                buffer_param.vPosition.x = 100.0;                buffer_param.vVelocity.x = -200.0/duration;            }            buffer_param.flMinDistance = 10;            rc=IDirectSound3DBuffer_SetAllParameters(buffer,&buffer_param,                                                     DS3D_IMMEDIATE);            ok(rc==DS_OK,"IDirectSound3dBuffer_SetPosition() failed: %s\n",               DXGetErrorString8(rc));        }        start_time=GetTickCount();        while (buffer_service(&state)) {            WaitForSingleObject(GetCurrentProcess(),TIME_SLICE);            now=GetTickCount();            if (listener && move_listener) {                listener_param.vPosition.x = -5.0+10.0*(now-start_time)/                    1000/duration;                if (winetest_debug>2)                    trace("listener position=%g\n",listener_param.vPosition.x);                rc=IDirectSound3DListener_SetPosition(listener,                    listener_param.vPosition.x,listener_param.vPosition.y,                    listener_param.vPosition.z,DS3D_IMMEDIATE);                ok(rc==DS_OK,"IDirectSound3dListener_SetPosition() failed: "                   "%s\n",DXGetErrorString8(rc));            }            if (buffer3d && move_sound) {                buffer_param.vPosition.x = 100-200.0*(now-start_time)/                    1000/duration;                if (winetest_debug>2)                    trace("sound position=%g\n",buffer_param.vPosition.x);                rc=IDirectSound3DBuffer_SetPosition(buffer,                    buffer_param.vPosition.x,buffer_param.vPosition.y,                    buffer_param.vPosition.z,DS3D_IMMEDIATE);                ok(rc==DS_OK,"IDirectSound3dBuffer_SetPosition() failed: %s\n",                   DXGetErrorString8(rc));            }        }        /* Check the sound duration was within 10% of the expected value */        now=GetTickCount();        ok(fabs(1000*duration-now+start_time)<=100*duration,           "The sound played for %ld ms instead of %g ms\n",

⌨️ 快捷键说明

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