From 1e82007cae363aa547ac13a69e9765220ef9974b Mon Sep 17 00:00:00 2001 From: Robert Reif Date: Mon, 30 Aug 2004 18:36:06 +0000 Subject: [PATCH] Test 32 bit float samples. --- dlls/winmm/tests/capture.c | 29 +++++++++++++++++++++++++++-- dlls/winmm/tests/wave.c | 41 ++++++++++++++++++++++++++++++++++++++++- 2 files changed, 67 insertions(+), 3 deletions(-) diff --git a/dlls/winmm/tests/capture.c b/dlls/winmm/tests/capture.c index 84fee84e906..645e4c30fe0 100644 --- a/dlls/winmm/tests/capture.c +++ b/dlls/winmm/tests/capture.c @@ -33,6 +33,7 @@ #include "mmreg.h" extern GUID KSDATAFORMAT_SUBTYPE_PCM; +extern GUID KSDATAFORMAT_SUBTYPE_IEEE_FLOAT; #include "winmm_test.h" @@ -505,7 +506,7 @@ static void wave_in_test_device(int device) waveInClose(win); wave_in_test_deviceIn(device,&wfex.Format,0,0,&capsA); } else - trace("waveInOpen(%s): 24 bit not supported\n", + trace("waveInOpen(%s): 24 bit samples not supported\n", dev_name(device)); #endif @@ -530,7 +531,31 @@ static void wave_in_test_device(int device) waveInClose(win); wave_in_test_deviceIn(device,&wfex.Format,0,0,&capsA); } else - trace("waveInOpen(%s): 32 bit not supported\n", + trace("waveInOpen(%s): 32 bit samples not supported\n", + dev_name(device)); + + /* test if 32 bit float samples supported */ + wfex.Format.wFormatTag=WAVE_FORMAT_EXTENSIBLE; + wfex.Format.nChannels=2; + wfex.Format.wBitsPerSample=32; + wfex.Format.nSamplesPerSec=22050; + wfex.Format.nBlockAlign=wfex.Format.nChannels*wfex.Format.wBitsPerSample/8; + wfex.Format.nAvgBytesPerSec=wfex.Format.nSamplesPerSec* + wfex.Format.nBlockAlign; + wfex.Format.cbSize=22; + wfex.Samples.wValidBitsPerSample=wfex.Format.wBitsPerSample; + wfex.dwChannelMask=SPEAKER_ALL; + wfex.SubFormat=KSDATAFORMAT_SUBTYPE_IEEE_FLOAT; + rc=waveInOpen(&win,device,&wfex.Format,0,0, + CALLBACK_NULL|WAVE_FORMAT_DIRECT); + ok(rc==MMSYSERR_NOERROR || rc==WAVERR_BADFORMAT || + rc==MMSYSERR_INVALFLAG || rc==MMSYSERR_INVALPARAM, + "waveInOpen(%s): returned: %s\n",dev_name(device),wave_in_error(rc)); + if (rc==MMSYSERR_NOERROR) { + waveInClose(win); + wave_in_test_deviceIn(device,&wfex.Format,0,0,&capsA); + } else + trace("waveInOpen(%s): 32 bit float samples not supported\n", dev_name(device)); } diff --git a/dlls/winmm/tests/wave.c b/dlls/winmm/tests/wave.c index c51af0bc337..45a2cd3f3d3 100644 --- a/dlls/winmm/tests/wave.c +++ b/dlls/winmm/tests/wave.c @@ -54,6 +54,7 @@ static char* wave_generate_la(WAVEFORMATEX* wfx, double duration, DWORD* size) int nb_samples; char* buf; char* b; + WAVEFORMATEXTENSIBLE *wfex = (WAVEFORMATEXTENSIBLE*)wfx; nb_samples=(int)(duration*wfx->nSamplesPerSec); *size=nb_samples*wfx->nBlockAlign; @@ -79,7 +80,9 @@ static char* wave_generate_la(WAVEFORMATEX* wfx, double duration, DWORD* size) b[2]=(sample >> 16) & 0xff; b+=3; } - } else if (wfx->wBitsPerSample==32) { + } else if ((wfx->wBitsPerSample==32) && ((wfx->wFormatTag == WAVE_FORMAT_PCM) || + ((wfx->wFormatTag == WAVE_FORMAT_EXTENSIBLE) && + IsEqualGUID(&wfex->SubFormat, &KSDATAFORMAT_SUBTYPE_PCM)))) { signed int sample=(signed int)(((double)0x7fffffff+0.5)*y-0.5); for (j = 0; j < wfx->nChannels; j++) { b[0]=sample & 0xff; @@ -88,6 +91,17 @@ static char* wave_generate_la(WAVEFORMATEX* wfx, double duration, DWORD* size) b[3]=(sample >> 24) & 0xff; b+=4; } + } else if ((wfx->wBitsPerSample==32) && (wfx->wFormatTag == WAVE_FORMAT_EXTENSIBLE) && + IsEqualGUID(&wfex->SubFormat, &KSDATAFORMAT_SUBTYPE_IEEE_FLOAT)) { + union { float f; char c[4]; } sample; + sample.f=y; + for (j = 0; j < wfx->nChannels; j++) { + b[0]=sample.c[0]; + b[1]=sample.c[1]; + b[2]=sample.c[2]; + b[3]=sample.c[3]; + b+=4; + } } } return buf; @@ -868,6 +882,31 @@ static void wave_out_test_device(int device) } else trace("waveOutOpen(%s): 32 bit samples not supported\n", dev_name(device)); + + /* test if 32 bit float samples supported */ + wfex.Format.wFormatTag=WAVE_FORMAT_EXTENSIBLE; + wfex.Format.nChannels=2; + wfex.Format.wBitsPerSample=32; + wfex.Format.nSamplesPerSec=22050; + wfex.Format.nBlockAlign=wfex.Format.nChannels*wfex.Format.wBitsPerSample/8; + wfex.Format.nAvgBytesPerSec=wfex.Format.nSamplesPerSec* + wfex.Format.nBlockAlign; + wfex.Format.cbSize=22; + wfex.Samples.wValidBitsPerSample=wfex.Format.wBitsPerSample; + wfex.dwChannelMask=SPEAKER_ALL; + wfex.SubFormat=KSDATAFORMAT_SUBTYPE_IEEE_FLOAT; + rc=waveOutOpen(&wout,device,&wfex.Format,0,0, + CALLBACK_NULL|WAVE_FORMAT_DIRECT); + ok(rc==MMSYSERR_NOERROR || rc==WAVERR_BADFORMAT || + rc==MMSYSERR_INVALFLAG || rc==MMSYSERR_INVALPARAM, + "waveOutOpen(%s): returned %s\n",dev_name(device),wave_out_error(rc)); + if (rc==MMSYSERR_NOERROR) { + waveOutClose(wout); + wave_out_test_deviceOut(device,1.0,&wfex.Format,WAVE_FORMAT_2M16,0, + &capsA); + } else + trace("waveOutOpen(%s): 32 bit float samples not supported\n", + dev_name(device)); } static void wave_out_tests() -- 2.11.4.GIT