Ejemplo n.º 1
0
        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);
                }
            }
        }
Ejemplo n.º 2
0
        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()}"));
            }
        }