diff --git a/CUETools.Codecs/WAVReader.cs b/CUETools.Codecs/WAVReader.cs index 6cfbc40..fce796b 100644 --- a/CUETools.Codecs/WAVReader.cs +++ b/CUETools.Codecs/WAVReader.cs @@ -74,6 +74,11 @@ namespace CUETools.Codecs public string Path { get { return _path; } } public WAVReader(string path, Stream IO) + : this(path, IO, false) + { + } + + public WAVReader(string path, Stream IO, bool ignore_chunk_sizes) { _path = path; _IO = IO != null ? IO : new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read, 0x10000, FileOptions.SequentialScan); @@ -81,7 +86,7 @@ namespace CUETools.Codecs ParseHeaders(); - if (_dataLen < 0) + if (_dataLen < 0 || ignore_chunk_sizes) _sampleLen = -1; else _sampleLen = _dataLen / pcm.BlockAlign; diff --git a/CUETools.Converter/Program.cs b/CUETools.Converter/Program.cs index fd8ab93..ea5d188 100644 --- a/CUETools.Converter/Program.cs +++ b/CUETools.Converter/Program.cs @@ -19,6 +19,7 @@ namespace CUETools.Converter Console.Error.WriteLine(" --encoder-format Use encoder format different from file extension."); Console.Error.WriteLine(" --lossy Use lossy encoder/mode."); Console.Error.WriteLine(" --lossless Use lossless encoder/mode (default)."); + Console.Error.WriteLine(" --ignore-chunk-sizes Ignore WAV length (for pipe input)"); Console.Error.WriteLine(" -p # Padding bytes."); Console.Error.WriteLine(" -m Encoder mode (0..8 for flac, V0..V9 for mp3, etc)"); Console.Error.WriteLine(); @@ -32,10 +33,10 @@ namespace CUETools.Converter (lossless ? fmt.encoderLossless : fmt.encoderLossy); } - public static IAudioSource GetAudioSource(CUEToolsCodecsConfig config, string path, string chosenDecoder) + public static IAudioSource GetAudioSource(CUEToolsCodecsConfig config, string path, string chosenDecoder, bool ignore_chunk_sizes) { if (path == "-") - return new WAVReader("", Console.OpenStandardInput()); + return new WAVReader("", Console.OpenStandardInput(), ignore_chunk_sizes); string extension = Path.GetExtension(path).ToLower(); Stream IO = null; if (extension == ".bin") @@ -78,11 +79,15 @@ namespace CUETools.Converter string decoderName = null; string encoderName = null; string encoderFormat = null; + bool ignore_chunk_sizes = false; AudioEncoderType audioEncoderType = AudioEncoderType.NoAudio; + for (int arg = 0; arg < args.Length; arg++) { if (args[arg].Length == 0) ok = false; + else if (args[arg] == "--ignore-chunk-sizes") + ignore_chunk_sizes = true; else if (args[arg] == "--decoder" && ++arg < args.Length) decoderName = args[arg]; else if (args[arg] == "--encoder" && ++arg < args.Length) @@ -137,7 +142,7 @@ namespace CUETools.Converter try { - audioSource = Program.GetAudioSource(config, sourceFile, decoderName); + audioSource = Program.GetAudioSource(config, sourceFile, decoderName, ignore_chunk_sizes); AudioBuffer buff = new AudioBuffer(audioSource, 0x10000); Console.Error.WriteLine("Filename : {0}", sourceFile); Console.Error.WriteLine("File Info : {0}kHz; {1} channel; {2} bit; {3}", audioSource.PCM.SampleRate, audioSource.PCM.ChannelCount, audioSource.PCM.BitsPerSample, TimeSpan.FromSeconds(audioSource.Length * 1.0 / audioSource.PCM.SampleRate)); diff --git a/CUETools.FLACCL.cmd/Program.cs b/CUETools.FLACCL.cmd/Program.cs index 68ce18f..2fc6665 100644 --- a/CUETools.FLACCL.cmd/Program.cs +++ b/CUETools.FLACCL.cmd/Program.cs @@ -43,7 +43,8 @@ namespace CUETools.FLACCL.cmd Console.WriteLine(" --verify Verify during encoding"); Console.WriteLine(" --no-md5 Don't compute MD5 hash"); Console.WriteLine(" --no-seektable Don't generate a seektable"); - Console.WriteLine(" --cpu-threads Use additional CPU threads"); + Console.WriteLine(" --ignore-chunk-sizes Ignore WAV length (for pipe input)"); + Console.WriteLine(" --cpu-threads Use additional CPU threads"); Console.WriteLine(); Console.WriteLine("OpenCL Options:"); Console.WriteLine(); @@ -94,6 +95,7 @@ namespace CUETools.FLACCL.cmd bool buffered = false; bool ok = true; bool allowNonSubset = false; + bool ignore_chunk_sizes = false; int intarg; for (int arg = 0; arg < args.Length; arg++) @@ -106,9 +108,11 @@ namespace CUETools.FLACCL.cmd quiet = true; else if (args[arg] == "--verify") settings.DoVerify = true; - else if (args[arg] == "--no-seektable") + else if (args[arg] == "--no-seektable") do_seektable = false; - else if (args[arg] == "--slow-gpu") + else if (args[arg] == "--ignore-chunk-sizes") + ignore_chunk_sizes = true; + else if (args[arg] == "--slow-gpu") settings.GPUOnly = false; else if (args[arg] == "--fast-gpu") settings.DoRice = true; @@ -238,7 +242,7 @@ namespace CUETools.FLACCL.cmd try { if (input_file == "-") - audioSource = new WAVReader("", Console.OpenStandardInput()); + audioSource = new WAVReader("", Console.OpenStandardInput(), ignore_chunk_sizes); else if (input_file == "nul") audioSource = new SilenceGenerator(new AudioPCMConfig(input_bps, input_ch, input_rate), input_len, input_val); else if (File.Exists(input_file) && Path.GetExtension(input_file) == ".wav") @@ -337,11 +341,12 @@ namespace CUETools.FLACCL.cmd { if ((elapsed - lastPrint).TotalMilliseconds > 60) { - Console.Error.Write("\rProgress : {0:00}%; {1:0.00}x; {2}/{3}", - 100.0 * audioSource.Position / audioSource.Length, + long length = Math.Max(audioSource.Position, audioSource.Length); + Console.Error.Write("\rProgress : {0:00}%; {1:0.00}x; {2}/{3}", + 100.0 * audioSource.Position / length, audioSource.Position / elapsed.TotalSeconds / audioSource.PCM.SampleRate, elapsed, - TimeSpan.FromMilliseconds(elapsed.TotalMilliseconds / audioSource.Position * audioSource.Length) + TimeSpan.FromMilliseconds(elapsed.TotalMilliseconds / audioSource.Position * length) ); lastPrint = elapsed; } diff --git a/CUETools.Flake/Program.cs b/CUETools.Flake/Program.cs index 0121df0..cec90f6 100644 --- a/CUETools.Flake/Program.cs +++ b/CUETools.Flake/Program.cs @@ -100,6 +100,7 @@ namespace CUETools.FlakeExe Console.WriteLine(" --verify Verify during encoding."); Console.WriteLine(" --no-md5 Don't compute MD5 hash."); Console.WriteLine(" --no-seektable Don't generate a seektable."); + Console.WriteLine(" --ignore-chunk-sizes Ignore WAV length (for pipe input)"); Console.WriteLine(); Console.WriteLine("Advanced Options:"); Console.WriteLine(); @@ -147,6 +148,7 @@ namespace CUETools.FlakeExe string coeffs = null; var settings = new FlakeWriterSettings() { AllowNonSubset = true }; bool allowNonSubset = false; + bool ignore_chunk_sizes = false; #if FINETUNE int finetune_depth = -1; #endif @@ -164,6 +166,8 @@ namespace CUETools.FlakeExe settings.DoVerify = true; else if (args[arg] == "--no-seektable") do_seektable = false; + else if (args[arg] == "--ignore-chunk-sizes") + ignore_chunk_sizes = true; else if (args[arg] == "--no-md5") settings.DoMD5 = false; else if (args[arg] == "--lax") @@ -321,7 +325,7 @@ namespace CUETools.FlakeExe IAudioSource audioSource; if (input_file == "-") - audioSource = new WAVReader("", Console.OpenStandardInput()); + audioSource = new WAVReader("", Console.OpenStandardInput(), ignore_chunk_sizes); else if (File.Exists(input_file) && Path.GetExtension(input_file) == ".wav") audioSource = new WAVReader(input_file, null); else if (File.Exists(input_file) && Path.GetExtension(input_file) == ".flac") @@ -346,7 +350,7 @@ namespace CUETools.FlakeExe output_file == "-" ? Console.OpenStandardOutput() : output_file == "nul" ? new NullStream() : null, settings); - flake.FinalSampleCount = audioSource.Length - skip_a - skip_b; + flake.FinalSampleCount = audioSource.Length < 0 ? -1 : audioSource.Length - skip_a - skip_b; if (prediction_type != null) flake.PredictionType = Flake.LookupPredictionType(prediction_type); @@ -412,11 +416,12 @@ namespace CUETools.FlakeExe { if ((elapsed - lastPrint).TotalMilliseconds > 60) { + long length = Math.Max(audioSource.Position, audioSource.Length); Console.Error.Write("\rProgress : {0:00}%; {1:0.00}x; {2}/{3}", - 100.0 * audioSource.Position / audioSource.Length, + 100.0 * audioSource.Position / length, audioSource.Position / elapsed.TotalSeconds / audioSource.PCM.SampleRate, elapsed,//.ToString(@"[-][d’.’]hh’:’mm’:’ss[‘.’ff]"), - TimeSpan.FromMilliseconds(elapsed.TotalMilliseconds / audioSource.Position * audioSource.Length) + TimeSpan.FromMilliseconds(elapsed.TotalMilliseconds / audioSource.Position * length) ); lastPrint = elapsed; }