<div dir="ltr"><div>Hi Bernard,</div><div><br></div><div>You have been doing windows.media.speech mainly due to Phasmophobia, right? There was an update today: <a href="https://steamcommunity.com/app/739630/eventcomments/3421060714389955228/">https://steamcommunity.com/app/739630/eventcomments/3421060714389955228/</a></div><div><br></div><div>Specifically this excerpt:<br><br><img src="https://cdn.akamai.steamstatic.com/steamcommunity/public/images/clans//37002678/a4008db45959066253d2a1be58100bc42070c2c9.png" style="border: medium none; max-width: 100%; color: rgb(207, 210, 211); font-family: "Motiva Sans", Arial, Helvetica, sans-serif; font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 300; letter-spacing: normal; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; background-color: rgb(37, 40, 46); text-decoration-style: initial; text-decoration-color: initial;"><br style="color:rgb(207,210,211);font-family:"Motiva Sans",Arial,Helvetica,sans-serif;font-size:14px;font-style:normal;font-variant-ligatures:normal;font-variant-caps:normal;font-weight:300;letter-spacing:normal;text-align:left;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(37,40,46);text-decoration-style:initial;text-decoration-color:initial"><br style="color:rgb(207,210,211);font-family:"Motiva Sans",Arial,Helvetica,sans-serif;font-size:14px;font-style:normal;font-variant-ligatures:normal;font-variant-caps:normal;font-weight:300;letter-spacing:normal;text-align:left;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(37,40,46);text-decoration-style:initial;text-decoration-color:initial"><span style="color:rgb(207,210,211);font-family:"Motiva Sans",Arial,Helvetica,sans-serif;font-size:14px;font-style:normal;font-variant-ligatures:normal;font-variant-caps:normal;font-weight:300;letter-spacing:normal;text-align:left;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(37,40,46);text-decoration-style:initial;text-decoration-color:initial;display:inline;float:none">Our Voice recognition system has been completely replaced!</span><br style="color:rgb(207,210,211);font-family:"Motiva Sans",Arial,Helvetica,sans-serif;font-size:14px;font-style:normal;font-variant-ligatures:normal;font-variant-caps:normal;font-weight:300;letter-spacing:normal;text-align:left;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(37,40,46);text-decoration-style:initial;text-decoration-color:initial"><br style="color:rgb(207,210,211);font-family:"Motiva Sans",Arial,Helvetica,sans-serif;font-size:14px;font-style:normal;font-variant-ligatures:normal;font-variant-caps:normal;font-weight:300;letter-spacing:normal;text-align:left;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(37,40,46);text-decoration-style:initial;text-decoration-color:initial"><span style="color:rgb(207,210,211);font-family:"Motiva Sans",Arial,Helvetica,sans-serif;font-size:14px;font-style:normal;font-variant-ligatures:normal;font-variant-caps:normal;font-weight:300;letter-spacing:normal;text-align:left;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(37,40,46);text-decoration-style:initial;text-decoration-color:initial;display:inline;float:none">We are no longer relying on Windows' speech systems, meaning it supports many more languages and platforms, such as ‘GeForce Now’ and Steam Deck, with no setup required (and fixes that pesky tab-out bug).</span><br style="color:rgb(207,210,211);font-family:"Motiva Sans",Arial,Helvetica,sans-serif;font-size:14px;font-style:normal;font-variant-ligatures:normal;font-variant-caps:normal;font-weight:300;letter-spacing:normal;text-align:left;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(37,40,46);text-decoration-style:initial;text-decoration-color:initial"><br style="color:rgb(207,210,211);font-family:"Motiva Sans",Arial,Helvetica,sans-serif;font-size:14px;font-style:normal;font-variant-ligatures:normal;font-variant-caps:normal;font-weight:300;letter-spacing:normal;text-align:left;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(37,40,46);text-decoration-style:initial;text-decoration-color:initial"><ul class="gmail-bbcodes_List_2YF79" style="list-style-type:disc;list-style-position:inside;display:block;color:rgb(207,210,211);font-family:"Motiva Sans",Arial,Helvetica,sans-serif;font-size:14px;font-style:normal;font-variant-ligatures:normal;font-variant-caps:normal;font-weight:300;letter-spacing:normal;text-align:left;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(37,40,46);text-decoration-style:initial;text-decoration-color:initial"><li class="gmail-bbcodes_ListItem_3FrNm" style="list-style-position:outside;margin-bottom:5px">You now only need to set your microphone in-game, instead of your ‘Windows Default Microphone’<br></li><li class="gmail-bbcodes_ListItem_3FrNm" style="list-style-position:outside;margin-bottom:5px">You can now see the input volume of your microphone in the Audio Settings<br></li><li class="gmail-bbcodes_ListItem_3FrNm" style="list-style-position:outside;margin-bottom:5px">Additional microphone input options have been added:<br><ul class="gmail-bbcodes_List_2YF79" style="list-style-type:disc;list-style-position:inside;display:block"><li class="gmail-bbcodes_ListItem_3FrNm" style="list-style-position:outside;margin-bottom:5px">Voice Detector Sensitivity<br></li><li class="gmail-bbcodes_ListItem_3FrNm" style="list-style-position:outside;margin-bottom:5px">Noise Suppression</li></ul><br></li><li class="gmail-bbcodes_ListItem_3FrNm" style="list-style-position:outside;margin-bottom:5px">Due to the new system only working if you are in a server, the voice recognition test has been removed.</li></ul><div>It seems that dknighter (the game main developer) did that for the Steam Deck. I haven't yet tested on my Deck, but did not work on my Arch Linux (maybe an early bug).</div><div><br></div><div>Does that harm your work? Or I'm wrong about Phasmophobia being the main drive behind your massive work?<br></div></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Thu, Jun 9, 2022 at 6:48 PM Bernhard Kölbl <<a href="mailto:wine@gitlab.winehq.org">wine@gitlab.winehq.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">From: Bernhard Kölbl <<a href="mailto:besentv@gmail.com" target="_blank">besentv@gmail.com</a>><br>
<br>
Signed-off-by: Bernhard Kölbl <<a href="mailto:besentv@gmail.com" target="_blank">besentv@gmail.com</a>><br>
---<br>
 dlls/windows.media.speech/tests/speech.c | 80 ++++++++++++++++++++++--<br>
 1 file changed, 76 insertions(+), 4 deletions(-)<br>
