From ed24343caf56365a807e7c1bd91c28981b9eb3b7 Mon Sep 17 00:00:00 2001 From: Dan Williams Date: Tue, 10 Oct 2017 02:11:40 -0400 Subject: [PATCH 1/4] Allocate all six oscillators as a single chunk of memory Allocating all six oscillators separately is inefficient. It is much more efficient to allocate all of them as a single block. --- include/Oscillator.h | 4 ++ .../triple_oscillator/TripleOscillator.cpp | 57 +++++++++---------- 2 files changed, 32 insertions(+), 29 deletions(-) diff --git a/include/Oscillator.h b/include/Oscillator.h index 6e89f9cb115..be76c156c14 100644 --- a/include/Oscillator.h +++ b/include/Oscillator.h @@ -42,6 +42,10 @@ class IntModel; class EXPORT Oscillator { MM_OPERATORS + void* operator new( std::size_t, void* p ) + { + return p; + } public: enum WaveShapes { diff --git a/plugins/triple_oscillator/TripleOscillator.cpp b/plugins/triple_oscillator/TripleOscillator.cpp index b1c441cdd75..e4b4dcc361a 100644 --- a/plugins/triple_oscillator/TripleOscillator.cpp +++ b/plugins/triple_oscillator/TripleOscillator.cpp @@ -300,8 +300,9 @@ void TripleOscillator::playNote( NotePlayHandle * _n, { if( _n->totalFramesPlayed() == 0 || _n->m_pluginData == NULL ) { - Oscillator * oscs_l[NUM_OF_OSCILLATORS]; - Oscillator * oscs_r[NUM_OF_OSCILLATORS]; + auto allOscs = MM_ALLOC( Oscillator, NUM_OF_OSCILLATORS*2 ); + Oscillator * oscs_l = allOscs; + Oscillator * oscs_r = allOscs + NUM_OF_OSCILLATORS; for( int i = NUM_OF_OSCILLATORS - 1; i >= 0; --i ) { @@ -309,14 +310,14 @@ void TripleOscillator::playNote( NotePlayHandle * _n, // the last oscs needs no sub-oscs... if( i == NUM_OF_OSCILLATORS - 1 ) { - oscs_l[i] = new Oscillator( + new (&oscs_l[i]) Oscillator( &m_osc[i]->m_waveShapeModel, &m_osc[i]->m_modulationAlgoModel, _n->frequency(), m_osc[i]->m_detuningLeft, m_osc[i]->m_phaseOffsetLeft, m_osc[i]->m_volumeLeft ); - oscs_r[i] = new Oscillator( + new (&oscs_r[i])Oscillator( &m_osc[i]->m_waveShapeModel, &m_osc[i]->m_modulationAlgoModel, _n->frequency(), @@ -326,33 +327,32 @@ void TripleOscillator::playNote( NotePlayHandle * _n, } else { - oscs_l[i] = new Oscillator( - &m_osc[i]->m_waveShapeModel, - &m_osc[i]->m_modulationAlgoModel, - _n->frequency(), - m_osc[i]->m_detuningLeft, - m_osc[i]->m_phaseOffsetLeft, - m_osc[i]->m_volumeLeft, - oscs_l[i + 1] ); - oscs_r[i] = new Oscillator( - &m_osc[i]->m_waveShapeModel, - &m_osc[i]->m_modulationAlgoModel, - _n->frequency(), - m_osc[i]->m_detuningRight, - m_osc[i]->m_phaseOffsetRight, - m_osc[i]->m_volumeRight, - oscs_r[i + 1] ); + new (&oscs_l[i]) Oscillator( + &m_osc[i]->m_waveShapeModel, + &m_osc[i]->m_modulationAlgoModel, + _n->frequency(), + m_osc[i]->m_detuningLeft, + m_osc[i]->m_phaseOffsetLeft, + m_osc[i]->m_volumeLeft, + &oscs_l[i + 1] ); + new (&oscs_r[i]) Oscillator( + &m_osc[i]->m_waveShapeModel, + &m_osc[i]->m_modulationAlgoModel, + _n->frequency(), + m_osc[i]->m_detuningRight, + m_osc[i]->m_phaseOffsetRight, + m_osc[i]->m_volumeRight, + &oscs_r[i + 1] ); } - oscs_l[i]->setUserWave( m_osc[i]->m_sampleBuffer ); - oscs_r[i]->setUserWave( m_osc[i]->m_sampleBuffer ); + oscs_l[i].setUserWave( m_osc[i]->m_sampleBuffer ); + oscs_r[i].setUserWave( m_osc[i]->m_sampleBuffer ); } _n->m_pluginData = new oscPtr; - static_cast( _n->m_pluginData )->oscLeft = oscs_l[0]; - static_cast< oscPtr *>( _n->m_pluginData )->oscRight = - oscs_r[0]; + static_cast( _n->m_pluginData )->oscLeft = &oscs_l[0]; + static_cast( _n->m_pluginData )->oscRight = &oscs_r[0]; } Oscillator * osc_l = static_cast( _n->m_pluginData )->oscLeft; @@ -374,10 +374,9 @@ void TripleOscillator::playNote( NotePlayHandle * _n, void TripleOscillator::deleteNotePluginData( NotePlayHandle * _n ) { - delete static_cast( static_cast( - _n->m_pluginData )->oscLeft ); - delete static_cast( static_cast( - _n->m_pluginData )->oscRight ); + auto ptr = static_cast(_n->m_pluginData)->oscLeft; + //It is safe to simply free the oscillators because they don't own anything. + MM_FREE( ptr ); delete static_cast( _n->m_pluginData ); } From 474b04200ea761407b4a1cf8f1c089215e77e5a6 Mon Sep 17 00:00:00 2001 From: Dan Williams Date: Tue, 10 Oct 2017 02:11:40 -0400 Subject: [PATCH 2/4] Allocate all six oscillators as a single chunk of memory Allocating all six oscillators separately is inefficient. It is much more efficient to allocate all of them as a single block. --- include/Oscillator.h | 4 ++ .../triple_oscillator/TripleOscillator.cpp | 57 +++++++++---------- 2 files changed, 32 insertions(+), 29 deletions(-) diff --git a/include/Oscillator.h b/include/Oscillator.h index 6e89f9cb115..be76c156c14 100644 --- a/include/Oscillator.h +++ b/include/Oscillator.h @@ -42,6 +42,10 @@ class IntModel; class EXPORT Oscillator { MM_OPERATORS + void* operator new( std::size_t, void* p ) + { + return p; + } public: enum WaveShapes { diff --git a/plugins/triple_oscillator/TripleOscillator.cpp b/plugins/triple_oscillator/TripleOscillator.cpp index b1c441cdd75..e4b4dcc361a 100644 --- a/plugins/triple_oscillator/TripleOscillator.cpp +++ b/plugins/triple_oscillator/TripleOscillator.cpp @@ -300,8 +300,9 @@ void TripleOscillator::playNote( NotePlayHandle * _n, { if( _n->totalFramesPlayed() == 0 || _n->m_pluginData == NULL ) { - Oscillator * oscs_l[NUM_OF_OSCILLATORS]; - Oscillator * oscs_r[NUM_OF_OSCILLATORS]; + auto allOscs = MM_ALLOC( Oscillator, NUM_OF_OSCILLATORS*2 ); + Oscillator * oscs_l = allOscs; + Oscillator * oscs_r = allOscs + NUM_OF_OSCILLATORS; for( int i = NUM_OF_OSCILLATORS - 1; i >= 0; --i ) { @@ -309,14 +310,14 @@ void TripleOscillator::playNote( NotePlayHandle * _n, // the last oscs needs no sub-oscs... if( i == NUM_OF_OSCILLATORS - 1 ) { - oscs_l[i] = new Oscillator( + new (&oscs_l[i]) Oscillator( &m_osc[i]->m_waveShapeModel, &m_osc[i]->m_modulationAlgoModel, _n->frequency(), m_osc[i]->m_detuningLeft, m_osc[i]->m_phaseOffsetLeft, m_osc[i]->m_volumeLeft ); - oscs_r[i] = new Oscillator( + new (&oscs_r[i])Oscillator( &m_osc[i]->m_waveShapeModel, &m_osc[i]->m_modulationAlgoModel, _n->frequency(), @@ -326,33 +327,32 @@ void TripleOscillator::playNote( NotePlayHandle * _n, } else { - oscs_l[i] = new Oscillator( - &m_osc[i]->m_waveShapeModel, - &m_osc[i]->m_modulationAlgoModel, - _n->frequency(), - m_osc[i]->m_detuningLeft, - m_osc[i]->m_phaseOffsetLeft, - m_osc[i]->m_volumeLeft, - oscs_l[i + 1] ); - oscs_r[i] = new Oscillator( - &m_osc[i]->m_waveShapeModel, - &m_osc[i]->m_modulationAlgoModel, - _n->frequency(), - m_osc[i]->m_detuningRight, - m_osc[i]->m_phaseOffsetRight, - m_osc[i]->m_volumeRight, - oscs_r[i + 1] ); + new (&oscs_l[i]) Oscillator( + &m_osc[i]->m_waveShapeModel, + &m_osc[i]->m_modulationAlgoModel, + _n->frequency(), + m_osc[i]->m_detuningLeft, + m_osc[i]->m_phaseOffsetLeft, + m_osc[i]->m_volumeLeft, + &oscs_l[i + 1] ); + new (&oscs_r[i]) Oscillator( + &m_osc[i]->m_waveShapeModel, + &m_osc[i]->m_modulationAlgoModel, + _n->frequency(), + m_osc[i]->m_detuningRight, + m_osc[i]->m_phaseOffsetRight, + m_osc[i]->m_volumeRight, + &oscs_r[i + 1] ); } - oscs_l[i]->setUserWave( m_osc[i]->m_sampleBuffer ); - oscs_r[i]->setUserWave( m_osc[i]->m_sampleBuffer ); + oscs_l[i].setUserWave( m_osc[i]->m_sampleBuffer ); + oscs_r[i].setUserWave( m_osc[i]->m_sampleBuffer ); } _n->m_pluginData = new oscPtr; - static_cast( _n->m_pluginData )->oscLeft = oscs_l[0]; - static_cast< oscPtr *>( _n->m_pluginData )->oscRight = - oscs_r[0]; + static_cast( _n->m_pluginData )->oscLeft = &oscs_l[0]; + static_cast( _n->m_pluginData )->oscRight = &oscs_r[0]; } Oscillator * osc_l = static_cast( _n->m_pluginData )->oscLeft; @@ -374,10 +374,9 @@ void TripleOscillator::playNote( NotePlayHandle * _n, void TripleOscillator::deleteNotePluginData( NotePlayHandle * _n ) { - delete static_cast( static_cast( - _n->m_pluginData )->oscLeft ); - delete static_cast( static_cast( - _n->m_pluginData )->oscRight ); + auto ptr = static_cast(_n->m_pluginData)->oscLeft; + //It is safe to simply free the oscillators because they don't own anything. + MM_FREE( ptr ); delete static_cast( _n->m_pluginData ); } From 316be798f232105a6a3904c142298a41591d555f Mon Sep 17 00:00:00 2001 From: Dan Williams Date: Tue, 10 Oct 2017 11:49:27 -0400 Subject: [PATCH 3/4] Reduce the number of allocations. Allocating each oscillator separately was degrading performance when using the Organic instrument. --- plugins/organic/organic.cpp | 27 ++++++++++++--------------- 1 file changed, 12 insertions(+), 15 deletions(-) diff --git a/plugins/organic/organic.cpp b/plugins/organic/organic.cpp index b062e5b114d..320108c5f00 100644 --- a/plugins/organic/organic.cpp +++ b/plugins/organic/organic.cpp @@ -233,8 +233,9 @@ void organicInstrument::playNote( NotePlayHandle * _n, if( _n->totalFramesPlayed() == 0 || _n->m_pluginData == NULL ) { - Oscillator * oscs_l[m_numOscillators]; - Oscillator * oscs_r[m_numOscillators]; + Oscillator * oscs_all = MM_ALLOC( Oscillator, m_numOscillators*2 ); + Oscillator * oscs_l = oscs_all; + Oscillator * oscs_r = oscs_all + m_numOscillators; _n->m_pluginData = new oscPtr; @@ -250,7 +251,7 @@ void organicInstrument::playNote( NotePlayHandle * _n, if( i == m_numOscillators - 1 ) { // create left oscillator - oscs_l[i] = new Oscillator( + new (&oscs_l[i]) Oscillator( &m_osc[i]->m_waveShape, &m_modulationAlgo, _n->frequency(), @@ -258,7 +259,7 @@ void organicInstrument::playNote( NotePlayHandle * _n, static_cast( _n->m_pluginData )->phaseOffsetLeft[i], m_osc[i]->m_volumeLeft ); // create right oscillator - oscs_r[i] = new Oscillator( + new (&oscs_r[i]) Oscillator( &m_osc[i]->m_waveShape, &m_modulationAlgo, _n->frequency(), @@ -269,30 +270,30 @@ void organicInstrument::playNote( NotePlayHandle * _n, else { // create left oscillator - oscs_l[i] = new Oscillator( + new (&oscs_l[i]) Oscillator( &m_osc[i]->m_waveShape, &m_modulationAlgo, _n->frequency(), m_osc[i]->m_detuningLeft, static_cast( _n->m_pluginData )->phaseOffsetLeft[i], m_osc[i]->m_volumeLeft, - oscs_l[i + 1] ); + &oscs_l[i + 1] ); // create right oscillator - oscs_r[i] = new Oscillator( + new (&oscs_r[i]) Oscillator( &m_osc[i]->m_waveShape, &m_modulationAlgo, _n->frequency(), m_osc[i]->m_detuningRight, static_cast( _n->m_pluginData )->phaseOffsetRight[i], m_osc[i]->m_volumeRight, - oscs_r[i + 1] ); + &oscs_r[i + 1] ); } } - static_cast( _n->m_pluginData )->oscLeft = oscs_l[0]; - static_cast( _n->m_pluginData )->oscRight = oscs_r[0]; + static_cast( _n->m_pluginData )->oscLeft = &oscs_l[0]; + static_cast( _n->m_pluginData )->oscRight = &oscs_r[0]; } Oscillator * osc_l = static_cast( _n->m_pluginData )->oscLeft; @@ -325,11 +326,7 @@ void organicInstrument::playNote( NotePlayHandle * _n, void organicInstrument::deleteNotePluginData( NotePlayHandle * _n ) { - delete static_cast( static_cast( - _n->m_pluginData )->oscLeft ); - delete static_cast( static_cast( - _n->m_pluginData )->oscRight ); - + MM_FREE( static_cast(_n->m_pluginData )->oscLeft); delete static_cast( _n->m_pluginData ); } From 01fcab82d406a652daa742ae24616edf1f3aaf88 Mon Sep 17 00:00:00 2001 From: Dan Williams Date: Tue, 10 Oct 2017 17:18:40 -0400 Subject: [PATCH 4/4] Fix whitespace --- .../triple_oscillator/TripleOscillator.cpp | 28 +++++++++---------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/plugins/triple_oscillator/TripleOscillator.cpp b/plugins/triple_oscillator/TripleOscillator.cpp index e4b4dcc361a..711797a5737 100644 --- a/plugins/triple_oscillator/TripleOscillator.cpp +++ b/plugins/triple_oscillator/TripleOscillator.cpp @@ -328,21 +328,21 @@ void TripleOscillator::playNote( NotePlayHandle * _n, else { new (&oscs_l[i]) Oscillator( - &m_osc[i]->m_waveShapeModel, - &m_osc[i]->m_modulationAlgoModel, - _n->frequency(), - m_osc[i]->m_detuningLeft, - m_osc[i]->m_phaseOffsetLeft, - m_osc[i]->m_volumeLeft, - &oscs_l[i + 1] ); + &m_osc[i]->m_waveShapeModel, + &m_osc[i]->m_modulationAlgoModel, + _n->frequency(), + m_osc[i]->m_detuningLeft, + m_osc[i]->m_phaseOffsetLeft, + m_osc[i]->m_volumeLeft, + &oscs_l[i + 1] ); new (&oscs_r[i]) Oscillator( - &m_osc[i]->m_waveShapeModel, - &m_osc[i]->m_modulationAlgoModel, - _n->frequency(), - m_osc[i]->m_detuningRight, - m_osc[i]->m_phaseOffsetRight, - m_osc[i]->m_volumeRight, - &oscs_r[i + 1] ); + &m_osc[i]->m_waveShapeModel, + &m_osc[i]->m_modulationAlgoModel, + _n->frequency(), + m_osc[i]->m_detuningRight, + m_osc[i]->m_phaseOffsetRight, + m_osc[i]->m_volumeRight, + &oscs_r[i + 1] ); } oscs_l[i].setUserWave( m_osc[i]->m_sampleBuffer );