public override bool HandleAction(IPlugInAPI.strTrigActInfo actionInfo) { using (var stopTokenSource = new CancellationTokenSource()) { try { switch (actionInfo.TANumber) { case ActionChromecastCastTANumber: if (actionInfo.DataIn != null) { var action = ObjectSerialize.DeSerializeFromBytes(actionInfo.DataIn) as ChromecastCastAction; if ((action != null) && (action.IsValid())) { if (pluginConfig.Devices.TryGetValue(action.ChromecastDeviceId, out var device)) { using (var combinedStopTokenSource = CancellationTokenSource.CreateLinkedTokenSource(stopTokenSource.Token, ShutdownCancellationToken)) { stopTokenSource.CancelAfter(60 * 1000); var chromecast = new SimpleChromecast(device, new System.Uri(action.Url), action.ContentType, action.Live); chromecast.Play(false, combinedStopTokenSource.Token).Wait(); return(true); } } } } Trace.TraceWarning(Invariant($"Failed to execute action with invalid action")); return(false); default: return(base.HandleAction(actionInfo)); } } catch (TaskCanceledException ex) { if (stopTokenSource.IsCancellationRequested) { Trace.TraceWarning(Invariant($"Failed to execute action with timeout Error: {ex.GetFullMessage()}")); } else { Trace.TraceWarning(Invariant($"Failed to execute action with: {ex.GetFullMessage()}")); } return(false); } catch (Exception ex) { Trace.TraceWarning(Invariant($"Failed to execute action with {ex.GetFullMessage()}")); return(false); } } }
private async Task Speak(string text, IEnumerable <ChromecastDevice> devices) { var stopTokenSource = new CancellationTokenSource(); try { bool isFileName = IsReferingToFile(text); VoiceData voiceData; if (isFileName) { voiceData = await VoiceDataFromFile.LoadFromFile(text, ShutdownCancellationToken).ConfigureAwait(false); } else { var voiceGenerator = new VoiceGenerator(text, pluginConfig.SAPIVoice); voiceData = await voiceGenerator.GenerateVoiceAsWavFile(ShutdownCancellationToken).ConfigureAwait(false); } Trace.WriteLine(Invariant($"Voice for [{text}] is {voiceData.Data.Length} bytes with duration of {voiceData.Duration} of type {voiceData.Extension}")); if (voiceData.Data.Length == 0) { throw new VoiceGenerationException(Invariant($"Data for [{text}] is Zero Bytes. Check Voice Text or File.")); } var uri = await webServerManager.Add(voiceData.Data, voiceData.Extension, voiceData.Duration).ConfigureAwait(false); var combinedStopTokenSource = CancellationTokenSource.CreateLinkedTokenSource(stopTokenSource.Token, ShutdownCancellationToken); TimeSpan timeout = MediaWebServerManager.FileEntryExpiry; if (voiceData.Duration.HasValue) { timeout.Add(voiceData.Duration.Value); } stopTokenSource.CancelAfter(timeout); var playTasks = new List <Task>(); foreach (var device in devices) { var chromecast = new SimpleChromecast(device, uri, duration: voiceData.Duration, volume: device.Volume); playTasks.Add(chromecast.Play(true, combinedStopTokenSource.Token)); } await Task.WhenAll(playTasks.ToArray()).ConfigureAwait(false); } catch (TaskCanceledException ex) { if (stopTokenSource.IsCancellationRequested) { Trace.TraceWarning(Invariant($"Failed to Speak [{text}] With Timeout Error: {ex.GetFullMessage()}")); } else { Trace.TraceWarning(Invariant($"Failed to Speak [{text}] With: {ex.GetFullMessage()}")); } } catch (Exception ex) { Trace.TraceWarning(Invariant($"Failed to Speak [{text}] With: {ex.GetFullMessage()}")); } }