From b7bd01c6c02ce83d3003455408e196e7e20f86b0 Mon Sep 17 00:00:00 2001 From: sabihoshi Date: Mon, 24 May 2021 03:47:47 +0800 Subject: [PATCH] Fix crash when Microsoft GS Wavetable Synth does not exist --- .../GenshinLyreMidiPlayer.WPF.csproj | 2 +- .../ViewModels/LyrePlayerViewModel.cs | 22 +++++++++++++++---- .../ViewModels/SettingsPageViewModel.cs | 2 ++ .../Views/SettingsPageView.xaml | 1 + 4 files changed, 22 insertions(+), 5 deletions(-) diff --git a/GenshinLyreMidiPlayer.WPF/GenshinLyreMidiPlayer.WPF.csproj b/GenshinLyreMidiPlayer.WPF/GenshinLyreMidiPlayer.WPF.csproj index f2a3bd1..33f4c4b 100644 --- a/GenshinLyreMidiPlayer.WPF/GenshinLyreMidiPlayer.WPF.csproj +++ b/GenshinLyreMidiPlayer.WPF/GenshinLyreMidiPlayer.WPF.csproj @@ -6,7 +6,7 @@ true GenshinLyreMidiPlayer.WPF.App app.manifest - 2.0.1 + 2.0.2 item_windsong_lyre.ico enable https://github.com/sabihoshi/GenshinLyreMidiPlayer diff --git a/GenshinLyreMidiPlayer.WPF/ViewModels/LyrePlayerViewModel.cs b/GenshinLyreMidiPlayer.WPF/ViewModels/LyrePlayerViewModel.cs index f4d7c4c..6012201 100644 --- a/GenshinLyreMidiPlayer.WPF/ViewModels/LyrePlayerViewModel.cs +++ b/GenshinLyreMidiPlayer.WPF/ViewModels/LyrePlayerViewModel.cs @@ -31,7 +31,7 @@ public class LyrePlayerViewModel : Screen, private readonly IEventAggregator _events; private readonly MediaPlayer? _player; private readonly SettingsPageViewModel _settings; - private readonly OutputDevice _speakers; + private readonly OutputDevice? _speakers; private readonly PlaybackCurrentTimeWatcher _timeWatcher; private bool _ignoreSliderChange; private InputDevice? _inputDevice; @@ -40,7 +40,6 @@ public class LyrePlayerViewModel : Screen, public LyrePlayerViewModel(IContainer ioc, SettingsPageViewModel settings, PlaylistViewModel playlist) { - _speakers = OutputDevice.GetByName("Microsoft GS Wavetable Synth"); _timeWatcher = PlaybackCurrentTimeWatcher.Instance; _events = ioc.Get(); @@ -66,6 +65,18 @@ public LyrePlayerViewModel(IContainer ioc, _player.CommandManager.PlayReceived += async (_, _) => await PlayPause(); _player.CommandManager.PauseReceived += async (_, _) => await PlayPause(); } + + try + { + _speakers = OutputDevice.GetByName("Microsoft GS Wavetable Synth"); + } + catch (ArgumentException e) + { + new ErrorContentDialog(e, closeText: "Ignore").ShowAsync(); + + _settings.CanUseSpeakers = false; + Settings.UseSpeakers = false; + } } public BindableCollection MidiInputs { get; } = new() @@ -225,8 +236,11 @@ public void UpdateButtons() private void InitializeTracks() { + if (Playlist.OpenedFile?.Midi is null) + return; + MidiTracks.Clear(); - MidiTracks.AddRange(Playlist.OpenedFile? + MidiTracks.AddRange(Playlist.OpenedFile .Midi.GetTrackChunks() .Select(t => new MidiTrack(_events, t))); } @@ -425,7 +439,7 @@ private void PlayNote(NoteEvent noteEvent) { if (Settings.UseSpeakers) { - _speakers.SendEvent(noteEvent); + _speakers?.SendEvent(noteEvent); return; } diff --git a/GenshinLyreMidiPlayer.WPF/ViewModels/SettingsPageViewModel.cs b/GenshinLyreMidiPlayer.WPF/ViewModels/SettingsPageViewModel.cs index 2bc3dd2..4d8b75c 100644 --- a/GenshinLyreMidiPlayer.WPF/ViewModels/SettingsPageViewModel.cs +++ b/GenshinLyreMidiPlayer.WPF/ViewModels/SettingsPageViewModel.cs @@ -45,6 +45,8 @@ public SettingsPageViewModel(IContainer ioc) public bool CanStartStopTimer => DateTime - DateTime.Now > TimeSpan.Zero; + public bool CanUseSpeakers { get; set; } = true; + public bool IncludeBetaUpdates { get; set; } = Settings.IncludeBetaUpdates; public bool IsCheckingUpdate { get; set; } diff --git a/GenshinLyreMidiPlayer.WPF/Views/SettingsPageView.xaml b/GenshinLyreMidiPlayer.WPF/Views/SettingsPageView.xaml index fbf1624..ddcb546 100644 --- a/GenshinLyreMidiPlayer.WPF/Views/SettingsPageView.xaml +++ b/GenshinLyreMidiPlayer.WPF/Views/SettingsPageView.xaml @@ -25,6 +25,7 @@