mirror of
https://github.com/juce-framework/JUCE.git
synced 2026-01-10 23:44:24 +00:00
AudioIODeviceCallback, AudioBuffer, AudioFormatReader: Use const T* const* for multi-channel data
This commit is contained in:
parent
37d57810f2
commit
f075de78fa
44 changed files with 150 additions and 92 deletions
|
|
@ -4,6 +4,35 @@ JUCE breaking changes
|
|||
develop
|
||||
=======
|
||||
|
||||
Change
|
||||
------
|
||||
The type representing multi-channel audio data has been changed from T** to
|
||||
T* const*. Affected classes are AudioIODeviceCallback, AudioBuffer and
|
||||
AudioFormatReader.
|
||||
|
||||
Possible Issues
|
||||
---------------
|
||||
Code overriding the affected AudioIODeviceCallback and AudioFormatReader
|
||||
functions will fail to compile. Code that interacts with the return value of
|
||||
AudioBuffer::getArrayOfReadPointers() and AudioBuffer::getArrayOfWritePointers()
|
||||
may fail to compile.
|
||||
|
||||
Workaround
|
||||
----------
|
||||
Functions overriding the affected AudioIODeviceCallback and AudioFormatReader
|
||||
members will need to be changed to confirm to the new signature. Type
|
||||
declarations related to getArrayOfReadPointers() and getArrayOfWritePointers()
|
||||
of AudioBuffer may have to be adjusted.
|
||||
|
||||
Rationale
|
||||
---------
|
||||
While the previous signature permitted it, changing the channel pointers by the
|
||||
previously used types was already being considered illegal. The earlier type
|
||||
however prevented passing T** values to parameters with type const T**. In some
|
||||
places this necessitated the usage of const_cast. The new signature can bind to
|
||||
T** values and the awkward casting can be avoided.
|
||||
|
||||
|
||||
Change
|
||||
------
|
||||
The minimum supported C++ standard is now C++17 and the oldest supported
|
||||
|
|
|
|||
|
|
@ -45,8 +45,8 @@ public:
|
|||
clear();
|
||||
}
|
||||
|
||||
void audioDeviceIOCallback (const float** inputChannelData, int numInputChannels,
|
||||
float** outputChannelData, int numOutputChannels,
|
||||
void audioDeviceIOCallback (const float* const* inputChannelData, int numInputChannels,
|
||||
float* const* outputChannelData, int numOutputChannels,
|
||||
int numberOfSamples) override
|
||||
{
|
||||
for (int i = 0; i < numberOfSamples; ++i)
|
||||
|
|
|
|||
|
|
@ -136,8 +136,8 @@ public:
|
|||
|
||||
void audioDeviceStopped() override {}
|
||||
|
||||
void audioDeviceIOCallback (const float** inputChannelData, int numInputChannels,
|
||||
float** outputChannelData, int numOutputChannels, int numSamples) override
|
||||
void audioDeviceIOCallback (const float* const* inputChannelData, int numInputChannels,
|
||||
float* const* outputChannelData, int numOutputChannels, int numSamples) override
|
||||
{
|
||||
const ScopedLock sl (lock);
|
||||
|
||||
|
|
|
|||
|
|
@ -134,8 +134,8 @@ public:
|
|||
sampleRate = 0;
|
||||
}
|
||||
|
||||
void audioDeviceIOCallback (const float** inputChannelData, int numInputChannels,
|
||||
float** outputChannelData, int numOutputChannels,
|
||||
void audioDeviceIOCallback (const float* const* inputChannelData, int numInputChannels,
|
||||
float* const* outputChannelData, int numOutputChannels,
|
||||
int numSamples) override
|
||||
{
|
||||
const ScopedLock sl (writerLock);
|
||||
|
|
|
|||
|
|
@ -689,8 +689,8 @@ public:
|
|||
}
|
||||
|
||||
//==============================================================================
|
||||
void audioDeviceIOCallback (const float** /*inputChannelData*/, int /*numInputChannels*/,
|
||||
float** outputChannelData, int numOutputChannels,
|
||||
void audioDeviceIOCallback (const float* const* /*inputChannelData*/, int /*numInputChannels*/,
|
||||
float* const* outputChannelData, int numOutputChannels,
|
||||
int numSamples) override
|
||||
{
|
||||
AudioBuffer<float> buffer (outputChannelData, numOutputChannels, numSamples);
|
||||
|
|
|
|||
|
|
@ -662,7 +662,7 @@ private:
|
|||
{
|
||||
using ElementType = std::remove_pointer_t<decltype (DataFormat::data)>;
|
||||
using ChannelType = std::conditional_t<IsConst, const ElementType*, ElementType*>;
|
||||
using DataType = std::conditional_t<IsInterleaved, ChannelType, ChannelType*>;
|
||||
using DataType = std::conditional_t<IsInterleaved, ChannelType, ChannelType const*>;
|
||||
using PointerType = Pointer<DataFormat,
|
||||
Endianness,
|
||||
std::conditional_t<IsInterleaved, Interleaved, NonInterleaved>,
|
||||
|
|
|
|||
|
|
@ -324,7 +324,7 @@ public:
|
|||
Don't modify any of the pointers that are returned, and bear in mind that
|
||||
these will become invalid if the buffer is resized.
|
||||
*/
|
||||
const Type** getArrayOfReadPointers() const noexcept { return const_cast<const Type**> (channels); }
|
||||
const Type* const* getArrayOfReadPointers() const noexcept { return channels; }
|
||||
|
||||
/** Returns an array of pointers to the channels in the buffer.
|
||||
|
||||
|
|
@ -339,7 +339,7 @@ public:
|
|||
|
||||
@see setNotClear
|
||||
*/
|
||||
Type** getArrayOfWritePointers() noexcept { isClear = false; return channels; }
|
||||
Type* const* getArrayOfWritePointers() noexcept { isClear = false; return channels; }
|
||||
|
||||
//==============================================================================
|
||||
/** Changes the buffer's size or number of channels.
|
||||
|
|
@ -465,7 +465,7 @@ public:
|
|||
@param newNumSamples the number of samples to use - this must correspond to the
|
||||
size of the arrays passed in
|
||||
*/
|
||||
void setDataToReferTo (Type** dataToReferTo,
|
||||
void setDataToReferTo (Type* const* dataToReferTo,
|
||||
int newNumChannels,
|
||||
int newStartSample,
|
||||
int newNumSamples)
|
||||
|
|
@ -506,7 +506,7 @@ public:
|
|||
@param newNumSamples the number of samples to use - this must correspond to the
|
||||
size of the arrays passed in
|
||||
*/
|
||||
void setDataToReferTo (Type** dataToReferTo,
|
||||
void setDataToReferTo (Type* const* dataToReferTo,
|
||||
int newNumChannels,
|
||||
int newNumSamples)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -69,9 +69,9 @@ public:
|
|||
CallbackHandler (AudioDeviceManager& adm) noexcept : owner (adm) {}
|
||||
|
||||
private:
|
||||
void audioDeviceIOCallbackWithContext (const float** ins,
|
||||
void audioDeviceIOCallbackWithContext (const float* const* ins,
|
||||
int numIns,
|
||||
float** outs,
|
||||
float* const* outs,
|
||||
int numOuts,
|
||||
int numSamples,
|
||||
const AudioIODeviceCallbackContext& context) override
|
||||
|
|
@ -982,9 +982,9 @@ void AudioDeviceManager::removeAudioCallback (AudioIODeviceCallback* callbackToR
|
|||
}
|
||||
}
|
||||
|
||||
void AudioDeviceManager::audioDeviceIOCallbackInt (const float** inputChannelData,
|
||||
void AudioDeviceManager::audioDeviceIOCallbackInt (const float* const* inputChannelData,
|
||||
int numInputChannels,
|
||||
float** outputChannelData,
|
||||
float* const* outputChannelData,
|
||||
int numOutputChannels,
|
||||
int numSamples,
|
||||
const AudioIODeviceCallbackContext& context)
|
||||
|
|
@ -1006,7 +1006,7 @@ void AudioDeviceManager::audioDeviceIOCallbackInt (const float** inputChannelDat
|
|||
numSamples,
|
||||
context);
|
||||
|
||||
auto** tempChans = tempBuffer.getArrayOfWritePointers();
|
||||
auto* const* tempChans = tempBuffer.getArrayOfWritePointers();
|
||||
|
||||
for (int i = callbacks.size(); --i > 0;)
|
||||
{
|
||||
|
|
@ -1048,7 +1048,7 @@ void AudioDeviceManager::audioDeviceIOCallbackInt (const float** inputChannelDat
|
|||
testSound.reset();
|
||||
}
|
||||
|
||||
outputLevelGetter->updateLevel (const_cast<const float**> (outputChannelData), numOutputChannels, numSamples);
|
||||
outputLevelGetter->updateLevel (outputChannelData, numOutputChannels, numSamples);
|
||||
}
|
||||
|
||||
void AudioDeviceManager::audioDeviceAboutToStartInt (AudioIODevice* const device)
|
||||
|
|
@ -1891,7 +1891,7 @@ private:
|
|||
std::function<void()> stopped;
|
||||
std::function<void()> error;
|
||||
|
||||
void audioDeviceIOCallback (const float**, int, float**, int, int) override { NullCheckedInvocation::invoke (callback); }
|
||||
void audioDeviceIOCallback (const float* const*, int, float* const*, int, int) override { NullCheckedInvocation::invoke (callback); }
|
||||
void audioDeviceAboutToStart (AudioIODevice*) override { NullCheckedInvocation::invoke (aboutToStart); }
|
||||
void audioDeviceStopped() override { NullCheckedInvocation::invoke (stopped); }
|
||||
void audioDeviceError (const String&) override { NullCheckedInvocation::invoke (error); }
|
||||
|
|
|
|||
|
|
@ -526,9 +526,9 @@ private:
|
|||
class CallbackHandler;
|
||||
std::unique_ptr<CallbackHandler> callbackHandler;
|
||||
|
||||
void audioDeviceIOCallbackInt (const float** inputChannelData,
|
||||
void audioDeviceIOCallbackInt (const float* const* inputChannelData,
|
||||
int totalNumInputChannels,
|
||||
float** outputChannelData,
|
||||
float* const* outputChannelData,
|
||||
int totalNumOutputChannels,
|
||||
int numSamples,
|
||||
const AudioIODeviceCallbackContext& context);
|
||||
|
|
|
|||
|
|
@ -91,9 +91,9 @@ public:
|
|||
performance. So make sure your code can cope with reasonable
|
||||
changes in the buffer size from one callback to the next.
|
||||
*/
|
||||
virtual void audioDeviceIOCallback (const float** inputChannelData,
|
||||
virtual void audioDeviceIOCallback (const float* const* inputChannelData,
|
||||
int numInputChannels,
|
||||
float** outputChannelData,
|
||||
float* const* outputChannelData,
|
||||
int numOutputChannels,
|
||||
int numSamples)
|
||||
{
|
||||
|
|
@ -105,9 +105,9 @@ public:
|
|||
The default implementation of this function will call audioDeviceIOCallback(),
|
||||
but you can override this function if you need to make use of the context information.
|
||||
*/
|
||||
virtual void audioDeviceIOCallbackWithContext (const float** inputChannelData,
|
||||
virtual void audioDeviceIOCallbackWithContext (const float* const* inputChannelData,
|
||||
int numInputChannels,
|
||||
float** outputChannelData,
|
||||
float* const* outputChannelData,
|
||||
int numOutputChannels,
|
||||
int numSamples,
|
||||
const AudioIODeviceCallbackContext& context)
|
||||
|
|
|
|||
|
|
@ -423,8 +423,8 @@ private:
|
|||
}
|
||||
}
|
||||
|
||||
void process (const float** inputChannelData, int numInputChannels,
|
||||
float** outputChannelData, int numOutputChannels, int32_t numFrames)
|
||||
void process (const float* const* inputChannelData, int numInputChannels,
|
||||
float* const* outputChannelData, int numOutputChannels, int32_t numFrames)
|
||||
{
|
||||
if (auto* cb = callback.exchange (nullptr))
|
||||
{
|
||||
|
|
|
|||
|
|
@ -892,8 +892,8 @@ struct iOSAudioIODevice::Pimpl : public AsyncUpdater
|
|||
if ((int) numFrames > channelData.getFloatBufferSize())
|
||||
channelData.setFloatBufferSize ((int) numFrames);
|
||||
|
||||
float** const inputData = channelData.audioData.getArrayOfWritePointers();
|
||||
float** const outputData = inputData + channelData.inputs->numActiveChannels;
|
||||
float* const* const inputData = channelData.audioData.getArrayOfWritePointers();
|
||||
float* const* const outputData = inputData + channelData.inputs->numActiveChannels;
|
||||
|
||||
if (useInput)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -462,7 +462,7 @@ private:
|
|||
if (callback != nullptr)
|
||||
{
|
||||
if ((numActiveInChans + numActiveOutChans) > 0)
|
||||
callback->audioDeviceIOCallbackWithContext (const_cast<const float**> (inChans.getData()),
|
||||
callback->audioDeviceIOCallbackWithContext (inChans.getData(),
|
||||
numActiveInChans,
|
||||
outChans,
|
||||
numActiveOutChans,
|
||||
|
|
|
|||
|
|
@ -852,7 +852,7 @@ public:
|
|||
|
||||
const auto nanos = timeStamp != nullptr ? timeConversions.hostTimeToNanos (timeStamp->mHostTime) : 0;
|
||||
|
||||
callback->audioDeviceIOCallbackWithContext (const_cast<const float**> (tempInputBuffers.get()),
|
||||
callback->audioDeviceIOCallbackWithContext (tempInputBuffers.get(),
|
||||
numInputChans,
|
||||
tempOutputBuffers,
|
||||
numOutputChans,
|
||||
|
|
@ -1685,8 +1685,8 @@ private:
|
|||
bool active = false;
|
||||
String lastError;
|
||||
AudioBuffer<float> fifos;
|
||||
const float** fifoReadPointers = nullptr;
|
||||
float** fifoWritePointers = nullptr;
|
||||
const float* const* fifoReadPointers = nullptr;
|
||||
float* const* fifoWritePointers = nullptr;
|
||||
WaitableEvent threadInitialised;
|
||||
CriticalSection closeLock;
|
||||
|
||||
|
|
@ -2032,9 +2032,9 @@ private:
|
|||
outputFifo.finishedWrite (size1 + size2);
|
||||
}
|
||||
|
||||
void audioDeviceIOCallbackWithContext (const float** inputChannelData,
|
||||
void audioDeviceIOCallbackWithContext (const float* const* inputChannelData,
|
||||
int numInputChannels,
|
||||
float** outputChannelData,
|
||||
float* const* outputChannelData,
|
||||
int numOutputChannels,
|
||||
int numSamples,
|
||||
const AudioIODeviceCallbackContext&) override
|
||||
|
|
|
|||
|
|
@ -1326,7 +1326,7 @@ private:
|
|||
inputFormat[i].convertToFloat (infos[i].buffers[bufferIndex], inBuffers[i], samps);
|
||||
}
|
||||
|
||||
currentCallback->audioDeviceIOCallbackWithContext (const_cast<const float**> (inBuffers.getData()),
|
||||
currentCallback->audioDeviceIOCallbackWithContext (inBuffers.getData(),
|
||||
numActiveInputChans,
|
||||
outBuffers,
|
||||
numActiveOutputChans,
|
||||
|
|
|
|||
|
|
@ -1552,7 +1552,7 @@ public:
|
|||
const ScopedTryLock sl (startStopLock);
|
||||
|
||||
if (sl.isLocked() && isStarted)
|
||||
callback->audioDeviceIOCallbackWithContext (const_cast<const float**> (inputBuffers),
|
||||
callback->audioDeviceIOCallbackWithContext (inputBuffers,
|
||||
numInputBuffers,
|
||||
outputBuffers,
|
||||
numOutputBuffers,
|
||||
|
|
@ -1566,7 +1566,7 @@ public:
|
|||
{
|
||||
// Note that this function is handed the input device so it can check for the event and make sure
|
||||
// the input reservoir is filled up correctly even when bufferSize > device actualBufferSize
|
||||
outputDevice->copyBuffers (const_cast<const float**> (outputBuffers), numOutputBuffers, bufferSize, inputDevice.get(), *this);
|
||||
outputDevice->copyBuffers (outputBuffers, numOutputBuffers, bufferSize, inputDevice.get(), *this);
|
||||
|
||||
if (outputDevice->sampleRateHasChanged)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -56,9 +56,9 @@ void AudioSourcePlayer::setGain (const float newGain) noexcept
|
|||
gain = newGain;
|
||||
}
|
||||
|
||||
void AudioSourcePlayer::audioDeviceIOCallback (const float** inputChannelData,
|
||||
void AudioSourcePlayer::audioDeviceIOCallback (const float* const* inputChannelData,
|
||||
int totalNumInputChannels,
|
||||
float** outputChannelData,
|
||||
float* const* outputChannelData,
|
||||
int totalNumOutputChannels,
|
||||
int numSamples)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -80,9 +80,9 @@ public:
|
|||
|
||||
//==============================================================================
|
||||
/** Implementation of the AudioIODeviceCallback method. */
|
||||
void audioDeviceIOCallback (const float** inputChannelData,
|
||||
void audioDeviceIOCallback (const float* const* inputChannelData,
|
||||
int totalNumInputChannels,
|
||||
float** outputChannelData,
|
||||
float* const* outputChannelData,
|
||||
int totalNumOutputChannels,
|
||||
int numSamples) override;
|
||||
|
||||
|
|
|
|||
|
|
@ -573,7 +573,7 @@ public:
|
|||
}
|
||||
|
||||
//==============================================================================
|
||||
bool readSamples (int** destSamples, int numDestChannels, int startOffsetInDestBuffer,
|
||||
bool readSamples (int* const* destSamples, int numDestChannels, int startOffsetInDestBuffer,
|
||||
int64 startSampleInFile, int numSamples) override
|
||||
{
|
||||
clearSamplesBeyondAvailableLength (destSamples, numDestChannels, startOffsetInDestBuffer,
|
||||
|
|
@ -829,7 +829,7 @@ public:
|
|||
{
|
||||
}
|
||||
|
||||
bool readSamples (int** destSamples, int numDestChannels, int startOffsetInDestBuffer,
|
||||
bool readSamples (int* const* destSamples, int numDestChannels, int startOffsetInDestBuffer,
|
||||
int64 startSampleInFile, int numSamples) override
|
||||
{
|
||||
clearSamplesBeyondAvailableLength (destSamples, numDestChannels, startOffsetInDestBuffer,
|
||||
|
|
|
|||
|
|
@ -502,7 +502,7 @@ public:
|
|||
}
|
||||
|
||||
//==============================================================================
|
||||
bool readSamples (int** destSamples, int numDestChannels, int startOffsetInDestBuffer,
|
||||
bool readSamples (int* const* destSamples, int numDestChannels, int startOffsetInDestBuffer,
|
||||
int64 startSampleInFile, int numSamples) override
|
||||
{
|
||||
clearSamplesBeyondAvailableLength (destSamples, numDestChannels, startOffsetInDestBuffer,
|
||||
|
|
|
|||
|
|
@ -230,7 +230,7 @@ public:
|
|||
reservoir.setSize ((int) numChannels, 2 * (int) info.max_blocksize, false, false, true);
|
||||
}
|
||||
|
||||
bool readSamples (int** destSamples, int numDestChannels, int startOffsetInDestBuffer,
|
||||
bool readSamples (int* const* destSamples, int numDestChannels, int startOffsetInDestBuffer,
|
||||
int64 startSampleInFile, int numSamples) override
|
||||
{
|
||||
if (! ok)
|
||||
|
|
|
|||
|
|
@ -2975,7 +2975,7 @@ public:
|
|||
}
|
||||
}
|
||||
|
||||
bool readSamples (int** destSamples, int numDestChannels, int startOffsetInDestBuffer,
|
||||
bool readSamples (int* const* destSamples, int numDestChannels, int startOffsetInDestBuffer,
|
||||
int64 startSampleInFile, int numSamples) override
|
||||
{
|
||||
if (destSamples == nullptr)
|
||||
|
|
@ -3033,7 +3033,7 @@ public:
|
|||
}
|
||||
|
||||
const int numToCopy = jmin (decodedEnd - decodedStart, numSamples);
|
||||
float* const* const dst = reinterpret_cast<float**> (destSamples);
|
||||
float* const* const dst = reinterpret_cast<float* const*> (destSamples);
|
||||
memcpy (dst[0] + startOffsetInDestBuffer, decoded0 + decodedStart, (size_t) numToCopy * sizeof (float));
|
||||
|
||||
if (numDestChannels > 1 && dst[1] != nullptr)
|
||||
|
|
|
|||
|
|
@ -158,7 +158,7 @@ public:
|
|||
}
|
||||
|
||||
//==============================================================================
|
||||
bool readSamples (int** destSamples, int numDestChannels, int startOffsetInDestBuffer,
|
||||
bool readSamples (int* const* destSamples, int numDestChannels, int startOffsetInDestBuffer,
|
||||
int64 startSampleInFile, int numSamples) override
|
||||
{
|
||||
const auto getBufferedRange = [this] { return bufferedRange; };
|
||||
|
|
|
|||
|
|
@ -1476,7 +1476,7 @@ public:
|
|||
}
|
||||
|
||||
//==============================================================================
|
||||
bool readSamples (int** destSamples, int numDestChannels, int startOffsetInDestBuffer,
|
||||
bool readSamples (int* const* destSamples, int numDestChannels, int startOffsetInDestBuffer,
|
||||
int64 startSampleInFile, int numSamples) override
|
||||
{
|
||||
clearSamplesBeyondAvailableLength (destSamples, numDestChannels, startOffsetInDestBuffer,
|
||||
|
|
@ -1852,7 +1852,7 @@ public:
|
|||
{
|
||||
}
|
||||
|
||||
bool readSamples (int** destSamples, int numDestChannels, int startOffsetInDestBuffer,
|
||||
bool readSamples (int* const* destSamples, int numDestChannels, int startOffsetInDestBuffer,
|
||||
int64 startSampleInFile, int numSamples) override
|
||||
{
|
||||
clearSamplesBeyondAvailableLength (destSamples, numDestChannels, startOffsetInDestBuffer,
|
||||
|
|
|
|||
|
|
@ -163,7 +163,7 @@ public:
|
|||
wmSyncReader->Close();
|
||||
}
|
||||
|
||||
bool readSamples (int** destSamples, int numDestChannels, int startOffsetInDestBuffer,
|
||||
bool readSamples (int* const* destSamples, int numDestChannels, int startOffsetInDestBuffer,
|
||||
int64 startSampleInFile, int numSamples) override
|
||||
{
|
||||
if (sampleRate <= 0)
|
||||
|
|
|
|||
|
|
@ -115,7 +115,7 @@ void ARAAudioSourceReader::willDestroyAudioSource (ARAAudioSource* audioSource)
|
|||
invalidate();
|
||||
}
|
||||
|
||||
bool ARAAudioSourceReader::readSamples (int** destSamples, int numDestChannels, int startOffsetInDestBuffer,
|
||||
bool ARAAudioSourceReader::readSamples (int* const* destSamples, int numDestChannels, int startOffsetInDestBuffer,
|
||||
int64 startSampleInFile, int numSamples)
|
||||
{
|
||||
const auto destSize = (bitsPerSample / 8) * (size_t) numSamples;
|
||||
|
|
@ -237,7 +237,7 @@ void ARAPlaybackRegionReader::invalidate()
|
|||
playbackRenderer.reset();
|
||||
}
|
||||
|
||||
bool ARAPlaybackRegionReader::readSamples (int** destSamples, int numDestChannels, int startOffsetInDestBuffer,
|
||||
bool ARAPlaybackRegionReader::readSamples (int* const* destSamples, int numDestChannels, int startOffsetInDestBuffer,
|
||||
int64 startSampleInFile, int numSamples)
|
||||
{
|
||||
bool success = false;
|
||||
|
|
|
|||
|
|
@ -83,7 +83,7 @@ public:
|
|||
|
||||
~ARAAudioSourceReader() override;
|
||||
|
||||
bool readSamples (int** destSamples,
|
||||
bool readSamples (int* const* destSamples,
|
||||
int numDestChannels,
|
||||
int startOffsetInDestBuffer,
|
||||
int64 startSampleInFile,
|
||||
|
|
@ -166,7 +166,7 @@ public:
|
|||
*/
|
||||
void invalidate();
|
||||
|
||||
bool readSamples (int** destSamples,
|
||||
bool readSamples (int* const* destSamples,
|
||||
int numDestChannels,
|
||||
int startOffsetInDestBuffer,
|
||||
int64 startSampleInFile,
|
||||
|
|
|
|||
|
|
@ -86,7 +86,7 @@ bool AudioFormatReader::read (int* const* destChannels,
|
|||
if (numSamplesToRead <= 0)
|
||||
return true;
|
||||
|
||||
if (! readSamples (const_cast<int**> (destChannels),
|
||||
if (! readSamples (destChannels,
|
||||
jmin ((int) numChannels, numDestChannels), startOffsetInDestBuffer,
|
||||
startSampleInSource, numSamplesToRead))
|
||||
return false;
|
||||
|
|
|
|||
|
|
@ -267,7 +267,7 @@ public:
|
|||
to begin reading. This value is guaranteed to be >= 0.
|
||||
@param numSamples the number of samples to read
|
||||
*/
|
||||
virtual bool readSamples (int** destChannels,
|
||||
virtual bool readSamples (int* const* destChannels,
|
||||
int numDestChannels,
|
||||
int startOffsetInDestBuffer,
|
||||
int64 startSampleInFile,
|
||||
|
|
@ -306,7 +306,7 @@ protected:
|
|||
/** Used by AudioFormatReader subclasses to clear any parts of the data blocks that lie
|
||||
beyond the end of their available length.
|
||||
*/
|
||||
static void clearSamplesBeyondAvailableLength (int** destChannels, int numDestChannels,
|
||||
static void clearSamplesBeyondAvailableLength (int* const* destChannels, int numDestChannels,
|
||||
int startOffsetInDestBuffer, int64 startSampleInFile,
|
||||
int& numSamples, int64 fileLengthInSamples)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -50,7 +50,7 @@ AudioSubsectionReader::~AudioSubsectionReader()
|
|||
}
|
||||
|
||||
//==============================================================================
|
||||
bool AudioSubsectionReader::readSamples (int** destSamples, int numDestChannels, int startOffsetInDestBuffer,
|
||||
bool AudioSubsectionReader::readSamples (int* const* destSamples, int numDestChannels, int startOffsetInDestBuffer,
|
||||
int64 startSampleInFile, int numSamples)
|
||||
{
|
||||
clearSamplesBeyondAvailableLength (destSamples, numDestChannels, startOffsetInDestBuffer,
|
||||
|
|
|
|||
|
|
@ -66,7 +66,7 @@ public:
|
|||
|
||||
|
||||
//==============================================================================
|
||||
bool readSamples (int** destSamples, int numDestChannels, int startOffsetInDestBuffer,
|
||||
bool readSamples (int* const* destSamples, int numDestChannels, int startOffsetInDestBuffer,
|
||||
int64 startSampleInFile, int numSamples) override;
|
||||
|
||||
void readMaxLevels (int64 startSample, int64 numSamples,
|
||||
|
|
|
|||
|
|
@ -53,7 +53,7 @@ void BufferingAudioReader::setReadTimeout (int timeoutMilliseconds) noexcept
|
|||
timeoutMs = timeoutMilliseconds;
|
||||
}
|
||||
|
||||
bool BufferingAudioReader::readSamples (int** destSamples, int numDestChannels, int startOffsetInDestBuffer,
|
||||
bool BufferingAudioReader::readSamples (int* const* destSamples, int numDestChannels, int startOffsetInDestBuffer,
|
||||
int64 startSampleInFile, int numSamples)
|
||||
{
|
||||
auto startTime = Time::getMillisecondCounter();
|
||||
|
|
@ -218,7 +218,7 @@ struct TestAudioFormatReader : public AudioFormatReader
|
|||
numChannels = (unsigned int) buffer.getNumChannels();
|
||||
}
|
||||
|
||||
bool readSamples (int** destChannels, int numDestChannels, int startOffsetInDestBuffer,
|
||||
bool readSamples (int* const* destChannels, int numDestChannels, int startOffsetInDestBuffer,
|
||||
int64 startSampleInFile, int numSamples) override
|
||||
{
|
||||
clearSamplesBeyondAvailableLength (destChannels, numDestChannels, startOffsetInDestBuffer,
|
||||
|
|
@ -270,7 +270,7 @@ public:
|
|||
numChannels = 2;
|
||||
}
|
||||
|
||||
bool readSamples (int**, int, int, int64, int) override
|
||||
bool readSamples (int* const*, int, int, int64, int) override
|
||||
{
|
||||
Thread::sleep (100);
|
||||
return true;
|
||||
|
|
|
|||
|
|
@ -63,7 +63,7 @@ public:
|
|||
void setReadTimeout (int timeoutMilliseconds) noexcept;
|
||||
|
||||
//==============================================================================
|
||||
bool readSamples (int** destSamples, int numDestChannels, int startOffsetInDestBuffer,
|
||||
bool readSamples (int* const* destSamples, int numDestChannels, int startOffsetInDestBuffer,
|
||||
int64 startSampleInFile, int numSamples) override;
|
||||
|
||||
private:
|
||||
|
|
|
|||
|
|
@ -484,7 +484,7 @@ public:
|
|||
template<typename UnaryFunction>
|
||||
static void iterateAudioBuffer (AudioBuffer<float>& ab, UnaryFunction fn)
|
||||
{
|
||||
float** sampleData = ab.getArrayOfWritePointers();
|
||||
float* const* sampleData = ab.getArrayOfWritePointers();
|
||||
|
||||
for (int c = ab.getNumChannels(); --c >= 0;)
|
||||
for (int s = ab.getNumSamples(); --s >= 0;)
|
||||
|
|
|
|||
|
|
@ -448,9 +448,9 @@ private:
|
|||
inner.audioDeviceAboutToStart (device);
|
||||
}
|
||||
|
||||
void audioDeviceIOCallbackWithContext (const float** inputChannelData,
|
||||
void audioDeviceIOCallbackWithContext (const float* const* inputChannelData,
|
||||
int numInputChannels,
|
||||
float** outputChannelData,
|
||||
float* const* outputChannelData,
|
||||
int numOutputChannels,
|
||||
int numSamples,
|
||||
const AudioIODeviceCallbackContext& context) override
|
||||
|
|
@ -600,9 +600,9 @@ private:
|
|||
};
|
||||
|
||||
//==============================================================================
|
||||
void audioDeviceIOCallbackWithContext (const float** inputChannelData,
|
||||
void audioDeviceIOCallbackWithContext (const float* const* inputChannelData,
|
||||
int numInputChannels,
|
||||
float** outputChannelData,
|
||||
float* const* outputChannelData,
|
||||
int numOutputChannels,
|
||||
int numSamples,
|
||||
const AudioIODeviceCallbackContext& context) override
|
||||
|
|
|
|||
|
|
@ -829,6 +829,34 @@ static const int defaultVSTBlockSizeValue = 512;
|
|||
|
||||
JUCE_BEGIN_IGNORE_WARNINGS_MSVC (4996)
|
||||
|
||||
class TempChannelPointers
|
||||
{
|
||||
public:
|
||||
template <typename T>
|
||||
auto getArrayOfModifiableWritePointers (AudioBuffer<T>& buffer)
|
||||
{
|
||||
auto& pointers = getPointers (Tag<T>{});
|
||||
|
||||
jassert ((int) pointers.size() < buffer.getNumChannels());
|
||||
pointers.resize (jmax (pointers.size(), (size_t) buffer.getNumChannels()));
|
||||
|
||||
std::copy (buffer.getArrayOfWritePointers(),
|
||||
buffer.getArrayOfWritePointers() + buffer.getNumChannels(),
|
||||
pointers.begin());
|
||||
|
||||
return pointers.data();
|
||||
}
|
||||
|
||||
private:
|
||||
template <typename> struct Tag {};
|
||||
|
||||
auto& getPointers (Tag<float>) { return floatPointers; }
|
||||
auto& getPointers (Tag<double>) { return doublePointers; }
|
||||
|
||||
std::vector<float*> floatPointers { 128 };
|
||||
std::vector<double*> doublePointers { 128 };
|
||||
};
|
||||
|
||||
//==============================================================================
|
||||
struct VSTPluginInstance final : public AudioPluginInstance,
|
||||
private Timer,
|
||||
|
|
@ -2026,6 +2054,7 @@ private:
|
|||
bool lastProcessBlockCallWasBypass = false, vstSupportsBypass = false;
|
||||
mutable StringArray programNames;
|
||||
AudioBuffer<float> outOfPlaceBuffer;
|
||||
TempChannelPointers tempChannelPointers[2];
|
||||
|
||||
CriticalSection midiInLock;
|
||||
MidiBuffer incomingMidi;
|
||||
|
|
@ -2456,16 +2485,16 @@ private:
|
|||
{
|
||||
if ((vstEffect->flags & Vst2::effFlagsCanReplacing) != 0)
|
||||
{
|
||||
vstEffect->processReplacing (vstEffect, buffer.getArrayOfWritePointers(),
|
||||
buffer.getArrayOfWritePointers(), sampleFrames);
|
||||
vstEffect->processReplacing (vstEffect, tempChannelPointers[0].getArrayOfModifiableWritePointers (buffer),
|
||||
tempChannelPointers[1].getArrayOfModifiableWritePointers (buffer), sampleFrames);
|
||||
}
|
||||
else
|
||||
{
|
||||
outOfPlaceBuffer.setSize (vstEffect->numOutputs, sampleFrames);
|
||||
outOfPlaceBuffer.clear();
|
||||
|
||||
vstEffect->process (vstEffect, buffer.getArrayOfWritePointers(),
|
||||
outOfPlaceBuffer.getArrayOfWritePointers(), sampleFrames);
|
||||
vstEffect->process (vstEffect, tempChannelPointers[0].getArrayOfModifiableWritePointers (buffer),
|
||||
tempChannelPointers[1].getArrayOfModifiableWritePointers (outOfPlaceBuffer), sampleFrames);
|
||||
|
||||
for (int i = vstEffect->numOutputs; --i >= 0;)
|
||||
buffer.copyFrom (i, 0, outOfPlaceBuffer.getReadPointer (i), sampleFrames);
|
||||
|
|
@ -2474,8 +2503,8 @@ private:
|
|||
|
||||
inline void invokeProcessFunction (AudioBuffer<double>& buffer, int32 sampleFrames)
|
||||
{
|
||||
vstEffect->processDoubleReplacing (vstEffect, buffer.getArrayOfWritePointers(),
|
||||
buffer.getArrayOfWritePointers(), sampleFrames);
|
||||
vstEffect->processDoubleReplacing (vstEffect, tempChannelPointers[0].getArrayOfModifiableWritePointers (buffer),
|
||||
tempChannelPointers[1].getArrayOfModifiableWritePointers (buffer), sampleFrames);
|
||||
}
|
||||
|
||||
//==============================================================================
|
||||
|
|
|
|||
|
|
@ -444,7 +444,7 @@ struct GraphRenderSequence
|
|||
|
||||
struct Context
|
||||
{
|
||||
FloatType** audioBuffers;
|
||||
FloatType* const* audioBuffers;
|
||||
MidiBuffer* midiBuffers;
|
||||
AudioPlayHead* audioPlayHead;
|
||||
int numSamples;
|
||||
|
|
|
|||
|
|
@ -119,7 +119,7 @@ void AudioVisualiserComponent::clear()
|
|||
c->clear();
|
||||
}
|
||||
|
||||
void AudioVisualiserComponent::pushBuffer (const float** d, int numChannels, int num)
|
||||
void AudioVisualiserComponent::pushBuffer (const float* const* d, int numChannels, int num)
|
||||
{
|
||||
numChannels = jmin (numChannels, channels.size());
|
||||
|
||||
|
|
|
|||
|
|
@ -87,7 +87,7 @@ public:
|
|||
The number of channels provided here is expected to match the number of channels
|
||||
that this AudioVisualiserComponent has been told to use.
|
||||
*/
|
||||
void pushBuffer (const float** channelData, int numChannels, int numSamples);
|
||||
void pushBuffer (const float* const* channelData, int numChannels, int numSamples);
|
||||
|
||||
/** Pushes a single sample (per channel).
|
||||
The number of channels provided here is expected to match the number of channels
|
||||
|
|
|
|||
|
|
@ -30,10 +30,10 @@ template <typename Value>
|
|||
struct ChannelInfo
|
||||
{
|
||||
ChannelInfo() = default;
|
||||
ChannelInfo (Value** dataIn, int numChannelsIn)
|
||||
ChannelInfo (Value* const* dataIn, int numChannelsIn)
|
||||
: data (dataIn), numChannels (numChannelsIn) {}
|
||||
|
||||
Value** data = nullptr;
|
||||
Value* const* data = nullptr;
|
||||
int numChannels = 0;
|
||||
};
|
||||
|
||||
|
|
@ -235,9 +235,9 @@ void AudioProcessorPlayer::setMidiOutput (MidiOutput* midiOutputToUse)
|
|||
}
|
||||
|
||||
//==============================================================================
|
||||
void AudioProcessorPlayer::audioDeviceIOCallbackWithContext (const float** const inputChannelData,
|
||||
void AudioProcessorPlayer::audioDeviceIOCallbackWithContext (const float* const* const inputChannelData,
|
||||
const int numInputChannels,
|
||||
float** const outputChannelData,
|
||||
float* const* const outputChannelData,
|
||||
const int numOutputChannels,
|
||||
const int numSamples,
|
||||
const AudioIODeviceCallbackContext& context)
|
||||
|
|
|
|||
|
|
@ -92,7 +92,7 @@ public:
|
|||
|
||||
//==============================================================================
|
||||
/** @internal */
|
||||
void audioDeviceIOCallbackWithContext (const float**, int, float**, int, int, const AudioIODeviceCallbackContext&) override;
|
||||
void audioDeviceIOCallbackWithContext (const float* const*, int, float* const*, int, int, const AudioIODeviceCallbackContext&) override;
|
||||
/** @internal */
|
||||
void audioDeviceAboutToStart (AudioIODevice*) override;
|
||||
/** @internal */
|
||||
|
|
|
|||
|
|
@ -242,9 +242,9 @@ void SoundPlayer::playTestSound()
|
|||
}
|
||||
|
||||
//==============================================================================
|
||||
void SoundPlayer::audioDeviceIOCallback (const float** inputChannelData,
|
||||
void SoundPlayer::audioDeviceIOCallback (const float* const* inputChannelData,
|
||||
int numInputChannels,
|
||||
float** outputChannelData,
|
||||
float* const* outputChannelData,
|
||||
int numOutputChannels,
|
||||
int numSamples)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -110,7 +110,7 @@ public:
|
|||
|
||||
//==============================================================================
|
||||
/** @internal */
|
||||
void audioDeviceIOCallback (const float**, int, float**, int, int) override;
|
||||
void audioDeviceIOCallback (const float* const*, int, float* const*, int, int) override;
|
||||
/** @internal */
|
||||
void audioDeviceAboutToStart (AudioIODevice*) override;
|
||||
/** @internal */
|
||||
|
|
|
|||
|
|
@ -62,7 +62,7 @@ class ConvolutionTest : public UnitTest
|
|||
AudioBuffer<float> result (2, length);
|
||||
result.clear();
|
||||
|
||||
auto** channels = result.getArrayOfWritePointers();
|
||||
auto* const* channels = result.getArrayOfWritePointers();
|
||||
std::for_each (channels, channels + result.getNumChannels(), [length] (auto* channel)
|
||||
{
|
||||
std::fill (channel, channel + length, 1.0f);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue