Skip to content

Commit

Permalink
More file types supported, and async support.
Browse files Browse the repository at this point in the history
  • Loading branch information
Kurochi51 committed Jul 23, 2023
1 parent 6da77e9 commit cfd8c9c
Show file tree
Hide file tree
Showing 2 changed files with 91 additions and 54 deletions.
13 changes: 7 additions & 6 deletions AudioConverter/Window.Designer.cs

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

132 changes: 84 additions & 48 deletions AudioConverter/Window.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,17 @@
using FFMpegCore;
using FFMpegCore.Enums;
using System.Text;
using static System.Windows.Forms.DataFormats;
using System.Windows.Forms;

namespace AudioConverter
{
public partial class Window : Form
{
private int totalFiles, counter;
private readonly string[] allOptions = { "MP3", "WAV", "OGG" };
private readonly string[] allOptions = { "AAC", "AC3", "FLAC", "M4A", "M4B", "MP3", "OGG", "WAV" };
private bool isDarkModeEnabled;
List<Task> conversionTasks = new List<Task>();

public Window()
{
Expand Down Expand Up @@ -68,8 +71,7 @@ private void InputTextBox_DragDrop(object sender, DragEventArgs e)
{
if (e.Data.GetDataPresent(DataFormats.FileDrop))
{
string[]? files = e.Data.GetData(DataFormats.FileDrop) as string[];
if (files != null && files.Length > 0)
if (e.Data.GetData(DataFormats.FileDrop) is string[] files && files.Length > 0)
{
string path = files[0];
if (sender == sourceBox)
Expand Down Expand Up @@ -183,25 +185,16 @@ private void ConvertButton_Click(object sender, EventArgs e)
}

// Find and convert audio files
Task.Run(() =>
Task.Run(async () =>
{
if (File.Exists(directory)) // If the source is a single file
if (File.Exists(directory))
{
string fileType = Path.GetExtension(directory);
ConvertAudioFile(directory, output, fileType, outputType);
await ConvertAllAudioFilesParallel(new string[] { directory }, outputType);
}
else if (Directory.Exists(directory)) // If the source is a directory
else if (Directory.Exists(directory))
{
string[] files = Directory.GetFiles(directory, "*", SearchOption.AllDirectories);
foreach (var file in files)
{
if (IsAudioFile(file))
{
string fileType = Path.GetExtension(file);
string outputFile = Path.Combine(output, file.Substring(directory.Length + 1));
ConvertAudioFile(file, outputFile, fileType, outputType);
}
}
await ConvertAllAudioFilesParallel(files, outputType);
}
MessageBox.Show("Conversion complete.", "Conversion Finished", MessageBoxButtons.OK, MessageBoxIcon.Information);
Invoke(new Action(() =>
Expand All @@ -212,55 +205,86 @@ private void ConvertButton_Click(object sender, EventArgs e)
});
}

private void ConvertAudioFile(string inputFile, string outputFile, string inputFormat, string outputFormat)
private void ConvertAudioFile(string inputFile, string outputFile, string outputFormat)
{
Codec? codec = null;
AudioQuality quality = AudioQuality.Low;
string outputExtension = string.Empty;
var formatMappings = new Dictionary<string, (Codec? codec, AudioQuality quality, string Extension)>
{
["AAC"] = (AudioCodec.Aac, AudioQuality.Good, ".aac"),
["AC3"] = (null, AudioQuality.Low, ".ac3"),
["FLAC"] = (null, AudioQuality.Low, ".flac"),
["M4A"] = (AudioCodec.Aac, AudioQuality.Good, ".m4a"),
["M4B"] = (AudioCodec.Aac, AudioQuality.Good, ".m4b"),
["MP3"] = (AudioCodec.LibMp3Lame, AudioQuality.Good, ".mp3"),
["OGG"] = (AudioCodec.LibVorbis, AudioQuality.Ultra, ".ogg"),
["WAV"] = (null, AudioQuality.Low, ".wav")
};

switch (outputFormat)
if (!formatMappings.TryGetValue(outputFormat, out var format))
{
case "MP3":
codec = AudioCodec.LibMp3Lame;
quality = AudioQuality.Good;
outputExtension = ".mp3";
break;
case "OGG":
codec = AudioCodec.LibVorbis;
quality = AudioQuality.Ultra;
outputExtension = ".ogg";
break;
case "WAV":
outputExtension = ".wav";
break;
return;
}
var codec = format.codec;
var quality = format.quality;
var outputExtension = format.Extension;

outputFile = Path.ChangeExtension(outputFile, outputExtension);

if (codec == null || quality == AudioQuality.Low)
{
FFMpegArguments
.FromFileInput(inputFile)
.OutputToFile(outputFile, true)
.ProcessSynchronously();
try
{
FFMpegArguments
.FromFileInput(inputFile)
.OutputToFile(outputFile, true)
.ProcessSynchronously(true);
counter++;
UpdateCounterText();
}
catch (Exception e)
{
MessageBox.Show(e.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
else
{
FFMpegArguments
.FromFileInput(inputFile)
.OutputToFile(outputFile, true, options => options
.WithAudioCodec(codec)
.WithAudioBitrate(quality))
.ProcessSynchronously();
try
{
FFMpegArguments
.FromFileInput(inputFile)
.OutputToFile(outputFile, true, options => options
.WithAudioCodec(codec)
.WithAudioBitrate(quality))
.ProcessSynchronously(true);
counter++;
UpdateCounterText();
}
catch (Exception e)
{
MessageBox.Show(e.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
counter++;
UpdateCounterText();
}

private bool IsAudioFile(string filePath)
{
bool found = false;
string extension = Path.GetExtension(filePath).ToLower();
return extension == ".mp3" || extension == ".wav" || extension == ".ogg";
foreach (var type in allOptions)
{
if ($".{type.ToLower()}" == extension)
{
found = true;
break;
}
}
if (found)
{
return true;
}
else
{
return false;
}
}

private void UpdateCounterText()
Expand Down Expand Up @@ -339,6 +363,18 @@ private void SetDarkMode(bool enabled)
}
}

private async Task ConvertAllAudioFilesParallel(string[] inputFiles, string outputFormat)
{
var tasks = new List<Task>();
UpdateCounterText();
foreach (var inputFile in inputFiles)
{
string outputFile = Path.Combine(outputBox.Text.Trim(), Path.GetFileNameWithoutExtension(inputFile)) + $".{outputFormat.ToLower()}";
tasks.Add(Task.Run(() => ConvertAudioFile(inputFile, outputFile, outputFormat)));
}
await Task.WhenAll(tasks);
}

private void DarkModeToggle_Click(object sender, EventArgs e)
{
isDarkModeEnabled = !isDarkModeEnabled;
Expand Down

0 comments on commit cfd8c9c

Please sign in to comment.