AudioSampleBuffer still broken


#1
void AudioSampleBuffer::setSize (const int newNumChannels,

                                 const int newNumSamples,

                                 const bool keepExistingContent,

                                 const bool clearExtraSpace,

                                 const bool avoidReallocating) throw()

{

    jassert (newNumChannels > 0);



    if (newNumSamples != size || newNumChannels != numChannels)

    {

        const int newTotalBytes = newNumChannels * newNumSamples * sizeof (float) + 32;



        if (keepExistingContent)

        {

            float* const newData = (clearExtraSpace) ? (float*) juce_calloc (newTotalBytes)

                                                     : (float*) juce_malloc (newTotalBytes);



            const int sizeToCopy = sizeof (float) * jmin (newNumSamples, size);



            for (int i = jmin (newNumChannels, numChannels); --i >= 0;)

            {

                memcpy (newData + i * newNumSamples,

                        channels[i],

                        sizeToCopy);

            }



            juce_free (allocatedData);



            allocatedData = newData;

            allocatedBytes = newTotalBytes;

        }

        else

        {

            if (avoidReallocating && allocatedBytes >= newTotalBytes)

            {

                if (clearExtraSpace)

                    zeromem (allocatedData, newTotalBytes);

            }

            else

            {

                juce_free (allocatedData);



                allocatedData = (clearExtraSpace) ? (float*) juce_calloc (newTotalBytes)

                                                  : (float*) juce_malloc (newTotalBytes);

                allocatedBytes = newTotalBytes;

            }

        }



        size = newNumSamples;



        if (newNumChannels > numChannels)

            channels = (float**) juce_realloc (channels, (newNumChannels + 1) * sizeof (float*));



        numChannels = newNumChannels;



        float* chan = allocatedData;

        for (int i = 0; i < newNumChannels; ++i)

        {

            channels[i] = chan;

            chan += size;

        }



        channels [newNumChannels] = 0;

    }

}


#2

Thanks - I bumped into that one too, and checked in a fix.


#3

Thanks - I bumped into that one too, and checked in a fix.


#4

I’m curious–exactly what is broken in AudioSampleBuffer? I’m afraid I can’t tell from examining the code sample or from doing differences on the code. In fact, the main thing that’s changed is that reallocation is done on newNumChannels + 1 instead of numNewChannels and I’m wondering why that is necessary.

Thanks – Jeff.


#5

As far as I know nothing is now broken in that class. The reason it has an extra element in the array is just so that the array of pointers to channels is zero-terminated, which is sometimes handy when you’re using it in plugins, etc.