<br>
diff --git a/dlls/windows.media.speech/tests/speech.c b/dlls/windows.media.speech/tests/speech.c<br>
index 7c870901de9..9df71e2b6cb 100644<br>
--- a/dlls/windows.media.speech/tests/speech.c<br>
+++ b/dlls/windows.media.speech/tests/speech.c<br>
@@ -779,18 +779,26 @@ static void test_ActivationFactory(void)<br>
<br>
 static void test_SpeechSynthesizer(void)<br>
 {<br>
+    static const WCHAR *simple_ssml = <br>
+    L"<speak version='1.0' xmlns='<a href="http://www.w3.org/2001/10/synthesis" rel="noreferrer" target="_blank">http://www.w3.org/2001/10/synthesis</a>' xml:lang='en-US'>"<br>
+         "Hello, how are you doing today?"<br>
+     "</speak>";<br>
+    static const WCHAR *simple_synth_text = L"Hello, how are you doing today?";<br>
     static const WCHAR *speech_synthesizer_name = L"Windows.Media.SpeechSynthesis.SpeechSynthesizer";<br>
     static const WCHAR *speech_synthesizer_name2 = L"windows.media.speechsynthesis.speechsynthesizer";<br>
     static const WCHAR *unknown_class_name = L"Unknown.Class";<br>
     IActivationFactory *factory = NULL, *factory2 = NULL;<br>
+    IAsyncOperation_SpeechSynthesisStream *operation_ss_stream = NULL;<br>
     IVectorView_VoiceInformation *voices = NULL;<br>
     IInstalledVoicesStatic *voices_static = NULL;<br>
+    ISpeechSynthesisStream *ss_stream = NULL;<br>
     IVoiceInformation *voice;<br>
     IInspectable *inspectable = NULL, *tmp_inspectable = NULL;<br>
     IAgileObject *agile_object = NULL, *tmp_agile_object = NULL;<br>
     ISpeechSynthesizer *synthesizer;<br>
     ISpeechSynthesizer2 *synthesizer2;<br>
     IClosable *closable;<br>
+    struct async_inspectable_handler async_inspectable_handler;<br>
     HMODULE hdll;<br>
     HSTRING str, str2;<br>
     HRESULT hr;<br>
@@ -843,6 +851,7 @@ static void test_SpeechSynthesizer(void)<br>
         FreeLibrary(hdll);<br>
     }<br>
