/// <summary> /// Checks all songs in the library if any files are missing /// </summary> private async void CheckFiles(Func <BackgroundTaskControl, Task> callBack) { BackgroundTaskControl bgtc = null; Dispatcher.Invoke(() => { bgtc = new BackgroundTaskControl(this.BackgroundTaskStackPanel, "Checking for errors..."); }); await Task.Factory.StartNew(() => { List <string> ErrorSongs = new List <string>(); foreach (Song song in SongLibrary.SongList) { if (!System.IO.File.Exists(song.FilePath)) { ErrorSongs.Add(song.Name); } } if (ErrorSongs.Any()) { string errString = "The following songs have incorrect filepaths:\n"; foreach (string song in ErrorSongs) { errString += song + '\n'; } MessageBox.Show(errString, "Errors found", MessageBoxButton.OK, MessageBoxImage.Warning); } else { MessageBox.Show("No errors found."); } }); await callBack(bgtc); }
/// <summary> /// Asynchronously deserializes the backing library xml /// </summary> /// <param name="callBack">The function to callback when deserialization is finished</param> /// <returns></returns> public async Task AsyncDeserialize(Func <BackgroundTaskControl, Task> callBack) { if (SongLibrary?.SongList != null) { SongLibrary.SongList.CollectionChanged -= UpdateHintTextBox; // remove old listener to avoid resource leaks } BackgroundTaskControl bgtc = null; Dispatcher.Invoke(() => { bgtc = new BackgroundTaskControl(this.BackgroundTaskStackPanel, "Opening Library..."); }); bool result = false; await Task.Factory.StartNew(() => { result = XMLDeserializeLibrary(); }); if (!result) { SongLibrary = new Library(); } SongLibrary.SongList.CollectionChanged += UpdateHintTextBox; UpdateHintTextBox(this, null); UpdateLists(); await callBack(bgtc); }
public async void DoFileConvert(object sender, RoutedEventArgs args) { if (filePaths.Count() <= 0) { MessageBox.Show("Select files first!"); } else if (!Directory.Exists(outputPath)) { MessageBox.Show("Select a valid folder for output"); } else { WaitingProgressBar.Value = WaitingProgressBar.Minimum; WaitingProgressBar.IsIndeterminate = true; WaitingProgressBar.Visibility = Visibility.Visible; WaitingLabel.Visibility = Visibility.Visible; WaitingLabel.Content = "Converting files, hang on..."; BackgroundTaskControl bgtc = null; if (parentWindow != null) { bgtc = new BackgroundTaskControl(parentWindow.BackgroundTaskStackPanel, WaitingLabel.Content + "");; } Exportbutton.IsEnabled = false; await Task.Factory.StartNew(async() => { await ConvertFiles(ConvertCallBack, bgtc); }); } }
/// <summary> /// Asynchronously serializes the library into a xml /// </summary> /// <param name="callBack">The function to callback when the serialization is finished</param> /// <returns></returns> public async Task AsyncSerialize(Func <BackgroundTaskControl, Task> callBack) { BackgroundTaskControl bgtc = null; Dispatcher.Invoke(() => { bgtc = new BackgroundTaskControl(this.BackgroundTaskStackPanel, "Saving Library..."); }); await Task.Factory.StartNew(() => { XMLSerializeLibrary(SongLibrary); }); await callBack(bgtc); }
private async Task ConvertCallBack(BackgroundTaskControl bgtc) { Dispatcher.Invoke(() => { WaitingLabel.Content = "Conversion Done"; WaitingProgressBar.IsIndeterminate = false; WaitingProgressBar.Value = WaitingProgressBar.Maximum; Exportbutton.IsEnabled = true; if (parentWindow != null) { bgtc?.Dispose(); } }); }
public async Task BackgroundCallback(BackgroundTaskControl bgtc) { bgtc?.Dispose(); }
private async Task ConvertFiles(Func <BackgroundTaskControl, Task> callBack, BackgroundTaskControl bgtc) { await Task.Delay(250); // give time for rendering changes WaveStream inputStream = null; for (int i = 0; i < filePaths.Count(); i++) { try { if (filePaths[i].EndsWith(".ogg")) { inputStream = new VorbisWaveReader(filePaths[i]); } else if (filePaths[i].EndsWith(".flac")) { inputStream = new FlacReader(filePaths[i]); } else { inputStream = new AudioFileReader(filePaths[i]); } string selectedFileType = ""; Dispatcher.Invoke(() => { selectedFileType = OutputFileTypeComboBox.SelectedItem as string; WaitingLabel.Content = $"Now converting {safeFileNames[i]} to {selectedFileType.Substring(selectedFileType.IndexOf("(")+1,4)}"; if (bgtc != null) { bgtc.BackgroundTaskLabel.Content = WaitingLabel.Content; } }); if (selectedFileType.EndsWith("(.mp3)")) { string monoStereoSelection = ""; Dispatcher.Invoke(() => { monoStereoSelection = MSConvertComboBox.SelectedItem as string; }); if (inputStream.WaveFormat.BitsPerSample == 16) { IWaveProvider provider = MonoStereoConvert16(inputStream, monoStereoSelection == "Mono"); using (FileStream fileStream = File.Create($"{outputPath}/{safeFileNames[i]}.mp3")) using (NAudio.Lame.LameMP3FileWriter writer = new NAudio.Lame.LameMP3FileWriter(fileStream, provider.WaveFormat, 320000)) { byte[] buffer = new byte[4096]; int bytesRead = 0; do { bytesRead = provider.Read(buffer, 0, buffer.Length); writer.Write(buffer, 0, bytesRead); } while (bytesRead > 0); } } else if (inputStream.WaveFormat.BitsPerSample == 32) { ISampleProvider provider = MonoStereoConvert32(inputStream as ISampleProvider, monoStereoSelection == "Mono"); using (FileStream fileStream = File.Create($"{outputPath}/{safeFileNames[i]}.mp3")) using (NAudio.Lame.LameMP3FileWriter writer = new NAudio.Lame.LameMP3FileWriter(fileStream, provider.WaveFormat, 320000)) { byte[] buffer = new byte[4096]; int bytesRead = 0; do { var providerAsWave = provider.ToWaveProvider(); // need to write with bytes not floats bytesRead = providerAsWave.Read(buffer, 0, buffer.Length); writer.Write(buffer, 0, bytesRead); } while (bytesRead > 0); } } TagLib.File outputTags = TagLib.File.Create($"{outputPath}//{safeFileNames[i]}.mp3"); TagLib.File inputTags = TagLib.File.Create(filePaths[i]); outputTags.Tag.Album = inputTags.Tag.Album; outputTags.Tag.AlbumArtists = inputTags.Tag.AlbumArtists; outputTags.Tag.Genres = inputTags.Tag.Genres; outputTags.Tag.Performers = inputTags.Tag.Performers; outputTags.Tag.Year = inputTags.Tag.Year; outputTags.Tag.Pictures = inputTags.Tag.Pictures; outputTags.Tag.Title = inputTags.Tag.Title; outputTags.Tag.Track = inputTags.Tag.Track; outputTags.Save(); inputTags.Dispose(); outputTags.Dispose(); } //else if (selectedFileType.EndsWith("(.wma)")) //{ // FileStream fileStream = File.Create($"c:/temp/conversiontest/{safeFileName}.wma"); // fileStream.Close(); // using (MediaFoundationEncoder writer = new MediaFoundationEncoder(new NAudio.MediaFoundation.MediaType(inputStream.WaveFormat))) // { // writer.Encode($"c:/temp/conversiontest/{safeFileName}.wma", inputStream); // } //} else if (selectedFileType.EndsWith("(.wav)")) { string monoStereoSelection = ""; Dispatcher.Invoke(() => { monoStereoSelection = MSConvertComboBox.SelectedItem as string; }); if (inputStream.WaveFormat.BitsPerSample == 16) { IWaveProvider provider = MonoStereoConvert16(inputStream, monoStereoSelection == "Mono"); using (FileStream fileStream = File.Create($"{outputPath}/{safeFileNames[i]}.wav")) using (WaveFileWriter writer = new WaveFileWriter(fileStream, provider.WaveFormat)) { byte[] buffer = new byte[4096]; int bytesRead = 0; do { bytesRead = provider.Read(buffer, 0, buffer.Length); writer.Write(buffer, 0, bytesRead); } while (bytesRead > 0); } } else if (inputStream.WaveFormat.BitsPerSample == 32) { ISampleProvider provider = MonoStereoConvert32(inputStream as ISampleProvider, monoStereoSelection == "Mono"); using (FileStream fileStream = File.Create($"{outputPath}/{safeFileNames[i]}.wav")) using (WaveFileWriter writer = new WaveFileWriter(fileStream, provider.WaveFormat)) { byte[] buffer = new byte[4096]; int bytesRead = 0; do { var providerAsWave = provider.ToWaveProvider(); // need to write with bytes not floats bytesRead = providerAsWave.Read(buffer, 0, buffer.Length); writer.Write(buffer, 0, bytesRead); } while (bytesRead > 0); } } TagLib.File outputTags = TagLib.File.Create($"{outputPath}/{safeFileNames[i]}.wav"); TagLib.File inputTags = TagLib.File.Create(filePaths[i]); outputTags.Tag.Album = inputTags.Tag.Album; outputTags.Tag.AlbumArtists = inputTags.Tag.AlbumArtists; outputTags.Tag.Genres = inputTags.Tag.Genres; outputTags.Tag.Performers = inputTags.Tag.Performers; outputTags.Tag.Year = inputTags.Tag.Year; outputTags.Tag.Pictures = inputTags.Tag.Pictures; outputTags.Tag.Title = inputTags.Tag.Title; outputTags.Tag.Track = inputTags.Tag.Track; outputTags.Save(); inputTags.Dispose(); outputTags.Dispose(); } } catch (Exception e) { MessageBox.Show("Error converting " + filePaths[i] + ", message: " + e.Message); //just move onto the next song } finally { (inputStream as WaveStream)?.Close(); } } await callBack(bgtc); MessageBox.Show("File(s) successfully converted!"); }
private async Task ConvertFiles(Func <BackgroundTaskControl, Task> callBack, BackgroundTaskControl bgtc) { await Task.Delay(250); // give time for rendering changes WaveStream inputStream = null; for (int i = 0; i < selectedSongs.Count(); i++) { try { if (selectedSongs[i].FilePath.EndsWith(".ogg")) { inputStream = new VorbisWaveReader(selectedSongs[i].FilePath); } else if (selectedSongs[i].FilePath.EndsWith(".flac")) { inputStream = new FlacReader(selectedSongs[i].FilePath); } else { inputStream = new AudioFileReader(selectedSongs[i].FilePath); } string selectedFileType = ""; Dispatcher.Invoke(() => { selectedFileType = OutputFileTypeComboBox.SelectedItem as string; WaitingLabel.Content = $"Now converting {selectedSongs[i].Name} to {selectedFileType.Substring(selectedFileType.IndexOf("(") + 1, 4)}"; bgtc.BackgroundTaskLabel.Content = WaitingLabel.Content; }); if (selectedFileType.EndsWith("(.mp3)")) { using (FileStream fileStream = File.Create($"{outputPath}/{selectedSongs[i].Name}.mp3")) using (NAudio.Lame.LameMP3FileWriter writer = new NAudio.Lame.LameMP3FileWriter(fileStream, inputStream.WaveFormat, 320000)) { byte[] buffer = new byte[4096]; int bytesRead = 0; do { bytesRead = inputStream.Read(buffer, 0, buffer.Length); writer.Write(buffer, 0, bytesRead); } while (bytesRead > 0); } TagLib.File outputTags = TagLib.File.Create($"{outputPath}/{selectedSongs[i].Name}.mp3"); TagLib.File inputTags = TagLib.File.Create(selectedSongs[i].FilePath); outputTags.Tag.Album = inputTags.Tag.Album; outputTags.Tag.AlbumArtists = inputTags.Tag.AlbumArtists; outputTags.Tag.Genres = inputTags.Tag.Genres; outputTags.Tag.Performers = inputTags.Tag.Performers; outputTags.Tag.Year = inputTags.Tag.Year; outputTags.Tag.Pictures = inputTags.Tag.Pictures; outputTags.Tag.Title = inputTags.Tag.Title; outputTags.Tag.Track = inputTags.Tag.Track; outputTags.Save(); inputTags.Dispose(); outputTags.Dispose(); } else if (selectedFileType.EndsWith("(.wav)")) { using (FileStream fileStream = File.Create($"{outputPath}/{selectedSongs[i].Name}.wav")) using (WaveFileWriter writer = new WaveFileWriter(fileStream, inputStream.WaveFormat)) { byte[] buffer = new byte[4096]; int bytesRead = 0; do { bytesRead = inputStream.Read(buffer, 0, buffer.Length); writer.Write(buffer, 0, bytesRead); } while (bytesRead > 0); } TagLib.File outputTags = TagLib.File.Create($"{outputPath}/{selectedSongs[i].Name}.wav"); TagLib.File inputTags = TagLib.File.Create(selectedSongs[i].FilePath); outputTags.Tag.Album = inputTags.Tag.Album; outputTags.Tag.AlbumArtists = inputTags.Tag.AlbumArtists; outputTags.Tag.Genres = inputTags.Tag.Genres; outputTags.Tag.Performers = inputTags.Tag.Performers; outputTags.Tag.Year = inputTags.Tag.Year; outputTags.Tag.Pictures = inputTags.Tag.Pictures; outputTags.Tag.Title = inputTags.Tag.Title; outputTags.Tag.Track = inputTags.Tag.Track; outputTags.Save(); inputTags.Dispose(); outputTags.Dispose(); } } catch (Exception e) { MessageBox.Show("Error converting " + selectedSongs[i].FilePath + ", message: " + e.Message); await callBack(bgtc); inputStream?.Close(); return; } finally { inputStream?.Close(); } } await callBack(bgtc); MessageBox.Show("File(s) successfully converted!"); }