diff --git a/modules/dsp/chowdsp_buffers/Buffers/chowdsp_BufferView.h b/modules/dsp/chowdsp_buffers/Buffers/chowdsp_BufferView.h index 97ce85952..2924d432d 100644 --- a/modules/dsp/chowdsp_buffers/Buffers/chowdsp_BufferView.h +++ b/modules/dsp/chowdsp_buffers/Buffers/chowdsp_BufferView.h @@ -382,10 +382,17 @@ BufferView (BufferType&, Ts...) -> BufferView>; template BufferView make_temp_buffer (ArenaAllocatorView arena, int num_channels, int num_samples) { + int num_samples_padded = num_samples; +#if ! CHOWDSP_NO_XSIMD + static constexpr auto vec_size = (int) xsimd::batch::size; + if constexpr (std::is_floating_point_v) + num_samples_padded = buffers_detail::ceiling_divide (num_samples, vec_size) * vec_size; +#endif + std::array channel_pointers {}; for (size_t ch = 0; ch < static_cast (num_channels); ++ch) { - channel_pointers[ch] = arena.allocate (num_samples, SIMDUtils::defaultSIMDAlignment); + channel_pointers[ch] = arena.allocate (num_samples_padded, SIMDUtils::defaultSIMDAlignment); jassert (channel_pointers[ch] != nullptr); } return { channel_pointers.data(), num_channels, num_samples }; diff --git a/tests/dsp_tests/chowdsp_buffers_test/BufferViewTest.cpp b/tests/dsp_tests/chowdsp_buffers_test/BufferViewTest.cpp index a5938f5bb..cf7c0a496 100644 --- a/tests/dsp_tests/chowdsp_buffers_test/BufferViewTest.cpp +++ b/tests/dsp_tests/chowdsp_buffers_test/BufferViewTest.cpp @@ -1,4 +1,5 @@ #include +#include JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wfloat-equal") #include @@ -139,6 +140,16 @@ TEMPLATE_TEST_CASE ("Buffer View Test", "[dsp][buffers][simd]", float, double, x REQUIRE (buffer_view.getReadPointer (0) == buffer_view_copy.getReadPointer (0)); } } + + if constexpr (std::is_floating_point_v) + { + SECTION ("make_temp_buffer") + { + chowdsp::ArenaAllocator<> arena { 1 << 10 }; + chowdsp::make_temp_buffer (arena, 2, 61); + REQUIRE (arena.get_bytes_used() == 64 * 2 * sizeof (float)); + } + } } JUCE_END_IGNORE_WARNINGS_GCC_LIKE