public void Submit(SampleCollection samples) { if (!samples.IsLast) { if (_bytesPerSample == 1) { // 1-8 bit samples are unsigned: for (var sample = 0; sample < samples.SampleCount; sample++) { for (var channel = 0; channel < _channels; channel++) { _writer.Write((byte)Math.Round(samples[channel][sample] * _multiplier + 128)); } } } else { for (var sample = 0; sample < samples.SampleCount; sample++) { for (var channel = 0; channel < _channels; channel++) { // Optimization - BitConverter wastes memory because you can't reuse the array: var int32Value = (int)Math.Round(samples[channel][sample] * _multiplier); ConvertInt32ToBytes(int32Value, _buffer); _writer.Write(_buffer, 0, _bytesPerSample); } } } } else { // Finish the data and RIFF chunks: _writer.FinishChunk(); _writer.FinishChunk(); } }
static void WriteFmtChunk(RiffWriter writer, AudioInfo audioInfo, int bytesPerSample) { Contract.Requires(writer != null); Contract.Requires(audioInfo != null); Contract.Requires(bytesPerSample > 0); writer.BeginChunk("fmt ", 16); writer.Write((ushort)1); writer.Write((ushort)audioInfo.Channels); writer.Write((uint)audioInfo.SampleRate); writer.Write((uint)(bytesPerSample * audioInfo.Channels * audioInfo.SampleRate)); writer.Write((ushort)(bytesPerSample * audioInfo.Channels)); writer.Write((ushort)audioInfo.BitsPerSample); writer.FinishChunk(); }