Ejemplo n.º 1
0
        /// <summary>
        /// Pauses or plays the music.
        /// </summary>
        /// <returns>A boolean indicating whether the music is playing.</returns>
        public bool TogglePlay(bool?pause = null)
        {
            var result = false;

            if (_waveOutDevice != null && _currentSong != null)
            {
                if ((_waveOutDevice.PlaybackState == PlaybackState.Playing && pause != false) || pause == true)
                {
                    _currentSong.IsPlaying = false;
                    _waveOutDevice.Pause();
                }
                else if (_playStream != null)
                {
                    _waveOutDevice.Play();
                    _currentSong.IsPlaying = true;
                    _timeTracker?.Abort();

                    if (!_currentSong.IsInternetRadio)
                    {
                        _timeTracker = new Thread(UpdateTime);
                        _timeTracker.Start();
                    }

                    result = true;
                }

                SongChanged?.Invoke(_currentSong);
            }

            return(result);
        }
Ejemplo n.º 2
0
 private void FireSongChangeEvent()
 {
     if (SongChanged != null)
     {
         SongChanged.Invoke(this, EventArgs.Empty);
     }
 }
Ejemplo n.º 3
0
        private PlaylistItem AdvancePlaylist()
        {
            PlaylistItem item = Program.Core.DataSource.CurrentItem = Program.Mover.Next();

            SongChanged?.Invoke(this, item);
            return(item);
        }
Ejemplo n.º 4
0
        public async Task Previous()
        {
            QueueItem nowPlaying = await GetNowPlaying();

            int i = Queue.IndexOf(nowPlaying);

            Queue[i].NowPlaying = false;
            Queue[i].Position   = 0;
            if (i == 0)
            {
                if (RepeatAll)
                {
                    Queue[Queue.Count - 1].NowPlaying = true;
                }
                else
                {
                    await Stop();
                }
            }
            else
            {
                Queue[i - 1].NowPlaying = true;
            }
            SongChanged.Invoke(this, null);
            if (PlayerState == StatePlaying)
            {
                await Play();
            }
        }
Ejemplo n.º 5
0
        /// <summary>
        /// Load a song
        /// </summary>
        /// <param name="path">the absolute path</param>
        private void Load(string path)
        {
            try
            {
                DisposeWaveOut(true);
                _playStream?.Dispose();
                _playStream = new MediaFoundationReader(path);

                if (_playStream == null)
                {
                    return;
                }

                _waveOutDevice.Init(_playStream);
                _currentSong.Duration = Convert.ToInt64(_playStream.TotalTime.TotalSeconds);
                SongChanged?.Invoke(_currentSong);
                TogglePlay();
            }
            catch (Exception e)
            {
                Logger.LogError(e, "MusicPlayer: Could not load song " + path);
                _playStream = null;

                if (!_isReceiveMode)
                {
                    Next();
                }
            }
        }
Ejemplo n.º 6
0
 private void OnSongChanged(SongChangeMode songChangeMode)
 {
     if (SongChanged != null)
     {
         SongChanged.Invoke(songChangeMode);
     }
 }
Ejemplo n.º 7
0
        /// <summary>
        ///     Start playing a track by getting the download URL from onedrive and passing it to the native MediaPlayer
        /// </summary>
        /// <param name="track"></param>
        /// <returns></returns>
        public async Task <bool> Play(Track track, int postition = 0)
        {
            string url = await App.OneDrive.GetTrackURL(track.OneDrive_ID);

            SongChanged.Invoke(this, null);
            DependencyService.Get <PlayMusic>().Play(url, postition);
            PlayerState = StatePlaying;
            return(true);
        }
