From f075de78faf8ef246e254409e1a0d09895f66472 Mon Sep 17 00:00:00 2001 From: attila Date: Tue, 13 Sep 2022 17:41:41 +0200 Subject: [PATCH] AudioIODeviceCallback, AudioBuffer, AudioFormatReader: Use const T* const* for multi-channel data --- BREAKING-CHANGES.txt | 29 +++++++++++++ examples/Assets/AudioLiveScrollingDisplay.h | 4 +- examples/Audio/AudioLatencyDemo.h | 4 +- examples/Audio/AudioRecordingDemo.h | 4 +- examples/Audio/MPEDemo.h | 4 +- .../buffers/juce_AudioDataConverters.h | 2 +- .../buffers/juce_AudioSampleBuffer.h | 8 ++-- .../audio_io/juce_AudioDeviceManager.cpp | 20 ++++----- .../audio_io/juce_AudioDeviceManager.h | 4 +- .../audio_io/juce_AudioIODevice.h | 8 ++-- .../native/juce_android_Oboe.cpp | 4 +- .../native/juce_ios_Audio.cpp | 4 +- .../native/juce_linux_JackAudio.cpp | 2 +- .../native/juce_mac_CoreAudio.cpp | 10 ++--- .../native/juce_win32_ASIO.cpp | 2 +- .../native/juce_win32_WASAPI.cpp | 4 +- .../sources/juce_AudioSourcePlayer.cpp | 4 +- .../sources/juce_AudioSourcePlayer.h | 4 +- .../codecs/juce_AiffAudioFormat.cpp | 4 +- .../codecs/juce_CoreAudioFormat.cpp | 2 +- .../codecs/juce_FlacAudioFormat.cpp | 2 +- .../codecs/juce_MP3AudioFormat.cpp | 4 +- .../codecs/juce_OggVorbisAudioFormat.cpp | 2 +- .../codecs/juce_WavAudioFormat.cpp | 4 +- .../codecs/juce_WindowsMediaAudioFormat.cpp | 2 +- .../format/juce_ARAAudioReaders.cpp | 4 +- .../format/juce_ARAAudioReaders.h | 4 +- .../format/juce_AudioFormatReader.cpp | 2 +- .../format/juce_AudioFormatReader.h | 4 +- .../format/juce_AudioSubsectionReader.cpp | 2 +- .../format/juce_AudioSubsectionReader.h | 2 +- .../juce_BufferingAudioFormatReader.cpp | 6 +-- .../format/juce_BufferingAudioFormatReader.h | 2 +- .../LV2/juce_LV2_Client.cpp | 2 +- .../Standalone/juce_StandaloneFilterWindow.h | 8 ++-- .../format_types/juce_VSTPluginFormat.cpp | 41 ++++++++++++++++--- .../processors/juce_AudioProcessorGraph.cpp | 2 +- .../gui/juce_AudioVisualiserComponent.cpp | 2 +- .../gui/juce_AudioVisualiserComponent.h | 2 +- .../players/juce_AudioProcessorPlayer.cpp | 8 ++-- .../players/juce_AudioProcessorPlayer.h | 2 +- .../players/juce_SoundPlayer.cpp | 4 +- .../players/juce_SoundPlayer.h | 2 +- .../frequency/juce_Convolution_test.cpp | 2 +- 44 files changed, 150 insertions(+), 92 deletions(-) diff --git a/BREAKING-CHANGES.txt b/BREAKING-CHANGES.txt index ccb9100d14..9c57f9dbff 100644 --- a/BREAKING-CHANGES.txt +++ b/BREAKING-CHANGES.txt @@ -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 diff --git a/examples/Assets/AudioLiveScrollingDisplay.h b/examples/Assets/AudioLiveScrollingDisplay.h index dc75464ee9..9aa76d40f1 100644 --- a/examples/Assets/AudioLiveScrollingDisplay.h +++ b/examples/Assets/AudioLiveScrollingDisplay.h @@ -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) diff --git a/examples/Audio/AudioLatencyDemo.h b/examples/Audio/AudioLatencyDemo.h index 171accb436..4e6cddd989 100644 --- a/examples/Audio/AudioLatencyDemo.h +++ b/examples/Audio/AudioLatencyDemo.h @@ -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); diff --git a/examples/Audio/AudioRecordingDemo.h b/examples/Audio/AudioRecordingDemo.h index 6bfa622eb3..4a759e7610 100644 --- a/examples/Audio/AudioRecordingDemo.h +++ b/examples/Audio/AudioRecordingDemo.h @@ -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); diff --git a/examples/Audio/MPEDemo.h b/examples/Audio/MPEDemo.h index 35a51c4b04..eeccc8452f 100644 --- a/examples/Audio/MPEDemo.h +++ b/examples/Audio/MPEDemo.h @@ -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 buffer (outputChannelData, numOutputChannels, numSamples); diff --git a/modules/juce_audio_basics/buffers/juce_AudioDataConverters.h b/modules/juce_audio_basics/buffers/juce_AudioDataConverters.h index aca7d7ce28..209f242d78 100644 --- a/modules/juce_audio_basics/buffers/juce_AudioDataConverters.h +++ b/modules/juce_audio_basics/buffers/juce_AudioDataConverters.h @@ -662,7 +662,7 @@ private: { using ElementType = std::remove_pointer_t; using ChannelType = std::conditional_t; - using DataType = std::conditional_t; + using DataType = std::conditional_t; using PointerType = Pointer, diff --git a/modules/juce_audio_basics/buffers/juce_AudioSampleBuffer.h b/modules/juce_audio_basics/buffers/juce_AudioSampleBuffer.h index 9ea81f51df..c1f81e2677 100644 --- a/modules/juce_audio_basics/buffers/juce_AudioSampleBuffer.h +++ b/modules/juce_audio_basics/buffers/juce_AudioSampleBuffer.h @@ -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 (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) { diff --git a/modules/juce_audio_devices/audio_io/juce_AudioDeviceManager.cpp b/modules/juce_audio_devices/audio_io/juce_AudioDeviceManager.cpp index bf0eb6f07b..c9f22e1223 100644 --- a/modules/juce_audio_devices/audio_io/juce_AudioDeviceManager.cpp +++ b/modules/juce_audio_devices/audio_io/juce_AudioDeviceManager.cpp @@ -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 (outputChannelData), numOutputChannels, numSamples); + outputLevelGetter->updateLevel (outputChannelData, numOutputChannels, numSamples); } void AudioDeviceManager::audioDeviceAboutToStartInt (AudioIODevice* const device) @@ -1891,10 +1891,10 @@ private: std::function stopped; std::function error; - void audioDeviceIOCallback (const float**, int, float**, 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); } + 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); } }; void initialiseManager (AudioDeviceManager& manager) diff --git a/modules/juce_audio_devices/audio_io/juce_AudioDeviceManager.h b/modules/juce_audio_devices/audio_io/juce_AudioDeviceManager.h index f288b6e14b..c655254ecf 100644 --- a/modules/juce_audio_devices/audio_io/juce_AudioDeviceManager.h +++ b/modules/juce_audio_devices/audio_io/juce_AudioDeviceManager.h @@ -526,9 +526,9 @@ private: class CallbackHandler; std::unique_ptr 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); diff --git a/modules/juce_audio_devices/audio_io/juce_AudioIODevice.h b/modules/juce_audio_devices/audio_io/juce_AudioIODevice.h index 8864ffd783..a98411ed41 100644 --- a/modules/juce_audio_devices/audio_io/juce_AudioIODevice.h +++ b/modules/juce_audio_devices/audio_io/juce_AudioIODevice.h @@ -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) diff --git a/modules/juce_audio_devices/native/juce_android_Oboe.cpp b/modules/juce_audio_devices/native/juce_android_Oboe.cpp index 105a182a2f..5bedb1791a 100644 --- a/modules/juce_audio_devices/native/juce_android_Oboe.cpp +++ b/modules/juce_audio_devices/native/juce_android_Oboe.cpp @@ -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)) { diff --git a/modules/juce_audio_devices/native/juce_ios_Audio.cpp b/modules/juce_audio_devices/native/juce_ios_Audio.cpp index 12c8b3389d..6fa620f295 100644 --- a/modules/juce_audio_devices/native/juce_ios_Audio.cpp +++ b/modules/juce_audio_devices/native/juce_ios_Audio.cpp @@ -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) { diff --git a/modules/juce_audio_devices/native/juce_linux_JackAudio.cpp b/modules/juce_audio_devices/native/juce_linux_JackAudio.cpp index 8b7e77573b..c1be61a398 100644 --- a/modules/juce_audio_devices/native/juce_linux_JackAudio.cpp +++ b/modules/juce_audio_devices/native/juce_linux_JackAudio.cpp @@ -462,7 +462,7 @@ private: if (callback != nullptr) { if ((numActiveInChans + numActiveOutChans) > 0) - callback->audioDeviceIOCallbackWithContext (const_cast (inChans.getData()), + callback->audioDeviceIOCallbackWithContext (inChans.getData(), numActiveInChans, outChans, numActiveOutChans, diff --git a/modules/juce_audio_devices/native/juce_mac_CoreAudio.cpp b/modules/juce_audio_devices/native/juce_mac_CoreAudio.cpp index 66ea635cf8..26c4b94f41 100644 --- a/modules/juce_audio_devices/native/juce_mac_CoreAudio.cpp +++ b/modules/juce_audio_devices/native/juce_mac_CoreAudio.cpp @@ -852,7 +852,7 @@ public: const auto nanos = timeStamp != nullptr ? timeConversions.hostTimeToNanos (timeStamp->mHostTime) : 0; - callback->audioDeviceIOCallbackWithContext (const_cast (tempInputBuffers.get()), + callback->audioDeviceIOCallbackWithContext (tempInputBuffers.get(), numInputChans, tempOutputBuffers, numOutputChans, @@ -1685,8 +1685,8 @@ private: bool active = false; String lastError; AudioBuffer 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 diff --git a/modules/juce_audio_devices/native/juce_win32_ASIO.cpp b/modules/juce_audio_devices/native/juce_win32_ASIO.cpp index 529c8b6f29..bc0a05a47f 100644 --- a/modules/juce_audio_devices/native/juce_win32_ASIO.cpp +++ b/modules/juce_audio_devices/native/juce_win32_ASIO.cpp @@ -1326,7 +1326,7 @@ private: inputFormat[i].convertToFloat (infos[i].buffers[bufferIndex], inBuffers[i], samps); } - currentCallback->audioDeviceIOCallbackWithContext (const_cast (inBuffers.getData()), + currentCallback->audioDeviceIOCallbackWithContext (inBuffers.getData(), numActiveInputChans, outBuffers, numActiveOutputChans, diff --git a/modules/juce_audio_devices/native/juce_win32_WASAPI.cpp b/modules/juce_audio_devices/native/juce_win32_WASAPI.cpp index 2619f7062e..f5484f5b84 100644 --- a/modules/juce_audio_devices/native/juce_win32_WASAPI.cpp +++ b/modules/juce_audio_devices/native/juce_win32_WASAPI.cpp @@ -1552,7 +1552,7 @@ public: const ScopedTryLock sl (startStopLock); if (sl.isLocked() && isStarted) - callback->audioDeviceIOCallbackWithContext (const_cast (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 (outputBuffers), numOutputBuffers, bufferSize, inputDevice.get(), *this); + outputDevice->copyBuffers (outputBuffers, numOutputBuffers, bufferSize, inputDevice.get(), *this); if (outputDevice->sampleRateHasChanged) { diff --git a/modules/juce_audio_devices/sources/juce_AudioSourcePlayer.cpp b/modules/juce_audio_devices/sources/juce_AudioSourcePlayer.cpp index 8270d20afd..901847243a 100644 --- a/modules/juce_audio_devices/sources/juce_AudioSourcePlayer.cpp +++ b/modules/juce_audio_devices/sources/juce_AudioSourcePlayer.cpp @@ -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) { diff --git a/modules/juce_audio_devices/sources/juce_AudioSourcePlayer.h b/modules/juce_audio_devices/sources/juce_AudioSourcePlayer.h index 65c19aac4b..73e638459f 100644 --- a/modules/juce_audio_devices/sources/juce_AudioSourcePlayer.h +++ b/modules/juce_audio_devices/sources/juce_AudioSourcePlayer.h @@ -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; diff --git a/modules/juce_audio_formats/codecs/juce_AiffAudioFormat.cpp b/modules/juce_audio_formats/codecs/juce_AiffAudioFormat.cpp index a5b6329728..2d1ed97028 100644 --- a/modules/juce_audio_formats/codecs/juce_AiffAudioFormat.cpp +++ b/modules/juce_audio_formats/codecs/juce_AiffAudioFormat.cpp @@ -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, diff --git a/modules/juce_audio_formats/codecs/juce_CoreAudioFormat.cpp b/modules/juce_audio_formats/codecs/juce_CoreAudioFormat.cpp index e7ef336d6b..079df3f378 100644 --- a/modules/juce_audio_formats/codecs/juce_CoreAudioFormat.cpp +++ b/modules/juce_audio_formats/codecs/juce_CoreAudioFormat.cpp @@ -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, diff --git a/modules/juce_audio_formats/codecs/juce_FlacAudioFormat.cpp b/modules/juce_audio_formats/codecs/juce_FlacAudioFormat.cpp index 9034a42c04..66783df8fb 100644 --- a/modules/juce_audio_formats/codecs/juce_FlacAudioFormat.cpp +++ b/modules/juce_audio_formats/codecs/juce_FlacAudioFormat.cpp @@ -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) diff --git a/modules/juce_audio_formats/codecs/juce_MP3AudioFormat.cpp b/modules/juce_audio_formats/codecs/juce_MP3AudioFormat.cpp index 7a287f9cc3..d24df3dfae 100644 --- a/modules/juce_audio_formats/codecs/juce_MP3AudioFormat.cpp +++ b/modules/juce_audio_formats/codecs/juce_MP3AudioFormat.cpp @@ -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 (destSamples); + float* const* const dst = reinterpret_cast (destSamples); memcpy (dst[0] + startOffsetInDestBuffer, decoded0 + decodedStart, (size_t) numToCopy * sizeof (float)); if (numDestChannels > 1 && dst[1] != nullptr) diff --git a/modules/juce_audio_formats/codecs/juce_OggVorbisAudioFormat.cpp b/modules/juce_audio_formats/codecs/juce_OggVorbisAudioFormat.cpp index b47c4a4d39..cf105e9bbe 100644 --- a/modules/juce_audio_formats/codecs/juce_OggVorbisAudioFormat.cpp +++ b/modules/juce_audio_formats/codecs/juce_OggVorbisAudioFormat.cpp @@ -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; }; diff --git a/modules/juce_audio_formats/codecs/juce_WavAudioFormat.cpp b/modules/juce_audio_formats/codecs/juce_WavAudioFormat.cpp index 20f0f49254..c562882ca8 100644 --- a/modules/juce_audio_formats/codecs/juce_WavAudioFormat.cpp +++ b/modules/juce_audio_formats/codecs/juce_WavAudioFormat.cpp @@ -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, diff --git a/modules/juce_audio_formats/codecs/juce_WindowsMediaAudioFormat.cpp b/modules/juce_audio_formats/codecs/juce_WindowsMediaAudioFormat.cpp index 9764a69697..8ce23321c6 100644 --- a/modules/juce_audio_formats/codecs/juce_WindowsMediaAudioFormat.cpp +++ b/modules/juce_audio_formats/codecs/juce_WindowsMediaAudioFormat.cpp @@ -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) diff --git a/modules/juce_audio_formats/format/juce_ARAAudioReaders.cpp b/modules/juce_audio_formats/format/juce_ARAAudioReaders.cpp index e02ab8f743..d3b0f2056d 100644 --- a/modules/juce_audio_formats/format/juce_ARAAudioReaders.cpp +++ b/modules/juce_audio_formats/format/juce_ARAAudioReaders.cpp @@ -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; diff --git a/modules/juce_audio_formats/format/juce_ARAAudioReaders.h b/modules/juce_audio_formats/format/juce_ARAAudioReaders.h index c55a0636f7..6f231969cd 100644 --- a/modules/juce_audio_formats/format/juce_ARAAudioReaders.h +++ b/modules/juce_audio_formats/format/juce_ARAAudioReaders.h @@ -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, diff --git a/modules/juce_audio_formats/format/juce_AudioFormatReader.cpp b/modules/juce_audio_formats/format/juce_AudioFormatReader.cpp index 21e6e82b16..92998539b9 100644 --- a/modules/juce_audio_formats/format/juce_AudioFormatReader.cpp +++ b/modules/juce_audio_formats/format/juce_AudioFormatReader.cpp @@ -86,7 +86,7 @@ bool AudioFormatReader::read (int* const* destChannels, if (numSamplesToRead <= 0) return true; - if (! readSamples (const_cast (destChannels), + if (! readSamples (destChannels, jmin ((int) numChannels, numDestChannels), startOffsetInDestBuffer, startSampleInSource, numSamplesToRead)) return false; diff --git a/modules/juce_audio_formats/format/juce_AudioFormatReader.h b/modules/juce_audio_formats/format/juce_AudioFormatReader.h index eff7869115..25af44c283 100644 --- a/modules/juce_audio_formats/format/juce_AudioFormatReader.h +++ b/modules/juce_audio_formats/format/juce_AudioFormatReader.h @@ -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) { diff --git a/modules/juce_audio_formats/format/juce_AudioSubsectionReader.cpp b/modules/juce_audio_formats/format/juce_AudioSubsectionReader.cpp index 8c16177e26..530c4bbca7 100644 --- a/modules/juce_audio_formats/format/juce_AudioSubsectionReader.cpp +++ b/modules/juce_audio_formats/format/juce_AudioSubsectionReader.cpp @@ -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, diff --git a/modules/juce_audio_formats/format/juce_AudioSubsectionReader.h b/modules/juce_audio_formats/format/juce_AudioSubsectionReader.h index 52d4ba6e72..5b9cdddb38 100644 --- a/modules/juce_audio_formats/format/juce_AudioSubsectionReader.h +++ b/modules/juce_audio_formats/format/juce_AudioSubsectionReader.h @@ -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, diff --git a/modules/juce_audio_formats/format/juce_BufferingAudioFormatReader.cpp b/modules/juce_audio_formats/format/juce_BufferingAudioFormatReader.cpp index d59b279afb..34a9de5c6f 100644 --- a/modules/juce_audio_formats/format/juce_BufferingAudioFormatReader.cpp +++ b/modules/juce_audio_formats/format/juce_BufferingAudioFormatReader.cpp @@ -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; diff --git a/modules/juce_audio_formats/format/juce_BufferingAudioFormatReader.h b/modules/juce_audio_formats/format/juce_BufferingAudioFormatReader.h index 8414c18a55..b16e2bdcea 100644 --- a/modules/juce_audio_formats/format/juce_BufferingAudioFormatReader.h +++ b/modules/juce_audio_formats/format/juce_BufferingAudioFormatReader.h @@ -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: diff --git a/modules/juce_audio_plugin_client/LV2/juce_LV2_Client.cpp b/modules/juce_audio_plugin_client/LV2/juce_LV2_Client.cpp index 53d9e9732e..c27d3a71bf 100644 --- a/modules/juce_audio_plugin_client/LV2/juce_LV2_Client.cpp +++ b/modules/juce_audio_plugin_client/LV2/juce_LV2_Client.cpp @@ -484,7 +484,7 @@ public: template static void iterateAudioBuffer (AudioBuffer& 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;) diff --git a/modules/juce_audio_plugin_client/Standalone/juce_StandaloneFilterWindow.h b/modules/juce_audio_plugin_client/Standalone/juce_StandaloneFilterWindow.h index 05842cc58a..cb15aca6c8 100644 --- a/modules/juce_audio_plugin_client/Standalone/juce_StandaloneFilterWindow.h +++ b/modules/juce_audio_plugin_client/Standalone/juce_StandaloneFilterWindow.h @@ -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 diff --git a/modules/juce_audio_processors/format_types/juce_VSTPluginFormat.cpp b/modules/juce_audio_processors/format_types/juce_VSTPluginFormat.cpp index 364d08a8ca..db7cd589ae 100644 --- a/modules/juce_audio_processors/format_types/juce_VSTPluginFormat.cpp +++ b/modules/juce_audio_processors/format_types/juce_VSTPluginFormat.cpp @@ -829,6 +829,34 @@ static const int defaultVSTBlockSizeValue = 512; JUCE_BEGIN_IGNORE_WARNINGS_MSVC (4996) +class TempChannelPointers +{ +public: + template + auto getArrayOfModifiableWritePointers (AudioBuffer& buffer) + { + auto& pointers = getPointers (Tag{}); + + 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 struct Tag {}; + + auto& getPointers (Tag) { return floatPointers; } + auto& getPointers (Tag) { return doublePointers; } + + std::vector floatPointers { 128 }; + std::vector doublePointers { 128 }; +}; + //============================================================================== struct VSTPluginInstance final : public AudioPluginInstance, private Timer, @@ -2026,6 +2054,7 @@ private: bool lastProcessBlockCallWasBypass = false, vstSupportsBypass = false; mutable StringArray programNames; AudioBuffer 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& buffer, int32 sampleFrames) { - vstEffect->processDoubleReplacing (vstEffect, buffer.getArrayOfWritePointers(), - buffer.getArrayOfWritePointers(), sampleFrames); + vstEffect->processDoubleReplacing (vstEffect, tempChannelPointers[0].getArrayOfModifiableWritePointers (buffer), + tempChannelPointers[1].getArrayOfModifiableWritePointers (buffer), sampleFrames); } //============================================================================== diff --git a/modules/juce_audio_processors/processors/juce_AudioProcessorGraph.cpp b/modules/juce_audio_processors/processors/juce_AudioProcessorGraph.cpp index f2ad96df0f..49b1640f57 100644 --- a/modules/juce_audio_processors/processors/juce_AudioProcessorGraph.cpp +++ b/modules/juce_audio_processors/processors/juce_AudioProcessorGraph.cpp @@ -444,7 +444,7 @@ struct GraphRenderSequence struct Context { - FloatType** audioBuffers; + FloatType* const* audioBuffers; MidiBuffer* midiBuffers; AudioPlayHead* audioPlayHead; int numSamples; diff --git a/modules/juce_audio_utils/gui/juce_AudioVisualiserComponent.cpp b/modules/juce_audio_utils/gui/juce_AudioVisualiserComponent.cpp index fe12591f8b..765c7a86c8 100644 --- a/modules/juce_audio_utils/gui/juce_AudioVisualiserComponent.cpp +++ b/modules/juce_audio_utils/gui/juce_AudioVisualiserComponent.cpp @@ -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()); diff --git a/modules/juce_audio_utils/gui/juce_AudioVisualiserComponent.h b/modules/juce_audio_utils/gui/juce_AudioVisualiserComponent.h index 28cd33fe2c..b1ba56c6bc 100644 --- a/modules/juce_audio_utils/gui/juce_AudioVisualiserComponent.h +++ b/modules/juce_audio_utils/gui/juce_AudioVisualiserComponent.h @@ -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 diff --git a/modules/juce_audio_utils/players/juce_AudioProcessorPlayer.cpp b/modules/juce_audio_utils/players/juce_AudioProcessorPlayer.cpp index bb1c5580fa..70b8b0ac09 100644 --- a/modules/juce_audio_utils/players/juce_AudioProcessorPlayer.cpp +++ b/modules/juce_audio_utils/players/juce_AudioProcessorPlayer.cpp @@ -30,10 +30,10 @@ template 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) diff --git a/modules/juce_audio_utils/players/juce_AudioProcessorPlayer.h b/modules/juce_audio_utils/players/juce_AudioProcessorPlayer.h index 8f14d52e95..9ba98ba958 100644 --- a/modules/juce_audio_utils/players/juce_AudioProcessorPlayer.h +++ b/modules/juce_audio_utils/players/juce_AudioProcessorPlayer.h @@ -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 */ diff --git a/modules/juce_audio_utils/players/juce_SoundPlayer.cpp b/modules/juce_audio_utils/players/juce_SoundPlayer.cpp index 3426fa3beb..6392a24d6b 100644 --- a/modules/juce_audio_utils/players/juce_SoundPlayer.cpp +++ b/modules/juce_audio_utils/players/juce_SoundPlayer.cpp @@ -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) { diff --git a/modules/juce_audio_utils/players/juce_SoundPlayer.h b/modules/juce_audio_utils/players/juce_SoundPlayer.h index e4c36aca34..59b1c62310 100644 --- a/modules/juce_audio_utils/players/juce_SoundPlayer.h +++ b/modules/juce_audio_utils/players/juce_SoundPlayer.h @@ -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 */ diff --git a/modules/juce_dsp/frequency/juce_Convolution_test.cpp b/modules/juce_dsp/frequency/juce_Convolution_test.cpp index 115c2c7688..ab676f44bb 100644 --- a/modules/juce_dsp/frequency/juce_Convolution_test.cpp +++ b/modules/juce_dsp/frequency/juce_Convolution_test.cpp @@ -62,7 +62,7 @@ class ConvolutionTest : public UnitTest AudioBuffer 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);