public bool Read(BinaryReader br, int numChannels, int bitsPerSample) { subChunk2Id = br.ReadBytes(4); if (subChunk2Id[0] != 'd' || subChunk2Id[1] != 'a' || subChunk2Id[2] != 't' || subChunk2Id[3] != 'a') { Console.WriteLine("E: DataSubChunk.subChunk2Id mismatch. \"{0}{1}{2}{3}\" should be \"data\"", (char)subChunk2Id[0], (char)subChunk2Id[1], (char)subChunk2Id[2], (char)subChunk2Id[3]); return(false); } subChunk2Size = br.ReadUInt32(); Console.WriteLine("D: subChunk2Size={0}", subChunk2Size); if (0x80000000 <= subChunk2Size) { Console.WriteLine("E: file too large to handle. {0} bytes", subChunk2Size); return(false); } int numSamples = (int)(subChunk2Size / (bitsPerSample / 8) / numChannels); data = new List <PcmSamples1Channel>(); for (int i = 0; i < numChannels; ++i) { PcmSamples1Channel ps1 = new PcmSamples1Channel(numSamples, bitsPerSample); data.Add(ps1); } for (int pos = 0; pos < numSamples; ++pos) { for (int ch = 0; ch < numChannels; ++ch) { Sample16Set(ch, pos, br.ReadInt16()); } } return(true); }
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) { int sampleDelay; double w1w2VolumeRatio; if (!SampleDelay(wavRead1, wavRead2, out sampleDelay, out w1w2VolumeRatio)) { e.Result = false; resultString = rm.GetString("TwoWavFilesTooDifferent"); return; } if (!checkBoxAutoAdjustVolumeDifference.Checked) { w1w2VolumeRatio = 1.0; } int numSamples = wavRead1.NumSamples - 2 * Math.Abs(sampleDelay); if (wavRead2.NumSamples < wavRead1.NumSamples) { numSamples = wavRead2.NumSamples - 2 * Math.Abs(sampleDelay); } List<PcmSamples1Channel> samples = new List<PcmSamples1Channel>(); for (int i=0; i<wavRead1.NumChannels; ++i) { PcmSamples1Channel ps = new PcmSamples1Channel(numSamples, wavRead1.BitsPerSample); samples.Add(ps); } long acc = 0; int maxDiff = 0; float magnitude = (float)Magnitude; if (0 <= sampleDelay) { for (int ch=0; ch < wavRead1.NumChannels; ++ch) { PcmSamples1Channel ps = samples[ch]; for (int sample=0; sample < numSamples; ++sample) { int diff = (int)(wavRead1.Sample16Get(ch, sample) - wavRead2.Sample16Get(ch, sample + sampleDelay) * w1w2VolumeRatio); int absDiff = Math.Abs(diff); acc += absDiff; if (maxDiff < absDiff) { maxDiff = absDiff; } ps.Set16(sample, (short)(diff * magnitude)); } } } else { // sampleDelay < 0 for (int ch=0; ch < wavRead1.NumChannels; ++ch) { PcmSamples1Channel ps = samples[ch]; for (int sample=0; sample < numSamples; ++sample) { int diff = (int)(wavRead1.Sample16Get(ch, sample - sampleDelay) - wavRead2.Sample16Get(ch, sample) * w1w2VolumeRatio); int absDiff = Math.Abs(diff); acc += absDiff; if (maxDiff < absDiff) { maxDiff = absDiff; } ps.Set16(sample, (short)(diff * magnitude)); } } } if (0 == acc) { e.Result = false; resultString = rm.GetString("TwoWavFilesAreExactlyTheSame"); return; } WavData wav = new WavData(); wav.Create(wavRead1.SampleRate, wavRead1.BitsPerSample, samples); if (0 < maxDiff) { int maxMagnitude = 32767 / maxDiff; resultString = string.Format(rm.GetString("DiffStatistics"), (double)acc / wav.NumSamples, maxDiff, maxMagnitude); Console.WriteLine(resultString); if (32767 < maxDiff * magnitude) { Console.WriteLine(rm.GetString("OutputFileLevelOver"), maxMagnitude); } } try { using (BinaryWriter bw = new BinaryWriter(File.Open(textBoxWrite.Text, FileMode.CreateNew))) { wav.Write(bw); } } catch (Exception ex) { resultString = ex.ToString(); e.Result = false; } e.Result = true; }
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) { int sampleDelay; double w1w2VolumeRatio; if (!SampleDelay(wavRead1, wavRead2, out sampleDelay, out w1w2VolumeRatio)) { e.Result = false; resultString = rm.GetString("TwoWavFilesTooDifferent"); return; } if (!checkBoxAutoAdjustVolumeDifference.Checked) { w1w2VolumeRatio = 1.0; } int numSamples = wavRead1.NumSamples - 2 * Math.Abs(sampleDelay); if (wavRead2.NumSamples < wavRead1.NumSamples) { numSamples = wavRead2.NumSamples - 2 * Math.Abs(sampleDelay); } List <PcmSamples1Channel> samples = new List <PcmSamples1Channel>(); for (int i = 0; i < wavRead1.NumChannels; ++i) { PcmSamples1Channel ps = new PcmSamples1Channel(numSamples, wavRead1.BitsPerSample); samples.Add(ps); } long acc = 0; int maxDiff = 0; float magnitude = (float)Magnitude; if (0 <= sampleDelay) { for (int ch = 0; ch < wavRead1.NumChannels; ++ch) { PcmSamples1Channel ps = samples[ch]; for (int sample = 0; sample < numSamples; ++sample) { int diff = (int)(wavRead1.Sample16Get(ch, sample) - wavRead2.Sample16Get(ch, sample + sampleDelay) * w1w2VolumeRatio); int absDiff = Math.Abs(diff); acc += absDiff; if (maxDiff < absDiff) { maxDiff = absDiff; } ps.Set16(sample, (short)(diff * magnitude)); } } } else { // sampleDelay < 0 for (int ch = 0; ch < wavRead1.NumChannels; ++ch) { PcmSamples1Channel ps = samples[ch]; for (int sample = 0; sample < numSamples; ++sample) { int diff = (int)(wavRead1.Sample16Get(ch, sample - sampleDelay) - wavRead2.Sample16Get(ch, sample) * w1w2VolumeRatio); int absDiff = Math.Abs(diff); acc += absDiff; if (maxDiff < absDiff) { maxDiff = absDiff; } ps.Set16(sample, (short)(diff * magnitude)); } } } if (0 == acc) { e.Result = false; resultString = rm.GetString("TwoWavFilesAreExactlyTheSame"); return; } WavData wav = new WavData(); wav.Create(wavRead1.SampleRate, wavRead1.BitsPerSample, samples); if (0 < maxDiff) { int maxMagnitude = 32767 / maxDiff; resultString = string.Format(rm.GetString("DiffStatistics"), (double)acc / wav.NumSamples, maxDiff, maxMagnitude); Console.WriteLine(resultString); if (32767 < maxDiff * magnitude) { Console.WriteLine(rm.GetString("OutputFileLevelOver"), maxMagnitude); } } try { using (BinaryWriter bw = new BinaryWriter(File.Open(textBoxWrite.Text, FileMode.CreateNew))) { wav.Write(bw); } } catch (Exception ex) { resultString = ex.ToString(); e.Result = false; } e.Result = true; }
public bool Read(BinaryReader br, int numChannels, int bitsPerSample) { subChunk2Id = br.ReadBytes(4); if (subChunk2Id[0] != 'd' || subChunk2Id[1] != 'a' || subChunk2Id[2] != 't' || subChunk2Id[3] != 'a') { Console.WriteLine("E: DataSubChunk.subChunk2Id mismatch. \"{0}{1}{2}{3}\" should be \"data\"", (char)subChunk2Id[0], (char)subChunk2Id[1], (char)subChunk2Id[2], (char)subChunk2Id[3]); return false; } subChunk2Size = br.ReadUInt32(); Console.WriteLine("D: subChunk2Size={0}", subChunk2Size); if (0x80000000 <= subChunk2Size) { Console.WriteLine("E: file too large to handle. {0} bytes", subChunk2Size); return false; } int numSamples = (int)(subChunk2Size / (bitsPerSample / 8) / numChannels); data = new List<PcmSamples1Channel>(); for (int i=0; i < numChannels; ++i) { PcmSamples1Channel ps1 = new PcmSamples1Channel(numSamples, bitsPerSample); data.Add(ps1); } for (int pos=0; pos < numSamples; ++pos) { for (int ch=0; ch < numChannels; ++ch) { Sample16Set(ch, pos, br.ReadInt16()); } } return true; }
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) { int sampleDelay; double w1w2VolumeRatio; if (!SampleDelay(wavRead1, wavRead2, out sampleDelay, out w1w2VolumeRatio)) { e.Result = false; resultString = rm.GetString("TwoWavFilesTooDifferent"); return; } int numSamples = wavRead1.NumSamples - 2 * Math.Abs(sampleDelay); if (wavRead2.NumSamples < wavRead1.NumSamples) { numSamples = wavRead2.NumSamples - 2 * Math.Abs(sampleDelay); } List<PcmSamples1Channel> samples1 = new List<PcmSamples1Channel>(); for (int i=0; i < wavRead1.NumChannels; ++i) { PcmSamples1Channel ps = new PcmSamples1Channel(numSamples, wavRead1.BitsPerSample); samples1.Add(ps); } List<PcmSamples1Channel> samples2 = new List<PcmSamples1Channel>(); for (int i=0; i < wavRead2.NumChannels; ++i) { PcmSamples1Channel ps = new PcmSamples1Channel(numSamples, wavRead2.BitsPerSample); samples2.Add(ps); } long acc = 0; int maxDiff = 0; int maxDiffPos = 0; double maxDiffRatio = 0; if (0 <= sampleDelay) { for (int ch=0; ch < wavRead1.NumChannels; ++ch) { PcmSamples1Channel ps1 = samples1[ch]; PcmSamples1Channel ps2 = samples2[ch]; for (int sample=0; sample < numSamples; ++sample) { int diff = (int)(wavRead1.Sample16Get(ch, sample) - wavRead2.Sample16Get(ch, sample + sampleDelay)); int absDiff = Math.Abs(diff); acc += absDiff; if (maxDiff < absDiff) { maxDiff = absDiff; maxDiffRatio = (double)wavRead1.Sample16Get(ch, sample) / wavRead2.Sample16Get(ch, sample + sampleDelay); maxDiffPos = sample; } ps1.Set16(sample, wavRead1.Sample16Get(ch, sample)); ps2.Set16(sample, wavRead2.Sample16Get(ch, sample + sampleDelay)); } } } else { // sampleDelay < 0 for (int ch=0; ch < wavRead1.NumChannels; ++ch) { PcmSamples1Channel ps1 = samples1[ch]; PcmSamples1Channel ps2 = samples2[ch]; for (int sample=0; sample < numSamples; ++sample) { int diff = (int)(wavRead1.Sample16Get(ch, sample - sampleDelay) - wavRead2.Sample16Get(ch, sample)); int absDiff = Math.Abs(diff); acc += absDiff; if (maxDiff < absDiff) { maxDiff = absDiff; maxDiffRatio = (double)wavRead1.Sample16Get(ch, sample) / wavRead2.Sample16Get(ch, sample + sampleDelay); maxDiffPos = sample; } ps1.Set16(sample, wavRead1.Sample16Get(ch, sample - sampleDelay)); ps2.Set16(sample, wavRead2.Sample16Get(ch, sample)); } } } if (0 == acc) { e.Result = false; resultString = rm.GetString("TwoWavFilesAreExactlyTheSame"); return; } if (0 < maxDiff) { int maxMagnitude = 32767 / maxDiff; resultString = string.Format(rm.GetString("DiffStatistics"), (double)acc / numSamples, maxDiff, maxDiffPos, (double)maxDiffPos/wavRead1.SampleRate, 20.0 * System.Math.Log10(maxDiffRatio)); Console.WriteLine(resultString); } if (!SaveWav(wavRead1.SampleRate, wavRead1.BitsPerSample, samples1, ReadFilePathToWriteFilePath(textBoxWavFile1.Text))) { e.Result = false; return; } if (!SaveWav(wavRead2.SampleRate, wavRead2.BitsPerSample, samples2, ReadFilePathToWriteFilePath(textBoxWavFile2.Text))) { e.Result = false; return; } e.Result = true; }