Exemplo n.º 1
0
        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);
        }
Exemplo n.º 2
0
        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;
        }
Exemplo n.º 3
0
        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;
        }
Exemplo n.º 4
0
        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;
        }
Exemplo n.º 5
0
        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;
        }