[PATCH 06/11] windows.media.speech: Move speechsynthesis into a seperate file.

Bernhard Kölbl besentv at gmail.com
Wed Jan 19 07:28:14 CST 2022


Do this to seperate the activation factory from the COM object
implementations.

Signed-off-by: Bernhard Kölbl <besentv at gmail.com>
---
 dlls/windows.media.speech/Makefile.in         |   3 +-
 dlls/windows.media.speech/main.c              | 565 ++----------------
 dlls/windows.media.speech/speechsynthesis.c   | 505 ++++++++++++++++
 .../windows_media_speech_private.h            |  84 +++
 4 files changed, 657 insertions(+), 500 deletions(-)
 create mode 100644 dlls/windows.media.speech/speechsynthesis.c
 create mode 100644 dlls/windows.media.speech/windows_media_speech_private.h

diff --git a/dlls/windows.media.speech/Makefile.in b/dlls/windows.media.speech/Makefile.in
index 9fbff8e132f..57f2500d651 100644
--- a/dlls/windows.media.speech/Makefile.in
+++ b/dlls/windows.media.speech/Makefile.in
@@ -2,6 +2,7 @@ MODULE = windows.media.speech.dll
 IMPORTS = combase uuid
 
 C_SRCS = \
-	main.c
+	main.c \
+	speechsynthesis.c
 
 IDL_SRCS = classes.idl
diff --git a/dlls/windows.media.speech/main.c b/dlls/windows.media.speech/main.c
index b607f9a8203..1e2947fd026 100644
--- a/dlls/windows.media.speech/main.c
+++ b/dlls/windows.media.speech/main.c
@@ -17,401 +17,27 @@
  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
  */
 
-#include <stdarg.h>
+#define WINDOWS_MEDIA_SPEECH_INIT_GUID
 
-#define COBJMACROS
-#include "windef.h"
-#include "winbase.h"
-#include "winstring.h"
-#include "wine/debug.h"
-#include "objbase.h"
-
-#include "initguid.h"
-#include "activation.h"
-
-#define WIDL_using_Windows_Foundation
-#define WIDL_using_Windows_Foundation_Collections
-#include "windows.foundation.h"
-#define WIDL_using_Windows_Media_SpeechSynthesis
-#include "windows.media.speechsynthesis.h"
+#include "windows_media_speech_private.h"
 
 WINE_DEFAULT_DEBUG_CHANNEL(speech);
 
