public void Submit(SampleCollection samples) { if (!samples.IsLast) { // Filter by ReplayGain, depending on settings: _replayGainFilterLifetime.Value.Submit(samples); // Request an unmanaged buffer, then copy the samples to it: var buffers = new IntPtr[samples.Channels]; Marshal.Copy(_encoder.GetBuffer(samples.SampleCount), buffers, 0, buffers.Length); for (var i = 0; i < samples.Channels; i++) { Marshal.Copy(samples[i], 0, buffers[i], samples[i].Length); } } _encoder.Wrote(samples.SampleCount); while (_encoder.BlockOut()) { _encoder.Analysis(IntPtr.Zero); _encoder.AddBlock(); OggPacket packet; while (_encoder.FlushPacket(out packet)) { _oggStream.PacketIn(ref packet); OggPage page; while (_oggStream.PageOut(out page)) { WritePage(page, _output); } } } }