void ReversibleAudioSource::getNextAudioBlock (const AudioSourceChannelInfo& info)
{
	if (isForwards) 
    {
        input->getNextAudioBlock (info);
    }
    else
	{
        int64 nextReadPosition = input->getNextReadPosition() - (2 * info.numSamples);
        
		if (nextReadPosition < 0 && input->isLooping())
			nextReadPosition += input->getTotalLength();
		
		input->setNextReadPosition (nextReadPosition);
        input->getNextAudioBlock (info);

		if (info.buffer->getNumChannels() == 1)
		{
			reverseArray (info.buffer->getSampleData (0), info.numSamples);
		}
		else if (info.buffer->getNumChannels() == 2) 
		{
			reverseTwoArrays (info.buffer->getSampleData (0), info.buffer->getSampleData (1), info.numSamples);
		}
		else
		{
			for (int c = 0; c < info.buffer->getNumChannels(); c++)
				reverseArray (info.buffer->getSampleData(c), info.numSamples);
		}
	}
}
void ReversibleAudioSource::getNextAudioBlock (const AudioSourceChannelInfo& info)
{
	if (isForwards) 
    {
        input->getNextAudioBlock (info);
        previousReadPosition = input->getNextReadPosition();
    }
    else
	{
        int64 nextReadPosition = previousReadPosition - info.numSamples;
        
		if (nextReadPosition < 0 && input->isLooping())
			nextReadPosition += input->getTotalLength();
		
		input->setNextReadPosition (nextReadPosition);
        input->getNextAudioBlock (info);

		if (info.buffer->getNumChannels() == 1)
		{
			reverseArray (info.buffer->getWritePointer (0) + info.startSample, info.numSamples);
		}
		else if (info.buffer->getNumChannels() == 2) 
		{
			reverseTwoArrays (info.buffer->getWritePointer (0) + info.startSample,
                              info.buffer->getWritePointer (1) + info.startSample,
                              info.numSamples);
		}
		else
		{
			for (int c = 0; c < info.buffer->getNumChannels(); c++)
				reverseArray (info.buffer->getWritePointer (c) + info.startSample, info.numSamples);
		}
        
        previousReadPosition = nextReadPosition;
	}
}