Reference that attempt to create these. Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=33326
-- v4: dsdmo: Add Flanger effect stub dsdmo: Add Chorus effect stub
From: Alistair Leslie-Hughes leslie_alistair@hotmail.com
--- dlls/dsdmo/dsdmo.idl | 8 ++++ dlls/dsdmo/main.c | 95 ++++++++++++++++++++++++++++++++++++++++ dlls/dsdmo/tests/dsdmo.c | 7 ++- 3 files changed, 108 insertions(+), 2 deletions(-)
diff --git a/dlls/dsdmo/dsdmo.idl b/dlls/dsdmo/dsdmo.idl index 3922b4d6778..2eba0a4936e 100644 --- a/dlls/dsdmo/dsdmo.idl +++ b/dlls/dsdmo/dsdmo.idl @@ -57,3 +57,11 @@ coclass DirectSoundEchoDMO {} vi_progid("Microsoft.DirectSoundCompressorDMO") ] coclass DirectSoundCompressorDMO {} + +[ + uuid(efe6629c-81f7-4281-bd91-c9d604a95af6), + threading(both), + progid("Microsoft.DirectSoundChorusDMO.1"), + vi_progid("Microsoft.DirectSoundChorusDMO") +] +coclass DirectSoundChorusDMO {} diff --git a/dlls/dsdmo/main.c b/dlls/dsdmo/main.c index bb19b7b7e2e..90e5ee9eb07 100644 --- a/dlls/dsdmo/main.c +++ b/dlls/dsdmo/main.c @@ -1139,6 +1139,100 @@ static HRESULT compressor_create(IUnknown *outer, IUnknown **out) return S_OK; }
+struct dmochorusfx +{ + struct effect effect; + IDirectSoundFXChorus IDirectSoundFXChorus_iface; +}; + +static inline struct dmochorusfx *impl_from_IDirectSoundFXChorus(IDirectSoundFXChorus *iface) +{ + return CONTAINING_RECORD(iface, struct dmochorusfx, IDirectSoundFXChorus_iface); +} + +static HRESULT WINAPI chorusfx_QueryInterface(IDirectSoundFXChorus *iface, REFIID iid, void **out) +{ + struct dmochorusfx *effect = impl_from_IDirectSoundFXChorus(iface); + return IUnknown_QueryInterface(effect->effect.outer_unk, iid, out); +} + +static ULONG WINAPI chorusfx_AddRef(IDirectSoundFXChorus *iface) +{ + struct dmochorusfx *effect = impl_from_IDirectSoundFXChorus(iface); + return IUnknown_AddRef(effect->effect.outer_unk); +} + +static ULONG WINAPI chorusfx_Release(IDirectSoundFXChorus *iface) +{ + struct dmochorusfx *effect = impl_from_IDirectSoundFXChorus(iface); + return IUnknown_Release(effect->effect.outer_unk); +} + +static HRESULT WINAPI chorusfx_SetAllParameters(IDirectSoundFXChorus *iface, const DSFXChorus *compressor) +{ + struct dmochorusfx *This = impl_from_IDirectSoundFXChorus(iface); + FIXME("(%p) %p\n", This, compressor); + return E_NOTIMPL; +} + +static HRESULT WINAPI chorusfx_GetAllParameters(IDirectSoundFXChorus *iface, DSFXChorus *compressor) +{ + struct dmochorusfx *This = impl_from_IDirectSoundFXChorus(iface); + FIXME("(%p) %p\n", This, compressor); + return E_NOTIMPL; +} + +static const struct IDirectSoundFXChorusVtbl chorus_vtbl = +{ + chorusfx_QueryInterface, + chorusfx_AddRef, + chorusfx_Release, + chorusfx_SetAllParameters, + chorusfx_GetAllParameters +}; + +static struct dmochorusfx *implchorus_from_effect(struct effect *iface) +{ + return CONTAINING_RECORD(iface, struct dmochorusfx, effect); +} + +static void *chorus_query_interface(struct effect *iface, REFIID iid) +{ + struct dmochorusfx *effect = implchorus_from_effect(iface); + + if (IsEqualGUID(iid, &IID_IDirectSoundFXChorus)) + return &effect->IDirectSoundFXChorus_iface; + return NULL; +} + +static void chorus_destroy(struct effect *iface) +{ + struct dmochorusfx *effect = implchorus_from_effect(iface); + + free(effect); +} + +static const struct effect_ops chorus_ops = +{ + .destroy = chorus_destroy, + .query_interface = chorus_query_interface, +}; + +static HRESULT chorus_create(IUnknown *outer, IUnknown **out) +{ + struct dmochorusfx *object; + + if (!(object = calloc(1, sizeof(*object)))) + return E_OUTOFMEMORY; + + effect_init(&object->effect, outer, &chorus_ops); + object->IDirectSoundFXChorus_iface.lpVtbl = &chorus_vtbl; + + TRACE("Created chorus effect %p.\n", object); + *out = &object->effect.IUnknown_inner; + return S_OK; +} + struct class_factory { IClassFactory IClassFactory_iface; @@ -1225,6 +1319,7 @@ class_factories[] = {&GUID_DSFX_WAVES_REVERB, {{&class_factory_vtbl}, waves_reverb_create}}, {&GUID_DSFX_STANDARD_ECHO, {{&class_factory_vtbl}, echo_create}}, {&GUID_DSFX_STANDARD_COMPRESSOR, {{&class_factory_vtbl}, compressor_create}}, + {&GUID_DSFX_STANDARD_CHORUS, {{&class_factory_vtbl}, chorus_create}}, };
HRESULT WINAPI DllGetClassObject(REFCLSID clsid, REFIID iid, void **out) diff --git a/dlls/dsdmo/tests/dsdmo.c b/dlls/dsdmo/tests/dsdmo.c index 9296ad29168..9eb43c884c3 100644 --- a/dlls/dsdmo/tests/dsdmo.c +++ b/dlls/dsdmo/tests/dsdmo.c @@ -308,11 +308,14 @@ static void test_chorus_parameters(void)
hr = CoCreateInstance(&GUID_DSFX_STANDARD_CHORUS, NULL, CLSCTX_INPROC_SERVER, &IID_IDirectSoundFXChorus, (void **)&chorus); - todo_wine ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#lx.\n", hr); if (hr != S_OK) return;
hr = IDirectSoundFXChorus_GetAllParameters(chorus, ¶ms); + todo_wine ok(hr == S_OK, "Got hr %#lx.\n", hr); + if (hr != S_OK) + return; ok(hr == S_OK, "Got hr %#lx.\n", hr); ok(params.fWetDryMix == 50.0f, "Got wetness %.8e%%.\n", params.fWetDryMix); ok(params.fDepth == 10.0f, "Got depth %.8e.\n", params.fDepth); @@ -544,7 +547,7 @@ START_TEST(dsdmo) } tests[] = { - {&GUID_DSFX_STANDARD_CHORUS, &IID_IDirectSoundFXChorus, TRUE}, + {&GUID_DSFX_STANDARD_CHORUS, &IID_IDirectSoundFXChorus}, {&GUID_DSFX_STANDARD_COMPRESSOR, &IID_IDirectSoundFXCompressor}, {&GUID_DSFX_STANDARD_DISTORTION, &IID_IDirectSoundFXDistortion, TRUE}, {&GUID_DSFX_STANDARD_ECHO, &IID_IDirectSoundFXEcho},
From: Alistair Leslie-Hughes leslie_alistair@hotmail.com
--- dlls/dsdmo/dsdmo.idl | 8 ++++ dlls/dsdmo/main.c | 95 ++++++++++++++++++++++++++++++++++++++++ dlls/dsdmo/tests/dsdmo.c | 7 ++- 3 files changed, 108 insertions(+), 2 deletions(-)
diff --git a/dlls/dsdmo/dsdmo.idl b/dlls/dsdmo/dsdmo.idl index 2eba0a4936e..30c54d0f889 100644 --- a/dlls/dsdmo/dsdmo.idl +++ b/dlls/dsdmo/dsdmo.idl @@ -65,3 +65,11 @@ coclass DirectSoundCompressorDMO {} vi_progid("Microsoft.DirectSoundChorusDMO") ] coclass DirectSoundChorusDMO {} + +[ + uuid(efca3d92-dfd8-4672-a603-7420894bad98), + threading(both), + progid("Microsoft.DirectSoundFlangerDMO.1"), + vi_progid("Microsoft.DirectSoundFlangerDMO") +] +coclass DirectSoundFlangerDMO {} diff --git a/dlls/dsdmo/main.c b/dlls/dsdmo/main.c index 90e5ee9eb07..2393b92185e 100644 --- a/dlls/dsdmo/main.c +++ b/dlls/dsdmo/main.c @@ -1233,6 +1233,100 @@ static HRESULT chorus_create(IUnknown *outer, IUnknown **out) return S_OK; }
+struct dmo_flangerfx +{ + struct effect effect; + IDirectSoundFXFlanger IDirectSoundFXFlanger_iface; +}; + +static inline struct dmo_flangerfx *impl_from_IDirectSoundFXFlanger(IDirectSoundFXFlanger *iface) +{ + return CONTAINING_RECORD(iface, struct dmo_flangerfx, IDirectSoundFXFlanger_iface); +} + +static HRESULT WINAPI flangerfx_QueryInterface(IDirectSoundFXFlanger *iface, REFIID iid, void **out) +{ + struct dmo_flangerfx *effect = impl_from_IDirectSoundFXFlanger(iface); + return IUnknown_QueryInterface(effect->effect.outer_unk, iid, out); +} + +static ULONG WINAPI flangerfx_AddRef(IDirectSoundFXFlanger *iface) +{ + struct dmo_flangerfx *effect = impl_from_IDirectSoundFXFlanger(iface); + return IUnknown_AddRef(effect->effect.outer_unk); +} + +static ULONG WINAPI flangerfx_Release(IDirectSoundFXFlanger *iface) +{ + struct dmo_flangerfx *effect = impl_from_IDirectSoundFXFlanger(iface); + return IUnknown_Release(effect->effect.outer_unk); +} + +static HRESULT WINAPI flangerfx_SetAllParameters(IDirectSoundFXFlanger *iface, const DSFXFlanger *flanger) +{ + struct dmo_flangerfx *This = impl_from_IDirectSoundFXFlanger(iface); + FIXME("(%p) %p\n", This, flanger); + return E_NOTIMPL; +} + +static HRESULT WINAPI flangerfx_GetAllParameters(IDirectSoundFXFlanger *iface, DSFXFlanger *flanger) +{ + struct dmo_flangerfx *This = impl_from_IDirectSoundFXFlanger(iface); + FIXME("(%p) %p\n", This, flanger); + return E_NOTIMPL; +} + +static const struct IDirectSoundFXFlangerVtbl flanger_vtbl = +{ + flangerfx_QueryInterface, + flangerfx_AddRef, + flangerfx_Release, + flangerfx_SetAllParameters, + flangerfx_GetAllParameters +}; + +static struct dmo_flangerfx *impl_flanger_from_effect(struct effect *iface) +{ + return CONTAINING_RECORD(iface, struct dmo_flangerfx, effect); +} + +static void *flanger_query_interface(struct effect *iface, REFIID iid) +{ + struct dmo_flangerfx *effect = impl_flanger_from_effect(iface); + + if (IsEqualGUID(iid, &IID_IDirectSoundFXFlanger)) + return &effect->IDirectSoundFXFlanger_iface; + return NULL; +} + +static void flanger_destroy(struct effect *iface) +{ + struct dmo_flangerfx *effect = impl_flanger_from_effect(iface); + + free(effect); +} + +static const struct effect_ops flanger_ops = +{ + .destroy = flanger_destroy, + .query_interface = flanger_query_interface, +}; + +static HRESULT flanger_create(IUnknown *outer, IUnknown **out) +{ + struct dmo_flangerfx *object; + + if (!(object = calloc(1, sizeof(*object)))) + return E_OUTOFMEMORY; + + effect_init(&object->effect, outer, &flanger_ops); + object->IDirectSoundFXFlanger_iface.lpVtbl = &flanger_vtbl; + + TRACE("Created flanger effect %p.\n", object); + *out = &object->effect.IUnknown_inner; + return S_OK; +} + struct class_factory { IClassFactory IClassFactory_iface; @@ -1320,6 +1414,7 @@ class_factories[] = {&GUID_DSFX_STANDARD_ECHO, {{&class_factory_vtbl}, echo_create}}, {&GUID_DSFX_STANDARD_COMPRESSOR, {{&class_factory_vtbl}, compressor_create}}, {&GUID_DSFX_STANDARD_CHORUS, {{&class_factory_vtbl}, chorus_create}}, + {&GUID_DSFX_STANDARD_FLANGER, {{&class_factory_vtbl}, flanger_create}}, };
HRESULT WINAPI DllGetClassObject(REFCLSID clsid, REFIID iid, void **out) diff --git a/dlls/dsdmo/tests/dsdmo.c b/dlls/dsdmo/tests/dsdmo.c index 9eb43c884c3..369e02aeaa4 100644 --- a/dlls/dsdmo/tests/dsdmo.c +++ b/dlls/dsdmo/tests/dsdmo.c @@ -415,11 +415,14 @@ static void test_flanger_parameters(void)
hr = CoCreateInstance(&GUID_DSFX_STANDARD_FLANGER, NULL, CLSCTX_INPROC_SERVER, &IID_IDirectSoundFXFlanger, (void **)&flanger); - todo_wine ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#lx.\n", hr); if (hr != S_OK) return;
hr = IDirectSoundFXFlanger_GetAllParameters(flanger, ¶ms); + todo_wine ok(hr == S_OK, "Got hr %#lx.\n", hr); + if (hr != S_OK) + return; ok(hr == S_OK, "Got hr %#lx.\n", hr); ok(params.fWetDryMix == 50.0f, "Got %.8e%% wetness.\n", params.fWetDryMix); ok(params.fDepth == 100.0f, "Got %.8e * 0.01%% depth.\n", params.fDepth); @@ -551,7 +554,7 @@ START_TEST(dsdmo) {&GUID_DSFX_STANDARD_COMPRESSOR, &IID_IDirectSoundFXCompressor}, {&GUID_DSFX_STANDARD_DISTORTION, &IID_IDirectSoundFXDistortion, TRUE}, {&GUID_DSFX_STANDARD_ECHO, &IID_IDirectSoundFXEcho}, - {&GUID_DSFX_STANDARD_FLANGER, &IID_IDirectSoundFXFlanger, TRUE}, + {&GUID_DSFX_STANDARD_FLANGER, &IID_IDirectSoundFXFlanger}, {&GUID_DSFX_STANDARD_GARGLE, &IID_IDirectSoundFXGargle, TRUE}, {&GUID_DSFX_STANDARD_I3DL2REVERB, &IID_IDirectSoundFXI3DL2Reverb}, {&GUID_DSFX_STANDARD_PARAMEQ, &IID_IDirectSoundFXParamEq},