Ejemplo n.º 8
0
        public async Task <bool> Play()
        {
            QueueItem queueItem = await GetNowPlaying();

            string url = await App.OneDrive.GetTrackURL((await queueItem.GetTrack()).OneDrive_ID);

            SongChanged.Invoke(this, null);
            DependencyService.Get <PlayMusic>().Play(url, queueItem.Position);
            PlayerState = StatePlaying;
            return(true);
        }
        /// <summary>
        /// Connects to SignalR
        /// </summary>
        public async Task ConnectAsync()
        {
            connection = new HubConnectionBuilder()
                         .WithUrl(_hubUrl)
                         .Build();

            connection.On <CurrentlyPlaying>("SongChanged", (song) => SongChanged?.Invoke(song));
            connection.On <PlaylistItem>("PlaylistChanged", (playlist) => PlaylistChanged?.Invoke(playlist));
            connection.On <int>("VolumeChanged", (volume) => VolumeChanged?.Invoke(volume));
            connection.On("Paused", () => Paused?.Invoke());
            connection.On("Resumed", () => Resumed?.Invoke());

            await connection.StartAsync();
        }
Ejemplo n.º 10
0
        void AddNewMessage(JObject message)
        {
            try
            {
                if (Variables.NowPlaying != null)
                {
                    previousSong = Variables.NowPlaying;
                }
                string id         = message.GetValue("SongId").ToString();
                string title      = message.GetValue("SongTitle").ToString();
                string artist     = message.GetValue("ArtistName").ToString();
                string album      = message.GetValue("AlbumTitle").ToString();
                string length     = message.GetValue("SongLength").ToString();
                string songUrl    = message.GetValue("SongUrl").ToString();
                string artistId   = message.GetValue("ArtistId").ToString();
                string twitter    = message.GetValue("ArtistTwitterUrl").ToString();
                string facebook   = message.GetValue("ArtistFacebookUrl").ToString();
                string albumImage = message.GetValue("AlbumImage").ToString();
                Variables.NowPlaying = new SongModel
                {
                    Id                = id,
                    SongTitle         = title,
                    ArtistName        = artist,
                    AlbumTitle        = album,
                    SongLength        = length,
                    SongUrl           = songUrl,
                    ArtistId          = artistId,
                    ArtistTwitterUrl  = twitter,
                    ArtistFacebookUrl = facebook,
                    AlbumImage        = albumImage,
                };

                if (previousSong != null)
                {
                    if (previousSong != Variables.NowPlaying)
                    {
                        Variables.PreviouslyPlayed.Insert(0, Variables.NowPlaying);
                        Variables.PreviouslyPlayed.RemoveAt(Variables.PreviouslyPlayed.Count - 1);
                    }
                }
                //App.STVM.CurrentSong = Variables.CurrentSong;
                SongChanged?.Invoke(this, Variables.NowPlaying);
            }
            catch (Exception e)
            {
                Console.WriteLine("Sig R Obj Creation error" + e.Message);
            }
            Console.WriteLine(Variables.NowPlaying.SongTitle);
        }
Ejemplo n.º 11
0
        /// <summary>
        /// Update the data about the currently playing song
        /// </summary>
        private void UpdateSongData()
        {
            string filename = SendIPCCommandString(IPCCommand.GetFilename);

            if (CurrentSong.Filename == filename)
            {
                return;
            }

            bool   hasMetadata = true;
            string title       = GetMetadata(filename, "title");

            if (string.IsNullOrEmpty(title))
            {
                title       = SendIPCCommandString(IPCCommand.GetTitle);
                hasMetadata = false;
            }

            string artist = string.Empty;
            string year   = string.Empty;
            string album  = string.Empty;
            string track  = string.Empty;

            if (hasMetadata)
            {
                artist = GetMetadata(filename, "Artist");
                year   = GetMetadata(filename, "Year");
                album  = GetMetadata(filename, "Album");
                track  = GetMetadata(filename, "Track");
            }

            Song song = new Song
            {
                HasMetadata = hasMetadata,
                Filename    = filename,
                Title       = title,
                Artist      = artist,
                Album       = album,
                Year        = year,
                Track       = track
            };

            CurrentSong = song;

            SongChanged?.Invoke(this, new SongChangedEventArgs(song));
        }
Ejemplo n.º 12
0
        private void CheckIfSongChanged()
        {
            Process spotify        = SpotifyProcessManager.CurrentSpotifyProcess;
            string  newWindowTitle = spotify?.MainWindowTitle;

            if (_oldWindowTitle != newWindowTitle)
            {
                _logger.Log($"Song changed: _oldWindowTitle = '{_oldWindowTitle}', newWindowTitle = '{newWindowTitle}'.");
                var oldSong = LastSong;
                UpdateListWithNewSong(newWindowTitle: newWindowTitle);
                var newSong = LastSong;

                _oldWindowTitle = newWindowTitle;

                SongChanged?.Invoke(this, new SongChangeEventArgs(oldSong, newSong));
            }
        }
Ejemplo n.º 13
0
        /// <summary>
        /// Updates the position of the song.
        /// </summary>
        private void UpdateTime()
        {
            while (!_disposing && _waveOutDevice != null && _currentSong != null && _playstream != null &&
                   (_waveOutDevice.PlaybackState == PlaybackState.Paused || _waveOutDevice.PlaybackState == PlaybackState.Playing))
            {
                try
                {
                    if (_waveOutDevice.PlaybackState == PlaybackState.Playing)
                    {
                        _currentSong.Position = Convert.ToInt64(_playstream.CurrentTime.TotalSeconds);
                        SongChanged?.Invoke(_currentSong);
                    }

                    ThreadExtensions.SaveSleep(1000);
                }
                catch
                {
                }
            }
        }
Ejemplo n.º 14
0
        private async System.Threading.Tasks.Task HandleStationSongMetadataStage2Async(SongMetadata songMetadata)
        {
            ExtendedSongMetadata newMetadata = new ExtendedSongMetadata(songMetadata);

            bool hasMoreMetadata = await NepApp.MetadataManager.FindAdditionalMetadataAsync(newMetadata);

            CurrentSong            = newMetadata;
            CurrentSong.SongLength = newMetadata.SongLength;
            RaisePropertyChanged(nameof(CurrentSong));

            await History.AddSongAsync(CurrentSong);

            SongChanged.Invoke(this, new NepAppSongChangedEventArgs(CurrentSong));

            if (hasMoreMetadata)
            {
                ArtworkProcessor.UpdateArtworkMetadata();
            }
            else
            {
                ArtworkProcessor.ResetArtwork();
            }
        }
Ejemplo n.º 15
0
        public async void Init(SongViewModel song)
        {
            //Initialize our picker object
            castingPicker = new CastingDevicePicker();

            //Set the picker to filter to video capable casting devices
            castingPicker.Filter.SupportsAudio = true;

            //Hook up device selected event
            castingPicker.CastingDeviceSelected += CastingPicker_CastingDeviceSelected;

            Song      = song;
            _lastSong = new Song()
            {
                ID            = song.ID,
                IsOnline      = song.IsOnline,
                OnlineUri     = new Uri(song.FilePath),
                FilePath      = song.FilePath,
                Duration      = song.Song.Duration,
                Album         = song.Album,
                OnlineAlbumID = song.Song.OnlineAlbumID,
                OnlineID      = song.Song.OnlineID
            };
            CurrentArtwork = song.Artwork;
            lastUriPath    = song.Artwork?.AbsolutePath;
            IsPlaying      = player.IsPlaying;
            BufferProgress = MainPageViewModel.Current.BufferProgress;
            SongChanged?.Invoke(song, EventArgs.Empty);
            CurrentRating = song.Rating;
            var brush = new SolidColorBrush(await ImagingHelper.GetMainColor(CurrentArtwork));

            CurrentColorBrush = brush;
            MainPageViewModel.Current.LeftTopColor = AdjustColorbyTheme(CurrentColorBrush);
            CurrentIndex = MainPageViewModel.Current.CurrentIndex;
            var task = ThreadPool.RunAsync(async x =>
            {
                var favor = await _lastSong.GetFavoriteAsync();
                await CoreApplication.MainView.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.High, () =>
                {
                    IsCurrentFavorite = favor;
                });
            });

            var t = ThreadPool.RunAsync(async x =>
            {
                var ext = MainPageViewModel.Current.LyricExtension;
                if (ext != null)
                {
                    var result = await ext.ExecuteAsync(new ValueSet()
                    {
                        new KeyValuePair <string, object>("q", "lyric"),
                        new KeyValuePair <string, object>("title", Song.Title),
                        new KeyValuePair <string, object>("album", song.Album),
                        new KeyValuePair <string, object>("artist", Song.Song.Performers.IsNullorEmpty() ? null : Song.Song.Performers[0]),
                        new KeyValuePair <string, object>("ID", song.IsOnline ? song.Song.OnlineID : null)
                    });
                    if (result != null)
                    {
                        var l = new Lyric(LrcParser.Parser.Parse((string)result, Song.Song.Duration));
                        await CoreApplication.MainView.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Low, () =>
                        {
                            Lyric.New(l);
                        });
                    }
                    else
                    {
                        await CoreApplication.MainView.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Low, () =>
                        {
                            Lyric.Clear();
                            LyricHint = Consts.Localizer.GetString("NoLyricText");
                        });
                    }
                }
                else
                {
                    await CoreApplication.MainView.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Low, () =>
                    {
                        Lyric.Clear();
                        LyricHint = Consts.Localizer.GetString("NoLyricText");
                    });
                }
            });
        }
Ejemplo n.º 16
0
 /// <summary>
 /// Invoke the songChanged event.
 /// </summary>
 /// <param name="song">The song.</param>
 public void InvokeSongChanged(SongInformation song)
 {
     SongChanged?.Invoke(song);
 }
Ejemplo n.º 17
0
        /// <summary>
        /// Starts playing the Queue. In order to play a track, you must first add it to the Queue using <see cref="AddQueue(string)"/>.
        /// </summary>
        /// <param name="repeat">If true, avoids dequeuing the next track. Not to be used for anything other than the player.</param>
        public void PlayMusic(bool repeat = false)
        {
            if (!repeat && Queue.Count != 0)
            {
                FilePath = Queue[QueuePosition];
            }
            QueuePosition++;

            void PMusic()
            {
                //TODO: Check if FilePath is a file
                //maybe we can use cd://2 for CD track 2, and anything else we can use the NAudio backend?

                if (true)
                {
                    currentBackend = new NAudioBackend(FilePath);
                }

                currentBackend.Play();
                currentBackend.Volume             = CurrentVolume;
                currentBackend.OnPlaybackStopped += OnPlaybackStopped;

                Playing = true;
            }

            try
            {
                if (Playing != true)
                {
                    PMusic();
                }
                else
                {
                    AvoidNextQueue = true;
                    StopMusic();
                    PMusic();
                }

                SongChanged?.Invoke(null,
                                    EventArgs.Empty); // Now that playback has started without any issues, fire the song changed event.
            }
            catch (System.IO.FileNotFoundException)
            {
                var args = new PlaybackExceptionEventArgs {
                    Details = "That's not a valid file path!"
                };
                SongException?.Invoke(null, args);
            }
            catch (ArgumentException)
            {
                var args = new PlaybackExceptionEventArgs {
                    Details = "That's not a valid file path!"
                };
                SongException?.Invoke(null, args);
            }
            catch (System.Runtime.InteropServices.COMException)
            {
                var args = new PlaybackExceptionEventArgs {
                    Details = "This isn't a valid audio file!"
                };
                SongException?.Invoke(null, args);
            }
            catch (FormatException)
            {
                var args = new PlaybackExceptionEventArgs {
                    Details = "This audio file might be corrupt!"
                };
                SongException?.Invoke(null, args);
            }
            catch (InvalidOperationException)
            {
                var args = new PlaybackExceptionEventArgs {
                    Details = "This audio file uses VBR \nor might be corrupt!"
                };
                SongException?.Invoke(null, args);
            }
            catch (Exception e)
            {
                var args = new PlaybackExceptionEventArgs {
                    Details = $"{e.Message}\n{e.StackTrace}"
                };
                SongException?.Invoke(null, args);
            }
        }
Ejemplo n.º 18
0
        private async void Player_StatusChanged(object sender, PlayingItemsChangedArgs e)
        {
            await CoreApplication.MainView.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.High, async() =>
            {
                IsPlaying = player.IsPlaying;
                if (e.CurrentSong != null)
                {
                    if (!_lastSong.IsIDEqual(e.CurrentSong))
                    {
                        Song = new SongViewModel(e.CurrentSong);

                        CurrentRating = Song.Rating;

                        SongChanged?.Invoke(Song, EventArgs.Empty);

                        if (Song.Artwork != null)
                        {
                            if (lastUriPath == Song.Artwork.AbsolutePath)
                            {
                            }
                            else
                            {
                                CurrentArtwork    = Song.Artwork;
                                CurrentColorBrush = new SolidColorBrush(await ImagingHelper.GetMainColor(CurrentArtwork));
                                MainPageViewModel.Current.LeftTopColor = AdjustColorbyTheme(CurrentColorBrush);
                                lastUriPath = Song.Artwork.AbsolutePath;
                            }
                        }
                        else
                        {
                            CurrentArtwork    = null;
                            CurrentColorBrush = new SolidColorBrush(new UISettings().GetColorValue(UIColorType.Accent));
                            MainPageViewModel.Current.LeftTopColor = AdjustColorbyTheme(CurrentColorBrush);
                            lastUriPath = null;
                        }
                        if (e.Items is IList <Song> l)
                        {
                            NowListPreview = $"{e.CurrentIndex + 1}/{l.Count}";
                            NowPlayingList.Clear();
                            for (int i = 0; i < l.Count; i++)
                            {
                                NowPlayingList.Add(new SongViewModel(l[i])
                                {
                                    Index = (uint)i
                                });
                            }
                            if (e.CurrentIndex < NowPlayingList.Count)
                            {
                                CurrentIndex = e.CurrentIndex;
                            }
                        }

                        IsCurrentFavorite = await e.CurrentSong.GetFavoriteAsync();
                    }
                }
            });

            if (e.CurrentSong != null)
            {
                if (!_lastSong.IsIDEqual(e.CurrentSong))
                {
                    await CoreApplication.MainView.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.High, () =>
                    {
                        Lyric.Clear();
                        LyricHint = Consts.Localizer.GetString("LoadingLyricsText");
                    });

                    _lastSong = e.CurrentSong;
                    var ext = MainPageViewModel.Current.LyricExtension;
                    if (ext != null)
                    {
                        var result = await ext.ExecuteAsync(new ValueSet()
                        {
                            new KeyValuePair <string, object>("q", "lyric"),
                            new KeyValuePair <string, object>("title", Song.Title),
                            new KeyValuePair <string, object>("album", song.Album),
                            new KeyValuePair <string, object>("artist", Song.Song.Performers.IsNullorEmpty() ? null : Song.Song.Performers[0]),
                            new KeyValuePair <string, object>("ID", song.IsOnline ? song.Song.OnlineID : null)
                        });

                        if (result != null)
                        {
                            var l = new Lyric(LrcParser.Parser.Parse((string)result, Song.Song.Duration));
                            await CoreApplication.MainView.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.High, () =>
                            {
                                Lyric.New(l);
                            });
                        }
                        else
                        {
                            await CoreApplication.MainView.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.High, () =>
                            {
                                Lyric.Clear();
                                LyricHint = Consts.Localizer.GetString("NoLyricText");
                            });
                        }
                    }
                    else
                    {
                        await CoreApplication.MainView.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.High, () =>
                        {
                            Lyric.Clear();
                            LyricHint = Consts.Localizer.GetString("NoLyricText");
                        });
                    }
                }
            }
        }
Ejemplo n.º 19
0
 private void OnSongChanged(Song song)
 {
     SongChanged?.Invoke(this, song);
 }