About AudioSourcePlayer::audioDeviceIOCallback()
in this method, I got confused about the variable numActiveChans. In lastest jucedemo from subversion,
In the Audio Demo, I use my line6 box as device. I did the following test.In we I choose 0 input channels,
the numActiveChans is 2. when I choose 2 avtiveinputchannels(1+2), the numActiveChans is
also 2. I also changed the avtiveinputchannels to 1,3,4 in the audiodeviceIOCallback in AudioSourcePlayer,
I get the numActiveChans is always 2.
So could anyone explain this for me? why numActiveChans do not change for all the settings? does it equal to
the numOutPutChannles?
Best,
Chengyu
I attach the code below for convenience
void AudioSourcePlayer::audioDeviceIOCallback (const float** inputChannelData,
int totalNumInputChannels,
float** outputChannelData,
int totalNumOutputChannels,
int numSamples)
{
// these should have been prepared by audioDeviceAboutToStart()…
jassert (sampleRate > 0 && bufferSize > 0);
const ScopedLock sl (readLock);
if (source != 0)
{
AudioSourceChannelInfo info;
int i, numActiveChans = 0, numInputs = 0, numOutputs = 0;
// messy stuff needed to compact the channels down into an array
// of non-zero pointers..
for (i = 0; i < totalNumInputChannels; ++i)
{
if (inputChannelData[i] != 0)
{
inputChans [numInputs++] = inputChannelData[i];
if (numInputs >= numElementsInArray (inputChans))
break
}
}
for (i = 0; i < totalNcumOutputChannels; ++i)
{
if (outputChannelData[i] != 0)
{
outputChans [numOutputs++] = outputChannelData[i];
if (numOutputs >= numElementsInArray (outputChans))
break;
}
if (numInputs > numOutputs)
{
// if there aren't enough output channels for the number of
// inputs, we need to create some temporary extra ones (can't
// use the input data in case it gets written to)
tempBuffer.setSize (numInputs - numOutputs, numSamples,
false, false, true);
for (i = 0; i < numOutputs; ++i)
{
channels[numActiveChans] = outputChans[i];
memcpy (channels[numActiveChans], inputChans[i], sizeof (float) * numSamples);
++numActiveChans;
}
for (i = numOutputs; i < numInputs; ++i)
{
channels[numActiveChans] = tempBuffer.getSampleData (i - numOutputs, 0);
memcpy (channels[numActiveChans], inputChans[i], sizeof (float) * numSamples);
++numActiveChans;
}
}
else
{
for (i = 0; i < numInputs; ++i)
{
channels[numActiveChans] = outputChans[i];
memcpy (channels[numActiveChans], inputChans[i], sizeof (float) * numSamples);
++numActiveChans;
}
for (i = numInputs; i < numOutputs; ++i)
{
channels[numActiveChans] = outputChans[i];
zeromem (channels[numActiveChans], sizeof (float) * numSamples);
++numActiveChans;
}
}
AudioSampleBuffer buffer (channels, numActiveChans, numSamples);
info.buffer = &buffer;
info.startSample = 0;
info.numSamples = numSamples;
source->getNextAudioBlock (info);
for (i = info.buffer->getNumChannels(); --i >= 0;)
info.buffer->applyGainRamp (i, info.startSample, info.numSamples, lastGain, gain);
lastGain = gain;
}
else
{
for (int i = 0; i < totalNumOutputChannels; ++i)
if (outputChannelData[i] != 0)
zeromem (outputChannelData[i], sizeof (float) * numSamples);
}
}
