public void LoadPlaylistFromList()
        {
            A.CallTo(() => _mediaPlayer.Finished).Returns(true);

            var count = _audioPlaylist.LoadPlaylistFromList(new List <ITrack> {
                _track
            });

            _audioPlaylist.WaitForPlaybackToFinish();

            var countCorrect = count == 1;

            Assert.True(countCorrect, "Audio playlist returned incorrect count after loading from track list");

            A.CallTo(() => _mediaPlayer.LoadFile(A <string> .Ignored, A <MediaPlayerMetadata> .Ignored)).MustHaveHappened();
        }
        public AudioPlaylistTests()
        {
            _musicLibrary = A.Fake <IMusicLibrary>();
            _mediaPlayer  = A.Fake <IMediaPlayer>();

            A.CallTo(() => _mediaPlayer.LoadFile(A <string> .Ignored, A <MediaPlayerMetadata> .Ignored)).Invokes((o) => _mediaPlayer.Playing = true);

            _audioPlaylist = new AudioPlaylist(_musicLibrary, _mediaPlayer);
            _track         = A.Fake <ITrack>();

            A.CallTo(() => _track.Song).Returns(new Song {
                FileName = TrackFileName
            });

            _audioPlaylist.Tracks.Add(_track);
        }
Example #3
0
        /// <summary>
        /// Preform an iteration of the play all tracks loop.
        /// </summary>
        /// <param name="random">Random number generator to be used if shuffle is on.</param>
        private void PlayAllTracksIteration(Random random)
        {
            if (!_forward && !_back)
            {
                // Load current track into media player.
                var currentTrack      = Tracks[GetCurrentTrackIndex()];
                var mediaPlayMetadata = new MediaPlayerMetadata
                {
                    AlbumName  = currentTrack.Album?.Name,
                    ArtistName = currentTrack.Artist?.Name,
                    TrackName  = currentTrack.Song.Title
                };

                _mediaPlayer.LoadFile(currentTrack.Song.FileName, mediaPlayMetadata);

                // Wait until media player thread has started playback.
                while (!_mediaPlayer.Playing)
                {
                    Thread.Sleep(10);
                }

                if (GetCurrentTrackIndex() != _lastTrack)
                {
                    _previousTracks.Push(GetCurrentTrackIndex());
                }

                _lastTrack = GetCurrentTrackIndex();
            }

            // While next and back are not pressed and the user is not finished with the song.
            while (!_forward && !_back && !_mediaPlayer.Finished)
            {
                Thread.Sleep(10);
            }

            // Move forward if forward motion has been indicated and shuffle is off.
            if (_forward && !Shuffle)
            {
                SetCurrentTrackIndex(GetCurrentTrackIndex() + 1);

                _forward = false;
            }
            else if (_back && !Shuffle) // Move back one song if indicated and shuffle is off.
            {
                SetCurrentTrackIndex(GetCurrentTrackIndex() - 1);

                _back = false;
            }
            else if (Shuffle && (!_back || _previousTracks.Count < 2)) // Pick random track for playback.
            {
                int nextTrack = random.Next(Tracks.Count);

                while (nextTrack == GetCurrentTrackIndex())
                {
                    nextTrack = random.Next(Tracks.Count);
                }

                SetCurrentTrackIndex(nextTrack);

                _forward = false;
                _back    = false;
            }
            else if (Shuffle && _back) // Play last played track.
            {
                int nextTrack = _previousTracks.Pop();
                nextTrack = _previousTracks.Pop();

                SetCurrentTrackIndex(nextTrack);

                _back = false;
            }
            else if (!Repeat) // Go forward if no actions have been indicated and repeat is off.
            {
                SetCurrentTrackIndex(GetCurrentTrackIndex() + 1);
            }

            // Keep rolling over to start of playlist if repeat all is on.
            if (RepeatAll)
            {
                if (GetCurrentTrackIndex() >= Tracks.Count)
                {
                    // Roll on to start of playlist.
                    SetCurrentTrackIndex(0);
                }
                else if (GetCurrentTrackIndex() < 0) // Roll off to end of playlist.
                {
                    SetCurrentTrackIndex(Tracks.Count - 1);
                }
            }
        }