void _DoSlicing(object sender, DoWorkEventArgs e) { BackgroundWorker w = sender as BackgroundWorker; inputWavFile.Rewind(); uint samplesPerSlice = 0; if(durationRadio.Checked) { samplesPerSlice = (uint)(durationBox.Value * (decimal)inputWavFile.SampleRate); } else { samplesPerSlice = (uint)(((decimal)inputWavFile.Duration / slicesBox.Value) * inputWavFile.SampleRate); } System.Diagnostics.Debug.Print("Samples per slice: {0}", samplesPerSlice); System.Diagnostics.Debug.Print("nFrames: {0}", inputWavFile.NFrames); int n = (int)Math.Ceiling(inputWavFile.NFrames / inputWavFile.NChannels / (float)samplesPerSlice); byte[] iSlice = new byte[pictureBox1.ClientRectangle.Width]; for(int i=0;i<n;i++) { string fileBaseName = String.Format("{0}_{1:D4}.wav", System.IO.Path.GetFileNameWithoutExtension(inputFileStream.Name), i+1); string fileName = System.IO.Path.Combine(outputDirBox.Text, fileBaseName); System.Diagnostics.Debug.Print("Debug: {0} {1}", fileName, i); object[] derp = {fileBaseName, iSlice}; w.ReportProgress((int)(i / (float)(n-1) * 100), derp); using(FileStream ofs = new FileStream(fileName, FileMode.OpenOrCreate, FileAccess.Write)) { WavFile owf = new WavFile(); owf.SetFormat(inputWavFile.NChannels, inputWavFile.SampleWidth, inputWavFile.SampleRate); byte[] data = inputWavFile.ReadRaw(samplesPerSlice); Array.Copy(data, iSlice, iSlice.Length); owf.Write(ofs, data); } Thread.Sleep((n<100?40:15)); } }
void ValidateInputFile() { if(inputFileStream != null) { inputFileStream.Close(); inputWavFile = null; } FileStream fs = null; WavFile wf; try { fs = new FileStream(inputFileBox.Text, FileMode.Open, FileAccess.Read, FileShare.Read); wf = new WavFile(fs); } catch(Exception e) { infoLabel.ForeColor = Color.Maroon; infoLabel.Text = "Nope, not a valid file:\n" + e.Message; if(fs != null) fs.Close(); return; } infoLabel.ForeColor = SystemColors.ControlText; inputFileStream = fs; inputWavFile = wf; infoLabel.Text = String.Format("Sample Rate: {0}\nSample Resolution: {1} bits\nChannels: {2}\nDuration: {3}", wf.SampleRate, wf.SampleWidth, wf.NChannels, TimeSpan.FromSeconds(wf.Duration)); durationBox.Maximum = (decimal)wf.Duration; ValidateSettings(); }