void ChannelMappingNode::updateSettings()
{
    if (getNumInputs() > 0)
        channelBuffer.setSize(getNumInputs(), 10000);

	if (editorIsConfigured)
	{
	    OwnedArray<Channel> oldChannels;
		oldChannels.swapWith(channels);
	    channels.clear();
		Array<bool> recordStates;

	    settings.numOutputs = 0;

	    for (int i = 0; i < getNumInputs(); i++)
	    {
			if ((enabledChannelArray[channelArray[i]]) && (channelArray[i] < oldChannels.size()))
	        {
				oldChannels[channelArray[i]]->mappedIndex = settings.numOutputs;
	            channels.add(oldChannels[channelArray[i]]);
				recordStates.add(oldChannels[i]->getRecordState());
	            settings.numOutputs++;
	        }

	    }
		oldChannels.clearQuick(false);
		for (int i = 0; i < settings.numOutputs; i++)
		{
			channels[i]->setRecordState(recordStates[i]);
		}
	}
}
bool BufferingAudioReader::readNextBufferChunk()
{
    const int64 pos = nextReadPosition;
    const int64 startPos = ((pos - 1024) / samplesPerBlock) * samplesPerBlock;
    const int64 endPos = startPos + numBlocks * samplesPerBlock;

    OwnedArray<BufferedBlock> newBlocks;

    for (int i = blocks.size(); --i >= 0;)
        if (blocks.getUnchecked(i)->range.intersects (Range<int64> (startPos, endPos)))
            newBlocks.add (blocks.getUnchecked(i));

    if (newBlocks.size() == numBlocks)
    {
        newBlocks.clear (false);
        return false;
    }

    for (int64 p = startPos; p < endPos; p += samplesPerBlock)
    {
        if (getBlockContaining (p) == nullptr)
        {
            newBlocks.add (new BufferedBlock (*source, p, samplesPerBlock));
            break; // just do one block
        }
    }

    {
        const ScopedLock sl (lock);
        newBlocks.swapWith (blocks);
    }

    for (int i = blocks.size(); --i >= 0;)
        newBlocks.removeObject (blocks.getUnchecked(i), false);

    return true;
}