From: Matteo Bruni mbruni@codeweavers.com
Fixes: 8856ea79f3468d6f532f5f20e9b28c295d6e1db1 --- dlls/dsound/propset.c | 64 +++++++++++++++++++++---------------- dlls/dsound/tests/propset.c | 5 ++- 2 files changed, 40 insertions(+), 29 deletions(-)
diff --git a/dlls/dsound/propset.c b/dlls/dsound/propset.c index 4283618196e..7c87f6ab40b 100644 --- a/dlls/dsound/propset.c +++ b/dlls/dsound/propset.c @@ -264,11 +264,16 @@ static HRESULT DSPROPERTY_DescriptionW( return S_OK; }
-static -BOOL CALLBACK enum_callback(GUID *guid, const WCHAR *desc, const WCHAR *module, - void *user) +struct enum_callback_ctx { - PDSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_W_DATA ppd = user; + DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_W_DATA *pd; + EDataFlow flow; + unsigned int id; +}; + +static BOOL CALLBACK enum_callback(GUID *guid, const WCHAR *desc, const WCHAR *module, void *user) +{ + struct enum_callback_ctx *ctx = user; DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_W_DATA data; DWORD len; BOOL ret; @@ -279,19 +284,19 @@ BOOL CALLBACK enum_callback(GUID *guid, const WCHAR *desc, const WCHAR *module, if(!guid) return TRUE;
+ data.Type = DIRECTSOUNDDEVICE_TYPE_WDM; + data.DataFlow = ctx->flow == eRender ? DIRECTSOUNDDEVICE_DATAFLOW_RENDER : DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE; data.DeviceId = *guid; - - len = lstrlenW(module) + 1; - data.Module = malloc(len * sizeof(WCHAR)); - memcpy(data.Module, module, len * sizeof(WCHAR)); - len = lstrlenW(desc) + 1; data.Description = malloc(len * sizeof(WCHAR)); memcpy(data.Description, desc, len * sizeof(WCHAR)); - + len = lstrlenW(module) + 1; + data.Module = malloc(len * sizeof(WCHAR)); + memcpy(data.Module, module, len * sizeof(WCHAR)); data.Interface = wInterface; + data.WaveDeviceId = ctx->id++;
- ret = ppd->Callback(&data, ppd->Context); + ret = ctx->pd->Callback(&data, ctx->pd->Context);
free(data.Module); free(data.Description); @@ -299,35 +304,34 @@ BOOL CALLBACK enum_callback(GUID *guid, const WCHAR *desc, const WCHAR *module, return ret; }
-static HRESULT DSPROPERTY_EnumerateW( - LPVOID pPropData, - ULONG cbPropData, - PULONG pcbReturned ) +static HRESULT DSPROPERTY_EnumerateW(LPVOID pd, ULONG size, PULONG out_size) { - PDSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_W_DATA ppd = pPropData; + struct enum_callback_ctx ctx = {pd}; HRESULT hr;
- TRACE("(pPropData=%p,cbPropData=%ld,pcbReturned=%p)\n", - pPropData,cbPropData,pcbReturned); + TRACE("pd %p, size %lu, out_size %p\n", pd, size, out_size);
- if (pcbReturned) - *pcbReturned = 0; + if (out_size) + *out_size = sizeof(*ctx.pd);
- if (!ppd || !ppd->Callback) + if (!pd || !ctx.pd->Callback) { - WARN("Invalid ppd %p\n", ppd); + WARN("Invalid pd %p\n", pd); return E_PROP_ID_UNSUPPORTED; }
- if (cbPropData < sizeof(*ppd)) + if (size < sizeof(ctx.pd)) return E_INVALIDARG;
- hr = enumerate_mmdevices(eRender, DSOUND_renderer_guids, - enum_callback, ppd); + ctx.flow = eRender; + hr = enumerate_mmdevices(eRender, DSOUND_renderer_guids, enum_callback, &ctx);
- if(hr == S_OK) - hr = enumerate_mmdevices(eCapture, DSOUND_capture_guids, - enum_callback, ppd); + if (hr == S_OK) + { + ctx.flow = eCapture; + ctx.id = 0; + hr = enumerate_mmdevices(eCapture, DSOUND_capture_guids, enum_callback, &ctx); + }
return SUCCEEDED(hr) ? DS_OK : hr; } @@ -381,6 +385,8 @@ static BOOL CALLBACK DSPROPERTY_enumWtoA(DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTIO DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_A_DATA *ppd = data; BOOL ret;
+ TRACE("descW %p, data %p\n", descW, data); + ret = DSPROPERTY_descWtoA(descW, &descA); if (!ret) return FALSE; @@ -398,6 +404,8 @@ static HRESULT DSPROPERTY_EnumerateA( DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_A_DATA *ppd = pPropData; DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_W_DATA data;
+ TRACE("pPropData %p, cbPropData %lu, pcbReturned %p\n", pPropData, cbPropData, pcbReturned); + if (!ppd || !ppd->Callback) { WARN("Invalid ppd %p\n", ppd); diff --git a/dlls/dsound/tests/propset.c b/dlls/dsound/tests/propset.c index bd36973d2ef..3a691c14729 100644 --- a/dlls/dsound/tests/propset.c +++ b/dlls/dsound/tests/propset.c @@ -423,7 +423,7 @@ static void propset_private_tests(void)
if (support & KSPROPERTY_SUPPORT_GET) { DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_DATA data; - ULONG bytes; + ULONG bytes = 0;
data.Callback = callback; data.Context = 0; @@ -432,11 +432,14 @@ static void propset_private_tests(void) DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE, NULL, 0, &data, 1, &bytes); ok(rc == E_INVALIDARG, "Unexpected rc 0x%lx\n", rc); + ok(bytes == sizeof(data), "Unexpected bytes %lu\n", bytes);
+ bytes = 0; rc = IKsPropertySet_Get(pps, &DSPROPSETID_DirectSoundDevice, DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE, NULL, 0, &data, sizeof(data), &bytes); ok(rc == DS_OK, "Couldn't enumerate: 0x%lx\n", rc); + ok(bytes == sizeof(data), "Unexpected bytes %lu\n", bytes); }
/* test DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_1 */