1
0
mirror of https://github.com/wine-mirror/wine synced 2024-07-08 03:45:57 +00:00

dsdmo: Add Flanger effect stub.

This commit is contained in:
Alistair Leslie-Hughes 2023-06-26 16:04:23 +10:00 committed by Alexandre Julliard
parent e2258279e0
commit 654b970be1
3 changed files with 108 additions and 2 deletions

View File

@ -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 {}

View File

@ -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)

View File

@ -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, &params);
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},