diff --git a/include/BufferManager.h b/include/BufferPool.h similarity index 90% rename from include/BufferManager.h rename to include/BufferPool.h index 20390644b..6d5cd08e2 100644 --- a/include/BufferManager.h +++ b/include/BufferPool.h @@ -1,5 +1,5 @@ /* - * BufferManager.h - A buffer caching/memory management system + * BufferPool.h * * Copyright (c) 2014 Vesa Kivimäki * Copyright (c) 2006-2014 Tobias Doerffel @@ -23,13 +23,13 @@ * */ -#ifndef BUFFER_MANAGER_H -#define BUFFER_MANAGER_H +#pragma once #include "lmms_export.h" #include "lmms_basics.h" -class LMMS_EXPORT BufferManager +/// Legacy interface for buffer re-use. Uses MemoryPool internally now. +class LMMS_EXPORT BufferPool { public: static void init( fpp_t framesPerPeriod ); @@ -43,5 +43,3 @@ public: #endif static void release( sampleFrame * buf ); }; - -#endif diff --git a/plugins/vestige/vestige.cpp b/plugins/vestige/vestige.cpp index fc61a2484..31f359e2a 100644 --- a/plugins/vestige/vestige.cpp +++ b/plugins/vestige/vestige.cpp @@ -38,8 +38,6 @@ #include #include -#include "ConfigManager.h" -#include "BufferManager.h" #include "ConfigManager.h" #include "Engine.h" #include "gui_templates.h" diff --git a/src/core/BufferManager.cpp b/src/core/BufferPool.cpp similarity index 62% rename from src/core/BufferManager.cpp rename to src/core/BufferPool.cpp index ed658866c..72dc60a55 100644 --- a/src/core/BufferManager.cpp +++ b/src/core/BufferPool.cpp @@ -1,7 +1,7 @@ /* - * BufferManager.cpp - A buffer caching/memory management system + * BufferPool.cpp * - * Copyright (c) 2017 Lukas W + * Copyright (c) 2018 Lukas W * Copyright (c) 2014 Vesa Kivimäki * Copyright (c) 2006-2014 Tobias Doerffel * @@ -24,32 +24,31 @@ * */ -#include "BufferManager.h" +#include "BufferPool.h" -#include "Engine.h" -#include "Mixer.h" -#include "Memory.h" +#include +#include "MemoryPool.h" -static fpp_t framesPerPeriod; +static std::unique_ptr<_MemoryPool_Base> pool; +const int BM_INITIAL_BUFFERS = 256; -void BufferManager::init( fpp_t framesPerPeriod ) +void BufferPool::init( fpp_t framesPerPeriod ) { - ::framesPerPeriod = framesPerPeriod; + pool.reset(new _MemoryPool_Base(framesPerPeriod * sizeof(sampleFrame), BM_INITIAL_BUFFERS)); } - -sampleFrame * BufferManager::acquire() +sampleFrame * BufferPool::acquire() { - return MM_ALLOC( sampleFrame, ::framesPerPeriod ); + return reinterpret_cast(pool->allocate()); } -void BufferManager::clear( sampleFrame *ab, const f_cnt_t frames, const f_cnt_t offset ) +void BufferPool::clear( sampleFrame *ab, const f_cnt_t frames, const f_cnt_t offset ) { memset( ab + offset, 0, sizeof( *ab ) * frames ); } #ifndef LMMS_DISABLE_SURROUND -void BufferManager::clear( surroundSampleFrame * ab, const f_cnt_t frames, +void BufferPool::clear( surroundSampleFrame * ab, const f_cnt_t frames, const f_cnt_t offset ) { memset( ab + offset, 0, sizeof( *ab ) * frames ); @@ -57,8 +56,7 @@ void BufferManager::clear( surroundSampleFrame * ab, const f_cnt_t frames, #endif -void BufferManager::release( sampleFrame * buf ) +void BufferPool::release( sampleFrame * buf ) { - MM_FREE( buf ); + pool->deallocate(buf); } - diff --git a/src/core/CMakeLists.txt b/src/core/CMakeLists.txt index 4e8d7ef8a..411249272 100644 --- a/src/core/CMakeLists.txt +++ b/src/core/CMakeLists.txt @@ -5,7 +5,7 @@ set(LMMS_SRCS core/BandLimitedWave.cpp core/base64.cpp core/BBTrackContainer.cpp - core/BufferManager.cpp + core/BufferPool.cpp core/Clipboard.cpp core/ComboBoxModel.cpp core/ConfigManager.cpp diff --git a/src/core/FxMixer.cpp b/src/core/FxMixer.cpp index 032090bf1..7d33e1af1 100644 --- a/src/core/FxMixer.cpp +++ b/src/core/FxMixer.cpp @@ -24,7 +24,7 @@ #include -#include "BufferManager.h" +#include "BufferPool.h" #include "FxMixer.h" #include "Mixer.h" #include "MixerWorkerThread.h" @@ -74,7 +74,7 @@ FxChannel::FxChannel( int idx, Model * _parent ) : m_queued( false ), m_dependenciesMet(0) { - BufferManager::clear( m_buffer, Engine::mixer()->framesPerPeriod() ); + BufferPool::clear( m_buffer, Engine::mixer()->framesPerPeriod() ); } @@ -585,7 +585,7 @@ void FxMixer::mixToChannel( const sampleFrame * _buf, fx_ch_t _ch ) void FxMixer::prepareMasterMix() { - BufferManager::clear( m_fxChannels[0]->m_buffer, + BufferPool::clear( m_fxChannels[0]->m_buffer, Engine::mixer()->framesPerPeriod() ); } @@ -658,7 +658,7 @@ void FxMixer::masterMix( sampleFrame * _buf ) // reset channel process state for( int i = 0; i < numChannels(); ++i) { - BufferManager::clear( m_fxChannels[i]->m_buffer, + BufferPool::clear( m_fxChannels[i]->m_buffer, Engine::mixer()->framesPerPeriod() ); m_fxChannels[i]->reset(); m_fxChannels[i]->m_queued = false; diff --git a/src/core/Mixer.cpp b/src/core/Mixer.cpp index 8ad36c73b..1cf063569 100644 --- a/src/core/Mixer.cpp +++ b/src/core/Mixer.cpp @@ -37,6 +37,7 @@ #include "ConfigManager.h" #include "SamplePlayHandle.h" #include "Memory.h" +#include "BufferPool.h" // platform-specific audio-interface-classes #include "AudioAlsa.h" @@ -59,8 +60,6 @@ #include "MidiApple.h" #include "MidiDummy.h" -#include "BufferManager.h" - typedef LocklessList::Element LocklessListElement; @@ -98,7 +97,7 @@ Mixer::Mixer( bool renderOnly ) : m_inputBufferFrames[i] = 0; m_inputBufferSize[i] = DEFAULT_BUFFER_SIZE * 100; m_inputBuffer[i] = new sampleFrame[ DEFAULT_BUFFER_SIZE * 100 ]; - BufferManager::clear( m_inputBuffer[i], m_inputBufferSize[i] ); + BufferPool::clear( m_inputBuffer[i], m_inputBufferSize[i] ); } // determine FIFO size and number of frames per period @@ -133,15 +132,15 @@ Mixer::Mixer( bool renderOnly ) : // allocte the FIFO from the determined size m_fifo = new fifo( fifoSize ); - // now that framesPerPeriod is fixed initialize global BufferManager - BufferManager::init( m_framesPerPeriod ); + // now that framesPerPeriod is fixed initialize global BufferPool + BufferPool::init( m_framesPerPeriod ); AlignedAllocator alloc; for( int i = 0; i < 3; i++ ) { m_readBuf = alloc.allocate( m_framesPerPeriod ); - BufferManager::clear( m_readBuf, m_framesPerPeriod ); + BufferPool::clear( m_readBuf, m_framesPerPeriod ); m_bufferPool.push_back( m_readBuf ); } @@ -417,7 +416,7 @@ const surroundSampleFrame * Mixer::renderNextBuffer() m_readBuf = m_bufferPool[m_readBuffer]; // clear last audio-buffer - BufferManager::clear( m_writeBuf, m_framesPerPeriod ); + BufferPool::clear( m_writeBuf, m_framesPerPeriod ); // prepare master mix (clear internal buffers etc.) FxMixer * fxMixer = Engine::fxMixer(); diff --git a/src/core/Oscillator.cpp b/src/core/Oscillator.cpp index b7dc5bff5..bb06d9804 100644 --- a/src/core/Oscillator.cpp +++ b/src/core/Oscillator.cpp @@ -24,7 +24,7 @@ #include "Oscillator.h" -#include "BufferManager.h" +#include "BufferPool.h" #include "Engine.h" #include "Mixer.h" #include "AutomatableModel.h" @@ -59,7 +59,7 @@ void Oscillator::update( sampleFrame * _ab, const fpp_t _frames, { if( m_freq >= Engine::mixer()->processingSampleRate() / 2 ) { - BufferManager::clear( _ab, _frames ); + BufferPool::clear( _ab, _frames ); return; } if( m_subOsc != NULL ) diff --git a/src/core/PlayHandle.cpp b/src/core/PlayHandle.cpp index 9e92019a6..67ddb5e35 100644 --- a/src/core/PlayHandle.cpp +++ b/src/core/PlayHandle.cpp @@ -23,7 +23,7 @@ */ #include "PlayHandle.h" -#include "BufferManager.h" +#include "BufferPool.h" #include "Engine.h" #include "Mixer.h" @@ -36,7 +36,7 @@ PlayHandle::PlayHandle(const Type type, f_cnt_t offset) : m_type(type), m_offset(offset), m_affinity(QThread::currentThread()), - m_playHandleBuffer(BufferManager::acquire()), + m_playHandleBuffer(BufferPool::acquire()), m_bufferReleased(true), m_usesBuffer(true) { @@ -45,7 +45,7 @@ PlayHandle::PlayHandle(const Type type, f_cnt_t offset) : PlayHandle::~PlayHandle() { - BufferManager::release(m_playHandleBuffer); + BufferPool::release(m_playHandleBuffer); } @@ -54,7 +54,7 @@ void PlayHandle::doProcessing() if( m_usesBuffer ) { m_bufferReleased = false; - BufferManager::clear(m_playHandleBuffer, Engine::mixer()->framesPerPeriod()); + BufferPool::clear(m_playHandleBuffer, Engine::mixer()->framesPerPeriod()); play( buffer() ); } else diff --git a/src/core/RemotePlugin.cpp b/src/core/RemotePlugin.cpp index 23654d782..82bec2671 100644 --- a/src/core/RemotePlugin.cpp +++ b/src/core/RemotePlugin.cpp @@ -28,7 +28,7 @@ #include #endif -#include "BufferManager.h" +#include "BufferPool.h" #include "RemotePlugin.h" #include "Mixer.h" #include "Engine.h" @@ -287,7 +287,7 @@ bool RemotePlugin::process( const sampleFrame * _in_buf, { if( _out_buf != NULL ) { - BufferManager::clear( _out_buf, frames ); + BufferPool::clear( _out_buf, frames ); } return false; } @@ -306,7 +306,7 @@ bool RemotePlugin::process( const sampleFrame * _in_buf, } if( _out_buf != NULL ) { - BufferManager::clear( _out_buf, frames ); + BufferPool::clear( _out_buf, frames ); } return false; } @@ -380,7 +380,7 @@ bool RemotePlugin::process( const sampleFrame * _in_buf, sampleFrame * o = (sampleFrame *) ( m_shm + m_inputCount*frames ); // clear buffer, if plugin didn't fill up both channels - BufferManager::clear( _out_buf, frames ); + BufferPool::clear( _out_buf, frames ); for( ch_cnt_t ch = 0; ch < qMin( DEFAULT_CHANNELS, outputs ); ++ch ) diff --git a/src/core/audio/AudioPort.cpp b/src/core/audio/AudioPort.cpp index 71544dde2..91bd2d9d9 100644 --- a/src/core/audio/AudioPort.cpp +++ b/src/core/audio/AudioPort.cpp @@ -29,14 +29,14 @@ #include "Engine.h" #include "Mixer.h" #include "MixHelpers.h" -#include "BufferManager.h" +#include "BufferPool.h" AudioPort::AudioPort( const QString & _name, bool _has_effect_chain, FloatModel * volumeModel, FloatModel * panningModel, BoolModel * mutedModel ) : m_bufferUsage( false ), - m_portBuffer( BufferManager::acquire() ), + m_portBuffer( BufferPool::acquire() ), m_extOutputEnabled( false ), m_nextFxChannel( 0 ), m_name( "unnamed port" ), @@ -56,7 +56,7 @@ AudioPort::~AudioPort() { setExtOutputEnabled( false ); Engine::mixer()->removeAudioPort( this ); - BufferManager::release( m_portBuffer ); + BufferPool::release( m_portBuffer ); } @@ -111,7 +111,7 @@ void AudioPort::doProcessing() const fpp_t fpp = Engine::mixer()->framesPerPeriod(); // clear the buffer - BufferManager::clear( m_portBuffer, fpp ); + BufferPool::clear( m_portBuffer, fpp ); //qDebug( "Playhandles: %d", m_playHandles.size() ); for( PlayHandle * ph : m_playHandles ) // now we mix all playhandle buffers into the audioport buffer diff --git a/src/gui/widgets/VisualizationWidget.cpp b/src/gui/widgets/VisualizationWidget.cpp index 7234331df..2d933ec80 100644 --- a/src/gui/widgets/VisualizationWidget.cpp +++ b/src/gui/widgets/VisualizationWidget.cpp @@ -35,7 +35,7 @@ #include "ToolTip.h" #include "Song.h" -#include "BufferManager.h" +#include "BufferPool.h" VisualizationWidget::VisualizationWidget( const QPixmap & _bg, QWidget * _p, @@ -55,7 +55,7 @@ VisualizationWidget::VisualizationWidget( const QPixmap & _bg, QWidget * _p, const fpp_t frames = Engine::mixer()->framesPerPeriod(); m_buffer = new sampleFrame[frames]; - BufferManager::clear( m_buffer, frames ); + BufferPool::clear( m_buffer, frames ); ToolTip::add( this, tr( "Oscilloscope" ) );