private void ScheduleLoadedTrackFromFileEvent(string fileName, MediaPlayerMetadata mediaPlayerMetadata) { EventHandler handler = null; handler = (o, e) => { LoadedTrackFromFile?.Invoke(this, new TrackLoadedFromFileEventArgs { FileName = fileName, Metadata = mediaPlayerMetadata ?? defaultMetadata }); var eventInfo = o.GetType().GetEvent(startPlayingTrackEventName); eventInfo.RemoveEventHandler(o, handler); }; StartPlayingTrack += handler; }
/// <summary> /// /// </summary> /// <param name="fileName"></param> public void LoadFile(string fileName, MediaPlayerMetadata mediaPlayerMetadata = null) { if (string.IsNullOrEmpty(fileName)) { throw new ArgumentException("File name string specified has no value or is empty."); } else if (!File.Exists(fileName)) { throw new ArgumentException(string.Format("File '{0}' does not exist.", fileName)); } else if (File.ReadAllBytes(fileName).Count() == 0) { throw new ArgumentException(string.Format("File '{0}' contains no data!", fileName)); } if (_stream != 0) { Bass.BASS_StreamFree(_stream); } _stream = 0; _fileName = fileName; if (_playbackThread != null) { _playbackThread.Abort(); } ScheduleLoadedTrackFromFileEvent(fileName, mediaPlayerMetadata); _playbackThread = new Thread(PlayAudioFile); _playbackThread.Start(); logger.InfoFormat("{0} loaded for playback by the media player", fileName); }
/// <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); } } }