<br>
+    /* Test static Synth ifaces: IActivationFactory, IInstalledVoicesStatic, etc. */<br>
     hr = IActivationFactory_QueryInterface(factory, &IID_IInspectable, (void **)&inspectable);<br>
     ok(hr == S_OK, "IActivationFactory_QueryInterface IID_IInspectable failed, hr %#lx\n", hr);<br>
<br>
@@ -889,11 +898,24 @@ static void test_SpeechSynthesizer(void)<br>
<br>
     IVectorView_VoiceInformation_Release(voices);<br>
<br>
-    IInstalledVoicesStatic_Release(voices_static);<br>
+    hr = IInstalledVoicesStatic_get_DefaultVoice(voices_static, &voice);<br>
+    todo_wine ok(hr == S_OK, "IInstalledVoicesStatic_get_DefaultVoice failed, hr %#lx\n", hr);<br>
+<br>
+    if (hr == S_OK)<br>
+    {<br>
+        IVoiceInformation_get_Description(voice, &str2);<br>
+        trace("SpeechSynthesizer default voice %s.\n", debugstr_hstring(str2));<br>
+<br>
+        WindowsDeleteString(str2);<br>
+        ref = IVoiceInformation_Release(voice);<br>
+        ok(ref == 0, "Got unexpected ref %lu.\n", ref);<br>
+    }<br>
<br>
+    IInstalledVoicesStatic_Release(voices_static);<br>
     IAgileObject_Release(agile_object);<br>
     IInspectable_Release(inspectable);<br>
<br>
+    /* Test Synthesizer */<br>
     hr = IActivationFactory_QueryInterface(factory, &IID_ISpeechSynthesizer, (void **)&synthesizer);<br>
     ok(hr == E_NOINTERFACE, "Got unexpected hr %#lx.\n", hr);<br>
<br>
@@ -903,13 +925,63 @@ static void test_SpeechSynthesizer(void)<br>
     hr = IInspectable_QueryInterface(inspectable, &IID_ISpeechSynthesizer, (void **)&synthesizer);<br>
     ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr);<br>
