class JoiningWaveProvider : IWaveProvider { public JoiningWaveProvider(IEnumerable inputFileReaders) { if (! inputFileReaders.Any()) { throw new ArgumentException("At least one input file currentReader is needed"); } WaveFormat firstFormat = inputFileReaders.First().WaveFormat; IEnumerable nonMatchingReaders = inputFileReaders.Where(reader => !reader.WaveFormat.Equals(firstFormat)); if (nonMatchingReaders.Any()) { throw new ArgumentException("All readers must have the same WAV format"); } WaveFormat = firstFormat; _inputFileReaders = inputFileReaders.ToList(); _readIndex = 0; } public WaveFormat WaveFormat { get; private set; } public int Read(byte[] buffer, int offset, int count) { int currentOffset = offset; int totalRead = 0; int remaining = count; for (int i = _readIndex; i < _inputFileReaders.Count && remaining > 0; i++, _readIndex++) { MediaFoundationReader currentReader = _inputFileReaders[i]; int readNow = currentReader.Read(buffer, currentOffset, remaining); currentOffset += readNow; totalRead += readNow; remaining -= readNow; } return totalRead; } private int _readIndex; private readonly List _inputFileReaders; }