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 @@