From f2eca0aaa3eafb104879d2de0bb3f8049b495e59 Mon Sep 17 00:00:00 2001 From: Vesa Date: Tue, 12 Aug 2014 23:39:16 +0300 Subject: [PATCH] More fixes, stuff --- include/EnvelopeAndLfoParameters.h | 2 ++ src/core/EnvelopeAndLfoParameters.cpp | 25 ++++++++++---- src/core/InstrumentSoundShaping.cpp | 49 +++++++-------------------- src/tracks/InstrumentTrack.cpp | 9 +++-- 4 files changed, 38 insertions(+), 47 deletions(-) diff --git a/include/EnvelopeAndLfoParameters.h b/include/EnvelopeAndLfoParameters.h index 221b97608..1cea5e45b 100644 --- a/include/EnvelopeAndLfoParameters.h +++ b/include/EnvelopeAndLfoParameters.h @@ -138,6 +138,8 @@ private: f_cnt_t m_rFrames; sample_t * m_pahdEnv; sample_t * m_rEnv; + f_cnt_t m_pahdBufSize; + f_cnt_t m_rBufSize; FloatModel m_lfoPredelayModel; diff --git a/src/core/EnvelopeAndLfoParameters.cpp b/src/core/EnvelopeAndLfoParameters.cpp index e1dcaeb3d..4c567ec4a 100644 --- a/src/core/EnvelopeAndLfoParameters.cpp +++ b/src/core/EnvelopeAndLfoParameters.cpp @@ -100,8 +100,12 @@ EnvelopeAndLfoParameters::EnvelopeAndLfoParameters( m_releaseModel( 0.1, 0.0, 2.0, 0.001, this, tr( "Release" ) ), m_amountModel( 0.0, -1.0, 1.0, 0.005, this, tr( "Modulation" ) ), m_valueForZeroAmount( _value_for_zero_amount ), + m_pahdFrames( 0 ), + m_rFrames( 0 ), m_pahdEnv( NULL ), m_rEnv( NULL ), + m_pahdBufSize( 0 ), + m_rBufSize( 0 ), m_lfoPredelayModel( 0.0, 0.0, 1.0, 0.001, this, tr( "LFO Predelay" ) ), m_lfoAttackModel( 0.0, 0.0, 1.0, 0.001, this, tr( "LFO Attack" ) ), m_lfoSpeedModel( 0.1, 0.001, 1.0, 0.0001, @@ -434,15 +438,24 @@ void EnvelopeAndLfoParameters::updateSampleVars() if( static_cast( floorf( m_amount * 1000.0f ) ) == 0 ) { - //m_pahdFrames = 0; m_rFrames = 0; } - delete[] m_pahdEnv; - delete[] m_rEnv; - - m_pahdEnv = new sample_t[m_pahdFrames]; - m_rEnv = new sample_t[m_rFrames]; + // if the buffers are too small, make bigger ones - so we only alloc new memory when necessary + if( m_pahdBufSize < m_pahdFrames ) + { + sample_t * tmp = m_pahdEnv; + m_pahdEnv = new sample_t[m_pahdFrames]; + delete tmp; + m_pahdBufSize = m_pahdFrames; + } + if( m_rBufSize < m_rFrames ) + { + sample_t * tmp = m_rEnv; + m_rEnv = new sample_t[m_rFrames]; + delete tmp; + m_rBufSize = m_rFrames; + } const float aa = m_amountAdd; for( f_cnt_t i = 0; i < predelay_frames; ++i ) diff --git a/src/core/InstrumentSoundShaping.cpp b/src/core/InstrumentSoundShaping.cpp index 6d2b89df4..80a8f95f5 100644 --- a/src/core/InstrumentSoundShaping.cpp +++ b/src/core/InstrumentSoundShaping.cpp @@ -93,7 +93,7 @@ InstrumentSoundShaping::InstrumentSoundShaping( m_filterModel.addItem( tr( "RC LowPass 24dB" ), new PixmapLoader( "filter_lp" ) ); m_filterModel.addItem( tr( "RC BandPass 24dB" ), new PixmapLoader( "filter_bp" ) ); m_filterModel.addItem( tr( "RC HighPass 24dB" ), new PixmapLoader( "filter_hp" ) ); - m_filterModel.addItem( tr( "Vocal Formant Filter" ), new PixmapLoader( "filter_hp" ) ); + m_filterModel.addItem( tr( "Vocal Formant Filter" ), new PixmapLoader( "filter_hp" ) ); } @@ -146,6 +146,9 @@ void InstrumentSoundShaping::processAudioBuffer( sampleFrame* buffer, if( m_filterEnabledModel.value() ) { + float cutBuffer [frames]; + float resBuffer [frames]; + int old_filter_cut = 0; int old_filter_res = 0; @@ -155,27 +158,13 @@ void InstrumentSoundShaping::processAudioBuffer( sampleFrame* buffer, } n->m_filter->setFilterType( m_filterModel.value() ); -#ifdef __GNUC__ - float cut_buf[frames]; - float res_buf[frames]; -#else - float * cut_buf = NULL; - float * res_buf = NULL; -#endif - if( m_envLfoParameters[Cut]->isUsed() ) { -#ifndef __GNUC__ - cut_buf = new float[frames]; -#endif - m_envLfoParameters[Cut]->fillLevel( cut_buf, envTotalFrames, envReleaseBegin, frames ); + m_envLfoParameters[Cut]->fillLevel( cutBuffer, envTotalFrames, envReleaseBegin, frames ); } if( m_envLfoParameters[Resonance]->isUsed() ) { -#ifndef __GNUC__ - res_buf = new float[frames]; -#endif - m_envLfoParameters[Resonance]->fillLevel( res_buf, envTotalFrames, envReleaseBegin, frames ); + m_envLfoParameters[Resonance]->fillLevel( resBuffer, envTotalFrames, envReleaseBegin, frames ); } const float fcv = m_filterCutModel.value(); @@ -186,10 +175,10 @@ void InstrumentSoundShaping::processAudioBuffer( sampleFrame* buffer, { for( fpp_t frame = 0; frame < frames; ++frame ) { - const float new_cut_val = EnvelopeAndLfoParameters::expKnobVal( cut_buf[frame] ) * + const float new_cut_val = EnvelopeAndLfoParameters::expKnobVal( cutBuffer[frame] ) * CUT_FREQ_MULTIPLIER + fcv; - const float new_res_val = frv + RES_MULTIPLIER * res_buf[frame]; + const float new_res_val = frv + RES_MULTIPLIER * resBuffer[frame]; if( static_cast( new_cut_val ) != old_filter_cut || static_cast( new_res_val*RES_PRECISION ) != old_filter_res ) @@ -207,7 +196,7 @@ void InstrumentSoundShaping::processAudioBuffer( sampleFrame* buffer, { for( fpp_t frame = 0; frame < frames; ++frame ) { - float new_cut_val = EnvelopeAndLfoParameters::expKnobVal( cut_buf[frame] ) * + float new_cut_val = EnvelopeAndLfoParameters::expKnobVal( cutBuffer[frame] ) * CUT_FREQ_MULTIPLIER + fcv; if( static_cast( new_cut_val ) != old_filter_cut ) @@ -224,7 +213,7 @@ void InstrumentSoundShaping::processAudioBuffer( sampleFrame* buffer, { for( fpp_t frame = 0; frame < frames; ++frame ) { - float new_res_val = frv + RES_MULTIPLIER * res_buf[frame]; + float new_res_val = frv + RES_MULTIPLIER * resBuffer[frame]; if( static_cast( new_res_val*RES_PRECISION ) != old_filter_res ) { @@ -246,32 +235,20 @@ void InstrumentSoundShaping::processAudioBuffer( sampleFrame* buffer, buffer[frame][1] = n->m_filter->update( buffer[frame][1], 1 ); } } - -#ifndef __GNUC__ - delete[] cut_buf; - delete[] res_buf; -#endif } if( m_envLfoParameters[Volume]->isUsed() ) { -#ifdef __GNUC__ - float vol_buf[frames]; -#else - float * vol_buf = new float[frames]; -#endif - m_envLfoParameters[Volume]->fillLevel( vol_buf, envTotalFrames, envReleaseBegin, frames ); + float volBuffer [frames]; + m_envLfoParameters[Volume]->fillLevel( volBuffer, envTotalFrames, envReleaseBegin, frames ); for( fpp_t frame = 0; frame < frames; ++frame ) { - float vol_level = vol_buf[frame]; + float vol_level = volBuffer[frame]; vol_level = vol_level * vol_level; buffer[frame][0] = vol_level * buffer[frame][0]; buffer[frame][1] = vol_level * buffer[frame][1]; } -#ifndef __GNUC__ - delete[] vol_buf; -#endif } /* else if( m_envLfoParameters[Volume]->isUsed() == false && m_envLfoParameters[PANNING]->isUsed() ) diff --git a/src/tracks/InstrumentTrack.cpp b/src/tracks/InstrumentTrack.cpp index c09c08256..1479d2ce8 100644 --- a/src/tracks/InstrumentTrack.cpp +++ b/src/tracks/InstrumentTrack.cpp @@ -275,9 +275,9 @@ void InstrumentTrack::processInEvent( const MidiEvent& event, const MidiTime& ti if( event.velocity() > 0 ) { NotePlayHandle* nph; + m_notesMutex.lock(); if( m_notes[event.key()] == NULL ) { - m_notesMutex.lock(); nph = new NotePlayHandle( this, offset, typeInfo::max() / 2, note( MidiTime(), MidiTime(), event.key(), event.volume( midiPort()->baseVelocity() ) ), @@ -287,24 +287,23 @@ void InstrumentTrack::processInEvent( const MidiEvent& event, const MidiTime& ti if( ! engine::mixer()->addPlayHandle( nph ) ) { m_notes[event.key()] = NULL; - delete nph; } - m_notesMutex.unlock(); } + m_notesMutex.unlock(); eventHandled = true; break; } case MidiNoteOff: + m_notesMutex.lock(); if( m_notes[event.key()] != NULL ) { - m_notesMutex.lock(); // do actual note off and remove internal reference to NotePlayHandle (which itself will // be deleted later automatically) m_notes[event.key()]->noteOff( offset ); m_notes[event.key()] = NULL; - m_notesMutex.unlock(); } + m_notesMutex.unlock(); eventHandled = true; break;