<br>
+    /* Test SynthesizeTextToStreamAsync */<br>
+    hr = WindowsCreateString(simple_synth_text, wcslen(simple_synth_text), &str);<br>
+    ok(hr == S_OK, "WindowsCreateString failed, hr %#lx\n", hr);<br>
+<br>
+    hr = ISpeechSynthesizer_SynthesizeTextToStreamAsync(synthesizer, str, &operation_ss_stream);<br>
+    todo_wine ok(hr == S_OK, "ISpeechSynthesizer_SynthesizeSsmlToStreamAsync failed, hr %#lx\n", hr);<br>
+    if(FAILED(hr)) goto skip_ss_stream;<br>
+<br>
+    await_async_inspectable((IAsyncOperation_IInspectable *)operation_ss_stream,<br>
+                             &async_inspectable_handler,<br>
+                             &IID_IAsyncOperationCompletedHandler_SpeechSynthesisStream);<br>
+    check_async_info((IInspectable *)operation_ss_stream, 1, Completed, S_OK);<br>
+    check_interface(operation_ss_stream, &IID_IAgileObject, TRUE);<br>
+<br>
+    hr = IAsyncOperation_SpeechSynthesisStream_GetResults(operation_ss_stream, &ss_stream);<br>
+    todo_wine ok(hr == S_OK, "IAsyncOperation_SpeechSynthesisStream_GetResults failed, hr %#lx\n", hr);<br>
+<br>
+    if (hr == S_OK && ss_stream)<br>
+    {<br>
+        ref = ISpeechSynthesisStream_Release(ss_stream);<br>
+        todo_wine ok(ref == 0, "Got unexpected ref %lu.\n", ref);<br>
+    }<br>
+<br>
+    IAsyncOperation_SpeechSynthesisStream_Release(operation_ss_stream);<br>
+    WindowsDeleteString(str);<br>
+<br>
+    /* Test SynthesizeSsmlToStreamAsync */<br>
+    hr = WindowsCreateString(simple_ssml, wcslen(simple_ssml), &str);<br>
+    ok(hr == S_OK, "WindowsCreateString failed, hr %#lx\n", hr);<br>
+<br>
+    hr = ISpeechSynthesizer_SynthesizeSsmlToStreamAsync(synthesizer, str, &operation_ss_stream);<br>
+    todo_wine ok(hr == S_OK, "ISpeechSynthesizer_SynthesizeSsmlToStreamAsync failed, hr %#lx\n", hr);<br>
+    await_async_inspectable((IAsyncOperation_IInspectable *)operation_ss_stream,<br>
+                             &async_inspectable_handler,<br>
+                             &IID_IAsyncOperationCompletedHandler_SpeechSynthesisStream);<br>
+    check_async_info((IInspectable *)operation_ss_stream, 2, Completed, S_OK);<br>
+    check_interface(operation_ss_stream, &IID_IAgileObject, TRUE);<br>
+<br>
+    hr = IAsyncOperation_SpeechSynthesisStream_GetResults(operation_ss_stream, &ss_stream);<br>
+    todo_wine ok(hr == S_OK, "IAsyncOperation_SpeechSynthesisStream_GetResults failed, hr %#lx\n", hr);<br>
+<br>
+    if (hr == S_OK && ss_stream)<br>
+    {<br>
+        ref = ISpeechSynthesisStream_Release(ss_stream);<br>
+        ok(ref == 0, "Got unexpected ref %lu.\n", ref);<br>
+    }<br>
+<br>
+    IAsyncOperation_SpeechSynthesisStream_Release(operation_ss_stream);<br>
+<br>
+skip_ss_stream:<br>
+    WindowsDeleteString(str);<br>
+<br>
     hr = IInspectable_QueryInterface(inspectable, &IID_IClosable, (void **)&closable);<br>
     ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr);<br>
<br>
     hr = IInspectable_QueryInterface(inspectable, &IID_ISpeechSynthesizer2, (void **)&synthesizer2);<br>
-    ok(hr == S_OK ||<br>
-            broken(hr == E_NOINTERFACE), /* requires newer Windows */<br>
-            "Got unexpected hr %#lx.\n", hr);<br>
+    ok(hr == S_OK || broken(hr == E_NOINTERFACE), "Got unexpected hr %#lx.\n", hr); /* Requires Win10 >= 1703 */<br>
<br>
     if (hr == S_OK)<br>
     {<br>
-- <br>
GitLab<br>
<br>
<br>
<a href="https://gitlab.winehq.org/wine/wine/-/merge_requests/217" rel="noreferrer" target="_blank">https://gitlab.winehq.org/wine/wine/-/merge_requests/217</a><br>
<br>
</blockquote></div><br clear="all"><br>-- <br><div dir="ltr" class="gmail_signature"><div dir="ltr"><div>Cláudio "Patola" Sampaio</div><div>Wrocław, Polska<br></div></div></div>