[PATCH 2/5] windows.media.speech: Add SpeechContinousRecognitionSession stub.

Bernhard Kölbl besentv at gmail.com
Wed Mar 16 11:31:01 CDT 2022


Signed-off-by: Bernhard Kölbl <besentv at gmail.com>
---
 dlls/windows.media.speech/recognizer.c | 202 ++++++++++++++++++++++++-
 1 file changed, 197 insertions(+), 5 deletions(-)

diff --git a/dlls/windows.media.speech/recognizer.c b/dlls/windows.media.speech/recognizer.c
index 490493850c8..8819a46d5ba 100644
--- a/dlls/windows.media.speech/recognizer.c
+++ b/dlls/windows.media.speech/recognizer.c
@@ -23,6 +23,189 @@
 
 WINE_DEFAULT_DEBUG_CHANNEL(speech);
 
+/*
+ *
+ * SpeechContinuousRecognitionSession
+ *
+ */
+
+struct session
+{
+    ISpeechContinuousRecognitionSession ISpeechContinuousRecognitionSession_iface;
+    LONG ref;
+};
+
+/*
+ *
+ * ISpeechContinuousRecognitionSession
+ *
+ */
+
+static inline struct session *impl_from_ISpeechContinuousRecognitionSession( ISpeechContinuousRecognitionSession *iface )
+{
+    return CONTAINING_RECORD(iface, struct session, ISpeechContinuousRecognitionSession_iface);
+}
+
+static HRESULT WINAPI session_QueryInterface( ISpeechContinuousRecognitionSession *iface, REFIID iid, void **out )
+{
+    struct session *impl = impl_from_ISpeechContinuousRecognitionSession(iface);
+
+    TRACE("iface %p, iid %s, out %p.\n", iface, debugstr_guid(iid), out);
+
+    if (IsEqualGUID(iid, &IID_IUnknown) ||
+        IsEqualGUID(iid, &IID_IInspectable) ||
+        IsEqualGUID(iid, &IID_ISpeechContinuousRecognitionSession))
+    {
+        IInspectable_AddRef((*out = &impl->ISpeechContinuousRecognitionSession_iface));
+        return S_OK;
+    }
+
+    WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(iid));
+    *out = NULL;
+    return E_NOINTERFACE;
+}
+
+static ULONG WINAPI session_AddRef( ISpeechContinuousRecognitionSession *iface )
+{
+    struct session *impl = impl_from_ISpeechContinuousRecognitionSession(iface);
+    ULONG ref = InterlockedIncrement(&impl->ref);
+    TRACE("iface %p, ref %lu.\n", iface, ref);
+    return ref;
+}
+
+static ULONG WINAPI session_Release( ISpeechContinuousRecognitionSession *iface )
+{
+    struct session *impl = impl_from_ISpeechContinuousRecognitionSession(iface);
+    ULONG ref = InterlockedDecrement(&impl->ref);
+    TRACE("iface %p, ref %lu.\n", iface, ref);
+
+    if (!ref)
+        free(impl);
+
+    return ref;
+}
+
+static HRESULT WINAPI session_GetIids( ISpeechContinuousRecognitionSession *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 WINAPI session_GetRuntimeClassName( ISpeechContinuousRecognitionSession *iface, HSTRING *class_name )
+{
+    FIXME("iface %p, class_name %p stub!\n", iface, class_name);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI session_GetTrustLevel( ISpeechContinuousRecognitionSession *iface, TrustLevel *trust_level )
+{
+    FIXME("iface %p, trust_level %p stub!\n", iface, trust_level);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI session_get_AutoStopSilenceTimeout( ISpeechContinuousRecognitionSession *iface, TimeSpan *value )
+{
+    FIXME("iface %p, value %p stub!\n", iface, value);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI session_set_AutoStopSilenceTimeout( ISpeechContinuousRecognitionSession *iface, TimeSpan value )
+{
+    FIXME("iface %p, value %#I64x stub!\n", iface, value.Duration);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI session_StartAsync( ISpeechContinuousRecognitionSession *iface, IAsyncAction **action )
+{
+    FIXME("iface %p, action %p semi stub!\n", iface, action);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI session_StartWithModeAsync( ISpeechContinuousRecognitionSession *iface,
+                                                  SpeechContinuousRecognitionMode mode,
+                                                  IAsyncAction **action )
+{
+    FIXME("iface %p, mode %u, action %p stub!\n", iface, mode, action);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI session_StopAsync( ISpeechContinuousRecognitionSession *iface, IAsyncAction **action )
+{
+    FIXME("iface %p, action %p stub!\n", iface, action);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI session_CancelAsync( ISpeechContinuousRecognitionSession *iface, IAsyncAction **action )
+{
+    FIXME("iface %p, action %p stub!\n", iface, action);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI session_PauseAsync( ISpeechContinuousRecognitionSession *iface, IAsyncAction **action )
+{
+    FIXME("iface %p, action %p stub!\n", iface, action);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI session_Resume( ISpeechContinuousRecognitionSession *iface )
+{
+    FIXME("iface %p stub!\n", iface);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI session_add_Completed( ISpeechContinuousRecognitionSession *iface,
+                                             ITypedEventHandler_SpeechContinuousRecognitionSession_SpeechContinuousRecognitionCompletedEventArgs *handler,
+                                             EventRegistrationToken *token )
+{
+    FIXME("iface %p, handler %p, token %p stub!\n", iface, handler, token);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI session_remove_Completed( ISpeechContinuousRecognitionSession *iface, EventRegistrationToken token )
+{
+    FIXME("iface %p, token.value %#I64x stub!\n", iface, token.value);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI session_add_ResultGenerated( ISpeechContinuousRecognitionSession *iface,
+                                                   ITypedEventHandler_SpeechContinuousRecognitionSession_SpeechContinuousRecognitionResultGeneratedEventArgs *handler,
+                                                   EventRegistrationToken *token)
+{
+    FIXME("iface %p, handler %p, token %p stub!\n", iface, handler, token);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI session_remove_ResultGenerated( ISpeechContinuousRecognitionSession *iface, EventRegistrationToken token )
+{
+    FIXME("iface %p, token.value %#I64x stub!\n", iface, token.value);
+    return E_NOTIMPL;
+}
+
+static const struct ISpeechContinuousRecognitionSessionVtbl session_vtbl =
+{
+    /* IUnknown methods */
+    session_QueryInterface,
+    session_AddRef,
+    session_Release,
+    /* IInspectable methods */
+    session_GetIids,
+    session_GetRuntimeClassName,
+    session_GetTrustLevel,
+    /* ISpeechContinuousRecognitionSession methods */
+    session_get_AutoStopSilenceTimeout,
+    session_set_AutoStopSilenceTimeout,
+    session_StartAsync,
+    session_StartWithModeAsync,
+    session_StopAsync,
+    session_CancelAsync,
+    session_PauseAsync,
+    session_Resume,
+    session_add_Completed,
+    session_remove_Completed,
+    session_add_ResultGenerated,
+    session_remove_ResultGenerated
+};
+
 /*
  *
  * SpeechRecognizer
@@ -35,6 +218,8 @@ struct recognizer
     IClosable IClosable_iface;
     ISpeechRecognizer2 ISpeechRecognizer2_iface;
     LONG ref;
+
+    ISpeechContinuousRecognitionSession *session;
 };
 
 /*
@@ -96,7 +281,10 @@ static ULONG WINAPI recognizer_Release( ISpeechRecognizer *iface )
     TRACE("iface %p, ref %lu.\n", iface, ref);
 
     if (!ref)
+    {
+        ISpeechContinuousRecognitionSession_Release(impl->session);
         free(impl);
+    }
 
     return ref;
 }
@@ -433,21 +621,25 @@ DEFINE_IINSPECTABLE(recognizer_factory, ISpeechRecognizerFactory, struct recogni
 static HRESULT WINAPI recognizer_factory_Create( ISpeechRecognizerFactory *iface, ILanguage *language, ISpeechRecognizer **speechrecognizer )
 {
     struct recognizer *impl;
+    struct session *session;
 
     TRACE("iface %p, language %p, speechrecognizer %p.\n", iface, language, speechrecognizer);
 
-    if (!(impl = calloc(1, sizeof(*impl))))
-    {
-        *speechrecognizer = NULL;
-        return E_OUTOFMEMORY;
-    }
+    *speechrecognizer = NULL;
+
+    if (!(impl = calloc(1, sizeof(*impl)))) return E_OUTOFMEMORY;
+    if (!(session = calloc(1, sizeof(*session)))) return E_OUTOFMEMORY;
 
     if (language)
         FIXME("language parameter unused. Stub!\n");
 
+    session->ISpeechContinuousRecognitionSession_iface.lpVtbl = &session_vtbl;
+    session->ref = 1;
+
     impl->ISpeechRecognizer_iface.lpVtbl = &speech_recognizer_vtbl;
     impl->IClosable_iface.lpVtbl = &closable_vtbl;
     impl->ISpeechRecognizer2_iface.lpVtbl = &speech_recognizer2_vtbl;
+    impl->session = &session->ISpeechContinuousRecognitionSession_iface;
     impl->ref = 1;
 
     TRACE("created SpeechRecognizer %p.\n", impl);
-- 
2.35.1




More information about the wine-devel mailing list