Signed-off-by: Bernhard Kölbl besentv@gmail.com
-- v6: windows.media.speech: Add stub ISpeechSynthesisStream iface. windows.media.speech: Return IAsyncOperation from synthesizer_SynthesizeSsmlToStreamAsync. windows.media.speech: Return IAsyncOperation from synthesizer_SynthesizeTextToStreamAsync. windows.media.speech/tests: Add basic tests for ssml/text to stream functions. windows.media.speech/tests: Handle a possible race condition. windows.media.speech/tests: Remove a useless thread id trace. include/windows.media.speechsynthesis.idl: Update file to newer formatting. include/windows.media.idl: Move IMediaMarker collections from speechsynthesis. include/windows.media.idl: Update file to newer formatting.
From: Bernhard Kölbl besentv@gmail.com
I.e. get rid of nested namespaces and forward declares, separate attributes with commas and right align pointer declarations.
Signed-off-by: Bernhard Kölbl besentv@gmail.com --- include/windows.media.idl | 28 +++++++++++++--------------- 1 file changed, 13 insertions(+), 15 deletions(-)
diff --git a/include/windows.media.idl b/include/windows.media.idl index fe81c768361..1c0b3e82c1d 100644 --- a/include/windows.media.idl +++ b/include/windows.media.idl @@ -23,21 +23,19 @@ import "inspectable.idl"; import "windows.foundation.idl";
-namespace Windows { - namespace Media { - interface IMediaControl; - } -} +namespace Windows.Media +{ + interface IMediaControl;
-namespace Windows { - namespace Media { - [contract(Windows.Foundation.UniversalApiContract, 1.0)] - [uuid(1803def8-dca5-4b6f-9c20-e3d3c0643625)] - interface IMediaMarker : IInspectable - { - [propget] HRESULT Time([out] [retval] Windows.Foundation.TimeSpan* value); - [propget] HRESULT MediaMarkerType([out] [retval] HSTRING* value); - [propget] HRESULT Text([out] [retval] HSTRING* value); - } + [ + contract(Windows.Foundation.UniversalApiContract, 1.0), + uuid(1803def8-dca5-4b6f-9c20-e3d3c0643625) + ] + interface IMediaMarker : IInspectable + { + [propget] HRESULT Time([out, retval] Windows.Foundation.TimeSpan *value); + [propget] HRESULT MediaMarkerType([out, retval] HSTRING *value); + [propget] HRESULT Text([out, retval] HSTRING *value); } + }
From: Bernhard Kölbl besentv@gmail.com
Signed-off-by: Bernhard Kölbl besentv@gmail.com --- include/windows.media.idl | 9 +++++++++ include/windows.media.speechsynthesis.idl | 7 ------- 2 files changed, 9 insertions(+), 7 deletions(-)
diff --git a/include/windows.media.idl b/include/windows.media.idl index 1c0b3e82c1d..2c80e49a92b 100644 --- a/include/windows.media.idl +++ b/include/windows.media.idl @@ -26,6 +26,15 @@ import "windows.foundation.idl"; namespace Windows.Media { interface IMediaControl; + interface IMediaMarker; + + declare + { + interface Windows.Foundation.Collections.IIterable<Windows.Media.IMediaMarker*>; + interface Windows.Foundation.Collections.IIterator<Windows.Media.IMediaMarker*>; + interface Windows.Foundation.Collections.IVectorView<Windows.Media.IMediaMarker*>; + interface Windows.Foundation.Collections.IVector<Windows.Media.IMediaMarker*>; + }
[ contract(Windows.Foundation.UniversalApiContract, 1.0), diff --git a/include/windows.media.speechsynthesis.idl b/include/windows.media.speechsynthesis.idl index b2c86f37137..10fd2f5c897 100644 --- a/include/windows.media.speechsynthesis.idl +++ b/include/windows.media.speechsynthesis.idl @@ -54,12 +54,6 @@ namespace Windows { } }
-namespace Windows { - namespace Media { - interface IMediaMarker; - } -} - namespace Windows { namespace Media { namespace SpeechSynthesis { @@ -67,7 +61,6 @@ namespace Windows { interface Windows.Foundation.Collections.IIterator<Windows.Media.SpeechSynthesis.VoiceInformation*>; interface Windows.Foundation.Collections.IIterable<Windows.Media.SpeechSynthesis.VoiceInformation*>; interface Windows.Foundation.Collections.IVectorView<Windows.Media.SpeechSynthesis.VoiceInformation*>; - interface Windows.Foundation.Collections.IVectorView<Windows.Media.IMediaMarker*>; interface Windows.Foundation.IAsyncOperation<Windows.Media.SpeechSynthesis.SpeechSynthesisStream*>; interface Windows.Foundation.AsyncOperationCompletedHandler<Windows.Media.SpeechSynthesis.SpeechSynthesisStream*>; }
This merge request was approved by Alexandre Julliard.
From: Bernhard Kölbl besentv@gmail.com
I.e. get rid of nested namespaces and forward declares, separate attributes with commas and right align pointer declarations.
Signed-off-by: Bernhard Kölbl besentv@gmail.com --- include/windows.media.speechsynthesis.idl | 305 ++++++++++------------ 1 file changed, 143 insertions(+), 162 deletions(-)
diff --git a/include/windows.media.speechsynthesis.idl b/include/windows.media.speechsynthesis.idl index 10fd2f5c897..c4a0eb06106 100644 --- a/include/windows.media.speechsynthesis.idl +++ b/include/windows.media.speechsynthesis.idl @@ -23,181 +23,162 @@ import "inspectable.idl"; import "windows.foundation.idl"; import "windows.media.idl"; +import "windows.storage.streams.idl";
-namespace Windows { - namespace Foundation { - interface IClosable; - } - namespace Media { - namespace SpeechSynthesis { - typedef enum VoiceGender VoiceGender; - interface IInstalledVoicesStatic; - interface IInstalledVoicesStatic2; - interface ISpeechSynthesizer; - interface ISpeechSynthesizer2; - interface IVoiceInformation; - interface ISpeechSynthesisStream; - runtimeclass SpeechSynthesizer; - runtimeclass VoiceInformation; - runtimeclass SpeechSynthesizerOptions; - runtimeclass SpeechSynthesisStream; - } - } - namespace Storage { - namespace Streams { - interface IRandomAccessStreamWithContentType; - interface IRandomAccessStream; - interface IInputStream; - interface IOutputStream; - interface IContentTypeProvider; - } - } -} +namespace Windows.Media.SpeechSynthesis +{ + typedef enum VoiceGender VoiceGender; + interface IInstalledVoicesStatic; + interface IInstalledVoicesStatic2; + interface ISpeechSynthesizer; + interface ISpeechSynthesizer2; + interface IVoiceInformation; + interface ISpeechSynthesisStream; + runtimeclass SpeechSynthesizer; + runtimeclass VoiceInformation; + runtimeclass SpeechSynthesizerOptions; + runtimeclass SpeechSynthesisStream;
-namespace Windows { - namespace Media { - namespace SpeechSynthesis { - declare { - interface Windows.Foundation.Collections.IIterator<Windows.Media.SpeechSynthesis.VoiceInformation*>; - interface Windows.Foundation.Collections.IIterable<Windows.Media.SpeechSynthesis.VoiceInformation*>; - interface Windows.Foundation.Collections.IVectorView<Windows.Media.SpeechSynthesis.VoiceInformation*>; - interface Windows.Foundation.IAsyncOperation<Windows.Media.SpeechSynthesis.SpeechSynthesisStream*>; - interface Windows.Foundation.AsyncOperationCompletedHandler<Windows.Media.SpeechSynthesis.SpeechSynthesisStream*>; - } - } + declare + { + interface Windows.Foundation.Collections.IIterable<Windows.Media.SpeechSynthesis.VoiceInformation*>; + interface Windows.Foundation.Collections.IIterator<Windows.Media.SpeechSynthesis.VoiceInformation*>; + interface Windows.Foundation.Collections.IVectorView<Windows.Media.SpeechSynthesis.VoiceInformation*>; + interface Windows.Foundation.IAsyncOperation<Windows.Media.SpeechSynthesis.SpeechSynthesisStream*>; + interface Windows.Foundation.AsyncOperationCompletedHandler<Windows.Media.SpeechSynthesis.SpeechSynthesisStream*>; } -}
-namespace Windows { - namespace Media { - namespace SpeechSynthesis { - [contract(Windows.Foundation.UniversalApiContract, 1.0)] - enum VoiceGender - { - Male = 0, - Female = 1 - }; + [ + contract(Windows.Foundation.UniversalApiContract, 1.0) + ] + enum VoiceGender + { + Male = 0, + Female = 1 + };
- [contract(Windows.Foundation.UniversalApiContract, 1.0)] - [exclusiveto(Windows.Media.SpeechSynthesis.SpeechSynthesisStream)] - [uuid(83e46e93-244c-4622-ba0b-6229c4d0d65d)] - interface ISpeechSynthesisStream : IInspectable - requires - Windows.Storage.Streams.IRandomAccessStreamWithContentType, - Windows.Storage.Streams.IRandomAccessStream, - Windows.Foundation.IClosable, - Windows.Storage.Streams.IInputStream, - Windows.Storage.Streams.IOutputStream, - Windows.Storage.Streams.IContentTypeProvider - { - [propget] HRESULT Markers([out] [retval] Windows.Foundation.Collections.IVectorView<Windows.Media.IMediaMarker*>** value); - } + [ + contract(Windows.Foundation.UniversalApiContract, 1.0), + exclusiveto(Windows.Media.SpeechSynthesis.SpeechSynthesisStream), + uuid(83e46e93-244c-4622-ba0b-6229c4d0d65d) + ] + interface ISpeechSynthesisStream : IInspectable + requires + Windows.Storage.Streams.IRandomAccessStreamWithContentType, + Windows.Storage.Streams.IRandomAccessStream, + Windows.Foundation.IClosable, + Windows.Storage.Streams.IInputStream, + Windows.Storage.Streams.IOutputStream, + Windows.Storage.Streams.IContentTypeProvider + { + [propget] HRESULT Markers([out, retval] Windows.Foundation.Collections.IVectorView<Windows.Media.IMediaMarker*> **value); + }
- [ - contract(Windows.Foundation.UniversalApiContract, 1.0), - exclusiveto(Windows.Media.SpeechSynthesis.SpeechSynthesizer), - uuid(ce9f7c76-97f4-4ced-ad68-d51c458e45c6) - ] - interface ISpeechSynthesizer : IInspectable - { - HRESULT SynthesizeTextToStreamAsync([in] HSTRING text, [out] [retval] Windows.Foundation.IAsyncOperation<Windows.Media.SpeechSynthesis.SpeechSynthesisStream*> **operation); - HRESULT SynthesizeSsmlToStreamAsync([in] HSTRING Ssml, [out] [retval] Windows.Foundation.IAsyncOperation<Windows.Media.SpeechSynthesis.SpeechSynthesisStream*> **operation); - [propput] HRESULT Voice([in] VoiceInformation *value); - [propget] HRESULT Voice([out] [retval] VoiceInformation **value); - } + [ + contract(Windows.Foundation.UniversalApiContract, 1.0), + exclusiveto(Windows.Media.SpeechSynthesis.SpeechSynthesizer), + uuid(ce9f7c76-97f4-4ced-ad68-d51c458e45c6) + ] + interface ISpeechSynthesizer : IInspectable + { + HRESULT SynthesizeTextToStreamAsync([in] HSTRING text, [out, retval] Windows.Foundation.IAsyncOperation<Windows.Media.SpeechSynthesis.SpeechSynthesisStream*> **operation); + HRESULT SynthesizeSsmlToStreamAsync([in] HSTRING Ssml, [out, retval] Windows.Foundation.IAsyncOperation<Windows.Media.SpeechSynthesis.SpeechSynthesisStream*> **operation); + [propput] HRESULT Voice([in] VoiceInformation *value); + [propget] HRESULT Voice([out, retval] VoiceInformation **value); + }
- [ - contract(Windows.Foundation.UniversalApiContract, 1.0), - exclusiveto(Windows.Media.SpeechSynthesis.SpeechSynthesizer), - uuid(a7c5ecb2-4339-4d6a-bbf8-c7a4f1544c2e) - ] - interface ISpeechSynthesizer2 : IInspectable - { - [propget] HRESULT Options([out, retval] SpeechSynthesizerOptions **value); - } + [ + contract(Windows.Foundation.UniversalApiContract, 1.0), + exclusiveto(Windows.Media.SpeechSynthesis.SpeechSynthesizer), + uuid(a7c5ecb2-4339-4d6a-bbf8-c7a4f1544c2e) + ] + interface ISpeechSynthesizer2 : IInspectable + { + [propget] HRESULT Options([out, retval] SpeechSynthesizerOptions **value); + }
- [ - contract(Windows.Foundation.UniversalApiContract, 1.0), - exclusiveto(Windows.Media.SpeechSynthesis.VoiceInformation), - uuid(b127d6a4-1291-4604-aa9c-83134083352c) - ] - interface IVoiceInformation : IInspectable - { - [propget] HRESULT DisplayName([out] [retval] HSTRING* value); - [propget] HRESULT Id([out] [retval] HSTRING* value); - [propget] HRESULT Language([out] [retval] HSTRING* value); - [propget] HRESULT Description([out] [retval] HSTRING* value); - [propget] HRESULT Gender([out] [retval] VoiceGender* value); - } + [ + contract(Windows.Foundation.UniversalApiContract, 1.0), + exclusiveto(Windows.Media.SpeechSynthesis.VoiceInformation), + uuid(b127d6a4-1291-4604-aa9c-83134083352c) + ] + interface IVoiceInformation : IInspectable + { + [propget] HRESULT DisplayName([out, retval] HSTRING *value); + [propget] HRESULT Id([out, retval] HSTRING *value); + [propget] HRESULT Language([out, retval] HSTRING *value); + [propget] HRESULT Description([out, retval] HSTRING *value); + [propget] HRESULT Gender([out, retval] VoiceGender *value); + }
- [ - contract(Windows.Foundation.UniversalApiContract, 1.0), - exclusiveto(Windows.Media.SpeechSynthesis.SpeechSynthesizerOptions), - uuid(a0e23871-cc3d-43c9-91b1-ee185324d83d) - ] - interface ISpeechSynthesizerOptions : IInspectable - { - [propget] HRESULT IncludeWordBoundaryMetadata([out, retval] boolean *value); - [propput] HRESULT IncludeWordBoundaryMetadata([in] boolean value); - [propget] HRESULT IncludeSentenceBoundaryMetadata([out, retval] boolean *value); - [propput] HRESULT IncludeSentenceBoundaryMetadata([in] boolean value); - } + [ + contract(Windows.Foundation.UniversalApiContract, 1.0), + exclusiveto(Windows.Media.SpeechSynthesis.SpeechSynthesizerOptions), + uuid(a0e23871-cc3d-43c9-91b1-ee185324d83d) + ] + interface ISpeechSynthesizerOptions : IInspectable + { + [propget] HRESULT IncludeWordBoundaryMetadata([out, retval] boolean *value); + [propput] HRESULT IncludeWordBoundaryMetadata([in] boolean value); + [propget] HRESULT IncludeSentenceBoundaryMetadata([out, retval] boolean *value); + [propput] HRESULT IncludeSentenceBoundaryMetadata([in] boolean value); + }
- [ - contract(Windows.Foundation.UniversalApiContract, 1.0), - exclusiveto(Windows.Media.SpeechSynthesis.SpeechSynthesizer), - uuid(7d526ecc-7533-4c3f-85be-888c2baeebdc) - ] - interface IInstalledVoicesStatic : IInspectable - { - [propget] HRESULT AllVoices([out, retval] Windows.Foundation.Collections.IVectorView<VoiceInformation*>** value); - [propget] HRESULT DefaultVoice([out, retval] VoiceInformation** value); - } + [ + contract(Windows.Foundation.UniversalApiContract, 1.0), + exclusiveto(Windows.Media.SpeechSynthesis.SpeechSynthesizer), + uuid(7d526ecc-7533-4c3f-85be-888c2baeebdc) + ] + interface IInstalledVoicesStatic : IInspectable + { + [propget] HRESULT AllVoices([out, retval] Windows.Foundation.Collections.IVectorView<VoiceInformation*> **value); + [propget] HRESULT DefaultVoice([out, retval] VoiceInformation **value); + }
- [ - contract(Windows.Foundation.UniversalApiContract, 1.0), - marshaling_behavior(agile) - ] - runtimeclass VoiceInformation - { - [default] interface Windows.Media.SpeechSynthesis.IVoiceInformation; - } + [ + contract(Windows.Foundation.UniversalApiContract, 1.0), + marshaling_behavior(agile) + ] + runtimeclass VoiceInformation + { + [default] interface Windows.Media.SpeechSynthesis.IVoiceInformation; + }
- [ - contract(Windows.Foundation.UniversalApiContract, 1.0), - marshaling_behavior(agile) - ] - runtimeclass SpeechSynthesizerOptions - { - [default] interface Windows.Media.SpeechSynthesis.ISpeechSynthesizerOptions; - } + [ + contract(Windows.Foundation.UniversalApiContract, 1.0), + marshaling_behavior(agile) + ] + runtimeclass SpeechSynthesizerOptions + { + [default] interface Windows.Media.SpeechSynthesis.ISpeechSynthesizerOptions; + }
- [contract(Windows.Foundation.UniversalApiContract, 1.0)] - [marshaling_behavior(agile)] - runtimeclass SpeechSynthesisStream - { - [default] interface Windows.Media.SpeechSynthesis.ISpeechSynthesisStream; - interface Windows.Storage.Streams.IRandomAccessStreamWithContentType; - interface Windows.Storage.Streams.IContentTypeProvider; - interface Windows.Storage.Streams.IRandomAccessStream; - interface Windows.Storage.Streams.IOutputStream; - interface Windows.Foundation.IClosable; - interface Windows.Storage.Streams.IInputStream; - } + [ + contract(Windows.Foundation.UniversalApiContract, 1.0), + marshaling_behavior(agile) + ] + runtimeclass SpeechSynthesisStream + { + [default] interface Windows.Media.SpeechSynthesis.ISpeechSynthesisStream; + interface Windows.Storage.Streams.IRandomAccessStreamWithContentType; + interface Windows.Storage.Streams.IContentTypeProvider; + interface Windows.Storage.Streams.IRandomAccessStream; + interface Windows.Storage.Streams.IOutputStream; + interface Windows.Foundation.IClosable; + interface Windows.Storage.Streams.IInputStream; + }
- [ - activatable(Windows.Foundation.UniversalApiContract, 1.0), - contract(Windows.Foundation.UniversalApiContract, 1.0), - marshaling_behavior(agile), - static(Windows.Media.SpeechSynthesis.IInstalledVoicesStatic, Windows.Foundation.UniversalApiContract, 1.0), - static(Windows.Media.SpeechSynthesis.IInstalledVoicesStatic2, Windows.Foundation.UniversalApiContract, 5.0) - ] - runtimeclass SpeechSynthesizer - { - [default] interface Windows.Media.SpeechSynthesis.ISpeechSynthesizer; - interface Windows.Foundation.IClosable; - [contract(Windows.Foundation.UniversalApiContract, 4.0)] interface Windows.Media.SpeechSynthesis.ISpeechSynthesizer2; - } - } + [ + activatable(Windows.Foundation.UniversalApiContract, 1.0), + contract(Windows.Foundation.UniversalApiContract, 1.0), + marshaling_behavior(agile), + static(Windows.Media.SpeechSynthesis.IInstalledVoicesStatic, Windows.Foundation.UniversalApiContract, 1.0), + static(Windows.Media.SpeechSynthesis.IInstalledVoicesStatic2, Windows.Foundation.UniversalApiContract, 5.0) + ] + runtimeclass SpeechSynthesizer + { + [default] interface Windows.Media.SpeechSynthesis.ISpeechSynthesizer; + interface Windows.Foundation.IClosable; + [contract(Windows.Foundation.UniversalApiContract, 4.0)] interface Windows.Media.SpeechSynthesis.ISpeechSynthesizer2; } }
From: Bernhard Kölbl besentv@gmail.com
Signed-off-by: Bernhard Kölbl besentv@gmail.com --- dlls/windows.media.speech/tests/speech.c | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-)
diff --git a/dlls/windows.media.speech/tests/speech.c b/dlls/windows.media.speech/tests/speech.c index 5e74b90bf9a..421819fd10a 100644 --- a/dlls/windows.media.speech/tests/speech.c +++ b/dlls/windows.media.speech/tests/speech.c @@ -331,7 +331,6 @@ struct async_inspectable_handler
HANDLE event_block; HANDLE event_finished; - DWORD thread_id; };
static inline struct async_inspectable_handler *impl_from_IAsyncOperationCompletedHandler_IInspectable( IAsyncOperationCompletedHandler_IInspectable *iface ) @@ -378,9 +377,8 @@ HRESULT WINAPI async_inspectable_handler_Invoke( IAsyncOperationCompletedHandler AsyncStatus status ) { struct async_inspectable_handler *impl = impl_from_IAsyncOperationCompletedHandler_IInspectable(iface); - DWORD id = GetCurrentThreadId(); + trace("Iface %p, sender %p, status %d.\n", iface, sender, status); - trace("Caller thread id %lu callback thread id %lu.\n", impl->thread_id, id);
/* Signal finishing of the handler. */ if (impl->event_finished) SetEvent(impl->event_finished); @@ -1217,7 +1215,6 @@ static void test_SpeechRecognizer(void) async_inspectable_handler_create_static(&compilation_handler, &IID_IAsyncOperationCompletedHandler_SpeechRecognitionCompilationResult); compilation_handler.event_block = CreateEventW(NULL, FALSE, FALSE, NULL); compilation_handler.event_finished = CreateEventW(NULL, FALSE, FALSE, NULL); - compilation_handler.thread_id = GetCurrentThreadId();
ok(!!compilation_handler.event_block, "event_block wasn't created.\n"); ok(!!compilation_handler.event_finished, "event_finished wasn't created.\n");
From: Bernhard Kölbl besentv@gmail.com
Signed-off-by: Bernhard Kölbl besentv@gmail.com --- dlls/windows.media.speech/tests/speech.c | 33 ++++++++++++++---------- 1 file changed, 20 insertions(+), 13 deletions(-)
diff --git a/dlls/windows.media.speech/tests/speech.c b/dlls/windows.media.speech/tests/speech.c index 421819fd10a..9e65f52181b 100644 --- a/dlls/windows.media.speech/tests/speech.c +++ b/dlls/windows.media.speech/tests/speech.c @@ -1122,26 +1122,33 @@ static void test_SpeechRecognizer(void)
compilation_result = (void*)0xdeadbeef; hr = IAsyncOperation_SpeechRecognitionCompilationResult_GetResults(operation, &compilation_result); - ok(hr == E_ILLEGAL_METHOD_CALL, "Got unexpected hr %#lx.\n", hr); - ok(compilation_result == (void*)0xdeadbeef, "Compilation result had value %p.\n", compilation_result); + ok(hr == E_ILLEGAL_METHOD_CALL || hr == S_OK, "Got unexpected hr %#lx.\n", hr);
- await_async_inspectable((IAsyncOperation_IInspectable *)operation, - &compilation_handler, - &IID_IAsyncOperationCompletedHandler_SpeechRecognitionCompilationResult); - check_async_info((IInspectable *)operation, 1, Completed, S_OK); + if (hr == E_ILLEGAL_METHOD_CALL) /* Sometimes the operation could have already finished here, */ + /* if so skip waiting and getting the results a second time. */ + { + ok(compilation_result == (void*)0xdeadbeef, "Compilation result had value %p.\n", compilation_result);
- hr = IAsyncOperation_SpeechRecognitionCompilationResult_put_Completed(operation, NULL); - ok(hr == E_ILLEGAL_DELEGATE_ASSIGNMENT, "Got unexpected hr %#lx.\n", hr); + await_async_inspectable((IAsyncOperation_IInspectable *)operation, + &compilation_handler, + &IID_IAsyncOperationCompletedHandler_SpeechRecognitionCompilationResult);
- hr = IAsyncOperation_SpeechRecognitionCompilationResult_get_Completed(operation, &handler); - ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr); + hr = IAsyncOperation_SpeechRecognitionCompilationResult_put_Completed(operation, NULL); + ok(hr == E_ILLEGAL_DELEGATE_ASSIGNMENT, "Got unexpected hr %#lx.\n", hr);
- compilation_result = (void*)0xdeadbeef; - hr = IAsyncOperation_SpeechRecognitionCompilationResult_GetResults(operation, &compilation_result); - ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr); + hr = IAsyncOperation_SpeechRecognitionCompilationResult_get_Completed(operation, &handler); + ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr);
+ compilation_result = (void*)0xdeadbeef; + hr = IAsyncOperation_SpeechRecognitionCompilationResult_GetResults(operation, &compilation_result); + ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr); + } + + ok(compilation_result != (void*)0xdeadbeef, "Compilation result had value %p.\n", compilation_result); check_interface(compilation_result, &IID_IAgileObject, TRUE);
+ check_async_info((IInspectable *)operation, 1, Completed, S_OK); + hr = ISpeechRecognitionCompilationResult_get_Status(compilation_result, &result_status); ok(hr == S_OK, "ISpeechRecognitionCompilationResult_get_Status failed, hr %#lx.\n", hr); ok(result_status == SpeechRecognitionResultStatus_Success, "Got unexpected status %#x.\n", result_status);
Hi,
It looks like your patch introduced the new failures shown below. Please investigate and fix them if they are indeed new. Note that rare failures and failures with always changing text (e.g. because of memory addresses) can cause false positives. If this is what happened, then fixing those would really help.
The full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=116988
Your paranoid android.
=== debian11 (build log) ===
error: patch failed: include/windows.media.idl:23 error: patch failed: include/windows.media.idl:26 error: patch failed: include/windows.media.speechsynthesis.idl:54 error: patch failed: include/windows.media.speechsynthesis.idl:23 error: patch failed: dlls/windows.media.speech/tests/speech.c:331 error: patch failed: dlls/windows.media.speech/tests/speech.c:1122 Task: Patch failed to apply
From: Bernhard Kölbl besentv@gmail.com
Signed-off-by: Bernhard Kölbl besentv@gmail.com --- dlls/windows.media.speech/tests/speech.c | 129 +++++++++++++++++++++-- 1 file changed, 123 insertions(+), 6 deletions(-)
diff --git a/dlls/windows.media.speech/tests/speech.c b/dlls/windows.media.speech/tests/speech.c index 9e65f52181b..e6f8a32bb80 100644 --- a/dlls/windows.media.speech/tests/speech.c +++ b/dlls/windows.media.speech/tests/speech.c @@ -41,6 +41,7 @@ #define AsyncStatus_Closed 4
#define SPERR_WINRT_INTERNAL_ERROR 0x800455a0 +#define SPERR_WINRT_INCORRECT_FORMAT 0x80131537
#define IHandler_RecognitionResult ITypedEventHandler_SpeechContinuousRecognitionSession_SpeechContinuousRecognitionResultGeneratedEventArgs #define IHandler_RecognitionResultVtbl ITypedEventHandler_SpeechContinuousRecognitionSession_SpeechContinuousRecognitionResultGeneratedEventArgsVtbl @@ -779,18 +780,27 @@ static void test_ActivationFactory(void)
static void test_SpeechSynthesizer(void) { + static const WCHAR *simple_ssml = + L"<speak version='1.0' xmlns='http://www.w3.org/2001/10/synthesis' xml:lang='en-US'>" + "Hello, how are you doing today?" + "</speak>"; + static const WCHAR *simple_synth_text = L"Hello, how are you doing today?"; static const WCHAR *speech_synthesizer_name = L"Windows.Media.SpeechSynthesis.SpeechSynthesizer"; static const WCHAR *speech_synthesizer_name2 = L"windows.media.speechsynthesis.speechsynthesizer"; static const WCHAR *unknown_class_name = L"Unknown.Class"; IActivationFactory *factory = NULL, *factory2 = NULL; + IAsyncOperation_SpeechSynthesisStream *operation_ss_stream = NULL; + IVectorView_IMediaMarker *media_markers = NULL; IVectorView_VoiceInformation *voices = NULL; IInstalledVoicesStatic *voices_static = NULL; + ISpeechSynthesisStream *ss_stream = NULL; IVoiceInformation *voice; IInspectable *inspectable = NULL, *tmp_inspectable = NULL; IAgileObject *agile_object = NULL, *tmp_agile_object = NULL; ISpeechSynthesizer *synthesizer; ISpeechSynthesizer2 *synthesizer2; IClosable *closable; + struct async_inspectable_handler async_inspectable_handler; HMODULE hdll; HSTRING str, str2; HRESULT hr; @@ -843,6 +853,7 @@ static void test_SpeechSynthesizer(void) FreeLibrary(hdll); }
+ /* Test static Synth ifaces: IActivationFactory, IInstalledVoicesStatic, etc. */ hr = IActivationFactory_QueryInterface(factory, &IID_IInspectable, (void **)&inspectable); ok(hr == S_OK, "IActivationFactory_QueryInterface IID_IInspectable failed, hr %#lx\n", hr);
@@ -889,27 +900,135 @@ static void test_SpeechSynthesizer(void)
IVectorView_VoiceInformation_Release(voices);
- IInstalledVoicesStatic_Release(voices_static); + hr = IInstalledVoicesStatic_get_DefaultVoice(voices_static, &voice); + todo_wine ok(hr == S_OK, "IInstalledVoicesStatic_get_DefaultVoice failed, hr %#lx\n", hr); + + if (hr == S_OK) + { + IVoiceInformation_get_Description(voice, &str2); + trace("SpeechSynthesizer default voice %s.\n", debugstr_hstring(str2)); + + WindowsDeleteString(str2); + ref = IVoiceInformation_Release(voice); + ok(ref == 0, "Got unexpected ref %lu.\n", ref); + }
+ IInstalledVoicesStatic_Release(voices_static); IAgileObject_Release(agile_object); IInspectable_Release(inspectable);
+ /* Test Synthesizer */ hr = IActivationFactory_QueryInterface(factory, &IID_ISpeechSynthesizer, (void **)&synthesizer); ok(hr == E_NOINTERFACE, "Got unexpected hr %#lx.\n", hr);
hr = RoActivateInstance(str, &inspectable); ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr); + WindowsDeleteString(str);
hr = IInspectable_QueryInterface(inspectable, &IID_ISpeechSynthesizer, (void **)&synthesizer); ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr);
+ /* Test SynthesizeTextToStreamAsync */ + hr = WindowsCreateString(simple_synth_text, wcslen(simple_synth_text), &str); + ok(hr == S_OK, "WindowsCreateString failed, hr %#lx\n", hr); + + hr = ISpeechSynthesizer_SynthesizeTextToStreamAsync(synthesizer, NULL, &operation_ss_stream); + todo_wine ok(hr == S_OK, "ISpeechSynthesizer_SynthesizeTextToStreamAsync failed, hr %#lx\n", hr); + if(FAILED(hr)) goto skip_ss_stream; + + IAsyncOperation_SpeechSynthesisStream_Release(operation_ss_stream); + + hr = ISpeechSynthesizer_SynthesizeTextToStreamAsync(synthesizer, str, &operation_ss_stream); + todo_wine ok(hr == S_OK, "ISpeechSynthesizer_SynthesizeTextToStreamAsync failed, hr %#lx\n", hr); + + await_async_inspectable((IAsyncOperation_IInspectable *)operation_ss_stream, + &async_inspectable_handler, + &IID_IAsyncOperationCompletedHandler_SpeechSynthesisStream); + check_async_info((IInspectable *)operation_ss_stream, 2, Completed, S_OK); + check_interface(operation_ss_stream, &IID_IAsyncOperation_SpeechSynthesisStream, TRUE); + check_interface(operation_ss_stream, &IID_IAgileObject, TRUE); + + hr = IAsyncOperation_SpeechSynthesisStream_GetResults(operation_ss_stream, &ss_stream); + todo_wine ok(hr == S_OK, "IAsyncOperation_SpeechSynthesisStream_GetResults failed, hr %#lx\n", hr); + + if (hr == S_OK) + { + hr = ISpeechSynthesisStream_get_Markers(ss_stream, &media_markers); + todo_wine ok(hr == S_OK, "ISpeechSynthesisStream_get_Markers failed, hr %#lx\n", hr); + check_interface(media_markers, &IID_IVectorView_IMediaMarker, TRUE); + check_interface(media_markers, &IID_IIterable_IMediaMarker, TRUE); + check_interface(media_markers, &IID_IAgileObject, TRUE); + + ref = IVectorView_IMediaMarker_Release(media_markers); + todo_wine ok(ref == 0, "Got unexpected ref %lu.\n", ref); + + ref = ISpeechSynthesisStream_Release(ss_stream); + todo_wine ok(ref == 0, "Got unexpected ref %lu.\n", ref); + } + + IAsyncOperation_SpeechSynthesisStream_Release(operation_ss_stream); + + /* Test SynthesizeSsmlToStreamAsync */ + hr = WindowsCreateString(simple_ssml, wcslen(simple_ssml), &str2); + ok(hr == S_OK, "WindowsCreateString failed, hr %#lx\n", hr); + + hr = ISpeechSynthesizer_SynthesizeSsmlToStreamAsync(synthesizer, str2, &operation_ss_stream); + todo_wine ok(hr == S_OK, "ISpeechSynthesizer_SynthesizeSsmlToStreamAsync failed, hr %#lx\n", hr); + await_async_inspectable((IAsyncOperation_IInspectable *)operation_ss_stream, + &async_inspectable_handler, + &IID_IAsyncOperationCompletedHandler_SpeechSynthesisStream); + check_async_info((IInspectable *)operation_ss_stream, 3, Completed, S_OK); + check_interface(operation_ss_stream, &IID_IAsyncOperation_SpeechSynthesisStream, TRUE); + check_interface(operation_ss_stream, &IID_IAgileObject, TRUE); + + hr = IAsyncOperation_SpeechSynthesisStream_GetResults(operation_ss_stream, &ss_stream); + todo_wine ok(hr == S_OK, "IAsyncOperation_SpeechSynthesisStream_GetResults failed, hr %#lx\n", hr); + + if (hr == S_OK) + { + check_interface(ss_stream, &IID_ISpeechSynthesisStream, TRUE); + check_interface(ss_stream, &IID_IAgileObject, TRUE); + + ref = ISpeechSynthesisStream_Release(ss_stream); + ok(ref == 0, "Got unexpected ref %lu.\n", ref); + } + + IAsyncOperation_SpeechSynthesisStream_Release(operation_ss_stream); + + operation_ss_stream = (void *)0xdeadbeef; + hr = ISpeechSynthesizer_SynthesizeSsmlToStreamAsync(synthesizer, NULL, &operation_ss_stream); + /* Broken on Win 8 + 8.1 */ + todo_wine ok(hr == S_OK || broken(hr == E_INVALIDARG), "ISpeechSynthesizer_SynthesizeSsmlToStreamAsync failed, hr %#lx\n", hr); + + if (hr == S_OK) + { + todo_wine ok(!!operation_ss_stream, "operation_ss_stream had value %p.\n", operation_ss_stream); + IAsyncOperation_SpeechSynthesisStream_Release(operation_ss_stream); + } + else todo_wine ok(operation_ss_stream == NULL, "operation_ss_stream had value %p.\n", operation_ss_stream); + + operation_ss_stream = (void *)0xdeadbeef; + hr = ISpeechSynthesizer_SynthesizeSsmlToStreamAsync(synthesizer, str, &operation_ss_stream); + /* Broken on Win 8 + 8.1 */ + todo_wine ok(hr == S_OK || broken(hr == SPERR_WINRT_INCORRECT_FORMAT), "ISpeechSynthesizer_SynthesizeSsmlToStreamAsync failed, hr %#lx\n", hr); + + if (hr == S_OK) + { + todo_wine ok(!!operation_ss_stream, "operation_ss_stream had value %p.\n", operation_ss_stream); + IAsyncOperation_SpeechSynthesisStream_Release(operation_ss_stream); + } + else todo_wine ok(operation_ss_stream == NULL, "operation_ss_stream had value %p.\n", operation_ss_stream); + + WindowsDeleteString(str2); + +skip_ss_stream: + WindowsDeleteString(str); + hr = IInspectable_QueryInterface(inspectable, &IID_IClosable, (void **)&closable); ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr);
hr = IInspectable_QueryInterface(inspectable, &IID_ISpeechSynthesizer2, (void **)&synthesizer2); - ok(hr == S_OK || - broken(hr == E_NOINTERFACE), /* requires newer Windows */ - "Got unexpected hr %#lx.\n", hr); + ok(hr == S_OK || broken(hr == E_NOINTERFACE), "Got unexpected hr %#lx.\n", hr); /* Requires Win10 >= 1703 */
if (hr == S_OK) { @@ -927,8 +1046,6 @@ static void test_SpeechSynthesizer(void) ok(!ref, "Got unexpected ref %lu.\n", ref);
IActivationFactory_Release(factory); - WindowsDeleteString(str); - RoUninitialize(); }
Hi,
It looks like your patch introduced the new failures shown below. Please investigate and fix them if they are indeed new. Note that rare failures and failures with always changing text (e.g. because of memory addresses) can cause false positives. If this is what happened, then fixing those would really help.
The full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=116989
Your paranoid android.
=== debian11 (build log) ===
error: patch failed: include/windows.media.idl:23 error: patch failed: include/windows.media.idl:26 error: patch failed: include/windows.media.speechsynthesis.idl:54 error: patch failed: include/windows.media.speechsynthesis.idl:23 error: patch failed: dlls/windows.media.speech/tests/speech.c:331 error: patch failed: dlls/windows.media.speech/tests/speech.c:1122 error: patch failed: dlls/windows.media.speech/tests/speech.c:41 Task: Patch failed to apply
=== debian11 (build log) ===
error: patch failed: include/windows.media.idl:23 error: patch failed: include/windows.media.idl:26 error: patch failed: include/windows.media.speechsynthesis.idl:54 error: patch failed: include/windows.media.speechsynthesis.idl:23 error: patch failed: dlls/windows.media.speech/tests/speech.c:331 error: patch failed: dlls/windows.media.speech/tests/speech.c:1122 error: patch failed: dlls/windows.media.speech/tests/speech.c:41 Task: Patch failed to apply
From: Bernhard Kölbl besentv@gmail.com
Based on a patch by Connor McAdams cmcadams@codeweavers.com
Signed-off-by: Bernhard Kölbl besentv@gmail.com --- dlls/windows.media.speech/synthesizer.c | 8 +++++++- dlls/windows.media.speech/tests/speech.c | 11 +++++------ 2 files changed, 12 insertions(+), 7 deletions(-)
diff --git a/dlls/windows.media.speech/synthesizer.c b/dlls/windows.media.speech/synthesizer.c index e8c9f0a280d..3a77fc62234 100644 --- a/dlls/windows.media.speech/synthesizer.c +++ b/dlls/windows.media.speech/synthesizer.c @@ -241,11 +241,17 @@ static HRESULT WINAPI synthesizer_GetTrustLevel( ISpeechSynthesizer *iface, Trus return E_NOTIMPL; }
+static HRESULT CALLBACK text_to_stream_operation( IInspectable *invoker, IInspectable **result ) +{ + return S_OK; +} + static HRESULT WINAPI synthesizer_SynthesizeTextToStreamAsync( ISpeechSynthesizer *iface, HSTRING text, IAsyncOperation_SpeechSynthesisStream **operation ) { FIXME("iface %p, text %p, operation %p stub.\n", iface, text, operation); - return E_NOTIMPL; + return async_operation_inspectable_create(&IID_IAsyncOperation_SpeechSynthesisStream, NULL, + text_to_stream_operation, (IAsyncOperation_IInspectable **)operation); }
static HRESULT WINAPI synthesizer_SynthesizeSsmlToStreamAsync( ISpeechSynthesizer *iface, HSTRING ssml, diff --git a/dlls/windows.media.speech/tests/speech.c b/dlls/windows.media.speech/tests/speech.c index e6f8a32bb80..c9898b2cc03 100644 --- a/dlls/windows.media.speech/tests/speech.c +++ b/dlls/windows.media.speech/tests/speech.c @@ -933,13 +933,11 @@ static void test_SpeechSynthesizer(void) ok(hr == S_OK, "WindowsCreateString failed, hr %#lx\n", hr);
hr = ISpeechSynthesizer_SynthesizeTextToStreamAsync(synthesizer, NULL, &operation_ss_stream); - todo_wine ok(hr == S_OK, "ISpeechSynthesizer_SynthesizeTextToStreamAsync failed, hr %#lx\n", hr); - if(FAILED(hr)) goto skip_ss_stream; - + ok(hr == S_OK, "ISpeechSynthesizer_SynthesizeTextToStreamAsync failed, hr %#lx\n", hr); IAsyncOperation_SpeechSynthesisStream_Release(operation_ss_stream);
hr = ISpeechSynthesizer_SynthesizeTextToStreamAsync(synthesizer, str, &operation_ss_stream); - todo_wine ok(hr == S_OK, "ISpeechSynthesizer_SynthesizeTextToStreamAsync failed, hr %#lx\n", hr); + ok(hr == S_OK, "ISpeechSynthesizer_SynthesizeTextToStreamAsync failed, hr %#lx\n", hr);
await_async_inspectable((IAsyncOperation_IInspectable *)operation_ss_stream, &async_inspectable_handler, @@ -974,6 +972,8 @@ static void test_SpeechSynthesizer(void)
hr = ISpeechSynthesizer_SynthesizeSsmlToStreamAsync(synthesizer, str2, &operation_ss_stream); todo_wine ok(hr == S_OK, "ISpeechSynthesizer_SynthesizeSsmlToStreamAsync failed, hr %#lx\n", hr); + if(FAILED(hr)) goto skip_ss_stream; + await_async_inspectable((IAsyncOperation_IInspectable *)operation_ss_stream, &async_inspectable_handler, &IID_IAsyncOperationCompletedHandler_SpeechSynthesisStream); @@ -1019,9 +1019,8 @@ static void test_SpeechSynthesizer(void) } else todo_wine ok(operation_ss_stream == NULL, "operation_ss_stream had value %p.\n", operation_ss_stream);
- WindowsDeleteString(str2); - skip_ss_stream: + WindowsDeleteString(str2); WindowsDeleteString(str);
hr = IInspectable_QueryInterface(inspectable, &IID_IClosable, (void **)&closable);
Hi,
It looks like your patch introduced the new failures shown below. Please investigate and fix them if they are indeed new. Note that rare failures and failures with always changing text (e.g. because of memory addresses) can cause false positives. If this is what happened, then fixing those would really help.
The full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=116990
Your paranoid android.
=== debian11 (build log) ===
error: patch failed: include/windows.media.idl:23 error: patch failed: include/windows.media.idl:26 error: patch failed: include/windows.media.speechsynthesis.idl:54 error: patch failed: include/windows.media.speechsynthesis.idl:23 error: patch failed: dlls/windows.media.speech/tests/speech.c:331 error: patch failed: dlls/windows.media.speech/tests/speech.c:1122 error: patch failed: dlls/windows.media.speech/tests/speech.c:41 error: patch failed: dlls/windows.media.speech/synthesizer.c:241 error: patch failed: dlls/windows.media.speech/tests/speech.c:933 Task: Patch failed to apply
=== debian11 (build log) ===
error: patch failed: include/windows.media.idl:23 error: patch failed: include/windows.media.idl:26 error: patch failed: include/windows.media.speechsynthesis.idl:54 error: patch failed: include/windows.media.speechsynthesis.idl:23 error: patch failed: dlls/windows.media.speech/tests/speech.c:331 error: patch failed: dlls/windows.media.speech/tests/speech.c:1122 error: patch failed: dlls/windows.media.speech/tests/speech.c:41 error: patch failed: dlls/windows.media.speech/synthesizer.c:241 error: patch failed: dlls/windows.media.speech/tests/speech.c:933 Task: Patch failed to apply
From: Bernhard Kölbl besentv@gmail.com
Based on a patch by Connor McAdams cmcadams@codeweavers.com
Signed-off-by: Bernhard Kölbl besentv@gmail.com --- dlls/windows.media.speech/synthesizer.c | 8 +++++++- dlls/windows.media.speech/tests/speech.c | 16 +++++++--------- 2 files changed, 14 insertions(+), 10 deletions(-)
diff --git a/dlls/windows.media.speech/synthesizer.c b/dlls/windows.media.speech/synthesizer.c index 3a77fc62234..7e1d19cb4c1 100644 --- a/dlls/windows.media.speech/synthesizer.c +++ b/dlls/windows.media.speech/synthesizer.c @@ -254,11 +254,17 @@ static HRESULT WINAPI synthesizer_SynthesizeTextToStreamAsync( ISpeechSynthesize text_to_stream_operation, (IAsyncOperation_IInspectable **)operation); }
+static HRESULT CALLBACK ssml_to_stream_operation( IInspectable *invoker, IInspectable **result ) +{ + return S_OK; +} + static HRESULT WINAPI synthesizer_SynthesizeSsmlToStreamAsync( ISpeechSynthesizer *iface, HSTRING ssml, IAsyncOperation_SpeechSynthesisStream **operation ) { FIXME("iface %p, text %p, operation %p stub.\n", iface, ssml, operation); - return E_NOTIMPL; + return async_operation_inspectable_create(&IID_IAsyncOperation_SpeechSynthesisStream, NULL, + ssml_to_stream_operation, (IAsyncOperation_IInspectable **)operation); }
static HRESULT WINAPI synthesizer_put_Voice( ISpeechSynthesizer *iface, IVoiceInformation *value ) diff --git a/dlls/windows.media.speech/tests/speech.c b/dlls/windows.media.speech/tests/speech.c index c9898b2cc03..bea3c5104b1 100644 --- a/dlls/windows.media.speech/tests/speech.c +++ b/dlls/windows.media.speech/tests/speech.c @@ -971,8 +971,7 @@ static void test_SpeechSynthesizer(void) ok(hr == S_OK, "WindowsCreateString failed, hr %#lx\n", hr);
hr = ISpeechSynthesizer_SynthesizeSsmlToStreamAsync(synthesizer, str2, &operation_ss_stream); - todo_wine ok(hr == S_OK, "ISpeechSynthesizer_SynthesizeSsmlToStreamAsync failed, hr %#lx\n", hr); - if(FAILED(hr)) goto skip_ss_stream; + ok(hr == S_OK, "ISpeechSynthesizer_SynthesizeSsmlToStreamAsync failed, hr %#lx\n", hr);
await_async_inspectable((IAsyncOperation_IInspectable *)operation_ss_stream, &async_inspectable_handler, @@ -998,28 +997,27 @@ static void test_SpeechSynthesizer(void) operation_ss_stream = (void *)0xdeadbeef; hr = ISpeechSynthesizer_SynthesizeSsmlToStreamAsync(synthesizer, NULL, &operation_ss_stream); /* Broken on Win 8 + 8.1 */ - todo_wine ok(hr == S_OK || broken(hr == E_INVALIDARG), "ISpeechSynthesizer_SynthesizeSsmlToStreamAsync failed, hr %#lx\n", hr); + ok(hr == S_OK || broken(hr == E_INVALIDARG), "ISpeechSynthesizer_SynthesizeSsmlToStreamAsync failed, hr %#lx\n", hr);
if (hr == S_OK) { - todo_wine ok(!!operation_ss_stream, "operation_ss_stream had value %p.\n", operation_ss_stream); + ok(!!operation_ss_stream, "operation_ss_stream had value %p.\n", operation_ss_stream); IAsyncOperation_SpeechSynthesisStream_Release(operation_ss_stream); } - else todo_wine ok(operation_ss_stream == NULL, "operation_ss_stream had value %p.\n", operation_ss_stream); + else ok(operation_ss_stream == NULL, "operation_ss_stream had value %p.\n", operation_ss_stream);
operation_ss_stream = (void *)0xdeadbeef; hr = ISpeechSynthesizer_SynthesizeSsmlToStreamAsync(synthesizer, str, &operation_ss_stream); /* Broken on Win 8 + 8.1 */ - todo_wine ok(hr == S_OK || broken(hr == SPERR_WINRT_INCORRECT_FORMAT), "ISpeechSynthesizer_SynthesizeSsmlToStreamAsync failed, hr %#lx\n", hr); + ok(hr == S_OK || broken(hr == SPERR_WINRT_INCORRECT_FORMAT), "ISpeechSynthesizer_SynthesizeSsmlToStreamAsync failed, hr %#lx\n", hr);
if (hr == S_OK) { - todo_wine ok(!!operation_ss_stream, "operation_ss_stream had value %p.\n", operation_ss_stream); + ok(!!operation_ss_stream, "operation_ss_stream had value %p.\n", operation_ss_stream); IAsyncOperation_SpeechSynthesisStream_Release(operation_ss_stream); } - else todo_wine ok(operation_ss_stream == NULL, "operation_ss_stream had value %p.\n", operation_ss_stream); + else ok(operation_ss_stream == NULL, "operation_ss_stream had value %p.\n", operation_ss_stream);
-skip_ss_stream: WindowsDeleteString(str2); WindowsDeleteString(str);
Hi,
It looks like your patch introduced the new failures shown below. Please investigate and fix them if they are indeed new. Note that rare failures and failures with always changing text (e.g. because of memory addresses) can cause false positives. If this is what happened, then fixing those would really help.
The full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=116991
Your paranoid android.
=== debian11 (build log) ===
error: patch failed: include/windows.media.idl:23 error: patch failed: include/windows.media.idl:26 error: patch failed: include/windows.media.speechsynthesis.idl:54 error: patch failed: include/windows.media.speechsynthesis.idl:23 error: patch failed: dlls/windows.media.speech/tests/speech.c:331 error: patch failed: dlls/windows.media.speech/tests/speech.c:1122 error: patch failed: dlls/windows.media.speech/tests/speech.c:41 error: patch failed: dlls/windows.media.speech/synthesizer.c:241 error: patch failed: dlls/windows.media.speech/tests/speech.c:933 error: patch failed: dlls/windows.media.speech/synthesizer.c:254 error: patch failed: dlls/windows.media.speech/tests/speech.c:971 Task: Patch failed to apply
=== debian11 (build log) ===
error: patch failed: include/windows.media.idl:23 error: patch failed: include/windows.media.idl:26 error: patch failed: include/windows.media.speechsynthesis.idl:54 error: patch failed: include/windows.media.speechsynthesis.idl:23 error: patch failed: dlls/windows.media.speech/tests/speech.c:331 error: patch failed: dlls/windows.media.speech/tests/speech.c:1122 error: patch failed: dlls/windows.media.speech/tests/speech.c:41 error: patch failed: dlls/windows.media.speech/synthesizer.c:241 error: patch failed: dlls/windows.media.speech/tests/speech.c:933 error: patch failed: dlls/windows.media.speech/synthesizer.c:254 error: patch failed: dlls/windows.media.speech/tests/speech.c:971 Task: Patch failed to apply
From: Bernhard Kölbl besentv@gmail.com
Based on a patch by Connor McAdams cmcadams@codeweavers.com
Silences a warning about narrator being broken in Forza Horizon 5.
Signed-off-by: Bernhard Kölbl besentv@gmail.com --- dlls/windows.media.speech/synthesizer.c | 142 ++++++++++++++++++++++- dlls/windows.media.speech/tests/speech.c | 37 +++--- 2 files changed, 153 insertions(+), 26 deletions(-)
diff --git a/dlls/windows.media.speech/synthesizer.c b/dlls/windows.media.speech/synthesizer.c index 7e1d19cb4c1..ce257c7c355 100644 --- a/dlls/windows.media.speech/synthesizer.c +++ b/dlls/windows.media.speech/synthesizer.c @@ -146,6 +146,140 @@ static struct voice_information_vector all_voices = 0 };
+/* + * + * ISpeechSynthesisStream + * + */ + +struct synthesis_stream +{ + ISpeechSynthesisStream ISpeechSynthesisStream_iface; + LONG ref; + + IVector_IMediaMarker *markers; +}; + +static inline struct synthesis_stream *impl_from_ISpeechSynthesisStream( ISpeechSynthesisStream *iface ) +{ + return CONTAINING_RECORD(iface, struct synthesis_stream, ISpeechSynthesisStream_iface); +} + +HRESULT WINAPI synthesis_stream_QueryInterface( ISpeechSynthesisStream *iface, REFIID iid, void **out ) +{ + struct synthesis_stream *impl = impl_from_ISpeechSynthesisStream(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_IAgileObject) || + IsEqualGUID(iid, &IID_ISpeechSynthesisStream)) + { + IInspectable_AddRef((*out = &impl->ISpeechSynthesisStream_iface)); + return S_OK; + } + + FIXME("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(iid)); + *out = NULL; + return E_NOINTERFACE; +} + +ULONG WINAPI synthesis_stream_AddRef( ISpeechSynthesisStream *iface ) +{ + struct synthesis_stream *impl = impl_from_ISpeechSynthesisStream(iface); + ULONG ref = InterlockedIncrement(&impl->ref); + TRACE("iface %p, ref %lu.\n", iface, ref); + return ref; +} + +ULONG WINAPI synthesis_stream_Release( ISpeechSynthesisStream *iface ) +{ + struct synthesis_stream *impl = impl_from_ISpeechSynthesisStream(iface); + ULONG ref = InterlockedDecrement(&impl->ref); + + TRACE("iface %p, ref %lu.\n", iface, ref); + + if (!ref) + free(impl); + + return ref; +} + +HRESULT WINAPI synthesis_stream_GetIids( ISpeechSynthesisStream *iface, ULONG *iid_count, IID **iids ) +{ + FIXME("iface %p, iid_count %p, iids %p stub.\n", iface, iid_count, iids); + return E_NOTIMPL; +} + +HRESULT WINAPI synthesis_stream_GetRuntimeClassName( ISpeechSynthesisStream *iface, HSTRING *class_name ) +{ + FIXME("iface %p, class_name %p stub.\n", iface, class_name); + return E_NOTIMPL; +} + +HRESULT WINAPI synthesis_stream_GetTrustLevel( ISpeechSynthesisStream *iface, TrustLevel *trust_level ) +{ + FIXME("iface %p, trust_level %p stub.\n", iface, trust_level); + return E_NOTIMPL; +} + +HRESULT WINAPI synthesis_stream_get_Markers( ISpeechSynthesisStream *iface, IVectorView_IMediaMarker **value ) +{ + struct synthesis_stream *impl = impl_from_ISpeechSynthesisStream(iface); + FIXME("iface %p, value %p stub!\n", iface, value); + return IVector_IMediaMarker_GetView(impl->markers, value); +} + +static const struct ISpeechSynthesisStreamVtbl synthesis_stream_vtbl = +{ + /* IUnknown methods */ + synthesis_stream_QueryInterface, + synthesis_stream_AddRef, + synthesis_stream_Release, + /* IInspectable methods */ + synthesis_stream_GetIids, + synthesis_stream_GetRuntimeClassName, + synthesis_stream_GetTrustLevel, + /* ISpeechSynthesisStream methods */ + synthesis_stream_get_Markers +}; + + +static HRESULT synthesis_stream_create( ISpeechSynthesisStream **out ) +{ + struct synthesis_stream *impl; + struct vector_iids markers_iids = + { + .iterable = &IID_IIterable_IMediaMarker, + .iterator = &IID_IIterator_IMediaMarker, + .vector = &IID_IVector_IMediaMarker, + .view = &IID_IVectorView_IMediaMarker, + }; + HRESULT hr; + + TRACE("out %p.\n", out); + + if (!(impl = calloc(1, sizeof(*impl)))) + { + *out = NULL; + return E_OUTOFMEMORY; + } + + impl->ISpeechSynthesisStream_iface.lpVtbl = &synthesis_stream_vtbl; + impl->ref = 1; + if (FAILED(hr = vector_inspectable_create(&markers_iids, (IVector_IInspectable**)&impl->markers))) + goto error; + + TRACE("created ISpeechSynthesisStream %p.\n", impl); + *out = &impl->ISpeechSynthesisStream_iface; + return S_OK; + +error: + free(impl); + return hr; +} + /* * * SpeechSynthesizer runtimeclass @@ -243,26 +377,26 @@ static HRESULT WINAPI synthesizer_GetTrustLevel( ISpeechSynthesizer *iface, Trus
static HRESULT CALLBACK text_to_stream_operation( IInspectable *invoker, IInspectable **result ) { - return S_OK; + return synthesis_stream_create((ISpeechSynthesisStream **)result); }
static HRESULT WINAPI synthesizer_SynthesizeTextToStreamAsync( ISpeechSynthesizer *iface, HSTRING text, IAsyncOperation_SpeechSynthesisStream **operation ) { - FIXME("iface %p, text %p, operation %p stub.\n", iface, text, operation); + TRACE("iface %p, text %p, operation %p.\n", iface, text, operation); return async_operation_inspectable_create(&IID_IAsyncOperation_SpeechSynthesisStream, NULL, text_to_stream_operation, (IAsyncOperation_IInspectable **)operation); }
static HRESULT CALLBACK ssml_to_stream_operation( IInspectable *invoker, IInspectable **result ) { - return S_OK; + return synthesis_stream_create((ISpeechSynthesisStream **)result); }
static HRESULT WINAPI synthesizer_SynthesizeSsmlToStreamAsync( ISpeechSynthesizer *iface, HSTRING ssml, IAsyncOperation_SpeechSynthesisStream **operation ) { - FIXME("iface %p, text %p, operation %p stub.\n", iface, ssml, operation); + TRACE("iface %p, ssml %p, operation %p.\n", iface, ssml, operation); return async_operation_inspectable_create(&IID_IAsyncOperation_SpeechSynthesisStream, NULL, ssml_to_stream_operation, (IAsyncOperation_IInspectable **)operation); } diff --git a/dlls/windows.media.speech/tests/speech.c b/dlls/windows.media.speech/tests/speech.c index bea3c5104b1..0d67c8b7cdb 100644 --- a/dlls/windows.media.speech/tests/speech.c +++ b/dlls/windows.media.speech/tests/speech.c @@ -947,22 +947,19 @@ static void test_SpeechSynthesizer(void) check_interface(operation_ss_stream, &IID_IAgileObject, TRUE);
hr = IAsyncOperation_SpeechSynthesisStream_GetResults(operation_ss_stream, &ss_stream); - todo_wine ok(hr == S_OK, "IAsyncOperation_SpeechSynthesisStream_GetResults failed, hr %#lx\n", hr); + ok(hr == S_OK, "IAsyncOperation_SpeechSynthesisStream_GetResults failed, hr %#lx\n", hr);
- if (hr == S_OK) - { - hr = ISpeechSynthesisStream_get_Markers(ss_stream, &media_markers); - todo_wine ok(hr == S_OK, "ISpeechSynthesisStream_get_Markers failed, hr %#lx\n", hr); - check_interface(media_markers, &IID_IVectorView_IMediaMarker, TRUE); - check_interface(media_markers, &IID_IIterable_IMediaMarker, TRUE); - check_interface(media_markers, &IID_IAgileObject, TRUE); + hr = ISpeechSynthesisStream_get_Markers(ss_stream, &media_markers); + ok(hr == S_OK, "ISpeechSynthesisStream_get_Markers failed, hr %#lx\n", hr); + check_interface(media_markers, &IID_IVectorView_IMediaMarker, TRUE); + check_interface(media_markers, &IID_IIterable_IMediaMarker, TRUE); + check_interface(media_markers, &IID_IAgileObject, TRUE);
- ref = IVectorView_IMediaMarker_Release(media_markers); - todo_wine ok(ref == 0, "Got unexpected ref %lu.\n", ref); + ref = IVectorView_IMediaMarker_Release(media_markers); + ok(ref == 0, "Got unexpected ref %lu.\n", ref);
- ref = ISpeechSynthesisStream_Release(ss_stream); - todo_wine ok(ref == 0, "Got unexpected ref %lu.\n", ref); - } + ref = ISpeechSynthesisStream_Release(ss_stream); + ok(ref == 0, "Got unexpected ref %lu.\n", ref);
IAsyncOperation_SpeechSynthesisStream_Release(operation_ss_stream);
@@ -981,16 +978,12 @@ static void test_SpeechSynthesizer(void) check_interface(operation_ss_stream, &IID_IAgileObject, TRUE);
hr = IAsyncOperation_SpeechSynthesisStream_GetResults(operation_ss_stream, &ss_stream); - todo_wine ok(hr == S_OK, "IAsyncOperation_SpeechSynthesisStream_GetResults failed, hr %#lx\n", hr); + ok(hr == S_OK, "IAsyncOperation_SpeechSynthesisStream_GetResults failed, hr %#lx\n", hr); + check_interface(ss_stream, &IID_ISpeechSynthesisStream, TRUE); + check_interface(ss_stream, &IID_IAgileObject, TRUE);
- if (hr == S_OK) - { - check_interface(ss_stream, &IID_ISpeechSynthesisStream, TRUE); - check_interface(ss_stream, &IID_IAgileObject, TRUE); - - ref = ISpeechSynthesisStream_Release(ss_stream); - ok(ref == 0, "Got unexpected ref %lu.\n", ref); - } + ref = ISpeechSynthesisStream_Release(ss_stream); + ok(ref == 0, "Got unexpected ref %lu.\n", ref);
IAsyncOperation_SpeechSynthesisStream_Release(operation_ss_stream);
Hi,
It looks like your patch introduced the new failures shown below. Please investigate and fix them if they are indeed new. Note that rare failures and failures with always changing text (e.g. because of memory addresses) can cause false positives. If this is what happened, then fixing those would really help.
The full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=116992
Your paranoid android.
=== build (build log) ===
error: patch failed: include/windows.media.idl:23 error: patch failed: include/windows.media.idl:26 error: patch failed: include/windows.media.speechsynthesis.idl:54 error: patch failed: include/windows.media.speechsynthesis.idl:23 error: patch failed: dlls/windows.media.speech/tests/speech.c:331 error: patch failed: dlls/windows.media.speech/tests/speech.c:1122 error: patch failed: dlls/windows.media.speech/tests/speech.c:41 error: patch failed: dlls/windows.media.speech/synthesizer.c:241 error: patch failed: dlls/windows.media.speech/tests/speech.c:933 error: patch failed: dlls/windows.media.speech/synthesizer.c:254 error: patch failed: dlls/windows.media.speech/tests/speech.c:971 error: patch failed: dlls/windows.media.speech/synthesizer.c:146 error: patch failed: dlls/windows.media.speech/tests/speech.c:947 Task: Patch failed to apply
=== debian11 (build log) ===
error: patch failed: include/windows.media.idl:23 error: patch failed: include/windows.media.idl:26 error: patch failed: include/windows.media.speechsynthesis.idl:54 error: patch failed: include/windows.media.speechsynthesis.idl:23 error: patch failed: dlls/windows.media.speech/tests/speech.c:331 error: patch failed: dlls/windows.media.speech/tests/speech.c:1122 error: patch failed: dlls/windows.media.speech/tests/speech.c:41 error: patch failed: dlls/windows.media.speech/synthesizer.c:241 error: patch failed: dlls/windows.media.speech/tests/speech.c:933 error: patch failed: dlls/windows.media.speech/synthesizer.c:254 error: patch failed: dlls/windows.media.speech/tests/speech.c:971 error: patch failed: dlls/windows.media.speech/synthesizer.c:146 error: patch failed: dlls/windows.media.speech/tests/speech.c:947 Task: Patch failed to apply
=== debian11 (build log) ===
error: patch failed: include/windows.media.idl:23 error: patch failed: include/windows.media.idl:26 error: patch failed: include/windows.media.speechsynthesis.idl:54 error: patch failed: include/windows.media.speechsynthesis.idl:23 error: patch failed: dlls/windows.media.speech/tests/speech.c:331 error: patch failed: dlls/windows.media.speech/tests/speech.c:1122 error: patch failed: dlls/windows.media.speech/tests/speech.c:41 error: patch failed: dlls/windows.media.speech/synthesizer.c:241 error: patch failed: dlls/windows.media.speech/tests/speech.c:933 error: patch failed: dlls/windows.media.speech/synthesizer.c:254 error: patch failed: dlls/windows.media.speech/tests/speech.c:971 error: patch failed: dlls/windows.media.speech/synthesizer.c:146 error: patch failed: dlls/windows.media.speech/tests/speech.c:947 Task: Patch failed to apply