/// <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!");
        }
Example #8
0
        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!");
        }