diff --git a/src/services/windows-media-tts.ts b/src/services/windows-media-tts.ts index 496ef8a..c1e0f2a 100644 --- a/src/services/windows-media-tts.ts +++ b/src/services/windows-media-tts.ts @@ -25,16 +25,23 @@ function windowsMediaPreamble(): string { "Add-Type -AssemblyName System.Runtime.WindowsRuntime;", "$null = [Windows.Media.SpeechSynthesis.SpeechSynthesizer, Windows.Media.SpeechSynthesis, ContentType=WindowsRuntime];", "$null = [Windows.Storage.Streams.DataReader, Windows.Storage.Streams, ContentType=WindowsRuntime];", - "$null = [Windows.Foundation.AsyncStatus, Windows.Foundation, ContentType=WindowsRuntime];", "function Await-WinRt($operation) {", - " while ($operation.Status -eq [Windows.Foundation.AsyncStatus]::Started) { Start-Sleep -Milliseconds 10 }", - " if ($operation.Status -eq [Windows.Foundation.AsyncStatus]::Completed) { return $operation.GetResults() }", - " if ($operation.Status -eq [Windows.Foundation.AsyncStatus]::Canceled) { throw 'WinRT async operation canceled.' }", - " if ($operation.Status -eq [Windows.Foundation.AsyncStatus]::Error) {", - " if ($operation.ErrorCode) { throw $operation.ErrorCode }", - " throw 'WinRT async operation failed.'", - " }", - " throw ('Unexpected WinRT async status: ' + [string]$operation.Status)", + " $interfaceType = $operation.GetType().GetInterfaces() | Where-Object {", + " $_.IsGenericType -and $_.GetGenericTypeDefinition().FullName -eq 'Windows.Foundation.IAsyncOperation`1'", + " } | Select-Object -First 1;", + " if (-not $interfaceType) { throw 'IAsyncOperation 인터페이스를 찾지 못했습니다.' }", + " $resultType = $interfaceType.GetGenericArguments()[0];", + " $method = [System.WindowsRuntimeSystemExtensions].GetMethods() | Where-Object {", + " $_.Name -eq 'AsTask' -and", + " $_.IsGenericMethodDefinition -and", + " $_.GetGenericArguments().Count -eq 1 -and", + " $_.GetParameters().Count -eq 1 -and", + " $_.GetParameters()[0].ParameterType.IsGenericType -and", + " $_.GetParameters()[0].ParameterType.GetGenericTypeDefinition().FullName -eq 'Windows.Foundation.IAsyncOperation`1'", + " } | Select-Object -First 1;", + " if (-not $method) { throw 'System.WindowsRuntimeSystemExtensions.AsTask(IAsyncOperation) 를 찾지 못했습니다.' }", + " $task = $method.MakeGenericMethod(@($resultType)).Invoke($null, @($operation));", + " return $task.GetAwaiter().GetResult();", "}", ].join(" "); }