eac3to gui: audio extraction working

This commit is contained in:
Grigory Chudov
2018-02-24 11:32:35 -05:00
parent 4cf2420c46
commit 43218230eb
4 changed files with 218 additions and 68 deletions

View File

@@ -16,6 +16,10 @@ using System.Windows.Navigation;
using CUETools.Codecs.BDLPCM;
using CUETools.CDImage;
using CUETools.CTDB;
using System.ComponentModel;
using Krystalware.UploadHelper;
using CUETools.Codecs;
using CUETools.Codecs.FLAKE;
//using Microsoft.Win32;
namespace CUETools.eac3ui
@@ -88,6 +92,7 @@ namespace CUETools.eac3ui
private void cmbTitleSet_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
cmbMetadata.ItemsSource = new List<CTDBResponseMeta>();
ctdb = null;
var audios = new List<MPLSStream>();
if (e.AddedItems.Count == 1)
@@ -96,21 +101,50 @@ namespace CUETools.eac3ui
rdr.MPLSHeader.play_item.ForEach(i => i.audio.ForEach(v => { if (!audios.Exists(v1 => v1.pid == v.pid)) audios.Add(v); }));
var chapters = rdr.Chapters;
string strtoc = "";
for (int i = 0; i < chapters.Count; i++)
strtoc += string.Format(" {0}", chapters[i] / 600);
strtoc = strtoc.Substring(1);
CDImageLayout toc = new CDImageLayout(strtoc);
var ctdb = new CUEToolsDB(toc, null);
//Console.Error.WriteLine("Contacting CTDB...");
ctdb.ContactDB(null, "CUETools.eac3to 2.1.7", "", false, true, CTDBMetadataSearch.Extensive);
cmbMetadata.ItemsSource = ctdb.Metadata;
cmbMetadata.SelectedIndex = 0;
if (chapters.Count > 2)
{
string strtoc = "";
for (int i = 0; i < chapters.Count; i++)
strtoc += string.Format(" {0}", chapters[i] / 600);
strtoc = strtoc.Substring(1);
CDImageLayout toc = new CDImageLayout(strtoc);
ctdb = new CUEToolsDB(toc, null);
workerCtdb = new BackgroundWorker();
workerCtdb.DoWork += workerCtdb_DoWork;
workerCtdb.RunWorkerAsync();
}
}
cmbAudioTrack.ItemsSource = audios;
cmbAudioTrack.SelectedIndex = 0;
}
void workerCtdb_DoWork(object sender, DoWorkEventArgs e)
{
//Console.Error.WriteLine("Contacting CTDB...");
this.Dispatcher.Invoke(() =>
{
pbStatus.Visibility = Visibility.Visible;
pbStatus.IsIndeterminate = true;
});
//ctdb.UploadHelper.onProgress += worker_ctdbProgress;
ctdb.ContactDB(null, "CUETools.eac3to 2.1.7", "", false, true, CTDBMetadataSearch.Extensive);
this.Dispatcher.Invoke(() =>
{
pbStatus.Visibility = Visibility.Collapsed;
pbStatus.IsIndeterminate = false;
cmbMetadata.ItemsSource = ctdb.Metadata;
cmbMetadata.SelectedIndex = 0;
});
}
//private void worker_ctdbProgress(object sender, UploadProgressEventArgs args)
//{
// this.Dispatcher.Invoke(() =>
// {
// pbStatus.Value = (int)args.percent;
// });
//}
private void cmbAudioTrack_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
if (e.AddedItems.Count == 1)
@@ -118,5 +152,107 @@ namespace CUETools.eac3ui
MPLSStream stream = (MPLSStream)(e.AddedItems[0]);
}
}
BackgroundWorker workerCtdb;
CUEToolsDB ctdb;
BackgroundWorker workerExtract;
CTDBResponseMeta meta;
MPLSReader reader;
ushort pid;
string outputPath;
private void buttonExtract_Click(object sender, RoutedEventArgs e)
{
if (cmbTitleSet.SelectedItem == null) return;
pid = ((MPLSStream)cmbAudioTrack.SelectedItem).pid;
reader = new MPLSReader((cmbTitleSet.SelectedItem as MPLSReader).Path, null, pid);
meta = cmbMetadata.SelectedItem as CTDBResponseMeta;
outputPath = Path.Combine(textBoxDestination.Text, meta != null ? meta.artist + " - " + meta.year + " - " + meta.album + ".flac" : "image.flac");
pbStatus.Visibility = Visibility.Visible;
pbStatus.Value = 0.0;
//pbStatus.IsIndeterminate = true;
stackParams.IsEnabled = false;
buttonExtract.IsEnabled = false;
buttonStop.Visibility = Visibility.Visible;
buttonStop.IsEnabled = true;
workerExtract = new BackgroundWorker();
workerExtract.WorkerSupportsCancellation = true;
workerExtract.DoWork += workerExtract_DoWork;
workerExtract.RunWorkerAsync();
}
void workerExtract_DoWork(object sender, DoWorkEventArgs e)
{
try
{
AudioBuffer buff = new AudioBuffer(reader, 0x10000);
FlakeWriterSettings settings = new FlakeWriterSettings()
{
PCM = reader.PCM,
Padding = 16536,
EncoderMode = "5"
};
var start = DateTime.Now;
TimeSpan lastPrint = TimeSpan.FromMilliseconds(0);
var writer = new FlakeWriter(outputPath, settings);
try
{
while (reader.Read(buff, -1) != 0)
{
writer.Write(buff);
TimeSpan elapsed = DateTime.Now - start;
if ((elapsed - lastPrint).TotalMilliseconds > 60)
{
long length = Math.Max((long)(reader.Duration.TotalSeconds * reader.PCM.SampleRate), Math.Max(reader.Position, 1));
this.Dispatcher.Invoke(() =>
{
pbStatus.Value = 100.0 * reader.Position / length;
});
lastPrint = elapsed;
}
if (workerExtract.CancellationPending)
{
throw new Exception("aborted");
}
}
}
finally
{
writer.Close();
}
}
catch (Exception ex)
{
this.Dispatcher.Invoke(() =>
{
MessageBox.Show(this, ex.Message, "Extraction failed");
});
}
finally
{
reader.Close();
reader = null;
}
this.Dispatcher.Invoke(() =>
{
pbStatus.Visibility = Visibility.Collapsed;
//pbStatus.IsIndeterminate = false;
stackParams.IsEnabled = true;
buttonExtract.IsEnabled = true;
buttonStop.Visibility = Visibility.Hidden;
buttonStop.IsEnabled = false;
});
}
private void buttonStop_Click(object sender, RoutedEventArgs e)
{
workerExtract.CancelAsync();
buttonStop.Visibility = Visibility.Hidden;
buttonStop.IsEnabled = false;
}
}
}