Example #1
0
        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);
            }
        }
Example #2
0
        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);
        }