private void Connector_ActivityReceived(object sender, ActivityReceivedEventArgs e) { var json = e.Activity; var activity = JsonConvert.DeserializeObject <Activity>(json); if (e.HasAudio && activity.Speak != null) { var audio = e.Audio; var stream = new ProducerConsumerStream(); Task.Run(() => { var buffer = new byte[800]; uint bytesRead = 0; while ((bytesRead = audio.Read(buffer)) > 0) { stream.Write(buffer, 0, (int)bytesRead); } }).Wait(); var channelData = activity.GetChannelData <SpeechChannelData>(); var id = channelData?.ConversationalAiData?.RequestInfo?.InteractionId; if (!string.IsNullOrEmpty(id)) { System.Diagnostics.Debug.WriteLine($"Expecting TTS stream {id}"); } var wavStream = new RawSourceWaveStream(stream, new WaveFormat(16000, 16, 1)); this.playbackStreams.Enqueue(new WavQueueEntry(id, false, stream, wavStream)); if (this.player.PlaybackState != PlaybackState.Playing) { Task.Run(() => this.PlayFromAudioQueue()); } } List <AdaptiveCard> cardsToBeRendered = new List <AdaptiveCard>(); if (activity.Attachments?.Any() is true) { cardsToBeRendered = activity.Attachments .Where(x => x.ContentType == AdaptiveCard.ContentType) .Select(x => { try { var parseResult = AdaptiveCard.FromJson(x.Content.ToString()); return(parseResult.Card); } #pragma warning disable CA1031 // Do not catch general exception types catch (Exception ex) { this.ShowException(ex); return(null); } #pragma warning restore CA1031 // Do not catch general exception types }) .Where(x => x != null) .ToList(); } this.RunOnUiThread(() => { this.Activities.Add(new ActivityDisplay(json, activity, Sender.Bot)); if (activity.Type == ActivityTypes.Message || cardsToBeRendered?.Any() == true) { var renderedCards = cardsToBeRendered.Select(x => { var rendered = this.renderer.RenderCard(x); rendered.OnAction += this.RenderedCard_OnAction; rendered.OnMediaClicked += this.RenderedCard_OnMediaClicked; return(rendered?.FrameworkElement); }); this.Messages.Add(new MessageDisplay(activity.Text, Sender.Bot, renderedCards)); this.ConversationView.ConversationHistory.ScrollIntoView(this.ConversationView.ConversationHistory.Items[this.ConversationView.ConversationHistory.Items.Count - 1]); } }); }
public WavQueueEntry(string id, bool playInitiated, ProducerConsumerStream stream, RawSourceWaveStream reader) => (this.Id, this.PlayInitiated, this.Stream, this.Reader) = (id, playInitiated, stream, reader);