[PATCH 2/5] quartz/tests: Add some tests for media types for the DirectSound renderer.
Zebediah Figura
z.figura12 at gmail.com
Wed Jul 15 22:57:15 CDT 2020
Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
---
dlls/quartz/tests/Makefile.in | 2 +-
dlls/quartz/tests/dsoundrender.c | 118 +++++++++++++++++++++++++++++++
2 files changed, 119 insertions(+), 1 deletion(-)
diff --git a/dlls/quartz/tests/Makefile.in b/dlls/quartz/tests/Makefile.in
index 7652baf274e..b4a372d4d3e 100644
--- a/dlls/quartz/tests/Makefile.in
+++ b/dlls/quartz/tests/Makefile.in
@@ -1,5 +1,5 @@
TESTDLL = quartz.dll
-IMPORTS = strmbase advapi32 d3d9 msdmo msvfw32 ole32 oleaut32 user32 uuid
+IMPORTS = strmbase advapi32 d3d9 dsound msdmo msvfw32 ole32 oleaut32 user32 uuid
C_SRCS = \
acmwrapper.c \
diff --git a/dlls/quartz/tests/dsoundrender.c b/dlls/quartz/tests/dsoundrender.c
index ecff4b7c882..3add14d0437 100644
--- a/dlls/quartz/tests/dsoundrender.c
+++ b/dlls/quartz/tests/dsoundrender.c
@@ -24,6 +24,7 @@
#include "initguid.h"
#include "dsound.h"
#include "amaudio.h"
+#include "mmreg.h"
#include "wine/test.h"
static const WCHAR sink_id[] = L"Audio Input pin (rendered)";
@@ -685,6 +686,122 @@ static void test_unconnected_filter_state(void)
ok(!ref, "Got outstanding refcount %d.\n", ref);
}
+static HRESULT does_dsound_support_format(WAVEFORMATEX *format)
+{
+ const DSBUFFERDESC desc =
+ {
+ .dwSize = sizeof(DSBUFFERDESC),
+ .dwBufferBytes = format->nAvgBytesPerSec,
+ .lpwfxFormat = format,
+ };
+ IDirectSoundBuffer *buffer;
+ IDirectSound *dsound;
+ HRESULT hr;
+
+ hr = DirectSoundCreate(NULL, &dsound, NULL);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ hr = IDirectSound_CreateSoundBuffer(dsound, &desc, &buffer, NULL);
+ if (hr == S_OK)
+ IDirectSoundBuffer_Release(buffer);
+ IDirectSound_Release(dsound);
+
+ return hr == S_OK ? S_OK : S_FALSE;
+}
+
+static void test_media_types(void)
+{
+ IBaseFilter *filter = create_dsound_render();
+ AM_MEDIA_TYPE *mt, req_mt = {{0}};
+ IEnumMediaTypes *enummt;
+ WAVEFORMATEX wfx = {0};
+ HRESULT hr, expect_hr;
+ unsigned int i, j;
+ WORD channels;
+ ULONG ref;
+ IPin *pin;
+
+ static const DWORD sample_rates[] = {8000, 11025, 12000, 16000, 22050, 24000, 32000, 44100, 48000, 96000};
+
+ static const struct
+ {
+ WORD tag;
+ WORD depth;
+ } formats[] =
+ {
+ {WAVE_FORMAT_PCM, 8},
+ {WAVE_FORMAT_PCM, 16},
+ {WAVE_FORMAT_PCM, 24},
+ {WAVE_FORMAT_PCM, 32},
+ {WAVE_FORMAT_IEEE_FLOAT, 32},
+ {WAVE_FORMAT_IEEE_FLOAT, 64},
+ };
+
+ IBaseFilter_FindPin(filter, sink_id, &pin);
+
+ hr = IPin_EnumMediaTypes(pin, &enummt);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ hr = IEnumMediaTypes_Next(enummt, 1, &mt, NULL);
+ todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr);
+ if (hr == S_OK)
+ {
+ ok(IsEqualGUID(&mt->majortype, &MEDIATYPE_Audio), "Got major type %s.\n", wine_dbgstr_guid(&mt->majortype));
+ ok(IsEqualGUID(&mt->subtype, &GUID_NULL), "Got subtype %s.\n", wine_dbgstr_guid(&mt->subtype));
+ ok(mt->bFixedSizeSamples == TRUE, "Got fixed size %d.\n", mt->bFixedSizeSamples);
+ ok(!mt->bTemporalCompression, "Got temporal compression %d.\n", mt->bTemporalCompression);
+ ok(mt->lSampleSize == 1, "Got sample size %u.\n", mt->lSampleSize);
+ ok(IsEqualGUID(&mt->formattype, &GUID_NULL), "Got format type %s.\n", wine_dbgstr_guid(&mt->formattype));
+ ok(!mt->pUnk, "Got pUnk %p.\n", mt->pUnk);
+ ok(!mt->cbFormat, "Got format size %u.\n", mt->cbFormat);
+ ok(!mt->pbFormat, "Got unexpected format block.\n");
+
+ hr = IPin_QueryAccept(pin, mt);
+ ok(hr == S_FALSE, "Got hr %#x.\n", hr);
+
+ CoTaskMemFree(mt);
+ }
+
+ hr = IEnumMediaTypes_Next(enummt, 1, &mt, NULL);
+ ok(hr == S_FALSE, "Got hr %#x.\n", hr);
+
+ req_mt.majortype = MEDIATYPE_Audio;
+ req_mt.formattype = FORMAT_WaveFormatEx;
+ req_mt.cbFormat = sizeof(WAVEFORMATEX);
+ req_mt.pbFormat = (BYTE *)&wfx;
+
+ IEnumMediaTypes_Release(enummt);
+
+ for (channels = 1; channels <= 2; ++channels)
+ {
+ wfx.nChannels = channels;
+
+ for (i = 0; i < ARRAY_SIZE(formats); ++i)
+ {
+ wfx.wFormatTag = formats[i].tag;
+ wfx.wBitsPerSample = formats[i].depth;
+ wfx.nBlockAlign = wfx.nChannels * wfx.wBitsPerSample / 8;
+ for (j = 0; j < ARRAY_SIZE(sample_rates); ++j)
+ {
+ wfx.nSamplesPerSec = sample_rates[j];
+ wfx.nAvgBytesPerSec = wfx.nSamplesPerSec * wfx.nBlockAlign;
+
+ expect_hr = does_dsound_support_format(&wfx);
+
+ hr = IPin_QueryAccept(pin, &req_mt);
+ todo_wine_if (expect_hr == S_OK)
+ ok(hr == expect_hr, "Expected hr %#x, got %#x, for %d channels, %d-bit %s, %d Hz.\n",
+ expect_hr, hr, channels, formats[i].depth,
+ formats[i].tag == WAVE_FORMAT_PCM ? "integer" : "float", sample_rates[j]);
+ }
+ }
+ }
+
+ IPin_Release(pin);
+ ref = IBaseFilter_Release(filter);
+ ok(!ref, "Got outstanding refcount %d.\n", ref);
+}
+
START_TEST(dsoundrender)
{
IBaseFilter *filter;
@@ -712,6 +829,7 @@ START_TEST(dsoundrender)
test_basic_audio();
test_enum_media_types();
test_unconnected_filter_state();
+ test_media_types();
test_basefilter();
CoUninitialize();
--
2.27.0
More information about the wine-devel
mailing list