Commit 6d8279f0 authored by Alistair Leslie-Hughes's avatar Alistair Leslie-Hughes Committed by Alexandre Julliard

dsdmo: Add Echo FX Support.

parent 98f546ed
......@@ -41,3 +41,11 @@ coclass DirectSoundParamEqDMO {}
uuid(87fc0268-9a55-4360-95aa-004a1d9de26c)
]
coclass DirectSoundWavesReverbDMO {}
[
uuid(ef3e932c-d40b-4f51-8ccf-3f98f1b29d5d),
threading(both),
progid("Microsoft.DirectSoundEchoDMO.1"),
vi_progid("Microsoft.DirectSoundEchoDMO")
]
coclass DirectSoundEchoDMO {}
......@@ -947,6 +947,102 @@ static HRESULT waves_reverb_create(IUnknown *outer, IUnknown **out)
return S_OK;
}
struct dmo_echofx
{
struct effect effect;
IDirectSoundFXEcho IDirectSoundFXEcho_iface;
};
static inline struct dmo_echofx *impl_from_IDirectSoundFXEcho(IDirectSoundFXEcho *iface)
{
return CONTAINING_RECORD(iface, struct dmo_echofx, IDirectSoundFXEcho_iface);
}
static HRESULT WINAPI echofx_QueryInterface(IDirectSoundFXEcho *iface, REFIID iid, void **out)
{
struct dmo_echofx *effect = impl_from_IDirectSoundFXEcho(iface);
return IUnknown_QueryInterface(effect->effect.outer_unk, iid, out);
}
static ULONG WINAPI echofx_AddRef(IDirectSoundFXEcho *iface)
{
struct dmo_echofx *effect = impl_from_IDirectSoundFXEcho(iface);
return IUnknown_AddRef(effect->effect.outer_unk);
}
static ULONG WINAPI echofx_Release(IDirectSoundFXEcho *iface)
{
struct dmo_echofx *effect = impl_from_IDirectSoundFXEcho(iface);
return IUnknown_Release(effect->effect.outer_unk);
}
static HRESULT WINAPI echofx_SetAllParameters(IDirectSoundFXEcho *iface, const DSFXEcho *echo)
{
struct dmo_echofx *effect = impl_from_IDirectSoundFXEcho(iface);
FIXME("(%p) %p\n", effect, echo);
return E_NOTIMPL;
}
static HRESULT WINAPI echofx_GetAllParameters(IDirectSoundFXEcho *iface, DSFXEcho *echo)
{
struct dmo_echofx *effect = impl_from_IDirectSoundFXEcho(iface);
FIXME("(%p) %p\n", effect, echo);
return E_NOTIMPL;
}
static const struct IDirectSoundFXEchoVtbl echofx_vtbl =
{
echofx_QueryInterface,
echofx_AddRef,
echofx_Release,
echofx_SetAllParameters,
echofx_GetAllParameters
};
static struct dmo_echofx *impl_echo_from_effect(struct effect *iface)
{
return CONTAINING_RECORD(iface, struct dmo_echofx, effect);
}
static void *echo_query_interface(struct effect *iface, REFIID iid)
{
struct dmo_echofx *effect = impl_echo_from_effect(iface);
if (IsEqualGUID(iid, &IID_IDirectSoundFXEcho))
return &effect->IDirectSoundFXEcho_iface;
return NULL;
}
static void echo_destroy(struct effect *iface)
{
struct dmo_echofx *effect = impl_echo_from_effect(iface);
free(effect);
}
static const struct effect_ops echo_ops =
{
.destroy = echo_destroy,
.query_interface = echo_query_interface,
};
static HRESULT echo_create(IUnknown *outer, IUnknown **out)
{
struct dmo_echofx *object;
if (!(object = calloc(1, sizeof(*object))))
return E_OUTOFMEMORY;
effect_init(&object->effect, outer, &echo_ops);
object->IDirectSoundFXEcho_iface.lpVtbl = &echofx_vtbl;
TRACE("Created echo effect %p.\n", object);
*out = &object->effect.IUnknown_inner;
return S_OK;
}
struct class_factory
{
IClassFactory IClassFactory_iface;
......@@ -1031,6 +1127,7 @@ class_factories[] =
{&GUID_DSFX_STANDARD_I3DL2REVERB, {{&class_factory_vtbl}, reverb_create}},
{&GUID_DSFX_STANDARD_PARAMEQ, {{&class_factory_vtbl}, eq_create}},
{&GUID_DSFX_WAVES_REVERB, {{&class_factory_vtbl}, waves_reverb_create}},
{&GUID_DSFX_STANDARD_ECHO, {{&class_factory_vtbl}, echo_create}},
};
HRESULT WINAPI DllGetClassObject(REFCLSID clsid, REFIID iid, void **out)
......
......@@ -385,12 +385,14 @@ static void test_echo_parameters(void)
hr = CoCreateInstance(&GUID_DSFX_STANDARD_ECHO, NULL, CLSCTX_INPROC_SERVER,
&IID_IDirectSoundFXEcho, (void **)&echo);
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 = IDirectSoundFXEcho_GetAllParameters(echo, &params);
ok(hr == S_OK, "Got hr %#lx.\n", hr);
todo_wine ok(hr == S_OK, "Got hr %#lx.\n", hr);
if (hr != S_OK)
return;
ok(params.fWetDryMix == 50.0f, "Got %.8e%% wetness.\n", params.fWetDryMix);
ok(params.fFeedback == 50.0f, "Got %.8e%% feedback.\n", params.fFeedback);
ok(params.fLeftDelay == 500.0f, "Got left delay %.8e ms.\n", params.fLeftDelay);
......@@ -545,7 +547,7 @@ START_TEST(dsdmo)
{&GUID_DSFX_STANDARD_CHORUS, &IID_IDirectSoundFXChorus, TRUE},
{&GUID_DSFX_STANDARD_COMPRESSOR, &IID_IDirectSoundFXCompressor, TRUE},
{&GUID_DSFX_STANDARD_DISTORTION, &IID_IDirectSoundFXDistortion, TRUE},
{&GUID_DSFX_STANDARD_ECHO, &IID_IDirectSoundFXEcho, TRUE},
{&GUID_DSFX_STANDARD_ECHO, &IID_IDirectSoundFXEcho},
{&GUID_DSFX_STANDARD_FLANGER, &IID_IDirectSoundFXFlanger, TRUE},
{&GUID_DSFX_STANDARD_GARGLE, &IID_IDirectSoundFXGargle, TRUE},
{&GUID_DSFX_STANDARD_I3DL2REVERB, &IID_IDirectSoundFXI3DL2Reverb},
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment