diff --git a/RedBookPlayer/GUI/MainWindow.xaml.cs b/RedBookPlayer/GUI/MainWindow.xaml.cs index 031d78e..563e733 100644 --- a/RedBookPlayer/GUI/MainWindow.xaml.cs +++ b/RedBookPlayer/GUI/MainWindow.xaml.cs @@ -90,7 +90,7 @@ namespace RedBookPlayer.GUI Closing += (e, f) => { - PlayerView.Player.Stop(); + ((PlayerView)ContentControl.Content).StopButton_Click(this, null); }; AddHandler(DragDrop.DropEvent, MainWindow_Drop); diff --git a/RedBookPlayer/GUI/PlayerView.xaml.cs b/RedBookPlayer/GUI/PlayerView.xaml.cs index 3454bd7..b3c4166 100644 --- a/RedBookPlayer/GUI/PlayerView.xaml.cs +++ b/RedBookPlayer/GUI/PlayerView.xaml.cs @@ -71,7 +71,8 @@ namespace RedBookPlayer.GUI public async Task LoadImage(string path) { // If the player is currently running, stop it - if(Player.Playing) Player.Stop(); + if((DataContext as PlayerViewModel).Playing != true) + (DataContext as PlayerViewModel).Playing = null; bool result = await Task.Run(() => { @@ -233,13 +234,13 @@ namespace RedBookPlayer.GUI await LoadImage(path); } - public void PlayButton_Click(object sender, RoutedEventArgs e) => Player.TogglePlayPause(true); + public void PlayButton_Click(object sender, RoutedEventArgs e) => (DataContext as PlayerViewModel).Playing = true; - public void PauseButton_Click(object sender, RoutedEventArgs e) => Player.TogglePlayPause(false); + public void PauseButton_Click(object sender, RoutedEventArgs e) => (DataContext as PlayerViewModel).Playing = false; - public void PlayPauseButton_Click(object sender, RoutedEventArgs e) => Player.TogglePlayPause(!Player.Playing); + public void PlayPauseButton_Click(object sender, RoutedEventArgs e) => (DataContext as PlayerViewModel).Playing = !(DataContext as PlayerViewModel).Playing; - public void StopButton_Click(object sender, RoutedEventArgs e) => Player.Stop(); + public void StopButton_Click(object sender, RoutedEventArgs e) => (DataContext as PlayerViewModel).Playing = null; public void NextTrackButton_Click(object sender, RoutedEventArgs e) => Player.NextTrack(); @@ -253,29 +254,29 @@ namespace RedBookPlayer.GUI public void RewindButton_Click(object sender, RoutedEventArgs e) => Player.Rewind(); - public void VolumeUpButton_Click(object sender, RoutedEventArgs e) => App.Settings.Volume++; + public void VolumeUpButton_Click(object sender, RoutedEventArgs e) => (DataContext as PlayerViewModel).Volume++; - public void VolumeDownButton_Click(object sender, RoutedEventArgs e) => App.Settings.Volume--; + public void VolumeDownButton_Click(object sender, RoutedEventArgs e) => (DataContext as PlayerViewModel).Volume--; public void MuteToggleButton_Click(object sender, RoutedEventArgs e) { if (_lastVolume == null) { - _lastVolume = App.Settings.Volume; - App.Settings.Volume = 0; + _lastVolume = (DataContext as PlayerViewModel).Volume; + (DataContext as PlayerViewModel).Volume = 0; } else { - App.Settings.Volume = _lastVolume.Value; + (DataContext as PlayerViewModel).Volume = _lastVolume.Value; _lastVolume = null; } } - public void EnableDeEmphasisButton_Click(object sender, RoutedEventArgs e) => Player.ToggleDeEmphasis(true); + public void EnableDeEmphasisButton_Click(object sender, RoutedEventArgs e) => (DataContext as PlayerViewModel).ApplyDeEmphasis = true; - public void DisableDeEmphasisButton_Click(object sender, RoutedEventArgs e) => Player.ToggleDeEmphasis(false); + public void DisableDeEmphasisButton_Click(object sender, RoutedEventArgs e) => (DataContext as PlayerViewModel).ApplyDeEmphasis = false; - public void EnableDisableDeEmphasisButton_Click(object sender, RoutedEventArgs e) => Player.ToggleDeEmphasis(!Player.ApplyDeEmphasis); + public void EnableDisableDeEmphasisButton_Click(object sender, RoutedEventArgs e) => (DataContext as PlayerViewModel).ApplyDeEmphasis = !(DataContext as PlayerViewModel).ApplyDeEmphasis; #endregion } diff --git a/RedBookPlayer/GUI/PlayerViewModel.cs b/RedBookPlayer/GUI/PlayerViewModel.cs index 4a8c78d..55cb5d3 100644 --- a/RedBookPlayer/GUI/PlayerViewModel.cs +++ b/RedBookPlayer/GUI/PlayerViewModel.cs @@ -6,13 +6,31 @@ namespace RedBookPlayer.GUI { #region Player Status - private bool _playing; - public bool Playing + private bool? _playing; + public bool? Playing { get => _playing; set => this.RaiseAndSetIfChanged(ref _playing, value); } + private int _volume; + public int Volume + { + get => _volume; + set => this.RaiseAndSetIfChanged(ref _volume, value); + } + + private bool _applyDeEmphasis; + public bool ApplyDeEmphasis + { + get => _applyDeEmphasis; + set => this.RaiseAndSetIfChanged(ref _applyDeEmphasis, value); + } + + #endregion + + #region Model-Provided Playback Information + private ulong _currentSector; public ulong CurrentSector { @@ -35,20 +53,6 @@ namespace RedBookPlayer.GUI public int TotalSeconds => (int)(_totalSectors / 75 % 60); public int TotalMinutes => (int)(_totalSectors % 75); - private int _volume; - public int Volume - { - get => _volume; - set => this.RaiseAndSetIfChanged(ref _volume, value); - } - - private bool _applyDeEmphasis; - public bool ApplyDeEmphasis - { - get => _applyDeEmphasis; - set => this.RaiseAndSetIfChanged(ref _applyDeEmphasis, value); - } - #endregion #region Disc Flags diff --git a/RedBookPlayer/Hardware/Player.cs b/RedBookPlayer/Hardware/Player.cs index 2e822ee..5e63a79 100644 --- a/RedBookPlayer/Hardware/Player.cs +++ b/RedBookPlayer/Hardware/Player.cs @@ -90,35 +90,28 @@ namespace RedBookPlayer.Hardware #region Playback /// - /// Toggle audio playback + /// Set the current audio playback state /// - /// True to start playback, false to pause - public void TogglePlayPause(bool start) + /// True to start playback, false to pause, null to stop + private void SetPlayingState(bool? start) { if(_opticalDisc == null || !_opticalDisc.Initialized) return; - if(start) + if(start == true) { _soundOutput.Play(); _opticalDisc.SetTotalIndexes(); } - else + else if(start == false) { _soundOutput.Stop(); } - } - - /// - /// Stop the current audio playback - /// - public void Stop() - { - if(_opticalDisc == null || !_opticalDisc.Initialized) - return; - - _soundOutput.Stop(); - _opticalDisc.LoadFirstTrack(); + else + { + _soundOutput.Stop(); + _opticalDisc.LoadFirstTrack(); + } } /// @@ -130,13 +123,13 @@ namespace RedBookPlayer.Hardware return; bool wasPlaying = Playing; - if(wasPlaying) TogglePlayPause(false); + if(wasPlaying) SetPlayingState(false); _opticalDisc.NextTrack(); if(_opticalDisc is CompactDisc compactDisc) _soundOutput.ApplyDeEmphasis = compactDisc.TrackHasEmphasis; - if(wasPlaying) TogglePlayPause(true); + if(wasPlaying) SetPlayingState(true); } /// @@ -148,13 +141,13 @@ namespace RedBookPlayer.Hardware return; bool wasPlaying = Playing; - if(wasPlaying) TogglePlayPause(false); + if(wasPlaying) SetPlayingState(false); _opticalDisc.PreviousTrack(); if(_opticalDisc is CompactDisc compactDisc) _soundOutput.ApplyDeEmphasis = compactDisc.TrackHasEmphasis; - if(wasPlaying) TogglePlayPause(true); + if(wasPlaying) SetPlayingState(true); } /// @@ -167,13 +160,13 @@ namespace RedBookPlayer.Hardware return; bool wasPlaying = Playing; - if(wasPlaying) TogglePlayPause(false); + if(wasPlaying) SetPlayingState(false); _opticalDisc.NextIndex(changeTrack); if(_opticalDisc is CompactDisc compactDisc) _soundOutput.ApplyDeEmphasis = compactDisc.TrackHasEmphasis; - if(wasPlaying) TogglePlayPause(true); + if(wasPlaying) SetPlayingState(true); } /// @@ -186,13 +179,13 @@ namespace RedBookPlayer.Hardware return; bool wasPlaying = Playing; - if(wasPlaying) TogglePlayPause(false); + if(wasPlaying) SetPlayingState(false); _opticalDisc.PreviousIndex(changeTrack); if(_opticalDisc is CompactDisc compactDisc) _soundOutput.ApplyDeEmphasis = compactDisc.TrackHasEmphasis; - if(wasPlaying) TogglePlayPause(true); + if(wasPlaying) SetPlayingState(true); } /// @@ -255,12 +248,6 @@ namespace RedBookPlayer.Hardware return string.Join("", numbers.Select(i => i.ToString().PadLeft(2, '0').Substring(0, 2))); } - /// - /// Toggle de-emphasis processing - /// - /// True to apply de-emphasis, false otherwise - public void ToggleDeEmphasis(bool enable) => _soundOutput?.ToggleDeEmphasis(enable); - /// /// Update the data context for the frontend /// @@ -303,8 +290,9 @@ namespace RedBookPlayer.Hardware if(!Initialized || dataContext == null) return; + SetPlayingState(dataContext.Playing); App.Settings.Volume = dataContext.Volume; - ToggleDeEmphasis(dataContext.ApplyDeEmphasis); + _soundOutput?.ToggleDeEmphasis(dataContext.ApplyDeEmphasis); } ///