public void ResumeTrack() { if (PlaybackState == PlaybackState.Paused) { trackReader.Seek(trackReaderPosition, SeekOrigin.Begin); waveOut.Init(trackReader); waveOut.Play(); trackReaderPosition = -1; SpectrumVisualizer?.Resume(); PlaybackState = PlaybackState.Playing; } }
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); } } }
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; } } }
//Seek through song by reading the PCM stream's bitrate and multiplying it by the trackbar value. //Start at the beginning. Make sure to set isPlaying to true. private void trackBar1_Scroll(object sender, EventArgs e) { mfr.Seek(mfr.WaveFormat.AverageBytesPerSecond * positionBar.Value, SeekOrigin.Begin); isPlaying = true; }
public void SynchronizeReaderPositions() { trackReader.Seek(synchronizationReader.Position - TrackReaderPositionShift, System.IO.SeekOrigin.Begin); }