Example #1
0
        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);
                }
            }
        }