/Source/Sample_NAudio/MainWindow.xaml.cs

https://github.com/jacobjohnston/wpfsvl · C# · 207 lines · 175 code · 26 blank · 6 comment · 9 complexity · 924a80075eef82bcab421ca1ae105612 MD5 · raw file

  1. using System;
  2. using System.ComponentModel;
  3. using System.IO;
  4. using System.Windows;
  5. using System.Windows.Controls;
  6. using System.Windows.Media.Imaging;
  7. using WPFSoundVisualizationLib;
  8. using System.Windows.Data;
  9. namespace Sample_NAudio
  10. {
  11. /// <summary>
  12. /// Interaction logic for MainWindow.xaml
  13. /// </summary>
  14. public partial class MainWindow : Window
  15. {
  16. public MainWindow()
  17. {
  18. InitializeComponent();
  19. NAudioEngine soundEngine = NAudioEngine.Instance;
  20. soundEngine.PropertyChanged += NAudioEngine_PropertyChanged;
  21. UIHelper.Bind(soundEngine, "CanStop", StopButton, Button.IsEnabledProperty);
  22. UIHelper.Bind(soundEngine, "CanPlay", PlayButton, Button.IsEnabledProperty);
  23. UIHelper.Bind(soundEngine, "CanPause", PauseButton, Button.IsEnabledProperty);
  24. UIHelper.Bind(soundEngine, "SelectionBegin", repeatStartTimeEdit, TimeEditor.ValueProperty, BindingMode.TwoWay);
  25. UIHelper.Bind(soundEngine, "SelectionEnd", repeatStopTimeEdit, TimeEditor.ValueProperty, BindingMode.TwoWay);
  26. spectrumAnalyzer.RegisterSoundPlayer(soundEngine);
  27. waveformTimeline.RegisterSoundPlayer(soundEngine);
  28. LoadExpressionDarkTheme();
  29. }
  30. #region NAudio Engine Events
  31. private void NAudioEngine_PropertyChanged(object sender, PropertyChangedEventArgs e)
  32. {
  33. NAudioEngine engine = NAudioEngine.Instance;
  34. switch (e.PropertyName)
  35. {
  36. case "FileTag":
  37. if (engine.FileTag != null)
  38. {
  39. TagLib.Tag tag = engine.FileTag.Tag;
  40. if (tag.Pictures.Length > 0)
  41. {
  42. using (MemoryStream albumArtworkMemStream = new MemoryStream(tag.Pictures[0].Data.Data))
  43. {
  44. try
  45. {
  46. BitmapImage albumImage = new BitmapImage();
  47. albumImage.BeginInit();
  48. albumImage.CacheOption = BitmapCacheOption.OnLoad;
  49. albumImage.StreamSource = albumArtworkMemStream;
  50. albumImage.EndInit();
  51. albumArtPanel.AlbumArtImage = albumImage;
  52. }
  53. catch (NotSupportedException)
  54. {
  55. albumArtPanel.AlbumArtImage = null;
  56. // System.NotSupportedException:
  57. // No imaging component suitable to complete this operation was found.
  58. }
  59. albumArtworkMemStream.Close();
  60. }
  61. }
  62. else
  63. {
  64. albumArtPanel.AlbumArtImage = null;
  65. }
  66. }
  67. else
  68. {
  69. albumArtPanel.AlbumArtImage = null;
  70. }
  71. break;
  72. case "ChannelPosition":
  73. clockDisplay.Time = TimeSpan.FromSeconds(engine.ChannelPosition);
  74. break;
  75. default:
  76. // Do Nothing
  77. break;
  78. }
  79. }
  80. #endregion
  81. private void PlayButton_Click(object sender, RoutedEventArgs e)
  82. {
  83. if (NAudioEngine.Instance.CanPlay)
  84. NAudioEngine.Instance.Play();
  85. }
  86. private void PauseButton_Click(object sender, RoutedEventArgs e)
  87. {
  88. if (NAudioEngine.Instance.CanPause)
  89. NAudioEngine.Instance.Pause();
  90. }
  91. private void StopButton_Click(object sender, RoutedEventArgs e)
  92. {
  93. if (NAudioEngine.Instance.CanStop)
  94. NAudioEngine.Instance.Stop();
  95. }
  96. private void BrowseButton_Click(object sender, RoutedEventArgs e)
  97. {
  98. OpenFile();
  99. }
  100. private void LoadDefaultTheme()
  101. {
  102. DefaultThemeMenuItem.IsChecked = true;
  103. DefaultThemeMenuItem.IsEnabled = false;
  104. ExpressionDarkMenuItem.IsChecked = false;
  105. ExpressionDarkMenuItem.IsEnabled = true;
  106. ExpressionLightMenuItem.IsChecked = false;
  107. ExpressionLightMenuItem.IsEnabled = true;
  108. Resources.MergedDictionaries.Clear();
  109. }
  110. private void LoadDarkBlueTheme()
  111. {
  112. DefaultThemeMenuItem.IsChecked = false;
  113. DefaultThemeMenuItem.IsEnabled = true;
  114. ExpressionDarkMenuItem.IsChecked = false;
  115. ExpressionDarkMenuItem.IsEnabled = true;
  116. ExpressionLightMenuItem.IsChecked = false;
  117. ExpressionLightMenuItem.IsEnabled = true;
  118. Resources.MergedDictionaries.Clear();
  119. ResourceDictionary themeResources = Application.LoadComponent(new Uri("DarkBlue.xaml", UriKind.Relative)) as ResourceDictionary;
  120. Resources.MergedDictionaries.Add(themeResources);
  121. }
  122. private void LoadExpressionDarkTheme()
  123. {
  124. DefaultThemeMenuItem.IsChecked = false;
  125. DefaultThemeMenuItem.IsEnabled = true;
  126. ExpressionDarkMenuItem.IsChecked = true;
  127. ExpressionDarkMenuItem.IsEnabled = false;
  128. ExpressionLightMenuItem.IsChecked = false;
  129. ExpressionLightMenuItem.IsEnabled = true;
  130. Resources.MergedDictionaries.Clear();
  131. ResourceDictionary themeResources = Application.LoadComponent(new Uri("ExpressionDark.xaml", UriKind.Relative)) as ResourceDictionary;
  132. Resources.MergedDictionaries.Add(themeResources);
  133. }
  134. private void LoadExpressionLightTheme()
  135. {
  136. DefaultThemeMenuItem.IsChecked = false;
  137. DefaultThemeMenuItem.IsEnabled = true;
  138. ExpressionDarkMenuItem.IsChecked = false;
  139. ExpressionDarkMenuItem.IsEnabled = true;
  140. ExpressionLightMenuItem.IsChecked = true;
  141. ExpressionLightMenuItem.IsEnabled = false;
  142. Resources.MergedDictionaries.Clear();
  143. ResourceDictionary themeResources = Application.LoadComponent(new Uri("ExpressionLight.xaml", UriKind.Relative)) as ResourceDictionary;
  144. Resources.MergedDictionaries.Add(themeResources);
  145. }
  146. private void DefaultThemeMenuItem_Checked(object sender, RoutedEventArgs e)
  147. {
  148. LoadDefaultTheme();
  149. }
  150. private void ExpressionDarkMenuItem_Checked(object sender, RoutedEventArgs e)
  151. {
  152. LoadExpressionDarkTheme();
  153. }
  154. private void ExpressionLightMenuItem_Checked(object sender, RoutedEventArgs e)
  155. {
  156. LoadExpressionLightTheme();
  157. }
  158. private void OpenFile()
  159. {
  160. Microsoft.Win32.OpenFileDialog openDialog = new Microsoft.Win32.OpenFileDialog();
  161. openDialog.Filter = "(*.mp3)|*.mp3";
  162. if (openDialog.ShowDialog() == true)
  163. {
  164. NAudioEngine.Instance.OpenFile(openDialog.FileName);
  165. FileText.Text = openDialog.FileName;
  166. }
  167. }
  168. private void OpenFileMenuItem_Click(object sender, RoutedEventArgs e)
  169. {
  170. OpenFile();
  171. }
  172. private void CloseMenuItem_Click(object sender, RoutedEventArgs e)
  173. {
  174. Close();
  175. }
  176. protected override void OnClosing(System.ComponentModel.CancelEventArgs e)
  177. {
  178. NAudioEngine.Instance.Dispose();
  179. }
  180. }
  181. }