protected override void OnUserAction(BackgroundAudioPlayer player, AudioTrack track, UserAction action, object param) { switch (action) { case UserAction.Play: if (PlayState.Playing != player.PlayerState) { player.Play(); } break; case UserAction.Stop: player.Stop(); break; case UserAction.Pause: if (PlayState.Playing == player.PlayerState) { player.Pause(); } break; case UserAction.Rewind: player.Position = player.Position.Subtract(new TimeSpan(0,0,10)); break; case UserAction.FastForward: player.Position = player.Position.Add(new TimeSpan(0,0,10)); break; } NotifyComplete(); }
/// <summary> /// Called when the playstate changes, except for the Error state (see OnError) /// </summary> /// <param name="player">The BackgroundAudioPlayer</param> /// <param name="track">The track playing at the time the playstate changed</param> /// <param name="playState">The new playstate of the player</param> /// <remarks> /// Play State changes cannot be cancelled. They are raised even if the application /// caused the state change itself, assuming the application has opted-in to the callback /// </remarks> protected override void OnPlayStateChanged(BackgroundAudioPlayer player, AudioTrack track, PlayState playState) { switch (playState) { case PlayState.TrackReady: // The track to play is set in the PlayTrack method. player.Volume = 1; player.Play(); break; case PlayState.TrackEnded: try { player.Stop(); } catch (Exception e) { //Console.WriteLine(e); } break; } NotifyComplete(); }
/// <summary> /// Called when the user requests an action using application/system provided UI /// </summary> /// <param name="player">The BackgroundAudioPlayer</param> /// <param name="track">The track playing at the time of the user action</param> /// <param name="action">The action the user has requested</param> /// <param name="param">The data associated with the requested action. /// In the current version this parameter is only for use with the Seek action, /// to indicate the requested position of an audio track</param> /// <remarks> /// User actions do not automatically make any changes in system state; the agent is responsible /// for carrying out the user actions if they are supported. /// /// Call NotifyComplete() only once, after the agent request has been completed, including async callbacks. /// </remarks> protected override void OnUserAction(BackgroundAudioPlayer player, AudioTrack track, UserAction action, object param) { switch (action) { case UserAction.Play: if (player.PlayerState != PlayState.Playing) { player.Play(); } break; case UserAction.Stop: player.Stop(); break; case UserAction.Pause: player.Pause(); break; case UserAction.FastForward: player.FastForward(); break; case UserAction.Rewind: player.Rewind(); break; case UserAction.Seek: player.Position = (TimeSpan)param; break; case UserAction.SkipNext: try { player.Track = GetNextTrack(); } catch (LastTrackException ex) { player.Track = ex.Track; player.Stop(); } break; case UserAction.SkipPrevious: if (player.Position > TimeSpan.FromSeconds(7)) { player.Position = new TimeSpan(0); } else { AudioTrack previousTrack = GetPreviousTrack(); if (previousTrack != null) { player.Track = previousTrack; } } break; } NotifyComplete(); }
/// <summary> /// Called when the user requests an action using application/system provided UI /// </summary> /// <param name="player">The BackgroundAudioPlayer</param> /// <param name="track">The track playing at the time of the user action</param> /// <param name="action">The action the user has requested</param> /// <param name="param"> /// The data associated with the requested action. /// In the current version this parameter is only for use with the Seek action, /// to indicate the requested position of an audio track /// </param> /// <remarks> /// User actions do not automatically make any changes in system state; the agent is responsible /// for carrying out the user actions if they are supported. /// Call NotifyComplete() only once, after the agent request has been completed, including async callbacks. /// </remarks> protected override void OnUserAction(BackgroundAudioPlayer player, AudioTrack track, UserAction action, object param) { Debug.WriteLine("OnUserAction() action " + action); switch (action) { case UserAction.Play: var task = Task.Run((Func<Task>)RunDownload); if (player.PlayerState != PlayState.Playing) player.Play(); task.ContinueWith(t => NotifyComplete()); return; case UserAction.Stop: player.Stop(); break; case UserAction.Pause: player.Pause(); break; case UserAction.FastForward: player.FastForward(); break; case UserAction.Rewind: player.Rewind(); break; case UserAction.Seek: player.Position = (TimeSpan)param; break; case UserAction.SkipNext: player.Track = GetNextTrack(); break; case UserAction.SkipPrevious: var previousTrack = GetPreviousTrack(); if (previousTrack != null) player.Track = previousTrack; break; } NotifyComplete(); }
/// <summary> /// Called when the user requests an action using application/system provided UI /// </summary> /// <param name="player">The BackgroundAudioPlayer</param> /// <param name="track">The track playing at the time of the user action</param> /// <param name="action">The action the user has requested</param> /// <param name="param">The data associated with the requested action. /// In the current version this parameter is only for use with the Seek action, /// to indicate the requested position of an audio track</param> /// <remarks> /// User actions do not automatically make any changes in system state; the agent is responsible /// for carrying out the user actions if they are supported. /// /// Call NotifyComplete() only once, after the agent request has been completed, including async callbacks. /// </remarks> protected override void OnUserAction(BackgroundAudioPlayer player, AudioTrack track, UserAction action, object param) { switch (action) { case UserAction.Play: loadfile(); PlayTrack(player); break; case UserAction.Pause: player.Pause(); break; case UserAction.Stop: player.Stop(); break; case UserAction.SkipPrevious: PlayPreviousTrack(player); break; case UserAction.SkipNext: PlayNextTrack(player); break; case UserAction.Seek: player.Position = (TimeSpan)param; break; } NotifyComplete(); }
/// <summary> /// Called when the user requests an action using application/system provided UI /// </summary> /// <param name="player">The BackgroundAudioPlayer</param> /// <param name="track">The track playing at the time of the user action</param> /// <param name="action">The action the user has requested</param> /// <param name="param">The data associated with the requested action. /// In the current version this parameter is only for use with the Seek action, /// to indicate the requested position of an audio track</param> /// <remarks> /// User actions do not automatically make any changes in system state; the agent is responsible /// for carrying out the user actions if they are supported. /// /// Call NotifyComplete() only once, after the agent request has been completed, including async callbacks. /// </remarks> protected override void OnUserAction(BackgroundAudioPlayer player, AudioTrack track, UserAction action, object param) { switch (action) { case UserAction.Play: try { if (player.PlayerState != PlayState.Playing) { Debug.WriteLine("User.Action: Play"); player.Play(); } } catch (InvalidOperationException e) { Debug.WriteLine("Exception: " + e.Message); } catch (SystemException syse) { Debug.WriteLine("Exception: " + syse.Message); } break; case UserAction.Stop: try { if (player.PlayerState != PlayState.Stopped) { updatePlayposForCurrentEpisode(player); player.Stop(); Debug.WriteLine("User.Action: Stop"); } } catch (Exception e) { Debug.WriteLine("Exception: " + e.Message); } break; case UserAction.Pause: Debug.WriteLine("User.Action: Pause"); try { if (player.PlayerState == PlayState.Playing) { updatePlayposForCurrentEpisode(player); player.Pause(); } } catch (InvalidOperationException e) { Debug.WriteLine("Exception: " + e.Message); } break; case UserAction.Seek: try { if (player.PlayerState == PlayState.Playing) { player.Position = (TimeSpan)param; } } catch (InvalidOperationException e) { Debug.WriteLine("Exception: " + e.Message); } break; case UserAction.SkipNext: Debug.WriteLine("Skip next."); updatePlayposForCurrentEpisode(player); AudioTrack nextTrack = getNextPlaylistTrack(); if (nextTrack == null) { player.Position = (player.Position.TotalSeconds + 30 < player.Track.Duration.TotalSeconds) ? TimeSpan.FromSeconds(player.Position.TotalSeconds + 30) : TimeSpan.FromSeconds(player.Track.Duration.TotalSeconds); } else { player.Track = nextTrack; player.Play(); } break; case UserAction.FastForward: try { Debug.WriteLine("Player fast forward. New position: " + player.Position); player.Position = (player.Position.TotalSeconds + 30 < player.Track.Duration.TotalSeconds) ? TimeSpan.FromSeconds(player.Position.TotalSeconds + 30) : TimeSpan.FromSeconds(player.Track.Duration.TotalSeconds); } catch (Exception) { Debug.WriteLine("Error seeking. Probably seeked passed the end."); } break; case UserAction.SkipPrevious: case UserAction.Rewind: try { player.Position = (player.Position.TotalSeconds - 30 >= 0) ? TimeSpan.FromSeconds(player.Position.TotalSeconds - 30) : TimeSpan.FromSeconds(0); Debug.WriteLine("Player fast forward. New position: " + player.Position); } catch(Exception) { Debug.WriteLine("Error seeking. Probably seeked passed the start."); } break; } NotifyComplete(); }
/// <summary> /// Called when the user requests an action using application/system provided UI /// </summary> /// <param name="player">The BackgroundAudioPlayer</param> /// <param name="track">The track playing at the time of the user action</param> /// <param name="action">The action the user has requested</param> /// <param name="param">The data associated with the requested action. /// In the current version this parameter is only for use with the Seek action, /// to indicate the requested position of an audio track</param> /// <remarks> /// User actions do not automatically make any changes in system state; the agent is responsible /// for carrying out the user actions if they are supported. /// /// Call NotifyComplete() only once, after the agent request has been completed, including async callbacks. /// </remarks> protected override void OnUserAction(BackgroundAudioPlayer player, AudioTrack track, UserAction action, object param) { switch (action) { case UserAction.Play: try { if (player.PlayerState != PlayState.Playing) { Debug.WriteLine("User.Action: Play"); player.Play(); } } catch (InvalidOperationException e) { Debug.WriteLine("Exception: " + e.Message); } catch (SystemException syse) { Debug.WriteLine("Exception: " + syse.Message); } break; case UserAction.Stop: try { if (player.PlayerState != PlayState.Stopped) { updatePlayposForCurrentEpisode(player); player.Stop(); Debug.WriteLine("User.Action: Stop"); } } catch (Exception e) { Debug.WriteLine("Exception: " + e.Message); } break; case UserAction.Pause: Debug.WriteLine("User.Action: Pause"); try { if (player.PlayerState == PlayState.Playing) { updatePlayposForCurrentEpisode(player); player.Pause(); } } catch (InvalidOperationException e) { Debug.WriteLine("Exception: " + e.Message); } break; case UserAction.Seek: try { if (player.PlayerState == PlayState.Playing) { player.Position = (TimeSpan)param; } } catch (InvalidOperationException e) { Debug.WriteLine("Exception: " + e.Message); } break; case UserAction.SkipNext: Debug.WriteLine("Skip next."); updatePlayposForCurrentEpisode(player); AudioTrack nextTrack = getNextPlaylistTrack(); if (nextTrack == null) { player.Position = (player.Position.TotalSeconds + 30 < player.Track.Duration.TotalSeconds) ? TimeSpan.FromSeconds(player.Position.TotalSeconds + 30) : TimeSpan.FromSeconds(player.Track.Duration.TotalSeconds); } else { player.Track = nextTrack; player.Play(); } break; case UserAction.FastForward: try { Debug.WriteLine("Player fast forward. New position: " + player.Position); player.Position = (player.Position.TotalSeconds + 30 < player.Track.Duration.TotalSeconds) ? TimeSpan.FromSeconds(player.Position.TotalSeconds + 30) : TimeSpan.FromSeconds(player.Track.Duration.TotalSeconds); } catch (Exception) { Debug.WriteLine("Error seeking. Probably seeked passed the end."); } break; case UserAction.SkipPrevious: case UserAction.Rewind: try { player.Position = (player.Position.TotalSeconds - 30 >= 0) ? TimeSpan.FromSeconds(player.Position.TotalSeconds - 30) : TimeSpan.FromSeconds(0); Debug.WriteLine("Player fast forward. New position: " + player.Position); } catch (Exception) { Debug.WriteLine("Error seeking. Probably seeked passed the start."); } break; } NotifyComplete(); }
/// <summary> /// Called when the playstate changes, except for the Error state (see OnError) /// </summary> /// <param name="player">The BackgroundAudioPlayer</param> /// <param name="track">The track playing at the time the playstate changed</param> /// <param name="playState">The new playstate of the player</param> /// <remarks> /// Play State changes cannot be cancelled. They are raised even if the application /// caused the state change itself, assuming the application has opted-in to the callback. /// /// Notable playstate events: /// (a) TrackEnded: invoked when the player has no current track. The agent can set the next track. /// (b) TrackReady: an audio track has been set and it is now ready for playack. /// /// Call NotifyComplete() only once, after the agent request has been completed, including async callbacks. /// </remarks> protected override void OnPlayStateChanged(BackgroundAudioPlayer player, AudioTrack track, PlayState playState) { switch (playState) { case PlayState.TrackEnded: player.Stop(); break; case PlayState.TrackReady: player.Play(); break; case PlayState.Shutdown: // TODO: Handle the shutdown state here (e.g. save state) break; case PlayState.Unknown: break; case PlayState.Stopped: break; case PlayState.Paused: player.Pause(); break; case PlayState.Playing: break; case PlayState.BufferingStarted: break; case PlayState.BufferingStopped: break; case PlayState.Rewinding: break; case PlayState.FastForwarding: break; } NotifyComplete(); }
/// <summary> /// Called when the user requests an action using application/system provided UI /// </summary> /// <param name="player">The BackgroundAudioPlayer</param> /// <param name="track">The track playing at the time of the user action</param> /// <param name="action">The action the user has requested</param> /// <param name="param">The data associated with the requested action. /// In the current version this parameter is only for use with the Seek action, /// to indicate the requested position of an audio track</param> /// <remarks> /// User actions do not automatically make any changes in system state; the agent is responsible /// for carrying out the user actions if they are supported. /// /// Call NotifyComplete() only once, after the agent request has been completed, including async callbacks. /// </remarks> protected override void OnUserAction(BackgroundAudioPlayer player, AudioTrack track, UserAction action, object param) { switch (action) { case UserAction.Play: if (player.PlayerState != PlayState.Playing) { player.Play(); } break; case UserAction.Stop: player.Stop(); break; case UserAction.Pause: player.Pause(); break; default: break; } NotifyComplete(); }
/// <summary> /// Called when the user requests an action using system-provided UI and the application has requesed /// notifications of the action /// </summary> /// <param name="player">The BackgroundAudioPlayer</param> /// <param name="track">The track playing at the time of the user action</param> /// <param name="action">The action the user has requested</param> /// <param name="param">The data associated with the requested action. /// In the current version this parameter is only for use with the Seek action, /// to indicate the requested position of an audio track</param> /// <remarks> /// User actions do not automatically make any changes in system state; the agent is responsible /// for carrying out the user actions if they are supported /// </remarks> protected override void OnUserAction(BackgroundAudioPlayer player, AudioTrack track, UserAction action, object param) { switch (action) { case UserAction.FastForward: player.FastForward(); break; case UserAction.Pause: player.Pause(); break; case UserAction.Play: if (player.PlayerState == PlayState.Paused) { player.Play(); } else { Play(player); } break; case UserAction.Rewind: player.Rewind(); break; case UserAction.Seek: player.Position = (TimeSpan)param; break; case UserAction.SkipNext: PlayNext(player); break; case UserAction.SkipPrevious: PlayPrev(player); break; case UserAction.Stop: player.Stop(); break; default: break; } NotifyComplete(); }
/// <summary> /// Called when the user requests an action using application/system provided UI /// </summary> /// <param name="player">The BackgroundAudioPlayer</param> /// <param name="track">The track playing at the time of the user action</param> /// <param name="action">The action the user has requested</param> /// <param name="param">The data associated with the requested action. /// In the current version this parameter is only for use with the Seek action, /// to indicate the requested position of an audio track</param> /// <remarks> /// User actions do not automatically make any changes in system state; the agent is responsible /// for carrying out the user actions if they are supported. /// /// Call NotifyComplete() only once, after the agent request has been completed, including async callbacks. /// </remarks> protected override async void OnUserAction(BackgroundAudioPlayer player, AudioTrack track, UserAction action, object param) { await ConfigureThePlayer(); switch (action) { case UserAction.Play: if (player.PlayerState != PlayState.Playing) { _logger.Info("OnUserAction.Play"); player.Play(); } break; case UserAction.Stop: _logger.Info("OnUserAction.Stop"); player.Stop(); break; case UserAction.Pause: _logger.Info("OnUserAction.Pause"); player.Pause(); break; case UserAction.FastForward: _logger.Info("OnUserAction.FastForward"); player.FastForward(); break; case UserAction.Rewind: _logger.Info("OnUserAction.Rewind"); player.Rewind(); break; case UserAction.Seek: player.Position = (TimeSpan)param; break; case UserAction.SkipNext: _logger.Info("OnUserAction.SkipNext"); var nextTrack = await GetNextTrack(); if (nextTrack != null) { player.Track = nextTrack; } await InformOfPlayingTrack(); break; case UserAction.SkipPrevious: _logger.Info("OnUserAction.SkipPrevious"); var previousTrack = await GetPreviousTrack(); if (previousTrack != null) { player.Track = previousTrack; } await InformOfPlayingTrack(); break; } NotifyComplete(); }
/// <summary> /// Вызывается при запросе пользователем действия с помощью пользовательского интерфейса приложения или системы /// </summary> /// <param name="player">BackgroundAudioPlayer</param> /// <param name="track">Дорожка, воспроизводимая во время действия пользователя</param> /// <param name="action">Действие, запрошенное пользователем</param> /// <param name="param">Данные, связанные с запрошенным действием. /// В текущей версии этот параметр используется только с действием поиска /// для обозначения запрошенного положения в звуковой дорожке</param> /// <remarks> /// Действия пользователя не изменяют автоматически состояние системы; за выполнение действий /// пользователя, если они поддерживаются, отвечает агент. /// /// Вызовите NotifyComplete() только один раз после завершения запроса агента, включая асинхронные обратные вызовы. /// </remarks> protected override void OnUserAction(BackgroundAudioPlayer player, AudioTrack track, UserAction action, object param) { switch (action) { case UserAction.Play: if (player.PlayerState != PlayState.Playing) { List <string> atrack = DeserializeFromIsolatedStorage <List <string> >("podcast.link"); //AudioTrack pcast = new Uri track_url = new Uri(atrack[0], UriKind.Absolute); if (player.Track == null) { AudioTrack podcast = new AudioTrack(track_url, atrack[1], atrack[2], atrack[3], null); player.Track = podcast; } else if (player.Track.Source != track_url) { AudioTrack podcast = new AudioTrack(track_url, atrack[1], atrack[2], atrack[3], null); player.Track = podcast; } player.Play(); break; } break; case UserAction.Stop: player.Stop(); break; case UserAction.Pause: player.Pause(); break; case UserAction.FastForward: player.FastForward(); break; case UserAction.Rewind: player.Rewind(); break; case UserAction.Seek: player.Position = (TimeSpan)param; break; case UserAction.SkipNext: player.Track = GetNextTrack(); break; case UserAction.SkipPrevious: AudioTrack previousTrack = GetPreviousTrack(); if (previousTrack != null) { player.Track = previousTrack; } break; } NotifyComplete(); }
/// <summary> /// Called when the user requests an action using system-provided UI and the application has requesed /// notifications of the action /// </summary> /// <param name="player">The BackgroundAudioPlayer</param> /// <param name="track">The track playing at the time of the user action</param> /// <param name="action">The action the user has requested</param> /// <param name="param">The data associated with the requested action. /// In the current version this parameter is only for use with the Seek action, /// to indicate the requested position of an audio track</param> /// <remarks> /// User actions do not automatically make any changes in system state; the agent is responsible /// for carrying out the user actions if they are supported /// </remarks> protected override void OnUserAction(BackgroundAudioPlayer player, AudioTrack track, UserAction action, object param) { switch (action) { case UserAction.Play: playTrack(player); break; case UserAction.Stop: player.Stop(); break; } NotifyComplete(); }
/// <summary> /// Called when the user requests an action using application/system provided UI /// </summary> /// <param name="player">The BackgroundAudioPlayer</param> /// <param name="track">The track playing at the time of the user action</param> /// <param name="action">The action the user has requested</param> /// <param name="param">The data associated with the requested action. /// In the current version this parameter is only for use with the Seek action, /// to indicate the requested position of an audio track</param> /// <remarks> /// User actions do not automatically make any changes in system state; the agent is responsible /// for carrying out the user actions if they are supported. /// /// Call NotifyComplete() only once, after the agent request has been completed, including async callbacks. /// </remarks> protected override void OnUserAction(BackgroundAudioPlayer player, AudioTrack track, UserAction action, object param) { switch (action) { case UserAction.Play: if (player.PlayerState == PlayState.Paused) PopulatePlaylist(false); else PopulatePlaylist(true); if (currentPlaylist != null && currentPlaylist.Count > 0) { player.Track = currentPlaylist[currentTrackNumber]; } break; case UserAction.Stop: currentPlaylist = null; currentTrackNumber = 0; player.Stop(); break; case UserAction.Pause: player.Pause(); break; case UserAction.FastForward: player.FastForward(); break; case UserAction.Rewind: player.Rewind(); break; case UserAction.Seek: player.Position = (TimeSpan)param; break; case UserAction.SkipNext: if (currentPlaylist != null && currentPlaylist.Count > 0) player.Track = GetNextTrack(); break; case UserAction.SkipPrevious: if (currentPlaylist != null && currentPlaylist.Count > 0) player.Track = GetPreviousTrack(); break; } NotifyComplete(); }
/// <summary> /// Called when the user requests an action using application/system provided UI /// </summary> /// <param name="player">The BackgroundAudioPlayer</param> /// <param name="track">The track playing at the time of the user action</param> /// <param name="action">The action the user has requested</param> /// <param name="param">The data associated with the requested action. /// In the current version this parameter is only for use with the Seek action, /// to indicate the requested position of an audio track</param> /// <remarks> /// User actions do not automatically make any changes in system state; the agent is responsible /// for carrying out the user actions if they are supported. /// /// Call NotifyComplete() only once, after the agent request has been completed, including async callbacks. /// </remarks> protected override void OnUserAction(BackgroundAudioPlayer player, AudioTrack track, UserAction action, object param) { System.Diagnostics.Debug.WriteLine("UserAction player state: "+player.PlayerState); switch (action) { case UserAction.Play: PlayTrack(player); break; case UserAction.Stop: player.Stop(); break; } System.Diagnostics.Debug.WriteLine("Before NOtify. "); NotifyComplete(); }
protected override void OnUserAction(BackgroundAudioPlayer player, AudioTrack track, UserAction action, object param) { switch (action) { case UserAction.Play: PlayTrack(player); break; case UserAction.Pause: try { if (player.CanPause) { player.Pause(); } } catch (UnauthorizedAccessException ex) { // what the f**k?? } break; case UserAction.SkipPrevious: PlayPreviousTrack(player); break; case UserAction.SkipNext: PlayNextTrack(player); break; case UserAction.Stop: player.Stop(); break; case UserAction.FastForward: player.FastForward(); break; case UserAction.Rewind: player.Rewind(); break; case UserAction.Seek: player.Position = (TimeSpan)param; break; } NotifyComplete(); }
/// <summary> /// Called when the playstate changes, except for the Error state (see OnError) /// </summary> /// <param name="player">The BackgroundAudioPlayer</param> /// <param name="track">The track playing at the time the playstate changed</param> /// <param name="playState">The new playstate of the player</param> /// <remarks> /// Play State changes cannot be cancelled. They are raised even if the application /// caused the state change itself, assuming the application has opted-in to the callback. /// /// Notable playstate events: /// (a) TrackEnded: invoked when the player has no current track. The agent can set the next track. /// (b) TrackReady: an audio track has been set and it is now ready for playack. /// /// Call NotifyComplete() only once, after the agent request has been completed, including async callbacks. /// </remarks> protected override void OnPlayStateChanged(BackgroundAudioPlayer player, AudioTrack track, PlayState playState) { switch (playState) { case PlayState.TrackEnded: PlaylistItem currentPlaylistItem = getCurrentlyPlayingTrack(); if (currentPlaylistItem != null) { currentPlaylistItem.SavedPlayPosTick = currentPlaylistItem.TotalPlayTicks; // We hit TrackEnded event so we can save the playpos to the end. // But really, this is a bug in WP8 since the player doesn't know the playpos at this point anymore. updateToDBPlaylistItem(currentPlaylistItem); } // Start playing next track if we have one. AudioTrack nextTrack = getNextPlaylistTrack(); if (nextTrack != null) { player.Track = nextTrack; player.Play(); } else { player.Stop(); } break; case PlayState.TrackReady: break; case PlayState.Shutdown: updatePlayposForCurrentEpisode(player); break; case PlayState.Unknown: updatePlayposForCurrentEpisode(player); Debug.WriteLine("Play state: Unkown"); break; case PlayState.Stopped: updatePlayposForCurrentEpisode(player); clearPrimaryTile(); Debug.WriteLine("Play state: Stopped"); break; case PlayState.Paused: updatePlayposForCurrentEpisode(player); Debug.WriteLine("Play state: Paused"); break; case PlayState.Playing: PlaylistItem plItem = getCurrentlyPlayingTrack(); if (plItem != null) { plItem.TotalPlayTicks = player.Track.Duration.Ticks; updateToDBPlaylistItem(plItem); Debug.WriteLine("Play state: Playing"); } else { Debug.WriteLine("Playlist item NULL!"); } updatePlayposForCurrentEpisode(player); setCurrentlyPlayingTrack(player.Track.Title); break; case PlayState.BufferingStarted: break; case PlayState.BufferingStopped: break; case PlayState.Rewinding: break; case PlayState.FastForwarding: break; } NotifyComplete(); }
/// <summary> /// Called when the user requests an action using application/system provided UI /// </summary> /// <param name="player">The BackgroundAudioPlayer</param> /// <param name="track">The track playing at the time of the user action</param> /// <param name="action">The action the user has requested</param> /// <param name="param">The data associated with the requested action. /// In the current version this parameter is only for use with the Seek action, /// to indicate the requested position of an audio track</param> /// <remarks> /// User actions do not automatically make any changes in system state; the agent is responsible /// for carrying out the user actions if they are supported. /// Call NotifyComplete() only once, after the agent request has been completed, including async callbacks. /// </remarks> protected override void OnUserAction(BackgroundAudioPlayer player, AudioTrack track, UserAction action, object param) { System.Diagnostics.Debug.WriteLine(System.Threading.Thread.CurrentThread.ManagedThreadId.ToString() + ": OnUserAction() - {0}", action); switch (action) { case UserAction.Play: // Since we are just restarting the same stream, this should be fine. if (player.PlayerState!=PlayState.Playing) { player.Track = track; // player.Track = fPlayList[gCurrentTrack]; player.Play(); } break; case UserAction.Stop: player.Stop(); break; case UserAction.Pause: player.Stop(); // Stop the background streaming agent. AudioTrackStreamer.ShutdownMediaStreamSource();//关闭 //Shoutcast.Sample.Phone.Background.Playback.AudioTrackStreamer.ShutdownMediaStreamSource(); break; case UserAction.FastForward: break; case UserAction.Rewind: break; case UserAction.Seek: break; case UserAction.SkipNext: break; case UserAction.SkipPrevious: break; } NotifyComplete(); }
/// <summary> /// Called when the user requests an action using application/system provided UI /// </summary> /// <param name="player">The BackgroundAudioPlayer</param> /// <param name="track">The track playing at the time of the user action</param> /// <param name="action">The action the user has requested</param> /// <param name="param">The data associated with the requested action. /// In the current version this parameter is only for use with the Seek action, /// to indicate the requested position of an audio track</param> /// <remarks> /// User actions do not automatically make any changes in system state; the agent is responsible /// for carrying out the user actions if they are supported. /// /// Call NotifyComplete() only once, after the agent request has been completed, including async callbacks. /// </remarks> protected override void OnUserAction(BackgroundAudioPlayer player, AudioTrack track, UserAction action, object param) { switch (action) { case UserAction.Play: //if (player.PlayerState != PlayState.Playing) //{ // to get audio track //player.Track = this.audioTrack; //player.Play(); //} if (player.Track == null) { currentTrack = 0; player.Track = playlist[currentTrack]; } else { player.Play(); } break; case UserAction.Stop: player.Stop(); break; case UserAction.Pause: player.Pause(); break; case UserAction.FastForward: player.FastForward(); break; case UserAction.Rewind: player.Rewind(); break; case UserAction.Seek: player.Position = (TimeSpan)param; break; case UserAction.SkipNext: //player.Track = GetNextTrack(); if (currentTrack < playlist.Count - 1) { currentTrack += 1; player.Track = playlist[currentTrack]; } else { player.Track = null; } break; case UserAction.SkipPrevious: //AudioTrack previousTrack = GetPreviousTrack(); //if (previousTrack != null) //{ //player.Track = previousTrack; //} break; } NotifyComplete(); }
/// <summary> /// Called when the user requests an action using application/system provided UI /// </summary> /// <param name="player">The BackgroundAudioPlayer</param> /// <param name="track">The track playing at the time of the user action</param> /// <param name="action">The action the user has requested</param> /// <param name="param"> /// The data associated with the requested action. /// In the current version this parameter is only for use with the Seek action, /// to indicate the requested position of an audio track /// </param> /// <remarks> /// User actions do not automatically make any changes in system state; the agent is responsible /// for carrying out the user actions if they are supported. /// Call NotifyComplete() only once, after the agent request has been completed, including async callbacks. /// </remarks> protected override void OnUserAction(BackgroundAudioPlayer player, AudioTrack track, UserAction action, object param) { Debug.WriteLine("AudioPlayer.OnUserAction() track.Source {0} track.Tag {1} action {2}", null == track ? "<no track>" : null == track.Source ? "<none>" : track.Source.ToString(), null == track ? "<no track>" : track.Tag ?? "<none>", action); try { switch (action) { case UserAction.Play: UpdateTrack(player); if (PlayState.Playing != player.PlayerState && null != player.Track) player.Play(); break; case UserAction.Stop: player.Stop(); break; case UserAction.Pause: if (PlayState.Playing == player.PlayerState) player.Pause(); break; case UserAction.FastForward: if (null != track && null != track.Source) player.FastForward(); break; case UserAction.Rewind: if (null != track && null != track.Source) player.Rewind(); break; case UserAction.Seek: if (null != track) player.Position = (TimeSpan)param; break; case UserAction.SkipNext: player.Track = GetNextTrack(); if (PlayState.Playing != player.PlayerState && null != player.Track) player.Play(); break; case UserAction.SkipPrevious: var previousTrack = GetPreviousTrack(); if (previousTrack != null) player.Track = previousTrack; if (PlayState.Playing != player.PlayerState && null != player.Track) player.Play(); break; } } catch (Exception ex) { Debug.WriteLine("AudioPlayer.OnUserAction() failed: " + ex.ExtendedMessage()); // Is there anything we can do about this? try { player.Close(); } catch (Exception ex2) { Debug.WriteLine("AudioPlayer.OnUserAction() close failed: " + ex2.ExtendedMessage()); } } finally { NotifyComplete(); } }
/// <summary> /// Called when the user requests an action using application/system provided UI /// </summary> /// <param name="player">The BackgroundAudioPlayer</param> /// <param name="track">The track playing at the time of the user action</param> /// <param name="action">The action the user has requested</param> /// <param name="param">The data associated with the requested action. /// In the current version this parameter is only for use with the Seek action, /// to indicate the requested position of an audio track</param> /// <remarks> /// User actions do not automatically make any changes in system state; the agent is responsible /// for carrying out the user actions if they are supported. /// /// Call NotifyComplete() only once, after the agent request has been completed, including async callbacks. /// </remarks> protected override void OnUserAction(BackgroundAudioPlayer player, AudioTrack track, UserAction action, object param) { switch (action) { case UserAction.Play: var audioInfo = (from audio in db.AudioPlaylist select audio).FirstOrDefault(); string audioUrl = audioInfo.AudioUrl; string audioTitle = audioInfo.AudioTitle; string audioArtist = audioInfo.AudioArtist; string audioId = audioInfo.Aid; player.Track = new AudioTrack(new Uri(audioUrl), audioTitle, audioArtist, null, null, audioId, EnabledPlayerControls.All); if (player.PlayerState != PlayState.Playing) { player.Play(); } break; case UserAction.Stop: player.Stop(); break; case UserAction.Pause: player.Pause(); break; case UserAction.FastForward: player.FastForward(); break; case UserAction.Rewind: player.Rewind(); break; case UserAction.Seek: player.Position = (TimeSpan)param; break; case UserAction.SkipNext: player.Track = GetNextTrack(); break; case UserAction.SkipPrevious: AudioTrack previousTrack = GetPreviousTrack(); if (previousTrack != null) { player.Track = previousTrack; } break; } NotifyComplete(); }
/// <summary> /// Called when the user requests an action using application/system provided UI /// </summary> /// <param name="player">The BackgroundAudioPlayer</param> /// <param name="track">The track playing at the time of the user action</param> /// <param name="action">The action the user has requested</param> /// <param name="param">The data associated with the requested action. /// In the current version this parameter is only for use with the Seek action, /// to indicate the requested position of an audio track</param> /// <remarks> /// User actions do not automatically make any changes in system state; the agent is responsible /// for carrying out the user actions if they are supported. /// /// Call NotifyComplete() only once, after the agent request has been completed, including async callbacks. /// </remarks> protected override void OnUserAction(BackgroundAudioPlayer player, AudioTrack track, UserAction action, object param) { System.Diagnostics.Debug.WriteLine("AGENT RECEIVED USER ACTION: " + action.ToString()); switch (action) { case UserAction.Play: PlayTrack(player); break; case UserAction.Stop: player.Stop(); break; case UserAction.Pause: player.Pause(); break; case UserAction.FastForward: player.FastForward(); break; case UserAction.Rewind: player.Rewind(); break; case UserAction.Seek: player.Position = (TimeSpan)param; break; case UserAction.SkipNext: player.Track = GetNextTrack(); break; case UserAction.SkipPrevious: AudioTrack previousTrack = GetPreviousTrack(); if (previousTrack != null) { player.Track = previousTrack; } break; } NotifyComplete(); }
/// <summary> /// Called when the user requests an action using application/system provided UI /// </summary> /// <param name="player">The BackgroundAudioPlayer</param> /// <param name="track">The track playing at the time of the user action</param> /// <param name="action">The action the user has requested</param> /// <param name="param">The data associated with the requested action. /// In the current version this parameter is only for use with the Seek action, /// to indicate the requested position of an audio track</param> /// <remarks> /// User actions do not automatically make any changes in system state; the agent is responsible /// for carrying out the user actions if they are supported. /// /// Call NotifyComplete() only once, after the agent request has been completed, including async callbacks. /// </remarks> protected override void OnUserAction(BackgroundAudioPlayer player, AudioTrack track, UserAction action, object param) { switch (action) { case UserAction.Play: if (player.PlayerState != PlayState.Playing) { player.Play(); } break; case UserAction.Stop: player.Stop(); break; case UserAction.Pause: player.Pause(); break; //case UserAction.FastForward: // player.FastForward(); // break; //case UserAction.Rewind: // player.Rewind(); // break; //case UserAction.Seek: // player.Position = (TimeSpan)param; // break; //case UserAction.SkipNext: //// player.Track = GetNextTrack(); // break; //case UserAction.SkipPrevious: // AudioTrack previousTrack = GetPreviousTrack(); // if (previousTrack != null) // { // player.Track = previousTrack; // } // break; } NotifyComplete(); }
/// <summary> /// Called when the user requests an action using application/system provided UI /// </summary> /// <param name="player">The BackgroundAudioPlayer</param> /// <param name="track">The track playing at the time of the user action</param> /// <param name="action">The action the user has requested</param> /// <param name="param">The data associated with the requested action. /// In the current version this parameter is only for use with the Seek action, /// to indicate the requested position of an audio track</param> /// <remarks> /// User actions do not automatically make any changes in system state; the agent is responsible /// for carrying out the user actions if they are supported. /// /// Call NotifyComplete() only once, after the agent request has been completed, including async callbacks. /// </remarks> protected override void OnUserAction(BackgroundAudioPlayer player, AudioTrack track, UserAction action, object param) { switch (action) { case UserAction.Play: if (PlayState.Playing != player.PlayerState) { player.Track = _playList[currentTrackNumber]; } break; case UserAction.Stop: player.Stop(); break; case UserAction.Pause: if (PlayState.Playing == player.PlayerState) { player.Pause(); } break; case UserAction.FastForward: // Fast Forward only works with non-MSS clients. // If the Source is null, we are streaming an MSS. if (track.Source != null) { player.FastForward(); } break; case UserAction.Rewind: // Rewind only works with non-MSS clients. // If the Source is null, we are streaming an MSS. if (track.Source != null) { player.Rewind(); } break; case UserAction.Seek: // Seek only works with non-MSS clients. // If the Source is null, we are streaming an MSS. if (track.Source != null) { player.Position = (TimeSpan)param; } break; case UserAction.SkipNext: player.Track = GetNextTrack(); break; case UserAction.SkipPrevious: player.Track = GetPreviousTrack(); break; } NotifyComplete(); }
/// <summary> /// Called when the user requests an action using application/system provided UI /// </summary> /// <param name="player">The BackgroundAudioPlayer</param> /// <param name="track">The track playing at the time of the user action</param> /// <param name="action">The action the user has requested</param> /// <param name="param">The data associated with the requested action. /// In the current version this parameter is only for use with the Seek action, /// to indicate the requested position of an audio track</param> /// <remarks> /// User actions do not automatically make any changes in system state; the agent is responsible /// for carrying out the user actions if they are supported. /// /// Call NotifyComplete() only once, after the agent request has been completed, including async callbacks. /// </remarks> protected override void OnUserAction(BackgroundAudioPlayer player, AudioTrack track, UserAction action, object param) { switch (action) { case UserAction.Play: if (player != null && player.PlayerState != PlayState.Playing) { player.Volume = 1; player.Play(); } break; case UserAction.Stop: player.Stop(); break; case UserAction.Pause: player.Pause(); break; case UserAction.FastForward: player.FastForward(); break; case UserAction.Rewind: player.Rewind(); break; case UserAction.Seek: player.Position = (TimeSpan)param; break; case UserAction.SkipNext: SetNextTrack(player); break; case UserAction.SkipPrevious: SetPreviousTrack(player); break; } NotifyComplete(); }
/// <summary> /// Called when the user requests an action using application/system provided UI /// </summary> /// <param name="player">The BackgroundAudioPlayer</param> /// <param name="track">The track playing at the time of the user action</param> /// <param name="action">The action the user has requested</param> /// <param name="param">The data associated with the requested action. /// In the current version this parameter is only for use with the Seek action, /// to indicate the requested position of an audio track</param> /// <remarks> /// User actions do not automatically make any changes in system state; the agent is responsible /// for carrying out the user actions if they are supported. /// /// Call NotifyComplete() only once, after the agent request has been completed, including async callbacks. /// </remarks> protected async override void OnUserAction(BackgroundAudioPlayer player, AudioTrack track, UserAction action, object param) { switch (action) { case UserAction.Play: if (player.PlayerState != PlayState.Playing) { player.Play(); } break; case UserAction.Stop: player.Stop(); break; case UserAction.Pause: player.Pause(); break; case UserAction.FastForward: player.FastForward(); break; case UserAction.Rewind: player.Rewind(); break; case UserAction.Seek: player.Position = (TimeSpan)param; break; case UserAction.SkipNext: { AudioTrack newTrack = await GetNextStation(player.Track.Artist); if (track != null) player.Track = newTrack; break; } case UserAction.SkipPrevious: { AudioTrack newTrack = await GetPreviousStation(player.Track.Artist); if (track != null) player.Track = newTrack; break; } } NotifyComplete(); }
/// <summary> /// Called when the user requests an action using application/system provided UI /// </summary> /// <param name="player">The BackgroundAudioPlayer</param> /// <param name="track">The track playing at the time of the user action</param> /// <param name="action">The action the user has requested</param> /// <param name="param">The data associated with the requested action. /// In the current version this parameter is only for use with the Seek action, /// to indicate the requested position of an audio track</param> /// <remarks> /// User actions do not automatically make any changes in system state; the agent is responsible /// for carrying out the user actions if they are supported. /// /// Call NotifyComplete() only once, after the agent request has been completed, including async callbacks. /// </remarks> protected override void OnUserAction(BackgroundAudioPlayer player, AudioTrack track, UserAction action, object param) { switch (action) { case UserAction.Play: if (track != null && track.Tag != null) { var data = track.Tag.ToString().Split('$'); var url = data[data.Length - 1]; var type = data[2]; if (type.ToLower() != "shoutcast") { track.Source = new Uri(url); } } //player.Track = new AudioTrack(null, "", "", "", null, track.Tag, EnabledPlayerControls.Pause); if (player.SafeGetPlayerState() != PlayState.Playing) { player.Play(); } break; case UserAction.Stop: if (player.SafeGetPlayerState() == PlayState.Playing) player.Stop(); break; case UserAction.Pause: if (player.SafeGetPlayerState() == PlayState.Playing) player.Pause(); break; case UserAction.FastForward: //player.FastForward(); break; case UserAction.Rewind: //player.Rewind(); break; case UserAction.Seek: //player.Position = (TimeSpan)param; break; case UserAction.SkipNext: //player.Track = GetNextTrack(); break; case UserAction.SkipPrevious: //AudioTrack previousTrack = GetPreviousTrack(); //if (previousTrack != null) //{ // player.Track = previousTrack; //} break; } NotifyComplete(); }
/// <summary> /// Called when the playstate changes, except for the Error state (see OnError) /// </summary> /// <param name="player">The BackgroundAudioPlayer</param> /// <param name="track">The track playing at the time the playstate changed</param> /// <param name="playState">The new playstate of the player</param> /// <remarks> /// Play State changes cannot be cancelled. They are raised even if the application /// caused the state change itself, assuming the application has opted-in to the callback. /// /// Notable playstate events: /// (a) TrackEnded: invoked when the player has no current track. The agent can set the next track. /// (b) TrackReady: an audio track has been set and it is now ready for playack. /// /// Call NotifyComplete() only once, after the agent request has been completed, including async callbacks. /// </remarks> protected override void OnPlayStateChanged(BackgroundAudioPlayer player, AudioTrack track, PlayState playState) { player.Volume = 1; switch (playState) { case PlayState.TrackEnded: try { player.Track = GetNextTrack(); } catch (LastTrackException ex) { player.Track = ex.Track; player.Stop(); } break; case PlayState.TrackReady: LoadPlaylist(); player.Play(); break; case PlayState.Shutdown: break; case PlayState.Unknown: break; case PlayState.Stopped: break; case PlayState.Paused: break; case PlayState.Playing: break; case PlayState.BufferingStarted: break; case PlayState.BufferingStopped: break; case PlayState.Rewinding: break; case PlayState.FastForwarding: break; } NotifyComplete(); }