Пример #1
0
        public void SetWaveData(byte[] data)
        {
            if (data == null || data.Length == 0)
            {
                lock (lockObj) {
                    this.data = new float[0];
                }
                return;
            }
            var samples = new List <float>();

            using (var stream = new MemoryStream(data)) {
                using (var waveFileReader = new WaveFileReader(stream)) {
                    if (waveFileReader.WaveFormat.SampleRate != 44100)
                    {
                        throw new Exception($"SampleRate {waveFileReader.WaveFormat.SampleRate}");
                    }
                    ISampleProvider sampleProvider = null;
                    switch (waveFileReader.WaveFormat.BitsPerSample)
                    {
                    case 8:
                        sampleProvider = new Pcm8BitToSampleProvider(waveFileReader);
                        break;

                    case 16:
                        sampleProvider = new Pcm16BitToSampleProvider(waveFileReader);
                        break;

                    case 24:
                        sampleProvider = new Pcm24BitToSampleProvider(waveFileReader);
                        break;

                    case 32:
                        sampleProvider = new Pcm32BitToSampleProvider(waveFileReader);
                        break;

                    default:
                        throw new Exception($"Unexpected bits per sample {waveFileReader.WaveFormat.BitsPerSample}");
                    }
                    if (waveFileReader.WaveFormat.Channels == 2)
                    {
                        sampleProvider = sampleProvider.ToMono(1, 0);
                    }
                    else if (waveFileReader.WaveFormat.Channels != 1)
                    {
                        throw new Exception($"Unexpected channel count {waveFileReader.WaveFormat.Channels}");
                    }
                    var buffer = new float[sampleProvider.WaveFormat.SampleRate];
                    int n;
                    while ((n = sampleProvider.Read(buffer, 0, buffer.Length)) > 0)
                    {
                        samples.AddRange(buffer.Take(n));
                    }
                }
            }
            lock (lockObj) {
                this.data = samples.ToArray();
                ApplyEnvelope(this.data, envelope);
            }
        }
Пример #2
0
        public override float[] ReadMonoFromFile(string pathToFile, int sampleRate, int secondsToRead, int startAtSecond)
        {
            using (var reader = new MediaFoundationReader(pathToFile))
            {
                int actualSampleRate = reader.WaveFormat.SampleRate;
                int bitsPerSample    = reader.WaveFormat.BitsPerSample;
                reader.Seek(actualSampleRate * bitsPerSample / 8 * startAtSecond, System.IO.SeekOrigin.Begin);
                using (var resampler = new MediaFoundationResampler(reader, WaveFormat.CreateIeeeFloatWaveFormat(sampleRate, 1)))
                {
                    float[]                  buffer            = new float[sampleRate * 20]; // 20 seconds buffer
                    List <float[]>           chunks            = new List <float[]>();
                    int                      totalFloatsToRead = secondsToRead == 0 ? int.MaxValue : secondsToRead * sampleRate;
                    int                      totalFloatsRead   = 0;
                    Pcm32BitToSampleProvider pcmReader         = new Pcm32BitToSampleProvider(resampler);
                    while (totalFloatsRead < totalFloatsToRead)
                    {
                        // get re-sampled/mono data
                        int floatsRead = pcmReader.Read(buffer, 0, buffer.Length);
                        if (floatsRead == 0)
                        {
                            break;
                        }

                        totalFloatsRead += floatsRead;

                        float[] chunk;

                        if (totalFloatsRead > totalFloatsToRead)
                        {
                            chunk = new float[(totalFloatsToRead - (totalFloatsRead - floatsRead))];
                            Array.Copy(buffer, chunk, totalFloatsToRead - (totalFloatsRead - floatsRead));
                        }
                        else
                        {
                            chunk = new float[floatsRead]; // each float contains 4 bytes
                            Array.Copy(buffer, chunk, floatsRead);
                        }

                        chunks.Add(chunk);
                    }

                    if (totalFloatsRead < (secondsToRead * sampleRate))
                    {
                        return(null); /*not enough samples to return the requested data*/
                    }

                    float[] data = ConcatenateChunksOfSamples(chunks);

                    return(data);
                }
            }
        }
Пример #3
0
        public override float[] ReadMonoFromFile(string pathToFile, int sampleRate, int secondsToRead, int startAtSecond)
        {
            using (var reader = new MediaFoundationReader(pathToFile))
            {
                int actualSampleRate = reader.WaveFormat.SampleRate;
                int bitsPerSample = reader.WaveFormat.BitsPerSample;
                reader.Seek(actualSampleRate * bitsPerSample / 8 * startAtSecond, System.IO.SeekOrigin.Begin);
                using (var resampler = new MediaFoundationResampler(reader, WaveFormat.CreateIeeeFloatWaveFormat(sampleRate, 1)))
                {
                    float[] buffer = new float[sampleRate * 20]; // 20 seconds buffer
                    List<float[]> chunks = new List<float[]>();
                    int totalFloatsToRead = secondsToRead == 0 ? int.MaxValue : secondsToRead * sampleRate;
                    int totalFloatsRead = 0;
                    Pcm32BitToSampleProvider pcmReader = new Pcm32BitToSampleProvider(resampler);
                    while (totalFloatsRead < totalFloatsToRead)
                    {
                        // get re-sampled/mono data
                        int floatsRead = pcmReader.Read(buffer, 0, buffer.Length);
                        if (floatsRead == 0)
                        {
                            break;
                        }

                        totalFloatsRead += floatsRead;

                        float[] chunk;

                        if (totalFloatsRead > totalFloatsToRead)
                        {
                            chunk = new float[(totalFloatsToRead - (totalFloatsRead - floatsRead))];
                            Array.Copy(buffer, chunk, totalFloatsToRead - (totalFloatsRead - floatsRead));
                        }
                        else
                        {
                            chunk = new float[floatsRead]; // each float contains 4 bytes
                            Array.Copy(buffer, chunk, floatsRead);
                        }

                        chunks.Add(chunk);
                    }

                    if (totalFloatsRead < (secondsToRead * sampleRate))
                    {
                        return null; /*not enough samples to return the requested data*/
                    }

                    float[] data = ConcatenateChunksOfSamples(chunks);

                    return data;
                }
            }
        }
Пример #4
0
        public static MemorySampleProvider FromStream(Stream stream)
        {
            using (var waveProvider = new WaveFileReader(stream)) {
                ISampleProvider sampleProvider = null;
                switch (waveProvider.WaveFormat.BitsPerSample)
                {
                case 8:
                    sampleProvider = new Pcm8BitToSampleProvider(waveProvider);
                    break;

                case 16:
                    sampleProvider = new Pcm16BitToSampleProvider(waveProvider);
                    break;

                case 24:
                    sampleProvider = new Pcm24BitToSampleProvider(waveProvider);
                    break;

                case 32:
                    sampleProvider = new Pcm32BitToSampleProvider(waveProvider);
                    break;

                default:
                    Log.Error($"Unknown PCM bits per sample {waveProvider.WaveFormat.BitsPerSample}");
                    return(null);
                }

                var format  = sampleProvider.WaveFormat;
                var samples = new List <float>();
                var buffer  = new float[format.SampleRate];
                var n       = 0;
                while ((n = sampleProvider.Read(buffer, 0, buffer.Length)) > 0)
                {
                    samples.AddRange(buffer.Take(n));
                }
                var data = samples.ToArray();
                return(new MemorySampleProvider()
                {
                    WaveFormat = format,
                    data = data,
                });
            }
        }