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/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 ); } diff --git a/plugins/triple_oscillator/TripleOscillator.cpp b/plugins/triple_oscillator/TripleOscillator.cpp index b1c441cdd75..711797a5737 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( + 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] ); - oscs_r[i] = new Oscillator( + &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_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 ); }