public void WriteAndLoad( string filename, ushort bitsPerSample ) { var parser = new WAVParser(ResolveDataFile(filename)); var temporaryFile = Path.GetTempFileName(); parser.BitsPerSample = bitsPerSample; parser.Save(temporaryFile); // WAVParser reReader; try { reReader = new WAVParser(temporaryFile); } finally { File.Delete(temporaryFile); } Assert.Equal(parser.ChannelCount, reReader.ChannelCount); Assert.Equal(parser.SampleRate, reReader.SampleRate); Assert.Equal(parser.BitsPerSample, reReader.BitsPerSample); Assert.Equal(parser.SamplesCount, reReader.SamplesCount); Assert.Equal(parser.Duration, reReader.Duration); var minSampleRate = Math.Min(bitsPerSample, parser.BitsPerSample); var minSampleRateC = 1 << (minSampleRate - 1); for (int channelId = 0; channelId < parser.ChannelCount; channelId++) { var sum = 0d; for (int i = 0; i < parser.SamplesCount; i++) { var expected = parser.Samples[channelId][i]; var real = reReader.Samples[channelId][i]; var tE = (expected > 0) ? minSampleRateC - 1 : minSampleRateC; var tR = (real > 0) ? minSampleRateC - 1 : minSampleRateC; var expected1 = Math.Round(expected * tE) / tE; var real1 = Math.Round(real * tR) / tR; var diff = real1 - expected1; sum += Math.Pow(diff, 2); } var rmse = Math.Sqrt(sum / parser.SamplesCount); Assert.InRange(rmse, 0, 0.000_01d); } }
public static int ProcessFile( string inputFile, string outputFile, VstPluginContext pluginContext, System.Threading.CancellationToken cancellationToken ) { var isDoublePrecision = pluginContext.PluginInfo.Flags.HasFlag(VstPluginFlags.CanDoubleReplacing); var pcmInput = new WAVParser(inputFile); var pcmOutput = new WAVParser { ChannelCount = pcmInput.ChannelCount, Samples = new List <List <double> >(), SampleRate = pcmInput.SampleRate, }; for (int i = 0; i < pcmOutput.ChannelCount; i++) { pcmOutput.Samples.Add(new List <double>()); } pluginContext.PluginCommandStub.SetSampleRate(pcmInput.SampleRate); pluginContext.PluginCommandStub.SetProcessPrecision(VstProcessPrecision.Process32); // hint: samples per buffer should be equal to pcmInput.SampleRate int samplesPerBuffer = (int)pcmInput.SampleRate; pluginContext.PluginCommandStub.SetBlockSize(samplesPerBuffer); int inputCount = pluginContext.PluginInfo.AudioInputCount; int outputCount = pluginContext.PluginInfo.AudioOutputCount; VstAudioBuffer[] vstBufIn = null, vstBufOut = null; VstAudioPrecisionBuffer[] vstBufIn2 = null, vstBufOut2 = null; if (isDoublePrecision) { var vstBufManIn = new VstAudioPrecisionBufferManager(inputCount, samplesPerBuffer); var vstBufManOut = new VstAudioPrecisionBufferManager(outputCount, samplesPerBuffer); vstBufIn2 = NumeratorToArray(vstBufManIn.GetEnumerator()); vstBufOut2 = NumeratorToArray(vstBufManOut.GetEnumerator()); } else { var vstBufManIn = new VstAudioBufferManager(inputCount, samplesPerBuffer); var vstBufManOut = new VstAudioBufferManager(outputCount, samplesPerBuffer); vstBufIn = NumeratorToArray(vstBufManIn.GetEnumerator()); vstBufOut = NumeratorToArray(vstBufManOut.GetEnumerator()); } pluginContext.PluginCommandStub.MainsChanged(true); pluginContext.PluginCommandStub.StartProcess(); for (int samplesOffset = 0; samplesOffset < pcmInput.SamplesCount; samplesOffset += (int)pcmInput.SampleRate) { if (cancellationToken.IsCancellationRequested) { return(ReturnCodeOffset + 20); } var result = ProcessSingleBuffer( pluginContext, samplesOffset, vstBufIn, vstBufOut, vstBufIn2, vstBufOut2, isDoublePrecision, pcmInput, pcmOutput, inputCount, outputCount, samplesPerBuffer ); if (result != 0) { return(result); } } // Close VST Context pluginContext.PluginCommandStub.StopProcess(); pluginContext.PluginCommandStub.MainsChanged(false); // Save pcmOutput.Save(outputFile); return(0); }