Signed-off-by: Bernhard Kölbl besentv@gmail.com
-- v4: 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: Get rid of nested namespaces.
From: Bernhard Kölbl besentv@gmail.com
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..9847b4caabd 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 | 9 +-------- 2 files changed, 10 insertions(+), 8 deletions(-)
diff --git a/include/windows.media.idl b/include/windows.media.idl index 9847b4caabd..2b1cd3cceaf 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..46e61ee31b4 100644 --- a/include/windows.media.speechsynthesis.idl +++ b/include/windows.media.speechsynthesis.idl @@ -54,20 +54,13 @@ namespace Windows { } }
-namespace Windows { - namespace Media { - interface IMediaMarker; - } -} - 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.IIterator<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*>; }
From: Bernhard Kölbl besentv@gmail.com
I.e. no use of nested namespaces and separation of attributes with commas.
Signed-off-by: Bernhard Kölbl besentv@gmail.com --- include/windows.media.speechsynthesis.idl | 332 +++++++++++----------- 1 file changed, 163 insertions(+), 169 deletions(-)
diff --git a/include/windows.media.speechsynthesis.idl b/include/windows.media.speechsynthesis.idl index 46e61ee31b4..00d3d280d9a 100644 --- a/include/windows.media.speechsynthesis.idl +++ b/include/windows.media.speechsynthesis.idl @@ -24,180 +24,174 @@ import "inspectable.idl"; import "windows.foundation.idl"; import "windows.media.idl";
-namespace Windows { - namespace Foundation { - interface IClosable; +namespace Windows.Foundation +{ + interface IClosable; +} + +namespace Windows.Storage.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; + + 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 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; - } + + [ + 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); } - namespace Storage { - namespace Streams { - interface IRandomAccessStreamWithContentType; - interface IRandomAccessStream; - interface IInputStream; - interface IOutputStream; - interface IContentTypeProvider; - } + + [ + 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); } -}
-namespace Windows { - namespace Media { - namespace SpeechSynthesis { - 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*>; - } - } + [ + 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.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), + 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 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; } -}
-namespace Windows { - namespace Media { - namespace SpeechSynthesis { - [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.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.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.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 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; - } - - [ - 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..d6c0c5e1988 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); + + 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);
- await_async_inspectable((IAsyncOperation_IInspectable *)operation, - &compilation_handler, - &IID_IAsyncOperationCompletedHandler_SpeechRecognitionCompilationResult); - check_async_info((IInspectable *)operation, 1, Completed, S_OK); + await_async_inspectable((IAsyncOperation_IInspectable *)operation, + &compilation_handler, + &IID_IAsyncOperationCompletedHandler_SpeechRecognitionCompilationResult);
- hr = IAsyncOperation_SpeechRecognitionCompilationResult_put_Completed(operation, NULL); - ok(hr == E_ILLEGAL_DELEGATE_ASSIGNMENT, "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);
- hr = IAsyncOperation_SpeechRecognitionCompilationResult_get_Completed(operation, &handler); - 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); + 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);
From: Bernhard Kölbl besentv@gmail.com
Signed-off-by: Bernhard Kölbl besentv@gmail.com --- dlls/windows.media.speech/tests/speech.c | 119 +++++++++++++++++++++-- 1 file changed, 113 insertions(+), 6 deletions(-)
diff --git a/dlls/windows.media.speech/tests/speech.c b/dlls/windows.media.speech/tests/speech.c index d6c0c5e1988..c8bf1646080 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,125 @@ 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 && ss_stream) + { + 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 && ss_stream) + { + 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); + todo_wine ok(!!operation_ss_stream || broken(operation_ss_stream == NULL), "operation_ss_stream had value %p.\n", operation_ss_stream); + if (hr == S_OK) IAsyncOperation_SpeechSynthesisStream_Release(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); + todo_wine ok(!!operation_ss_stream || broken(operation_ss_stream == NULL), "operation_ss_stream had value %p.\n", operation_ss_stream); + if (hr == S_OK) IAsyncOperation_SpeechSynthesisStream_Release(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 +1036,6 @@ static void test_SpeechSynthesizer(void) ok(!ref, "Got unexpected ref %lu.\n", ref);
IActivationFactory_Release(factory); - WindowsDeleteString(str); - RoUninitialize(); }
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 c8bf1646080..392a38c27e2 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); @@ -1009,9 +1009,8 @@ static void test_SpeechSynthesizer(void) todo_wine ok(!!operation_ss_stream || broken(operation_ss_stream == NULL), "operation_ss_stream had value %p.\n", operation_ss_stream); if (hr == S_OK) IAsyncOperation_SpeechSynthesisStream_Release(operation_ss_stream);
- WindowsDeleteString(str2); - skip_ss_stream: + WindowsDeleteString(str2); WindowsDeleteString(str);
hr = IInspectable_QueryInterface(inspectable, &IID_IClosable, (void **)&closable);
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 | 12 +++++------- 2 files changed, 12 insertions(+), 8 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 392a38c27e2..d74890d1617 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,18 +997,17 @@ 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); - todo_wine ok(!!operation_ss_stream || broken(operation_ss_stream == NULL), "operation_ss_stream had value %p.\n", operation_ss_stream); + ok(hr == S_OK || broken(hr == E_INVALIDARG), "ISpeechSynthesizer_SynthesizeSsmlToStreamAsync failed, hr %#lx\n", hr); + ok(!!operation_ss_stream || broken(operation_ss_stream == NULL), "operation_ss_stream had value %p.\n", operation_ss_stream); if (hr == S_OK) IAsyncOperation_SpeechSynthesisStream_Release(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); - todo_wine ok(!!operation_ss_stream || broken(operation_ss_stream == NULL), "operation_ss_stream had value %p.\n", operation_ss_stream); + ok(hr == S_OK || broken(hr == SPERR_WINRT_INCORRECT_FORMAT), "ISpeechSynthesizer_SynthesizeSsmlToStreamAsync failed, hr %#lx\n", hr); + ok(!!operation_ss_stream || broken(operation_ss_stream == NULL), "operation_ss_stream had value %p.\n", operation_ss_stream); if (hr == S_OK) IAsyncOperation_SpeechSynthesisStream_Release(operation_ss_stream);
-skip_ss_stream: WindowsDeleteString(str2); WindowsDeleteString(str);
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 d74890d1617..dea4f72f755 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 && ss_stream) - { - 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 && ss_stream) - { - 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);
Rémi Bernon (@rbernon) commented about include/windows.media.idl:
[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);
Could you change to right aligned pointers too?
Rémi Bernon (@rbernon) commented about include/windows.media.speechsynthesis.idl:
}
}
-namespace Windows {
- namespace Media {
interface IMediaMarker;
- }
-}
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.IIterator<Windows.Media.SpeechSynthesis.VoiceInformation*>;
This seems unrelated, could be done in next commit.
Rémi Bernon (@rbernon) commented about include/windows.media.speechsynthesis.idl:
-namespace Windows {
- namespace Foundation {
interface IClosable;
+namespace Windows.Foundation +{
- interface IClosable;
+}
+namespace Windows.Storage.Streams +{
- interface IRandomAccessStreamWithContentType;
- interface IRandomAccessStream;
- interface IInputStream;
- interface IOutputStream;
- interface IContentTypeProvider;
+}
I don't think these forward declaration are actually useful, the SDK does it but it's automatically generated. We can and should simply do `import "windows.storage.stream.idl"` instead and remove the forward declarations.
Rémi Bernon (@rbernon) commented about include/windows.media.speechsynthesis.idl:
- [
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);
Same thing here, while you're making style changes you should change `IMediaMarker*>** value` to at least be `IMediaMarker*> **value`.
Rémi Bernon (@rbernon) commented about include/windows.media.speechsynthesis.idl:
- {
[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);
Ditto for the pointer stars.
Rémi Bernon (@rbernon) commented about dlls/windows.media.speech/tests/speech.c:
- {
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);
- todo_wine ok(!!operation_ss_stream || broken(operation_ss_stream == NULL), "operation_ss_stream had value %p.\n", operation_ss_stream);
- if (hr == S_OK) IAsyncOperation_SpeechSynthesisStream_Release(operation_ss_stream);
I think it'd be better with only the `hr` check marked as broken, and putting the second check inside a `if (hr == S_OK) ... else ...`. Otherwise with the two `broken` you can very well have `hr == S_OK` and `operation_ss_stream == NULL` passing the checks.
Rémi Bernon (@rbernon) commented about dlls/windows.media.speech/tests/speech.c:
- 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);
- todo_wine ok(!!operation_ss_stream || broken(operation_ss_stream == NULL), "operation_ss_stream had value %p.\n", operation_ss_stream);
- if (hr == S_OK) IAsyncOperation_SpeechSynthesisStream_Release(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);
- todo_wine ok(!!operation_ss_stream || broken(operation_ss_stream == NULL), "operation_ss_stream had value %p.\n", operation_ss_stream);
- if (hr == S_OK) IAsyncOperation_SpeechSynthesisStream_Release(operation_ss_stream);
Same here.
On Mon Jun 13 19:23:37 2022 +0000, Rémi Bernon wrote:
This seems unrelated, could be done in next commit.
This was more or less an accidental copy and paste error.