Added debug introspection about the max number of buffer used

This commit is contained in:
Paul Ferrand 2020-03-29 17:54:47 +02:00
parent 1a55b42bd7
commit c1266e5d70
2 changed files with 78 additions and 6 deletions

View file

@ -6,10 +6,15 @@
#pragma once #pragma once
#include "Config.h" #include "Config.h"
#include "Debug.h"
#include "Buffer.h" #include "Buffer.h"
#include "AudioBuffer.h" #include "AudioBuffer.h"
#include <array> #include <array>
#include <memory> #include <memory>
#ifndef NDEBUG
#include "absl/algorithm/container.h"
#include "MathHelpers.h"
#endif
namespace sfz namespace sfz
{ {
@ -23,6 +28,10 @@ public:
buffer = std::make_shared<sfz::Buffer<float>>(config::defaultSamplesPerBlock); buffer = std::make_shared<sfz::Buffer<float>>(config::defaultSamplesPerBlock);
} }
for (auto& buffer : indexBuffers) {
buffer = std::make_shared<sfz::Buffer<int>>(config::defaultSamplesPerBlock);
}
for (auto& buffer : stereoBuffers) { for (auto& buffer : stereoBuffers) {
buffer = std::make_shared<sfz::AudioBuffer<float>>(2, config::defaultSamplesPerBlock); buffer = std::make_shared<sfz::AudioBuffer<float>>(2, config::defaultSamplesPerBlock);
} }
@ -36,6 +45,12 @@ public:
buffer->resize(bufferSize); buffer->resize(bufferSize);
} }
for (auto& buffer: indexBuffers) {
// Trying to resize a buffer in use
ASSERT(buffer.use_count() == 1);
buffer->resize(bufferSize);
}
for (auto& buffer: stereoBuffers) { for (auto& buffer: stereoBuffers) {
// Trying to resize a buffer in use // Trying to resize a buffer in use
ASSERT(buffer.use_count() == 1); ASSERT(buffer.use_count() == 1);
@ -43,7 +58,7 @@ public:
} }
} }
std::shared_ptr<sfz::Buffer<float>> getBuffer(size_t numFrames) std::shared_ptr<sfz::Buffer<float>> getBuffer(size_t numFrames) const
{ {
auto bufferIt = buffers.begin(); auto bufferIt = buffers.begin();
@ -57,6 +72,12 @@ public:
return {}; return {};
} }
#ifndef NDEBUG
maxBuffersUsed = max<int>(1 + absl::c_count_if(buffers, [&](const std::shared_ptr<sfz::Buffer<float>>& buffer) {
return (buffer.use_count() > 1);
}), maxBuffersUsed);
#endif
while (bufferIt < buffers.end()) { while (bufferIt < buffers.end()) {
if (bufferIt->use_count() == 1) if (bufferIt->use_count() == 1)
return *bufferIt; return *bufferIt;
@ -68,18 +89,53 @@ public:
return {}; return {};
} }
std::shared_ptr<sfz::AudioBuffer<float>> getStereoBuffer(size_t numFrames) std::shared_ptr<sfz::Buffer<int>> getIndexBuffer(size_t numFrames) const
{
auto bufferIt = indexBuffers.begin();
if (indexBuffers.empty()) {
DBG("[sfizz] No available index buffers in the pool");
return {};
}
if (indexBuffers[0]->size() < numFrames) {
DBG("[sfizz] Someone asked for a index buffer of size " << numFrames << "; only " << indexBuffers[0]->size() << " available...");
return {};
}
#ifndef NDEBUG
maxIndexBuffersUsed = max<int>(1 + absl::c_count_if(indexBuffers, [&](const std::shared_ptr<sfz::Buffer<int>>& buffer) {
return (buffer.use_count() > 1);
}), maxIndexBuffersUsed);
#endif
while (bufferIt < indexBuffers.end()) {
if (bufferIt->use_count() == 1)
return *bufferIt;
++bufferIt;
}
// No buffer found; debug message
DBG("[sfizz] No free index buffer available!");
return {};
}
std::shared_ptr<sfz::AudioBuffer<float>> getStereoBuffer(size_t numFrames) const
{ {
if (stereoBuffers.empty()) { if (stereoBuffers.empty()) {
DBG("[sfizz] No available stereoBuffers in the pool"); DBG("[sfizz] No available stereo buffers in the pool");
return {}; return {};
} }
if (stereoBuffers[0]->getNumFrames() < numFrames) { if (stereoBuffers[0]->getNumFrames() < numFrames) {
DBG("[sfizz] Someone asked for a buffer of size " << numFrames << "; only " << stereoBuffers[0]->getNumFrames() << " available..."); DBG("[sfizz] Someone asked for a stereo buffer of size " << numFrames << "; only " << stereoBuffers[0]->getNumFrames() << " available...");
return {}; return {};
} }
#ifndef NDEBUG
maxStereoBuffersUsed = max<int>(1 + absl::c_count_if(stereoBuffers, [&](const std::shared_ptr<sfz::AudioBuffer<float>>& buffer) {
return (buffer.use_count() > 1);
}), maxStereoBuffersUsed);
#endif
auto bufferIt = stereoBuffers.begin(); auto bufferIt = stereoBuffers.begin();
while (bufferIt < stereoBuffers.end()) { while (bufferIt < stereoBuffers.end()) {
if (bufferIt->use_count() == 1) if (bufferIt->use_count() == 1)
@ -88,11 +144,26 @@ public:
} }
// No buffer found; debug message // No buffer found; debug message
DBG("[sfizz] No free buffer available!"); DBG("[sfizz] No free stereo buffer available!");
return {}; return {};
} }
#ifndef NDEBUG
~BufferPool()
{
DBG("Max buffers used: " << maxBuffersUsed);
DBG("Max index buffers used: " << maxIndexBuffersUsed);
DBG("Max stereo buffers used: " << maxStereoBuffersUsed);
}
#endif
private: private:
std::array<std::shared_ptr<sfz::Buffer<float>>, config::bufferPoolSize> buffers; std::array<std::shared_ptr<sfz::Buffer<float>>, config::bufferPoolSize> buffers;
std::array<std::shared_ptr<sfz::Buffer<int>>, config::bufferPoolSize> indexBuffers;
std::array<std::shared_ptr<sfz::AudioBuffer<float>>, config::stereoBufferPoolSize> stereoBuffers; std::array<std::shared_ptr<sfz::AudioBuffer<float>>, config::stereoBufferPoolSize> stereoBuffers;
#ifndef NDEBUG
mutable int maxBuffersUsed { 0 };
mutable int maxIndexBuffersUsed { 0 };
mutable int maxStereoBuffersUsed { 0 };
#endif
}; };
} }

View file

@ -30,6 +30,7 @@ namespace config {
constexpr int maxBlockSize { 8192 }; constexpr int maxBlockSize { 8192 };
constexpr int bufferPoolSize { 16 }; constexpr int bufferPoolSize { 16 };
constexpr int stereoBufferPoolSize { 4 }; constexpr int stereoBufferPoolSize { 4 };
constexpr int indexBufferPoolSize { 2 };
constexpr int preloadSize { 8192 }; constexpr int preloadSize { 8192 };
constexpr int loggerQueueSize { 256 }; constexpr int loggerQueueSize { 256 };
constexpr int voiceLoggerQueueSize { 256 }; constexpr int voiceLoggerQueueSize { 256 };