public void AudioDeviceIOCallback(float *[] inputChannelData, int numInputChannels, float *[] outputChannelData, int numOutputChannels, int numSamples) { if (_source != null) { if (numInputChannels > numOutputChannels) { throw new NotImplementedException(); } var numActiveChans = 0; var channelSize = numSamples * sizeof(float); for (var i = 0; i < numInputChannels; ++i) { _channels[numActiveChans] = outputChannelData[i]; Memory.MemCopy(_channels[numActiveChans], inputChannelData[i], channelSize); ++numActiveChans; } for (var i = 0; i < numOutputChannels; ++i) { _channels[numActiveChans] = outputChannelData[i]; Memory.ZeroMem <float>(_channels[numActiveChans], numSamples); ++numActiveChans; } _renderBuffer.Wrap(_channels, numActiveChans, numSamples); var info = new AudioSourceChannelInfo(_renderBuffer, 0, numSamples); _source.GetNextAudioBlock(ref info); for (var i = 0; i < numOutputChannels; ++i) { SIMD.Mul(outputChannelData[i], _gain, outputChannelData[i], numSamples); } } else { for (var i = 0; i < numOutputChannels; ++i) { Memory.ZeroMem <float>(outputChannelData[i], numSamples); } } }