Ejemplo n.º 1
0
        public static byte[] Resample(this WaveFormat waveFormat, byte[] data, WaveFormat outputFormat)
        {
            if (waveFormat.Equals(outputFormat))
            {
                return(data);
            }

            if (outputFormat.Encoding != WaveFormatEncoding.IeeeFloat)
            {
                throw new NotSupportedException("Only float supported.");
            }
            if (outputFormat.Channels > 1)
            {
                throw new NotSupportedException("Only mono supported.");
            }

            var sampleProvider = waveFormat.GetSampleProvider(data);

            if (waveFormat.Channels > 1)
            {
                sampleProvider = new StereoToMonoSampleProvider(sampleProvider);
            }

            var numSamples = waveFormat.SampleRate;
            var buffer     = new float[numSamples];

            var samples     = new List <float>();
            var samplesRead = sampleProvider.Read(buffer, 0, buffer.Length);

            while (samplesRead > 0)
            {
                var floats = samplesRead == buffer.Length ? buffer : buffer.Take(samplesRead).ToArray();
                samples.AddRange(floats);
                samplesRead = sampleProvider.Read(buffer, 0, buffer.Length);
            }

            buffer = samples.Resampled(waveFormat.SampleRate, outputFormat.SampleRate);

            var output     = new byte[buffer.Length * sizeof(float)];
            var waveBuffer = new WaveBuffer(output);

            for (var i = 0; i < buffer.Length; i++)
            {
                waveBuffer.FloatBuffer[i] = buffer[i];
            }
            return(output);
        }
Ejemplo n.º 2
0
        public PeakInfo[] Sample(WaveFormat waveFormat, byte[] data)
        {
            var sampleProvider = waveFormat.GetSampleProvider(data);

            var numSamples = waveFormat.SampleRate * waveFormat.Channels / PeaksPerSecond;
            var samples    = new float[numSamples];

            var peaks       = new List <PeakInfo>();
            var samplesRead = sampleProvider.Read(samples, 0, samples.Length);

            // only full buffers, so we get "exactly" #PeaksPerSecond peaks
            while (samplesRead > 0)
            {
                var floats = samplesRead == samples.Length ? samples : samples.Take(samplesRead).ToArray();
                var peak   = GetPeaks(waveFormat, floats);
                peaks.Add(peak);
                samplesRead = sampleProvider.Read(samples, 0, samples.Length);
            }

            return(peaks.ToArray());
        }