public SkillResponse PlaybackNearlyFinished(AudioSessionAttributes attributes) { if (attributes.EnqueuedToken != -1) { /* * Since AudioPlayer.PlaybackNearlyFinished Directive are prone to be delivered multiple times during the * same audio being played. * If an audio file is already enqueued, exit without enqueuing again. */ return(Speech.GetContinueResponse()); } int enqueueIndex = attributes.Index + 1; // Checking if there are any items to be enqueued. if (enqueueIndex == _feedItems.Count) { if (attributes.Loop) { // Enqueueing the first item since looping is enabled. enqueueIndex = 0; } else { // Nothing to enqueue since reached end of the list and looping is disabled. return(Speech.GetContinueResponse()); } } // Setting attributes to indicate item is enqueued. attributes.EnqueuedToken = attributes.PlayOrder[enqueueIndex]; var expectedPreviousToken = attributes.PlayOrder[attributes.Index].ToString(); attributes.OffsetInMilliseconds = 0; attributes.Index = enqueueIndex; return(Play(attributes, false, expectedPreviousToken)); }
public SkillResponse HandleStateEvent(string state, string @event, AudioSessionAttributes attributes, ILambdaContext context, Request request) { switch (state) { case Constants.States.StartMode: { switch (@event) { case Constants.Events.LaunchRequest: return(LaunchRequest(attributes)); case Constants.Events.PlayAudio: return(PlayAudio(attributes, true)); case Constants.Events.Amazon.HelpIntent: return(Help(attributes)); case Constants.Events.Amazon.StopIntent: return(StopCancel(attributes)); case Constants.Events.Amazon.CancelIntent: return(StopCancel(attributes)); case Constants.Events.SessionEndedRequest: return(SessionEnded(attributes)); case Constants.Events.Unhandled: return(Unhandled(attributes)); default: throw new InvalidOperationException($"Can't handle state {state} event {@event}"); } } case Constants.States.PlayMode: { switch (@event) { case Constants.Events.LaunchRequest: return(LaunchRequest(attributes)); case Constants.Events.PlayAudio: return(PlayAudio(attributes, false)); case Constants.Events.Amazon.NextIntent: return(NextAudio(attributes)); case Constants.Events.Amazon.PreviousIntent: return(PreviousAudio(attributes)); case Constants.Events.Amazon.PauseIntent: return(StopAudio(attributes)); case Constants.Events.Amazon.StopIntent: return(StopAudio(attributes)); case Constants.Events.Amazon.CancelIntent: return(StopAudio(attributes)); case Constants.Events.Amazon.ResumeIntent: return(PlayAudio(attributes, false)); case Constants.Events.Amazon.LoopOnIntent: return(LoopAudio(attributes, true)); case Constants.Events.Amazon.LoopOffIntent: return(LoopAudio(attributes, false)); case Constants.Events.Amazon.ShuffleOnIntent: return(ShuffleAudio(attributes, true)); case Constants.Events.Amazon.ShuffleOffInten: return(ShuffleAudio(attributes, false)); case Constants.Events.Amazon.StartOverIntent: return(StartOverAudio(attributes)); case Constants.Events.Amazon.HelpIntent: return(HelpWhilePlaying(attributes)); case Constants.Events.SessionEndedRequest: return(SessionEnded(attributes)); case Constants.Events.Unhandled: return(UnhandledWhilePlaying(attributes)); // Remote controller handlers case Constants.Events.PlayCommandIssued: return(PlayAudio(attributes, false)); case Constants.Events.PauseCommandIssued: return(StopAudio(attributes)); case Constants.Events.NextCommandIssued: return(NextAudio(attributes)); case Constants.Events.PreviousCommandIssued: return(PreviousAudio(attributes)); // Audio events case Constants.Events.Audio.PlaybackStarted: { attributes.PlaybackFinished = false; attributes.Index = GetIndexFromToken(attributes, ((AudioPlayerRequest)request).Token); return(Speech.GetContinueResponse()); } case Constants.Events.Audio.PlaybackFinished: { attributes.PlaybackFinished = true; attributes.EnqueuedToken = -1; return(Speech.GetContinueResponse()); } case Constants.Events.Audio.PlaybackStopped: { attributes.Index = GetIndexFromToken(attributes, ((AudioPlayerRequest)request).Token); attributes.OffsetInMilliseconds = ((AudioPlayerRequest)request).OffsetInMilliseconds; return(Speech.GetContinueResponse()); } case Constants.Events.Audio.PlaybackNearlyFinished: return(PlaybackNearlyFinishedAudio(attributes)); case Constants.Events.Audio.PlaybackFailed: { _logger.LogLine($"Playback failed: {((AudioPlayerRequest)request).Error}"); return(Speech.GetContinueResponse()); } default: throw new InvalidOperationException($"Can't handle state {state} event {@event}"); } } case Constants.States.ResumeDecisionMode: { switch (@event) { case Constants.Events.LaunchRequest: case Constants.Events.Amazon.HelpIntent: return(Speech.GetAskResponse( $"You were listening to episode {attributes.Index + 1}. Would you like to resume?", "You can say yes to resume or no to play from the top.")); case Constants.Events.Amazon.YesIntent: return(PlayAudio(attributes, false)); case Constants.Events.Amazon.NoIntent: return(StartOverAudio(attributes)); case Constants.Events.Amazon.StopIntent: case Constants.Events.Amazon.CancelIntent: return(StopAudio(attributes)); case Constants.Events.SessionEndedRequest: return(SessionEnded(attributes)); case Constants.Events.Unhandled: return(UnhandledWhilePlaying(attributes)); default: throw new InvalidOperationException($"Can't handle state {state} event {@event}"); } } } throw new InvalidOperationException($"Can't handle state {state} event {@event}"); }