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
#include "Config.h"
#include "Debug.h"
#include "Buffer.h"
#include "AudioBuffer.h"
#include <array>
#include <memory>
#ifndef NDEBUG
#include "absl/algorithm/container.h"
#include "MathHelpers.h"
#endif
namespace sfz
{
@ -23,6 +28,10 @@ public:
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) {
buffer = std::make_shared<sfz::AudioBuffer<float>>(2, config::defaultSamplesPerBlock);
}
@ -36,6 +45,12 @@ public:
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) {
// Trying to resize a buffer in use
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();
@ -57,6 +72,12 @@ public:
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()) {
if (bufferIt->use_count() == 1)
return *bufferIt;
@ -68,18 +89,53 @@ public:
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()) {
DBG("[sfizz] No available stereoBuffers in the pool");
DBG("[sfizz] No available stereo buffers in the pool");
return {};
}
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 {};
}
#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();
while (bufferIt < stereoBuffers.end()) {
if (bufferIt->use_count() == 1)
@ -88,11 +144,26 @@ public:
}
// No buffer found; debug message
DBG("[sfizz] No free buffer available!");
DBG("[sfizz] No free stereo buffer available!");
return {};
}
#ifndef NDEBUG
~BufferPool()
{
DBG("Max buffers used: " << maxBuffersUsed);
DBG("Max index buffers used: " << maxIndexBuffersUsed);
DBG("Max stereo buffers used: " << maxStereoBuffersUsed);
}
#endif
private:
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;
#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 bufferPoolSize { 16 };
constexpr int stereoBufferPoolSize { 4 };
constexpr int indexBufferPoolSize { 2 };
constexpr int preloadSize { 8192 };
constexpr int loggerQueueSize { 256 };
constexpr int voiceLoggerQueueSize { 256 };