-static const char *debugstr_hstring(HSTRING hstr)
-{
-    const WCHAR *str;
-    UINT32 len;
-    if (hstr && !((ULONG_PTR)hstr >> 16)) return "(invalid)";
-    str = WindowsGetStringRawBuffer(hstr, &len);
-    return wine_dbgstr_wn(str, len);
-}
-
-struct voice_information_vector
-{
-    IVectorView_VoiceInformation IVectorView_VoiceInformation_iface;
-    LONG ref;
-};
-
-static inline struct voice_information_vector *impl_from_IVectorView_VoiceInformation(IVectorView_VoiceInformation *iface)
-{
-    return CONTAINING_RECORD(iface, struct voice_information_vector, IVectorView_VoiceInformation_iface);
-}
-
-static HRESULT STDMETHODCALLTYPE vector_view_voice_information_QueryInterface(
-        IVectorView_VoiceInformation *iface, REFIID iid, void **out)
-{
-    TRACE("iface %p, iid %s, out %p stub!\n", iface, debugstr_guid(iid), out);
-
-    if (IsEqualGUID(iid, &IID_IUnknown) ||
-        IsEqualGUID(iid, &IID_IInspectable) ||
-        IsEqualGUID(iid, &IID_IVectorView_VoiceInformation))
-    {
-        IUnknown_AddRef(iface);
-        *out = iface;
-        return S_OK;
-    }
-
-    WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(iid));
-    *out = NULL;
-    return E_NOINTERFACE;
-}
-
-static ULONG STDMETHODCALLTYPE vector_view_voice_information_AddRef(
-        IVectorView_VoiceInformation *iface)
-{
-    struct voice_information_vector *impl = impl_from_IVectorView_VoiceInformation(iface);
-    ULONG ref = InterlockedIncrement(&impl->ref);
-    TRACE("iface %p, ref %u.\n", iface, ref);
-    return ref;
-}
-
-static ULONG STDMETHODCALLTYPE vector_view_voice_information_Release(
-        IVectorView_VoiceInformation *iface)
-{
-    struct voice_information_vector *impl = impl_from_IVectorView_VoiceInformation(iface);
-    ULONG ref = InterlockedDecrement(&impl->ref);
-    TRACE("iface %p, ref %u.\n", iface, ref);
-    return ref;
-}
-
-static HRESULT STDMETHODCALLTYPE vector_view_voice_information_GetIids(
-        IVectorView_VoiceInformation *iface, ULONG *iid_count, IID **iids)
-{
-    FIXME("iface %p, iid_count %p, iids %p stub!\n", iface, iid_count, iids);
-    return E_NOTIMPL;
-}
-
-static HRESULT STDMETHODCALLTYPE vector_view_voice_information_GetRuntimeClassName(
-        IVectorView_VoiceInformation *iface, HSTRING *class_name)
-{
-    FIXME("iface %p, class_name %p stub!\n", iface, class_name);
-    return E_NOTIMPL;
-}
-
-static HRESULT STDMETHODCALLTYPE vector_view_voice_information_GetTrustLevel(
-        IVectorView_VoiceInformation *iface, TrustLevel *trust_level)
-{
-    FIXME("iface %p, trust_level %p stub!\n", iface, trust_level);
-    return E_NOTIMPL;
-}
-
-static HRESULT STDMETHODCALLTYPE vector_view_voice_information_GetAt(
-        IVectorView_VoiceInformation *iface, UINT32 index, IVoiceInformation **value)
-{
-    FIXME("iface %p, index %#x, value %p stub!\n", iface, index, value);
-    *value = NULL;
-    return E_BOUNDS;
-}
-
-static HRESULT STDMETHODCALLTYPE vector_view_voice_information_get_Size(
-        IVectorView_VoiceInformation *iface, UINT32 *value)
-{
-    FIXME("iface %p, value %p stub!\n", iface, value);
-    *value = 0;
-    return S_OK;
-}
-
-static HRESULT STDMETHODCALLTYPE vector_view_voice_information_IndexOf(
-        IVectorView_VoiceInformation *iface, IVoiceInformation *element, UINT32 *index, BOOLEAN *found)
-{
-    FIXME("iface %p, element %p, index %p, found %p stub!\n", iface, element, index, found);
-    *index = 0;
-    *found = FALSE;
-    return S_OK;
-}
-
-static HRESULT STDMETHODCALLTYPE vector_view_voice_information_GetMany(
-        IVectorView_VoiceInformation *iface, UINT32 start_index,
-        UINT32 items_size, IVoiceInformation **items, UINT *value)
-{
-    FIXME("iface %p, start_index %#x, items %p, value %p stub!\n", iface, start_index, items, value);
-    *value = 0;
-    return S_OK;
-}
-
-static const struct IVectorView_VoiceInformationVtbl vector_view_voice_information_vtbl =
-{
-    vector_view_voice_information_QueryInterface,
-    vector_view_voice_information_AddRef,
-    vector_view_voice_information_Release,
-    /* IInspectable methods */
-    vector_view_voice_information_GetIids,
-    vector_view_voice_information_GetRuntimeClassName,
-    vector_view_voice_information_GetTrustLevel,
-    /* IVectorView<VoiceInformation> methods */
-    vector_view_voice_information_GetAt,
-    vector_view_voice_information_get_Size,
-    vector_view_voice_information_IndexOf,
-    vector_view_voice_information_GetMany,
-};
-
-static struct voice_information_vector all_voices =
-{
-    {&vector_view_voice_information_vtbl},
-    0
-};
-
-struct speech_synthesizer
-{
-    ISpeechSynthesizer ISpeechSynthesizer_iface;
-    IClosable IClosable_iface;
-    LONG ref;
-};
-
-static inline struct speech_synthesizer *impl_from_ISpeechSynthesizer(ISpeechSynthesizer *iface)
-{
-    return CONTAINING_RECORD(iface, struct speech_synthesizer, ISpeechSynthesizer_iface);
-}
-
-static inline struct speech_synthesizer *impl_from_IClosable(IClosable *iface)
-{
-    return CONTAINING_RECORD(iface, struct speech_synthesizer, IClosable_iface);
-}
-
-static HRESULT STDMETHODCALLTYPE speech_synthesizer_QueryInterface(
-        ISpeechSynthesizer *iface, REFIID iid, void **out)
-{
-    struct speech_synthesizer *impl = impl_from_ISpeechSynthesizer(iface);
-
-    TRACE("iface %p, iid %s, out %p stub!\n", iface, debugstr_guid(iid), out);
-
-    if (IsEqualGUID(iid, &IID_IUnknown) ||
-        IsEqualGUID(iid, &IID_IInspectable) ||
-        IsEqualGUID(iid, &IID_ISpeechSynthesizer))
-    {
-        IUnknown_AddRef(iface);
-        *out = iface;
-        return S_OK;
-    }
-
-    if (IsEqualGUID(iid, &IID_IClosable))
-    {
-        IUnknown_AddRef(iface);
-        *out = &impl->IClosable_iface;
-        return S_OK;
-    }
-
-    FIXME("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(iid));
-    *out = NULL;
-    return E_NOINTERFACE;
-}
-
-static ULONG STDMETHODCALLTYPE speech_synthesizer_AddRef(
-        ISpeechSynthesizer *iface)
-{
-    struct speech_synthesizer *impl = impl_from_ISpeechSynthesizer(iface);
-    ULONG ref = InterlockedIncrement(&impl->ref);
-
-    TRACE("iface %p, ref %u.\n", iface, ref);
-
-    return ref;
-}
-
-static ULONG STDMETHODCALLTYPE speech_synthesizer_Release(
-        ISpeechSynthesizer *iface)
-{
-    struct speech_synthesizer *impl = impl_from_ISpeechSynthesizer(iface);
-    ULONG ref = InterlockedDecrement(&impl->ref);
-
-    TRACE("iface %p, ref %u.\n", iface, ref);
-
-    if (!ref)
-        free(impl);
-
-    return ref;
-}
-
-static HRESULT STDMETHODCALLTYPE speech_synthesizer_GetIids(
-        ISpeechSynthesizer *iface, ULONG *iid_count, IID **iids)
-{
-    FIXME("iface %p, iid_count %p, iids %p stub.\n", iface, iid_count, iids);
-
-    return E_NOTIMPL;
-}
-
-static HRESULT STDMETHODCALLTYPE speech_synthesizer_GetRuntimeClassName(
-        ISpeechSynthesizer *iface, HSTRING *class_name)
-{
-    FIXME("iface %p, class_name %p stub.\n", iface, class_name);
-
-    return E_NOTIMPL;
-}
-
-static HRESULT STDMETHODCALLTYPE speech_synthesizer_GetTrustLevel(
-        ISpeechSynthesizer *iface, TrustLevel *trust_level)
-{
-    FIXME("iface %p, trust_level %p stub.\n", iface, trust_level);
-
-    return E_NOTIMPL;
-}
-
-static HRESULT STDMETHODCALLTYPE speech_synthesizer_SynthesizeTextToStreamAsync(ISpeechSynthesizer *iface,
-        HSTRING text, IAsyncOperation_SpeechSynthesisStream **operation)
-{
-    FIXME("iface %p, text %p, operation %p stub.\n", iface, text, operation);
-
-    return E_NOTIMPL;
-}
-
-static HRESULT STDMETHODCALLTYPE speech_synthesizer_SynthesizeSsmlToStreamAsync(ISpeechSynthesizer *iface,
-        HSTRING ssml, IAsyncOperation_SpeechSynthesisStream **operation)
-{
-    FIXME("iface %p, text %p, operation %p stub.\n", iface, ssml, operation);
-
-    return E_NOTIMPL;
-}
-
-static HRESULT STDMETHODCALLTYPE speech_synthesizer_put_Voice(ISpeechSynthesizer *iface, IVoiceInformation *value)
-{
-    FIXME("iface %p, value %p stub.\n", iface, value);
-
-    return E_NOTIMPL;
-}
-
-static HRESULT STDMETHODCALLTYPE speech_synthesizer_get_Voice(ISpeechSynthesizer *iface, IVoiceInformation **value)
-{
-    FIXME("iface %p, value %p stub.\n", iface, value);
-
-    return E_NOTIMPL;
-}
-
-static const struct ISpeechSynthesizerVtbl speech_synthesizer_vtbl =
-{
-    /* IUnknown methods */
-    speech_synthesizer_QueryInterface,
-    speech_synthesizer_AddRef,
-    speech_synthesizer_Release,
-    /* IInspectable methods */
-    speech_synthesizer_GetIids,
-    speech_synthesizer_GetRuntimeClassName,
-    speech_synthesizer_GetTrustLevel,
-    /* ISpeechSynthesizer methods */
-    speech_synthesizer_SynthesizeTextToStreamAsync,
-    speech_synthesizer_SynthesizeSsmlToStreamAsync,
-    speech_synthesizer_put_Voice,
-    speech_synthesizer_get_Voice,
-};
-
-static HRESULT STDMETHODCALLTYPE closable_QueryInterface(
-        IClosable *iface, REFIID iid, void **out)
-{
-    struct speech_synthesizer *impl = impl_from_IClosable(iface);
-
-    return speech_synthesizer_QueryInterface(&impl->ISpeechSynthesizer_iface, iid, out);
-}
-
-static ULONG STDMETHODCALLTYPE closable_AddRef(
-        IClosable *iface)
-{
-    struct speech_synthesizer *impl = impl_from_IClosable(iface);
-    ULONG ref = InterlockedIncrement(&impl->ref);
-
-    TRACE("iface %p, ref %u.\n", iface, ref);
-
-    return ref;
-}
-
-static ULONG STDMETHODCALLTYPE closable_Release(
-        IClosable *iface)
-{
-    struct speech_synthesizer *impl = impl_from_IClosable(iface);
-    ULONG ref = InterlockedDecrement(&impl->ref);
-
-    TRACE("iface %p, ref %u.\n", iface, ref);
-
-    if (!ref)
-        free(impl);
-
-    return ref;
-}
-
-static HRESULT STDMETHODCALLTYPE closable_GetIids(
-        IClosable *iface, ULONG *iid_count, IID **iids)
-{
-    FIXME("iface %p, iid_count %p, iids %p stub.\n", iface, iid_count, iids);
-
-    return E_NOTIMPL;
-}
-
-static HRESULT STDMETHODCALLTYPE closable_GetRuntimeClassName(
-        IClosable *iface, HSTRING *class_name)
-{
-    FIXME("iface %p, class_name %p stub.\n", iface, class_name);
-
-    return E_NOTIMPL;
-}
-
-static HRESULT STDMETHODCALLTYPE closable_GetTrustLevel(
-        IClosable *iface, TrustLevel *trust_level)
-{
-    FIXME("iface %p, trust_level %p stub.\n", iface, trust_level);
-
-    return E_NOTIMPL;
-}
-
-static HRESULT STDMETHODCALLTYPE closable_Close(
-        IClosable *iface)
-{
-    FIXME("iface %p stub.\n", iface);
-
-    return E_NOTIMPL;
-}
-
-static const struct IClosableVtbl closable_vtbl =
-{
-    /* IUnknown methods */
-    closable_QueryInterface,
-    closable_AddRef,
-    closable_Release,
-    /* IInspectable methods */
-    closable_GetIids,
-    closable_GetRuntimeClassName,
-    closable_GetTrustLevel,
-    /* IClosable methods */
-    closable_Close,
-};
-
-struct windows_media_speech
-{
-    IActivationFactory IActivationFactory_iface;
-    IInstalledVoicesStatic IInstalledVoicesStatic_iface;
-    LONG ref;
-};
-
-static inline struct windows_media_speech *impl_from_IActivationFactory(IActivationFactory *iface)
-{
-    return CONTAINING_RECORD(iface, struct windows_media_speech, IActivationFactory_iface);
-}
+/*
+ *
+ * IActivationFactory
+ *
+ */
 
-static inline struct windows_media_speech *impl_from_IInstalledVoicesStatic(IInstalledVoicesStatic *iface)
+static inline struct activation_factory *impl_from_IActivationFactory(IActivationFactory *iface)
 {
-    return CONTAINING_RECORD(iface, struct windows_media_speech, IInstalledVoicesStatic_iface);
+    return CONTAINING_RECORD(iface, struct activation_factory, IActivationFactory_iface);
 }
 
-static HRESULT STDMETHODCALLTYPE windows_media_speech_QueryInterface(
-        IActivationFactory *iface, REFIID iid, void **out)
+static HRESULT STDMETHODCALLTYPE activation_factory_QueryInterface(
+    IActivationFactory *iface, REFIID iid, void **out)
 {
-    struct windows_media_speech *impl = impl_from_IActivationFactory(iface);
+    struct activation_factory *impl = impl_from_IActivationFactory(iface);
 
     TRACE("iface %p, iid %s, out %p stub!\n", iface, debugstr_guid(iid), out);
 
@@ -437,156 +63,96 @@ static HRESULT STDMETHODCALLTYPE windows_media_speech_QueryInterface(
     return E_NOINTERFACE;
 }
 
-static ULONG STDMETHODCALLTYPE windows_media_speech_AddRef(
-        IActivationFactory *iface)
+static ULONG STDMETHODCALLTYPE activation_factory_AddRef(
+    IActivationFactory *iface)
 {
-    struct windows_media_speech *impl = impl_from_IActivationFactory(iface);
+    struct activation_factory *impl = impl_from_IActivationFactory(iface);
     ULONG ref = InterlockedIncrement(&impl->ref);
     TRACE("iface %p, ref %u.\n", iface, ref);
     return ref;
 }
 
-static ULONG STDMETHODCALLTYPE windows_media_speech_Release(
-        IActivationFactory *iface)
+static ULONG STDMETHODCALLTYPE activation_factory_Release(
+    IActivationFactory *iface)
 {
-    struct windows_media_speech *impl = impl_from_IActivationFactory(iface);
+    struct activation_factory *impl = impl_from_IActivationFactory(iface);
     ULONG ref = InterlockedDecrement(&impl->ref);
     TRACE("iface %p, ref %u.\n", iface, ref);
     return ref;
 }
 
-static HRESULT STDMETHODCALLTYPE windows_media_speech_GetIids(
-        IActivationFactory *iface, ULONG *iid_count, IID **iids)
+static HRESULT STDMETHODCALLTYPE activation_factory_GetIids(
+    IActivationFactory *iface, ULONG *iid_count, IID **iids)
 {
     FIXME("iface %p, iid_count %p, iids %p stub!\n", iface, iid_count, iids);
     return E_NOTIMPL;
 }
 
-static HRESULT STDMETHODCALLTYPE windows_media_speech_GetRuntimeClassName(
-        IActivationFactory *iface, HSTRING *class_name)
+static HRESULT STDMETHODCALLTYPE activation_factory_GetRuntimeClassName(
+    IActivationFactory *iface, HSTRING *class_name)
 {
     FIXME("iface %p, class_name %p stub!\n", iface, class_name);
     return E_NOTIMPL;
 }
 
-static HRESULT STDMETHODCALLTYPE windows_media_speech_GetTrustLevel(
-        IActivationFactory *iface, TrustLevel *trust_level)
+static HRESULT STDMETHODCALLTYPE activation_factory_GetTrustLevel(
+    IActivationFactory *iface, TrustLevel *trust_level)
 {
     FIXME("iface %p, trust_level %p stub!\n", iface, trust_level);
     return E_NOTIMPL;
 }
 
-static HRESULT STDMETHODCALLTYPE windows_media_speech_ActivateInstance(
-        IActivationFactory *iface, IInspectable **instance)
+static HRESULT STDMETHODCALLTYPE activation_factory_ActivateInstance(
+    IActivationFactory *iface, IInspectable **instance)
 {
-    struct speech_synthesizer *obj;
+    struct activation_factory *impl = impl_from_IActivationFactory(iface);
 
-    TRACE("iface %p, instance %p.\n", iface, instance);
+    TRACE("iface %p, instance %p\n", iface, instance);
 
-    if (!(obj = calloc(1, sizeof(*obj))))
+    if (!instance)
+        return E_INVALIDARG;
+
+    if (impl)
     {
-        *instance = NULL;
-        return E_OUTOFMEMORY;
+        return impl->create_instance(instance);
     }
 
-    obj->ISpeechSynthesizer_iface.lpVtbl = &speech_synthesizer_vtbl;
-    obj->IClosable_iface.lpVtbl = &closable_vtbl;
-    obj->ref = 1;
-    *instance = (IInspectable *)&obj->ISpeechSynthesizer_iface;
-    return S_OK;
+    return E_NOINTERFACE;
 }
 
 static const struct IActivationFactoryVtbl activation_factory_vtbl =
 {
-    windows_media_speech_QueryInterface,
-    windows_media_speech_AddRef,
-    windows_media_speech_Release,
-    /* IInspectable methods */
-    windows_media_speech_GetIids,
-    windows_media_speech_GetRuntimeClassName,
-    windows_media_speech_GetTrustLevel,
-    /* IActivationFactory methods */
-    windows_media_speech_ActivateInstance,
+        /* IUnknown methods */
+        activation_factory_QueryInterface,
+        activation_factory_AddRef,
+        activation_factory_Release,
+        /* IInspectable methods */
+        activation_factory_GetIids,
+        activation_factory_GetRuntimeClassName,
+        activation_factory_GetTrustLevel,
+        /* IActivationFactory methods */
+        activation_factory_ActivateInstance,
 };
 
-static HRESULT STDMETHODCALLTYPE installed_voices_static_QueryInterface(
-        IInstalledVoicesStatic *iface, REFIID iid, void **out)
-{
-    struct windows_media_speech *impl = impl_from_IInstalledVoicesStatic(iface);
-    return windows_media_speech_QueryInterface(&impl->IActivationFactory_iface, iid, out);
-}
-
-static ULONG STDMETHODCALLTYPE installed_voices_static_AddRef(
-        IInstalledVoicesStatic *iface)
-{
-    struct windows_media_speech *impl = impl_from_IInstalledVoicesStatic(iface);
-    return windows_media_speech_AddRef(&impl->IActivationFactory_iface);
-}
-
-static ULONG STDMETHODCALLTYPE installed_voices_static_Release(
-        IInstalledVoicesStatic *iface)
-{
-    struct windows_media_speech *impl = impl_from_IInstalledVoicesStatic(iface);
-    return windows_media_speech_Release(&impl->IActivationFactory_iface);
-}
-
-static HRESULT STDMETHODCALLTYPE installed_voices_static_GetIids(
-        IInstalledVoicesStatic *iface, ULONG *iid_count, IID **iids)
-{
-    FIXME("iface %p, iid_count %p, iids %p stub!\n", iface, iid_count, iids);
-    return E_NOTIMPL;
-}
-
-static HRESULT STDMETHODCALLTYPE installed_voices_static_GetRuntimeClassName(
-        IInstalledVoicesStatic *iface, HSTRING *class_name)
-{
-    FIXME("iface %p, class_name %p stub!\n", iface, class_name);
-    return E_NOTIMPL;
-}
-
-static HRESULT STDMETHODCALLTYPE installed_voices_static_GetTrustLevel(
-        IInstalledVoicesStatic *iface, TrustLevel *trust_level)
-{
-    FIXME("iface %p, trust_level %p stub!\n", iface, trust_level);
-    return E_NOTIMPL;
-}
-
-static HRESULT STDMETHODCALLTYPE installed_voices_static_get_AllVoices(
-    IInstalledVoicesStatic *iface, IVectorView_VoiceInformation **value)
-{
-    TRACE("iface %p, value %p.\n", iface, value);
-    *value = &all_voices.IVectorView_VoiceInformation_iface;
-    IVectorView_VoiceInformation_AddRef(*value);
-    return S_OK;
-}
-
-static HRESULT STDMETHODCALLTYPE installed_voices_static_get_DefaultVoice(
-    IInstalledVoicesStatic *iface, IVoiceInformation **value)
-{
-    FIXME("iface %p, value %p stub!\n", iface, value);
-    return E_NOTIMPL;
-}
+/*
+ *
+ * ActivationFactory instances
+ *
+ */
 
-static const struct IInstalledVoicesStaticVtbl installed_voices_static_vtbl =
+static struct activation_factory speechsynthesis_speechsynthesizer_af =
 {
-    installed_voices_static_QueryInterface,
-    installed_voices_static_AddRef,
-    installed_voices_static_Release,
-    /* IInspectable methods */
-    installed_voices_static_GetIids,
-    installed_voices_static_GetRuntimeClassName,
-    installed_voices_static_GetTrustLevel,
-    /* IInstalledVoicesStatic methods */
-    installed_voices_static_get_AllVoices,
-    installed_voices_static_get_DefaultVoice,
+    .IActivationFactory_iface = {&activation_factory_vtbl},
+    .IInstalledVoicesStatic_iface = {&installed_voices_static_vtbl},
+    .create_instance = speech_synthesizer_create_default,
+    .ref = 1
 };
 
-static struct windows_media_speech windows_media_speech =
-{
-    {&activation_factory_vtbl},
-    {&installed_voices_static_vtbl},
-    1
-};
+/*
+ *
+ * Exports
+ *
+ */
 
 HRESULT WINAPI DllGetClassObject(REFCLSID clsid, REFIID riid, void **out)
 {
@@ -598,13 +164,14 @@ HRESULT WINAPI DllGetActivationFactory(HSTRING classid, IActivationFactory **fac
 {
     TRACE("classid %s, factory %p.\n", debugstr_hstring(classid), factory);
 
-    if (wcscmp(WindowsGetStringRawBuffer(classid, NULL), L"Windows.Media.SpeechSynthesis.SpeechSynthesizer"))
+    if (IsEqualClassID(WindowsGetStringRawBuffer(classid, NULL),
+        L"Windows.Media.SpeechSynthesis.SpeechSynthesizer"))
     {
-        ERR("Unknown classid %s.\n", debugstr_hstring(classid));
-        return CLASS_E_CLASSNOTAVAILABLE;
+        *factory = &speechsynthesis_speechsynthesizer_af.IActivationFactory_iface;
+        IUnknown_AddRef(*factory);
+        return S_OK;
     }
 
-    *factory = &windows_media_speech.IActivationFactory_iface;
-    IUnknown_AddRef(*factory);
-    return S_OK;
+    ERR("Unknown classid %s.\n", debugstr_hstring(classid));
+    return CLASS_E_CLASSNOTAVAILABLE;
 }
diff --git a/dlls/windows.media.speech/speechsynthesis.c b/dlls/windows.media.speech/speechsynthesis.c
new file mode 100644
index 00000000000..e24b42c8914
--- /dev/null
+++ b/dlls/windows.media.speech/speechsynthesis.c
@@ -0,0 +1,505 @@
+/* WinRT Windows.Media.Speech implementation
+ *
+ * Copyright 2021 Rémi Bernon for CodeWeavers
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include "windows_media_speech_private.h"
+
+WINE_DEFAULT_DEBUG_CHANNEL(speech);
+
+/*
+ *
+ * IVectorView_VoiceInformation
+ *
+ */
+
+struct voice_information_vector
+{
+    IVectorView_VoiceInformation IVectorView_VoiceInformation_iface;
+    LONG ref;
+};
+
+static inline struct voice_information_vector *impl_from_IVectorView_VoiceInformation(IVectorView_VoiceInformation *iface)
+{
+    return CONTAINING_RECORD(iface, struct voice_information_vector, IVectorView_VoiceInformation_iface);
+}
+
+static HRESULT STDMETHODCALLTYPE vector_view_voice_information_QueryInterface(
+        IVectorView_VoiceInformation *iface, REFIID iid, void **out)
+{
+    TRACE("iface %p, iid %s, out %p stub!\n", iface, debugstr_guid(iid), out);
+
+    if (IsEqualGUID(iid, &IID_IUnknown) ||
+        IsEqualGUID(iid, &IID_IInspectable) ||
+        IsEqualGUID(iid, &IID_IVectorView_VoiceInformation))
+    {
+        IUnknown_AddRef(iface);
+        *out = iface;
+        return S_OK;
+    }
+
+    WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(iid));
+    *out = NULL;
+    return E_NOINTERFACE;
+}
+
+static ULONG STDMETHODCALLTYPE vector_view_voice_information_AddRef(
+        IVectorView_VoiceInformation *iface)
+{
+    struct voice_information_vector *impl = impl_from_IVectorView_VoiceInformation(iface);
+    ULONG ref = InterlockedIncrement(&impl->ref);
+    TRACE("iface %p, ref %u.\n", iface, ref);
+    return ref;
+}
+
+static ULONG STDMETHODCALLTYPE vector_view_voice_information_Release(
+        IVectorView_VoiceInformation *iface)
+{
+    struct voice_information_vector *impl = impl_from_IVectorView_VoiceInformation(iface);
+    ULONG ref = InterlockedDecrement(&impl->ref);
+    TRACE("iface %p, ref %u.\n", iface, ref);
+    return ref;
+}
+
+static HRESULT STDMETHODCALLTYPE vector_view_voice_information_GetIids(
+        IVectorView_VoiceInformation *iface, ULONG *iid_count, IID **iids)
+{
+    FIXME("iface %p, iid_count %p, iids %p stub!\n", iface, iid_count, iids);
+    return E_NOTIMPL;
+}
+
+static HRESULT STDMETHODCALLTYPE vector_view_voice_information_GetRuntimeClassName(
+        IVectorView_VoiceInformation *iface, HSTRING *class_name)
+{
+    FIXME("iface %p, class_name %p stub!\n", iface, class_name);
+    return E_NOTIMPL;
+}
+
+static HRESULT STDMETHODCALLTYPE vector_view_voice_information_GetTrustLevel(
+        IVectorView_VoiceInformation *iface, TrustLevel *trust_level)
+{
+    FIXME("iface %p, trust_level %p stub!\n", iface, trust_level);
+    return E_NOTIMPL;
+}
+
+static HRESULT STDMETHODCALLTYPE vector_view_voice_information_GetAt(
+        IVectorView_VoiceInformation *iface, UINT32 index, IVoiceInformation **value)
+{
+    FIXME("iface %p, index %#x, value %p stub!\n", iface, index, value);
+    *value = NULL;
+    return E_BOUNDS;
+}
+
+static HRESULT STDMETHODCALLTYPE vector_view_voice_information_get_Size(
+        IVectorView_VoiceInformation *iface, UINT32 *value)
+{
+    FIXME("iface %p, value %p stub!\n", iface, value);
+    *value = 0;
+    return S_OK;
+}
+
+static HRESULT STDMETHODCALLTYPE vector_view_voice_information_IndexOf(
+        IVectorView_VoiceInformation *iface, IVoiceInformation *element, UINT32 *index, BOOLEAN *found)
+{
+    FIXME("iface %p, element %p, index %p, found %p stub!\n", iface, element, index, found);
+    *index = 0;
+    *found = FALSE;
+    return S_OK;
+}
+
+static HRESULT STDMETHODCALLTYPE vector_view_voice_information_GetMany(
+        IVectorView_VoiceInformation *iface, UINT32 start_index,
+        UINT32 items_size, IVoiceInformation **items, UINT *value)
+{
+    FIXME("iface %p, start_index %#x, items %p, value %p stub!\n", iface, start_index, items, value);
+    *value = 0;
+    return S_OK;
+}
+
+static const struct IVectorView_VoiceInformationVtbl vector_view_voice_information_vtbl =
+{
+    vector_view_voice_information_QueryInterface,
+    vector_view_voice_information_AddRef,
+    vector_view_voice_information_Release,
+    /* IInspectable methods */
+    vector_view_voice_information_GetIids,
+    vector_view_voice_information_GetRuntimeClassName,
+    vector_view_voice_information_GetTrustLevel,
+    /* IVectorView<VoiceInformation> methods */
+    vector_view_voice_information_GetAt,
+    vector_view_voice_information_get_Size,
+    vector_view_voice_information_IndexOf,
+    vector_view_voice_information_GetMany,
+};
+
+static struct voice_information_vector all_voices =
+{
+    {&vector_view_voice_information_vtbl},
+    0
+};
+
+/*
+ *
+ * IInstalledVoicesStatic
+ *
+ */
+
+static inline struct activation_factory *impl_from_IInstalledVoicesStatic(IInstalledVoicesStatic *iface)
+{
+    return CONTAINING_RECORD(iface, struct activation_factory, IInstalledVoicesStatic_iface);
+}
+
+static HRESULT STDMETHODCALLTYPE installed_voices_static_QueryInterface(
+        IInstalledVoicesStatic *iface, REFIID iid, void **out)
+{
+    struct activation_factory *impl = impl_from_IInstalledVoicesStatic(iface);
+
+    TRACE("iface %p, iid %s, out %p.\n", iface, debugstr_guid(iid), out);
+
+    return IActivationFactory_QueryInterface(&impl->IActivationFactory_iface, iid, out);
+}
+
+static ULONG STDMETHODCALLTYPE installed_voices_static_AddRef(
+        IInstalledVoicesStatic *iface)
+{
+    struct activation_factory *impl = impl_from_IInstalledVoicesStatic(iface);
+
+    TRACE("iface %p.\n", iface);
+
+    return IActivationFactory_AddRef(&impl->IActivationFactory_iface);
+}
+
+static ULONG STDMETHODCALLTYPE installed_voices_static_Release(
+        IInstalledVoicesStatic *iface)
+{
+    struct activation_factory *impl = impl_from_IInstalledVoicesStatic(iface);
+
+    TRACE("iface %p.\n", iface);
+
+    return IActivationFactory_Release(&impl->IActivationFactory_iface);
+}
+
+static HRESULT STDMETHODCALLTYPE installed_voices_static_GetIids(
+        IInstalledVoicesStatic *iface, ULONG *iid_count, IID **iids)
+{
+    FIXME("iface %p, iid_count %p, iids %p stub!\n", iface, iid_count, iids);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT STDMETHODCALLTYPE installed_voices_static_GetRuntimeClassName(
+        IInstalledVoicesStatic *iface, HSTRING *class_name)
+{
+    FIXME("iface %p, class_name %p stub!\n", iface, class_name);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT STDMETHODCALLTYPE installed_voices_static_GetTrustLevel(
+        IInstalledVoicesStatic *iface, TrustLevel *trust_level)
+{
+    FIXME("iface %p, trust_level %p stub!\n", iface, trust_level);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT STDMETHODCALLTYPE installed_voices_static_get_AllVoices(
+    IInstalledVoicesStatic *iface, IVectorView_VoiceInformation **value)
+{
+    TRACE("iface %p, value %p.\n", iface, value);
+    *value = &all_voices.IVectorView_VoiceInformation_iface;
+    IVectorView_VoiceInformation_AddRef(*value);
+    return S_OK;
+}
+
+static HRESULT STDMETHODCALLTYPE installed_voices_static_get_DefaultVoice(
+    IInstalledVoicesStatic *iface, IVoiceInformation **value)
+{
+    FIXME("iface %p, value %p stub!\n", iface, value);
+
+    return E_NOTIMPL;
+}
+
+const struct IInstalledVoicesStaticVtbl installed_voices_static_vtbl =
+{
+    installed_voices_static_QueryInterface,
+    installed_voices_static_AddRef,
+    installed_voices_static_Release,
+    /* IInspectable methods */
+    installed_voices_static_GetIids,
+    installed_voices_static_GetRuntimeClassName,
+    installed_voices_static_GetTrustLevel,
+    /* IInstalledVoicesStatic methods */
+    installed_voices_static_get_AllVoices,
+    installed_voices_static_get_DefaultVoice,
+};
+
+/*
+ *
+ * SpeechSynthesizer
+ *
+ */
+
+struct speech_synthesizer
+{
+    ISpeechSynthesizer ISpeechSynthesizer_iface;
+    IClosable IClosable_iface;
+    LONG ref;
+};
+
+/*
+ *
+ * ISpeechSynthesizer
+ *
+ */
+
+static inline struct speech_synthesizer *impl_from_ISpeechSynthesizer(ISpeechSynthesizer *iface)
+{
+    return CONTAINING_RECORD(iface, struct speech_synthesizer, ISpeechSynthesizer_iface);
+}
+
+static HRESULT STDMETHODCALLTYPE speech_synthesizer_QueryInterface(
+        ISpeechSynthesizer *iface, REFIID iid, void **out)
+{
+    struct speech_synthesizer *impl = impl_from_ISpeechSynthesizer(iface);
+
+    TRACE("iface %p, iid %s, out %p stub!\n", iface, debugstr_guid(iid), out);
+
+    if (IsEqualGUID(iid, &IID_IUnknown) ||
+        IsEqualGUID(iid, &IID_IInspectable) ||
+        IsEqualGUID(iid, &IID_ISpeechSynthesizer))
+    {
+        IUnknown_AddRef(iface);
+        *out = iface;
+        return S_OK;
+    }
+
+    if (IsEqualGUID(iid, &IID_IClosable))
+    {
+        IUnknown_AddRef(iface);
+        *out = &impl->IClosable_iface;
+        return S_OK;
+    }
+
+    FIXME("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(iid));
+    *out = NULL;
+    return E_NOINTERFACE;
+}
+
+static ULONG STDMETHODCALLTYPE speech_synthesizer_AddRef(
+        ISpeechSynthesizer *iface)
+{
+    struct speech_synthesizer *impl = impl_from_ISpeechSynthesizer(iface);
+    ULONG ref = InterlockedIncrement(&impl->ref);
+
+    TRACE("iface %p, ref %u.\n", iface, ref);
+
+    return ref;
+}
+
+static ULONG STDMETHODCALLTYPE speech_synthesizer_Release(
+        ISpeechSynthesizer *iface)
+{
+    struct speech_synthesizer *impl = impl_from_ISpeechSynthesizer(iface);
+    ULONG ref = InterlockedDecrement(&impl->ref);
+
+    TRACE("iface %p, ref %u.\n", iface, ref);
+
+    if (!ref)
+        free(impl);
+
+    return ref;
+}
+
+static HRESULT STDMETHODCALLTYPE speech_synthesizer_GetIids(
+        ISpeechSynthesizer *iface, ULONG *iid_count, IID **iids)
+{
+    FIXME("iface %p, iid_count %p, iids %p stub.\n", iface, iid_count, iids);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT STDMETHODCALLTYPE speech_synthesizer_GetRuntimeClassName(
+        ISpeechSynthesizer *iface, HSTRING *class_name)
+{
+    FIXME("iface %p, class_name %p stub.\n", iface, class_name);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT STDMETHODCALLTYPE speech_synthesizer_GetTrustLevel(
+        ISpeechSynthesizer *iface, TrustLevel *trust_level)
+{
+    FIXME("iface %p, trust_level %p stub.\n", iface, trust_level);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT STDMETHODCALLTYPE speech_synthesizer_SynthesizeTextToStreamAsync(ISpeechSynthesizer *iface,
+        HSTRING text, IAsyncOperation_SpeechSynthesisStream **operation)
+{
+    FIXME("iface %p, text %p, operation %p stub.\n", iface, text, operation);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT STDMETHODCALLTYPE speech_synthesizer_SynthesizeSsmlToStreamAsync(ISpeechSynthesizer *iface,
+        HSTRING ssml, IAsyncOperation_SpeechSynthesisStream **operation)
+{
+    FIXME("iface %p, text %p, operation %p stub.\n", iface, ssml, operation);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT STDMETHODCALLTYPE speech_synthesizer_put_Voice(ISpeechSynthesizer *iface, IVoiceInformation *value)
+{
+    FIXME("iface %p, value %p stub.\n", iface, value);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT STDMETHODCALLTYPE speech_synthesizer_get_Voice(ISpeechSynthesizer *iface, IVoiceInformation **value)
+{
+    FIXME("iface %p, value %p stub.\n", iface, value);
+
+    return E_NOTIMPL;
+}
+
+static const struct ISpeechSynthesizerVtbl speech_synthesizer_vtbl =
+{
+    /* IUnknown methods */
+    speech_synthesizer_QueryInterface,
+    speech_synthesizer_AddRef,
+    speech_synthesizer_Release,
+    /* IInspectable methods */
+    speech_synthesizer_GetIids,
+    speech_synthesizer_GetRuntimeClassName,
+    speech_synthesizer_GetTrustLevel,
+    /* ISpeechSynthesizer methods */
+    speech_synthesizer_SynthesizeTextToStreamAsync,
+    speech_synthesizer_SynthesizeSsmlToStreamAsync,
+    speech_synthesizer_put_Voice,
+    speech_synthesizer_get_Voice,
+};
+
+/*
+ *
+ * IClosable
+ *
+ */
+
+static inline struct speech_synthesizer *impl_from_IClosable(IClosable *iface)
+{
+    return CONTAINING_RECORD(iface, struct speech_synthesizer, IClosable_iface);
+}
+
+static HRESULT STDMETHODCALLTYPE closable_QueryInterface(
+        IClosable *iface, REFIID iid, void **out)
+{
+    struct speech_synthesizer *impl = impl_from_IClosable(iface);
+
+    return ISpeechSynthesizer_QueryInterface(&impl->ISpeechSynthesizer_iface, iid, out);
+}
+
+static ULONG STDMETHODCALLTYPE closable_AddRef(
+        IClosable *iface)
+{
+    struct speech_synthesizer *impl = impl_from_IClosable(iface);
+
+    TRACE("iface %p.\n", iface);
+
+    return ISpeechSynthesizer_AddRef(&impl->ISpeechSynthesizer_iface);
+}
+
+static ULONG STDMETHODCALLTYPE closable_Release(
+        IClosable *iface)
+{
+    struct speech_synthesizer *impl = impl_from_IClosable(iface);
+
+    TRACE("iface %p.\n", iface);
+
+    return ISpeechSynthesizer_Release(&impl->ISpeechSynthesizer_iface);
+}
+
+static HRESULT STDMETHODCALLTYPE closable_GetIids(
+        IClosable *iface, ULONG *iid_count, IID **iids)
+{
+    FIXME("iface %p, iid_count %p, iids %p stub.\n", iface, iid_count, iids);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT STDMETHODCALLTYPE closable_GetRuntimeClassName(
+        IClosable *iface, HSTRING *class_name)
+{
+    FIXME("iface %p, class_name %p stub.\n", iface, class_name);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT STDMETHODCALLTYPE closable_GetTrustLevel(
+        IClosable *iface, TrustLevel *trust_level)
+{
+    FIXME("iface %p, trust_level %p stub.\n", iface, trust_level);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT STDMETHODCALLTYPE closable_Close(
+        IClosable *iface)
+{
+    FIXME("iface %p stub.\n", iface);
+
+    return E_NOTIMPL;
+}
+
+static const struct IClosableVtbl closable_vtbl =
+{
+    /* IUnknown methods */
+    closable_QueryInterface,
+    closable_AddRef,
+    closable_Release,
+    /* IInspectable methods */
+    closable_GetIids,
+    closable_GetRuntimeClassName,
+    closable_GetTrustLevel,
+    /* IClosable methods */
+    closable_Close,
+};
+
+HRESULT STDMETHODCALLTYPE speech_synthesizer_create_default(IInspectable **instance)
+{
+    struct speech_synthesizer *impl;
+    HRESULT hr;
+
+    TRACE("instance %p.\n", instance);
+
+    if (!(impl = calloc(1, sizeof(*impl))))
+    {
+        *instance = NULL;
+        return E_OUTOFMEMORY;
+    }
+
+    impl->ISpeechSynthesizer_iface.lpVtbl = &speech_synthesizer_vtbl;
+    impl->IClosable_iface.lpVtbl = &closable_vtbl;
+    impl->ref = 1;
+
+    hr = ISpeechSynthesizer_QueryInterface(&impl->ISpeechSynthesizer_iface, &IID_ISpeechSynthesizer, (void**)instance);
+    ISpeechSynthesizer_Release(&impl->ISpeechSynthesizer_iface);
+
+    return hr;
+}
\ No newline at end of file
diff --git a/dlls/windows.media.speech/windows_media_speech_private.h b/dlls/windows.media.speech/windows_media_speech_private.h
new file mode 100644
index 00000000000..471eb4ef281
--- /dev/null
+++ b/dlls/windows.media.speech/windows_media_speech_private.h
@@ -0,0 +1,84 @@
+/* WinRT Windows.Media.Speech private header
+ *
+ * Copyright 2022 Bernhard Kölbl
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef __WINE_WINDOWS_MEDIA_SPEECH_PRIVATE_H
+#define __WINE_WINDOWS_MEDIA_SPEECH_PRIVATE_H
+
+#include "wine/debug.h"
+#include "wine/heap.h"
+
+#include <stdarg.h>
+
+#define COBJMACROS
+#include "windef.h"
+#include "winbase.h"
+#include "winstring.h"
+#include "objbase.h"
+
+#ifdef WINDOWS_MEDIA_SPEECH_INIT_GUID
+#include "initguid.h"
+#endif
+
+#include "activation.h"
+
+#define WIDL_using_Windows_Foundation
+#define WIDL_using_Windows_Foundation_Collections
+#include "windows.foundation.h"
+#define WIDL_using_Windows_Media_SpeechSynthesis
+#include "windows.media.speechsynthesis.h"
+
+#define IsEqualClassID(classid1, classid2) (!wcscmp(classid1, classid2))
+
+static inline const char *debugstr_hstring(HSTRING hstr)
+{
+    const WCHAR *str;
+    UINT32 len;
+    if (hstr && !((ULONG_PTR)hstr >> 16)) return "(invalid)";
+    str = WindowsGetStringRawBuffer(hstr, &len);
+    return wine_dbgstr_wn(str, len);
+}
+
+/*
+ *
+ * ActivationFactory
+ *
+ */
+
+struct activation_factory
+{
+    /* Factories */
+    IActivationFactory IActivationFactory_iface;
+    /* Static interfaces */
+    IInstalledVoicesStatic IInstalledVoicesStatic_iface;
+    /* Variables */
+    HRESULT (*create_instance)(IInspectable **instance);
+    LONG ref;
+};
+
+/*
+ *
+ * Windows.Media.SpeechSynthesis
+ *
+ */
+
+extern const struct IInstalledVoicesStaticVtbl installed_voices_static_vtbl;
+
+HRESULT STDMETHODCALLTYPE speech_synthesizer_create_default(IInspectable **instance) DECLSPEC_HIDDEN;
+
+#endif
-- 
2.34.1




More information about the wine-devel mailing list