wave.c

来自「Wine-20031016」· C语言 代码 · 共 515 行 · 第 1/2 页

C
515
字号
    trace("found %d WaveOut devices\n",ndev);    rc=waveOutGetDevCapsA(ndev+1,&caps,sizeof(caps));    ok(rc==MMSYSERR_BADDEVICEID,       "waveOutGetDevCapsA: MMSYSERR_BADDEVICEID expected, got %d\n",rc);    format.wFormatTag=WAVE_FORMAT_PCM;    format.nChannels=2;    format.wBitsPerSample=16;    format.nSamplesPerSec=44100;    format.nBlockAlign=format.nChannels*format.wBitsPerSample/8;    format.nAvgBytesPerSec=format.nSamplesPerSec*format.nBlockAlign;    format.cbSize=0;    rc=waveOutOpen(&wout,ndev+1,&format,0,0,CALLBACK_NULL);    ok(rc==MMSYSERR_BADDEVICEID,       "waveOutOpen: MMSYSERR_BADDEVICEID expected, got %d\n",rc);    for (d=0;d<ndev;d++) {        rc=waveOutGetDevCapsA(d,&caps,sizeof(caps));        ok(rc==MMSYSERR_NOERROR || rc==MMSYSERR_BADDEVICEID,           "waveOutGetDevCapsA: failed to get capabilities of device %d: rc=%d\n",d,rc);        if (rc==MMSYSERR_BADDEVICEID)            continue;        trace("  %d: \"%s\" %d.%d (%d:%d): channels=%d formats=%05lx support=%04lx\n",              d,caps.szPname,caps.vDriverVersion >> 8,              caps.vDriverVersion & 0xff,              caps.wMid,caps.wPid,              caps.wChannels,caps.dwFormats,caps.dwSupport);        for (f=0;f<NB_WIN_FORMATS;f++) {            if (caps.dwFormats & win_formats[f][0]) {                wave_out_test_deviceOut(d,f,0);                wave_out_test_deviceOut(d,f,WAVE_FORMAT_DIRECT);            }        }        /* Try an invalid format to test error handling */        trace("Testing invalid 2MHz format\n");        format.wFormatTag=WAVE_FORMAT_PCM;        format.nChannels=2;        format.wBitsPerSample=16;        format.nSamplesPerSec=2000000; /* 2MHz! */        format.nBlockAlign=format.nChannels*format.wBitsPerSample/8;        format.nAvgBytesPerSec=format.nSamplesPerSec*format.nBlockAlign;        format.cbSize=0;	oformat=format;        rc=waveOutOpen(&wout,d,&format,0,0,CALLBACK_NULL|WAVE_FORMAT_DIRECT);        ok(rc==WAVERR_BADFORMAT,           "waveOutOpen: opening the device at 2MHz should fail %d: rc=%d\n",d,rc);        if (rc==MMSYSERR_NOERROR) {            trace("     got %ldx%2dx%d for %ldx%2dx%d\n",                  format.nSamplesPerSec, format.wBitsPerSample,                  format.nChannels,                  oformat.nSamplesPerSec, oformat.wBitsPerSample,                  oformat.nChannels);            waveOutClose(wout);        }        format.wFormatTag=WAVE_FORMAT_PCM;        format.nChannels=2;        format.wBitsPerSample=16;        format.nSamplesPerSec=2000000; /* 2MHz! */        format.nBlockAlign=format.nChannels*format.wBitsPerSample/8;        format.nAvgBytesPerSec=format.nSamplesPerSec*format.nBlockAlign;        format.cbSize=0;        rc=waveOutOpen(&wout,d,&format,0,0,CALLBACK_NULL|WAVE_FORMAT_DIRECT);        ok(rc==WAVERR_BADFORMAT || rc==MMSYSERR_INVALFLAG,           "waveOutOpen: opening the device at 2MHz should fail %d: rc=%d\n",d,rc);        if (rc==MMSYSERR_NOERROR) {            trace("     got %ldx%2dx%d for %dx%2dx%d\n",                  format.nSamplesPerSec, format.wBitsPerSample,                  format.nChannels,                  win_formats[f][1], win_formats[f][2],                  win_formats[f][3]);            waveOutClose(wout);        }    }}static const char * wave_in_error(MMRESULT error){    static char msg[1024];    MMRESULT rc;    rc = waveInGetErrorText(error, msg, sizeof(msg));    if (rc != MMSYSERR_NOERROR)	sprintf(msg, "waveInGetErrorText(%x) failed with error %x", error, rc);    return msg;}static void wave_in_test_deviceIn(int device, int format, DWORD flags){    WAVEFORMATEX wfx;    HWAVEIN win;    HANDLE hevent;    WAVEHDR frag;    MMRESULT rc;    hevent=CreateEvent(NULL,FALSE,FALSE,NULL);    ok(hevent!=NULL,"CreateEvent: error=%ld\n",GetLastError());    if (hevent==NULL)        return;    wfx.wFormatTag=WAVE_FORMAT_PCM;    wfx.nChannels=win_formats[format][3];    wfx.wBitsPerSample=win_formats[format][2];    wfx.nSamplesPerSec=win_formats[format][1];    wfx.nBlockAlign=wfx.nChannels*wfx.wBitsPerSample/8;    wfx.nAvgBytesPerSec=wfx.nSamplesPerSec*wfx.nBlockAlign;    wfx.cbSize=0;    win=NULL;    rc=waveInOpen(&win,device,&wfx,(DWORD)hevent,0,CALLBACK_EVENT|flags);    /* Note: Win9x doesn't know WAVE_FORMAT_DIRECT */    ok(rc==MMSYSERR_NOERROR || rc==MMSYSERR_BADDEVICEID ||       (rc==MMSYSERR_INVALFLAG && (flags & WAVE_FORMAT_DIRECT)),       "waveInOpen: device=%d format=%ldx%2dx%d flags=%lx(%s) rc=%d(%s)\n",device,       wfx.nSamplesPerSec,wfx.wBitsPerSample,wfx.nChannels,CALLBACK_EVENT|flags,       wave_open_flags(CALLBACK_EVENT|flags),rc,wave_in_error(rc));    if (rc!=MMSYSERR_NOERROR) {        CloseHandle(hevent);        return;    }    ok(wfx.nChannels==win_formats[format][3] &&       wfx.wBitsPerSample==win_formats[format][2] &&       wfx.nSamplesPerSec==win_formats[format][1],       "got the wrong format: %ldx%2dx%d instead of %dx%2dx%d\n",       wfx.nSamplesPerSec, wfx.wBitsPerSample,       wfx.nChannels, win_formats[format][1], win_formats[format][2],       win_formats[format][3]);    frag.lpData=malloc(wfx.nAvgBytesPerSec);    frag.dwBufferLength=wfx.nAvgBytesPerSec;    frag.dwFlags=0;    frag.dwLoops=0;    rc=waveInPrepareHeader(win, &frag, sizeof(frag));    ok(rc==MMSYSERR_NOERROR, "waveOutPrepareHeader: device=%d rc=%d\n",device,rc);    if (winetest_interactive && rc==MMSYSERR_NOERROR) {        trace("Recording at %ldx%2dx%d %04lx\n",              wfx.nSamplesPerSec, wfx.wBitsPerSample,wfx.nChannels,flags);	rc=waveInAddBuffer(win, &frag, sizeof(frag));        ok(rc==MMSYSERR_NOERROR,"waveInAddBuffer: device=%d rc=%d\n",device,rc);        rc=waveInStart(win);        ok(rc==MMSYSERR_NOERROR,"waveInStart: device=%d rc=%d\n",device,rc);        WaitForSingleObject(hevent,INFINITE);    }    rc=waveInUnprepareHeader(win, &frag, sizeof(frag));    ok(rc==MMSYSERR_NOERROR,       "waveInUnprepareHeader: device=%d rc=%d\n",device,rc);    free(frag.lpData);    CloseHandle(hevent);    waveInClose(win);}static void wave_in_tests(){    WAVEINCAPS caps;    WAVEFORMATEX format,oformat;    HWAVEIN win;    MMRESULT rc;    UINT ndev,d,f;    ndev=waveInGetNumDevs();    trace("found %d WaveIn devices\n",ndev);    rc=waveInGetDevCapsA(ndev+1,&caps,sizeof(caps));    ok(rc==MMSYSERR_BADDEVICEID,       "waveInGetDevCapsA: MMSYSERR_BADDEVICEID expected, got %d\n",rc);    format.wFormatTag=WAVE_FORMAT_PCM;    format.nChannels=2;    format.wBitsPerSample=16;    format.nSamplesPerSec=44100;    format.nBlockAlign=format.nChannels*format.wBitsPerSample/8;    format.nAvgBytesPerSec=format.nSamplesPerSec*format.nBlockAlign;    format.cbSize=0;    rc=waveInOpen(&win,ndev+1,&format,0,0,CALLBACK_NULL);    ok(rc==MMSYSERR_BADDEVICEID,       "waveInOpen: MMSYSERR_BADDEVICEID expected, got %d\n",rc);    for (d=0;d<ndev;d++) {        rc=waveInGetDevCapsA(d,&caps,sizeof(caps));        ok(rc==MMSYSERR_NOERROR || rc==MMSYSERR_BADDEVICEID,           "waveInGetDevCapsA: failed to get capabilities of device %d: rc=%d\n",d,rc);        if (rc==MMSYSERR_BADDEVICEID)            continue;        trace("  %d: \"%s\" %d.%d (%d:%d): channels=%d formats=%05lx\n",              d,caps.szPname,caps.vDriverVersion >> 8,              caps.vDriverVersion & 0xff,              caps.wMid,caps.wPid,              caps.wChannels,caps.dwFormats);        for (f=0;f<NB_WIN_FORMATS;f++) {            if (caps.dwFormats & win_formats[f][0]) {                wave_in_test_deviceIn(d,f,0);                wave_in_test_deviceIn(d,f,WAVE_FORMAT_DIRECT);            }        }        /* Try an invalid format to test error handling */        trace("Testing invalid 2MHz format\n");        format.wFormatTag=WAVE_FORMAT_PCM;        format.nChannels=2;        format.wBitsPerSample=16;        format.nSamplesPerSec=2000000; /* 2MHz! */        format.nBlockAlign=format.nChannels*format.wBitsPerSample/8;        format.nAvgBytesPerSec=format.nSamplesPerSec*format.nBlockAlign;        format.cbSize=0;	oformat=format;        rc=waveInOpen(&win,d,&format,0,0,CALLBACK_NULL|WAVE_FORMAT_DIRECT);        ok(rc==WAVERR_BADFORMAT,           "waveInOpen: opening the device at 2MHz should fail %d: rc=%d\n",d,rc);        if (rc==MMSYSERR_NOERROR) {            trace("     got %ldx%2dx%d for %ldx%2dx%d\n",                  format.nSamplesPerSec, format.wBitsPerSample,                  format.nChannels,                  oformat.nSamplesPerSec, oformat.wBitsPerSample,                  oformat.nChannels);            waveInClose(win);        }        format.wFormatTag=WAVE_FORMAT_PCM;        format.nChannels=2;        format.wBitsPerSample=16;        format.nSamplesPerSec=2000000; /* 2MHz! */        format.nBlockAlign=format.nChannels*format.wBitsPerSample/8;        format.nAvgBytesPerSec=format.nSamplesPerSec*format.nBlockAlign;        format.cbSize=0;        rc=waveInOpen(&win,d,&format,0,0,CALLBACK_NULL|WAVE_FORMAT_DIRECT);        ok(rc==WAVERR_BADFORMAT || rc==MMSYSERR_INVALFLAG,           "waveInOpen: opening the device at 2MHz should fail %d: rc=%d\n",d,rc);        if (rc==MMSYSERR_NOERROR) {            trace("     got %ldx%2dx%d for %dx%2dx%d\n",                  format.nSamplesPerSec, format.wBitsPerSample,                  format.nChannels,                  win_formats[f][1], win_formats[f][2],                  win_formats[f][3]);            waveInClose(win);        }    }}START_TEST(wave){    wave_out_tests();    wave_in_tests();}

⌨️ 快捷键说明

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