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); } } }
public void GetNextAudioBlock(ref AudioSourceChannelInfo bufferToFill) { var buffer = bufferToFill.Buffer; for (var i = 1; i < buffer.NumChannels; ++i) { // for (var j = 0; j < bufferToFill.NumSamples; ++j) // { // buffer.Channels[i][bufferToFill.StartSample + j] *= buffer.Channels[0][bufferToFill.StartSample + j]; // } SIMD.Mul( buffer.GetPointer(0, bufferToFill.StartSample), buffer.GetPointer(i, bufferToFill.StartSample), buffer.GetPointer(i, bufferToFill.StartSample), bufferToFill.NumSamples ); } }