diff --git a/modules/juce_audio_basics/buffers/juce_AudioDataConverters.cpp b/modules/juce_audio_basics/buffers/juce_AudioDataConverters.cpp index bd4a2d7441..7f7d59b572 100644 --- a/modules/juce_audio_basics/buffers/juce_AudioDataConverters.cpp +++ b/modules/juce_audio_basics/buffers/juce_AudioDataConverters.cpp @@ -434,16 +434,21 @@ void AudioDataConverters::convertFormatToFloat (DataFormat sourceFormat, const v //============================================================================== void AudioDataConverters::interleaveSamples (const float** source, float* dest, int numSamples, int numChannels) { - AudioData::interleaveSamples (source, numChannels, dest, numChannels, numSamples); + using Format = AudioData::Format; + + AudioData::interleaveSamples (AudioData::NonInterleavedSource { source, numChannels }, + AudioData::InterleavedDest { dest, numChannels }, + numSamples); } void AudioDataConverters::deinterleaveSamples (const float* source, float** dest, int numSamples, int numChannels) { - AudioData::deinterleaveSamples (source, numChannels, dest, numChannels, numSamples); -} + using Format = AudioData::Format; + AudioData::deinterleaveSamples (AudioData::InterleavedSource { source, numChannels }, + AudioData::NonInterleavedDest { dest, numChannels }, + numSamples); +} //============================================================================== //============================================================================== @@ -574,6 +579,8 @@ public: beginTest ("Round-trip conversion: Float32"); Test1 ::test (*this, r); + using Format = AudioData::Format; + beginTest ("Interleaving"); { constexpr auto numChannels = 4; @@ -586,10 +593,9 @@ public: for (int i = 0; i < numSamples; ++i) sourceBuffer.setSample (ch, i, r.nextFloat()); - AudioData::interleaveSamples (sourceBuffer.getArrayOfReadPointers(), numChannels, - destBuffer.getWritePointer (0), numChannels, - numSamples); + AudioData::interleaveSamples (AudioData::NonInterleavedSource { sourceBuffer.getArrayOfReadPointers(), numChannels }, + AudioData::InterleavedDest { destBuffer.getWritePointer (0), numChannels }, + numSamples); for (int ch = 0; ch < numChannels; ++ch) for (int i = 0; i < numSamples; ++i) @@ -608,10 +614,9 @@ public: for (int i = 0; i < numSamples; ++i) sourceBuffer.setSample (0, ch + (i * numChannels), r.nextFloat()); - AudioData::deinterleaveSamples (sourceBuffer.getReadPointer (0), numChannels, - destBuffer.getArrayOfWritePointers(), numChannels, - numSamples); + AudioData::deinterleaveSamples (AudioData::InterleavedSource { sourceBuffer.getReadPointer (0), numChannels }, + AudioData::NonInterleavedDest { destBuffer.getArrayOfWritePointers(), numChannels }, + numSamples); for (int ch = 0; ch < numChannels; ++ch) for (int i = 0; i < numSamples; ++i) diff --git a/modules/juce_audio_devices/native/juce_android_Audio.cpp b/modules/juce_audio_devices/native/juce_android_Audio.cpp index 158580fbfc..108ff761b5 100644 --- a/modules/juce_audio_devices/native/juce_android_Audio.cpp +++ b/modules/juce_audio_devices/native/juce_android_Audio.cpp @@ -326,6 +326,9 @@ public: JNIEnv* env = getEnv(); jshortArray audioBuffer = env->NewShortArray (actualBufferSize * jmax (numDeviceOutputChannels, numDeviceInputChannels)); + using NativeInt16 = AudioData::Format; + using NativeFloat32 = AudioData::Format; + while (! threadShouldExit()) { if (inputDevice != nullptr) @@ -339,12 +342,9 @@ public: jshort* const src = env->GetShortArrayElements (audioBuffer, nullptr); - AudioData::deinterleaveSamples (reinterpret_cast (src), - numDeviceInputChannels, - inputChannelBuffer.getArrayOfWritePointers(), - inputChannelBuffer.getNumChannels(), - actualBufferSize); + AudioData::deinterleaveSamples (AudioData::InterleavedSource { reinterpret_cast (src), numDeviceInputChannels }, + AudioData::NonInterleavedDest { inputChannelBuffer.getArrayOfWritePointers(), inputChannelBuffer.getNumChannels() }, + actualBufferSize); env->ReleaseShortArrayElements (audioBuffer, src, 0); } @@ -374,12 +374,9 @@ public: jshort* const dest = env->GetShortArrayElements (audioBuffer, nullptr); - AudioData::interleaveSamples (outputChannelBuffer.getArrayOfReadPointers(), - outputChannelBuffer.getNumChannels(), - reinterpret_cast (dest), - numDeviceOutputChannels, - actualBufferSize); + AudioData::interleaveSamples (AudioData::NonInterleavedSource { outputChannelBuffer.getArrayOfReadPointers(), outputChannelBuffer.getNumChannels() }, + AudioData::InterleavedDest { reinterpret_cast (dest), numDeviceOutputChannels }, + actualBufferSize); env->ReleaseShortArrayElements (audioBuffer, dest, 0); jint numWritten = env->CallIntMethod (outputDevice, AudioTrack.write, audioBuffer, 0, actualBufferSize * numDeviceOutputChannels); diff --git a/modules/juce_audio_devices/native/juce_android_Oboe.cpp b/modules/juce_audio_devices/native/juce_android_Oboe.cpp index 2f2f8beb70..92827efcd5 100644 --- a/modules/juce_audio_devices/native/juce_android_Oboe.cpp +++ b/modules/juce_audio_devices/native/juce_android_Oboe.cpp @@ -44,28 +44,25 @@ struct OboeAudioIODeviceBufferHelpers static bool referAudioBufferDirectlyToOboeIfPossible (int16*, AudioBuffer&, int) { return false; } + using NativeInt16 = AudioData::Format; + using NativeFloat32 = AudioData::Format; + static void convertFromOboe (const int16* srcInterleaved, AudioBuffer& audioBuffer, int numSamples) { const auto numChannels = audioBuffer.getNumChannels(); - AudioData::deinterleaveSamples (reinterpret_cast (srcInterleaved), - numChannels, - audioBuffer.getArrayOfWritePointers(), - numChannels, - numSamples); + AudioData::deinterleaveSamples (AudioData::InterleavedSource { reinterpret_cast (srcInterleaved), numChannels }, + AudioData::NonInterleavedDest { audioBuffer.getArrayOfWritePointers(), numChannels }, + numSamples); } static void convertToOboe (const AudioBuffer& audioBuffer, int16* dstInterleaved, int numSamples) { const auto numChannels = audioBuffer.getNumChannels(); - AudioData::interleaveSamples (audioBuffer.getArrayOfReadPointers(), - numChannels, - reinterpret_cast (dstInterleaved), - numChannels, - numSamples); + AudioData::interleaveSamples (AudioData::NonInterleavedSource { audioBuffer.getArrayOfReadPointers(), numChannels }, + AudioData::InterleavedDest { reinterpret_cast (dstInterleaved), numChannels }, + numSamples); } }; @@ -87,6 +84,8 @@ struct OboeAudioIODeviceBufferHelpers return false; } + using Format = AudioData::Format; + static void convertFromOboe (const float* srcInterleaved, AudioBuffer& audioBuffer, int numSamples) { auto numChannels = audioBuffer.getNumChannels(); @@ -96,12 +95,9 @@ struct OboeAudioIODeviceBufferHelpers // No need to convert, we instructed the buffer to point to the src data directly already jassert (audioBuffer.getWritePointer (0) != srcInterleaved); - AudioData::deinterleaveSamples (srcInterleaved, - numChannels, - audioBuffer.getArrayOfWritePointers(), - numChannels, - numSamples); + AudioData::deinterleaveSamples (AudioData::InterleavedSource { srcInterleaved, numChannels }, + AudioData::NonInterleavedDest { audioBuffer.getArrayOfWritePointers(), numChannels }, + numSamples); } } @@ -114,12 +110,9 @@ struct OboeAudioIODeviceBufferHelpers // No need to convert, we instructed the buffer to point to the src data directly already jassert (audioBuffer.getReadPointer (0) != dstInterleaved); - AudioData::interleaveSamples (audioBuffer.getArrayOfReadPointers(), - numChannels, - dstInterleaved, - numChannels, - numSamples); + AudioData::interleaveSamples (AudioData::NonInterleavedSource { audioBuffer.getArrayOfReadPointers(), numChannels }, + AudioData::InterleavedDest { dstInterleaved, numChannels }, + numSamples); } } }; diff --git a/modules/juce_audio_devices/native/juce_android_OpenSL.cpp b/modules/juce_audio_devices/native/juce_android_OpenSL.cpp index b93f9aeaad..2f5683f43c 100644 --- a/modules/juce_audio_devices/native/juce_android_OpenSL.cpp +++ b/modules/juce_audio_devices/native/juce_android_OpenSL.cpp @@ -194,28 +194,25 @@ struct BufferHelpers static void prepareCallbackBuffer (AudioBuffer&, int16*) {} + using LittleEndianInt16 = AudioData::Format; + using NativeFloat32 = AudioData::Format; + static void convertFromOpenSL (const int16* srcInterleaved, AudioBuffer& audioBuffer) { const auto numChannels = audioBuffer.getNumChannels(); - AudioData::deinterleaveSamples (reinterpret_cast (srcInterleaved), - numChannels, - audioBuffer.getArrayOfWritePointers(), - numChannels, - audioBuffer.getNumSamples()); + AudioData::deinterleaveSamples (AudioData::InterleavedSource { reinterpret_cast (srcInterleaved), numChannels }, + AudioData::NonInterleavedDest { audioBuffer.getArrayOfWritePointers(), numChannels }, + audioBuffer.getNumSamples()); } static void convertToOpenSL (const AudioBuffer& audioBuffer, int16* dstInterleaved) { const auto numChannels = audioBuffer.getNumChannels(); - AudioData::interleaveSamples (audioBuffer.getArrayOfReadPointers(), - numChannels, - reinterpret_cast (dstInterleaved), - numChannels, - audioBuffer.getNumSamples()); + AudioData::interleaveSamples (AudioData::NonInterleavedSource { audioBuffer.getArrayOfReadPointers(), numChannels }, + AudioData::InterleavedDest { reinterpret_cast (dstInterleaved), numChannels }, + audioBuffer.getNumSamples()); } }; @@ -244,6 +241,9 @@ struct BufferHelpers audioBuffer.setDataToReferTo (&native, 1, audioBuffer.getNumSamples()); } + using LittleEndianFloat32 = AudioData::Format; + using NativeFloat32 = AudioData::Format; + static void convertFromOpenSL (const float* srcInterleaved, AudioBuffer& audioBuffer) { const auto numChannels = audioBuffer.getNumChannels(); @@ -254,12 +254,9 @@ struct BufferHelpers return; } - AudioData::deinterleaveSamples (srcInterleaved, - numChannels, - audioBuffer.getArrayOfWritePointers(), - numChannels, - audioBuffer.getNumSamples()); + AudioData::deinterleaveSamples (AudioData::InterleavedSource { srcInterleaved, numChannels }, + AudioData::nonInterleavedDest { audioBuffer.getArrayOfWritePointers(), numChannels }, + audioBuffer.getNumSamples()); } static void convertToOpenSL (const AudioBuffer& audioBuffer, float* dstInterleaved) @@ -272,12 +269,9 @@ struct BufferHelpers return; } - AudioData::interleaveSamples (audioBuffer.getArrayOfReadPointers(), - numChannels, - dstInterleaved, - numChannels, - audioBuffer.getNumSamples()); + AudioData::interleaveSamples (AudioData::NonInterleavedSource { audioBuffer.getArrayOfReadPointers(), numChannels }, + AudioData::InterleavedDest { dstInterleaved, numChannels }, + audioBuffer.getNumSamples()); } }; diff --git a/modules/juce_audio_utils/native/juce_mac_AudioCDBurner.mm b/modules/juce_audio_utils/native/juce_mac_AudioCDBurner.mm index 5c7ea999bb..77a5a0167c 100644 --- a/modules/juce_audio_utils/native/juce_mac_AudioCDBurner.mm +++ b/modules/juce_audio_utils/native/juce_mac_AudioCDBurner.mm @@ -132,10 +132,9 @@ private: source->source->getNextAudioBlock (info); - AudioData::interleaveSamples (tempBuffer.getArrayOfReadPointers(), 2, - reinterpret_cast (buffer), 2, - numSamples); + AudioData::interleaveSamples (AudioData::NonInterleavedSource { tempBuffer.getArrayOfReadPointers(), 2 }, + AudioData::InterleavedDest { reinterpret_cast (buffer), 2 }, + numSamples); source->readPosition += numSamples; } diff --git a/modules/juce_audio_utils/native/juce_win32_AudioCDBurner.cpp b/modules/juce_audio_utils/native/juce_win32_AudioCDBurner.cpp index 7d8a9498e3..9a84abd647 100644 --- a/modules/juce_audio_utils/native/juce_win32_AudioCDBurner.cpp +++ b/modules/juce_audio_utils/native/juce_win32_AudioCDBurner.cpp @@ -388,10 +388,9 @@ bool AudioCDBurner::addAudioTrack (AudioSource* audioSource, int numSamples) buffer.clear (bytesPerBlock); - AudioData::interleaveSamples (sourceBuffer.getArrayOfReadPointers(), 2, - reinterpret_cast (buffer), 2, - samplesPerBlock); + AudioData::interleaveSamples (AudioData::NonInterleavedSource { sourceBuffer.getArrayOfReadPointers(), 2 }, + AudioData::InterleavedDest { reinterpret_cast (buffer), 2 }, + samplesPerBlock); hr = pimpl->redbook->AddAudioTrackBlocks (buffer, bytesPerBlock);