From d9e4a75d191ed69c0b7308920bd8e5484cdb5b3b Mon Sep 17 00:00:00 2001 From: Alistair Leslie-Hughes Date: Sat, 13 Aug 2022 15:49:29 +1000 Subject: [PATCH] Added dsdmo-fx-support patchset --- .../0001-dsdmo-Add-Echo-FX-Support.patch | 144 +++++++++++++++++ ...0002-dsdmo-Add-Compressor-FX-Support.patch | 145 ++++++++++++++++++ patches/dsdmo-fx-support/definition | 1 + patches/patchinstall.sh | 17 ++ 4 files changed, 307 insertions(+) create mode 100644 patches/dsdmo-fx-support/0001-dsdmo-Add-Echo-FX-Support.patch create mode 100644 patches/dsdmo-fx-support/0002-dsdmo-Add-Compressor-FX-Support.patch create mode 100644 patches/dsdmo-fx-support/definition diff --git a/patches/dsdmo-fx-support/0001-dsdmo-Add-Echo-FX-Support.patch b/patches/dsdmo-fx-support/0001-dsdmo-Add-Echo-FX-Support.patch new file mode 100644 index 00000000..94eb1728 --- /dev/null +++ b/patches/dsdmo-fx-support/0001-dsdmo-Add-Echo-FX-Support.patch @@ -0,0 +1,144 @@ +From 042e39ff36dcecd47af4102e8bb890cb9779db5e Mon Sep 17 00:00:00 2001 +From: Alistair Leslie-Hughes +Date: Sat, 13 Aug 2022 11:57:20 +1000 +Subject: [PATCH 1/2] dsdmo: Add Echo FX Support + +--- + dlls/dsdmo/dsdmo.idl | 8 ++++ + dlls/dsdmo/main.c | 97 ++++++++++++++++++++++++++++++++++++++++++++ + 2 files changed, 105 insertions(+) + +diff --git a/dlls/dsdmo/dsdmo.idl b/dlls/dsdmo/dsdmo.idl +index 7f172084828..c8130f8a1ce 100644 +--- a/dlls/dsdmo/dsdmo.idl ++++ b/dlls/dsdmo/dsdmo.idl +@@ -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 {} +diff --git a/dlls/dsdmo/main.c b/dlls/dsdmo/main.c +index 3b106a8f633..200293f5214 100644 +--- a/dlls/dsdmo/main.c ++++ b/dlls/dsdmo/main.c +@@ -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) +-- +2.35.1 + diff --git a/patches/dsdmo-fx-support/0002-dsdmo-Add-Compressor-FX-Support.patch b/patches/dsdmo-fx-support/0002-dsdmo-Add-Compressor-FX-Support.patch new file mode 100644 index 00000000..d43776c6 --- /dev/null +++ b/patches/dsdmo-fx-support/0002-dsdmo-Add-Compressor-FX-Support.patch @@ -0,0 +1,145 @@ +From 7a9faf6c5f18a24f4fcbda2fc3066a4b7dd9a892 Mon Sep 17 00:00:00 2001 +From: Alistair Leslie-Hughes +Date: Sat, 13 Aug 2022 15:03:46 +1000 +Subject: [PATCH 2/2] dsdmo: Add Compressor FX Support + +--- + dlls/dsdmo/dsdmo.idl | 8 ++++ + dlls/dsdmo/main.c | 97 ++++++++++++++++++++++++++++++++++++++++++++ + 2 files changed, 105 insertions(+) + +diff --git a/dlls/dsdmo/dsdmo.idl b/dlls/dsdmo/dsdmo.idl +index c8130f8a1ce..ee3154f64d1 100644 +--- a/dlls/dsdmo/dsdmo.idl ++++ b/dlls/dsdmo/dsdmo.idl +@@ -49,3 +49,11 @@ coclass DirectSoundWavesReverbDMO {} + vi_progid("Microsoft.DirectSoundEchoDMO") + ] + coclass DirectSoundEchoDMO {} ++ ++[ ++ uuid(ef011f79-4000-406d-87af-bffb3fc39d57), ++ threading(both), ++ progid("Microsoft.DirectSoundCompressorDMO.1"), ++ vi_progid("Microsoft.DirectSoundCompressorDMO") ++] ++coclass DirectSoundCompressorDMO {} +\ No newline at end of file +diff --git a/dlls/dsdmo/main.c b/dlls/dsdmo/main.c +index 200293f5214..bb19b7b7e2e 100644 +--- a/dlls/dsdmo/main.c ++++ b/dlls/dsdmo/main.c +@@ -1043,6 +1043,102 @@ static HRESULT echo_create(IUnknown *outer, IUnknown **out) + return S_OK; + } + ++struct dmo_compressorfx ++{ ++ struct effect effect; ++ IDirectSoundFXCompressor IDirectSoundFXCompressor_iface; ++}; ++ ++static inline struct dmo_compressorfx *impl_from_IDirectSoundFXCompressor(IDirectSoundFXCompressor *iface) ++{ ++ return CONTAINING_RECORD(iface, struct dmo_compressorfx, IDirectSoundFXCompressor_iface); ++} ++ ++static HRESULT WINAPI compressorfx_QueryInterface(IDirectSoundFXCompressor *iface, REFIID iid, void **out) ++{ ++ struct dmo_compressorfx *effect = impl_from_IDirectSoundFXCompressor(iface); ++ return IUnknown_QueryInterface(effect->effect.outer_unk, iid, out); ++} ++ ++static ULONG WINAPI compressorfx_AddRef(IDirectSoundFXCompressor *iface) ++{ ++ struct dmo_compressorfx *effect = impl_from_IDirectSoundFXCompressor(iface); ++ return IUnknown_AddRef(effect->effect.outer_unk); ++} ++ ++static ULONG WINAPI compressorfx_Release(IDirectSoundFXCompressor *iface) ++{ ++ struct dmo_compressorfx *effect = impl_from_IDirectSoundFXCompressor(iface); ++ return IUnknown_Release(effect->effect.outer_unk); ++} ++ ++static HRESULT WINAPI compressorfx_SetAllParameters(IDirectSoundFXCompressor *iface, const DSFXCompressor *compressor) ++{ ++ struct dmo_compressorfx *This = impl_from_IDirectSoundFXCompressor(iface); ++ FIXME("(%p) %p\n", This, compressor); ++ ++ return E_NOTIMPL; ++} ++ ++static HRESULT WINAPI compressorfx_GetAllParameters(IDirectSoundFXCompressor *iface, DSFXCompressor *compressor) ++{ ++ struct dmo_compressorfx *This = impl_from_IDirectSoundFXCompressor(iface); ++ FIXME("(%p) %p\n", This, compressor); ++ ++ return E_NOTIMPL; ++} ++ ++static const struct IDirectSoundFXCompressorVtbl compressor_vtbl = ++{ ++ compressorfx_QueryInterface, ++ compressorfx_AddRef, ++ compressorfx_Release, ++ compressorfx_SetAllParameters, ++ compressorfx_GetAllParameters ++}; ++ ++static struct dmo_compressorfx *impl_compressor_from_effect(struct effect *iface) ++{ ++ return CONTAINING_RECORD(iface, struct dmo_compressorfx, effect); ++} ++ ++static void *compressor_query_interface(struct effect *iface, REFIID iid) ++{ ++ struct dmo_compressorfx *effect = impl_compressor_from_effect(iface); ++ ++ if (IsEqualGUID(iid, &IID_IDirectSoundFXCompressor)) ++ return &effect->IDirectSoundFXCompressor_iface; ++ return NULL; ++} ++ ++static void compressor_destroy(struct effect *iface) ++{ ++ struct dmo_compressorfx *effect = impl_compressor_from_effect(iface); ++ ++ free(effect); ++} ++ ++static const struct effect_ops compressor_ops = ++{ ++ .destroy = compressor_destroy, ++ .query_interface = compressor_query_interface, ++}; ++ ++static HRESULT compressor_create(IUnknown *outer, IUnknown **out) ++{ ++ struct dmo_compressorfx *object; ++ ++ if (!(object = calloc(1, sizeof(*object)))) ++ return E_OUTOFMEMORY; ++ ++ effect_init(&object->effect, outer, &compressor_ops); ++ object->IDirectSoundFXCompressor_iface.lpVtbl = &compressor_vtbl; ++ ++ TRACE("Created compressor effect %p.\n", object); ++ *out = &object->effect.IUnknown_inner; ++ return S_OK; ++} ++ + struct class_factory + { + IClassFactory IClassFactory_iface; +@@ -1128,6 +1224,7 @@ class_factories[] = + {&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}}, ++ {&GUID_DSFX_STANDARD_COMPRESSOR, {{&class_factory_vtbl}, compressor_create}}, + }; + + HRESULT WINAPI DllGetClassObject(REFCLSID clsid, REFIID iid, void **out) +-- +2.35.1 + diff --git a/patches/dsdmo-fx-support/definition b/patches/dsdmo-fx-support/definition new file mode 100644 index 00000000..3da7f580 --- /dev/null +++ b/patches/dsdmo-fx-support/definition @@ -0,0 +1 @@ +Fixes: [52396] dsdmo: Add More FX interfaces. diff --git a/patches/patchinstall.sh b/patches/patchinstall.sh index 6bd06dd9..7f125cd7 100755 --- a/patches/patchinstall.sh +++ b/patches/patchinstall.sh @@ -106,6 +106,7 @@ patch_enable_all () enable_ddraw_Silence_FIXMEs="$1" enable_ddraw_version_check="$1" enable_dinput_joy_mappings="$1" + enable_dsdmo_fx_support="$1" enable_dsound_EAX="$1" enable_dsound_Fast_Mixer="$1" enable_eventfd_synchronization="$1" @@ -341,6 +342,9 @@ patch_enable () dinput-joy-mappings) enable_dinput_joy_mappings="$2" ;; + dsdmo-fx-support) + enable_dsdmo_fx_support="$2" + ;; dsound-EAX) enable_dsound_EAX="$2" ;; @@ -1658,6 +1662,19 @@ if test "$enable_dinput_joy_mappings" -eq 1; then patch_apply dinput-joy-mappings/0004-dinput-Allow-mapping-of-controls-based-of-Genre-type.patch fi +# Patchset dsdmo-fx-support +# | +# | This patchset fixes the following Wine bugs: +# | * [#52396] dsdmo: Add More FX interfaces. +# | +# | Modified files: +# | * dlls/dsdmo/dsdmo.idl, dlls/dsdmo/main.c +# | +if test "$enable_dsdmo_fx_support" -eq 1; then + patch_apply dsdmo-fx-support/0001-dsdmo-Add-Echo-FX-Support.patch + patch_apply dsdmo-fx-support/0002-dsdmo-Add-Compressor-FX-Support.patch +fi + # Patchset dsound-Fast_Mixer # | # | This patchset fixes the following Wine bugs: