From 0b46aa4506ddbd032d3bf5df56dceb5b6beb00f3 Mon Sep 17 00:00:00 2001 From: Vesa Date: Wed, 19 Mar 2014 03:19:02 +0200 Subject: [PATCH 1/2] Dual Filter fix: make more efficient - don't calculate coefficients unnecessarily --- plugins/DualFilter/DualFilter.cpp | 27 ++++++++++++++--- plugins/DualFilter/DualFilter.h | 4 +++ plugins/DualFilter/DualFilterControls.cpp | 35 +++++++++++++---------- plugins/DualFilter/DualFilterControls.h | 3 +- 4 files changed, 49 insertions(+), 20 deletions(-) diff --git a/plugins/DualFilter/DualFilter.cpp b/plugins/DualFilter/DualFilter.cpp index 12ac79436..de6932a02 100644 --- a/plugins/DualFilter/DualFilter.cpp +++ b/plugins/DualFilter/DualFilter.cpp @@ -55,6 +55,10 @@ DualFilterEffect::DualFilterEffect( Model* parent, const Descriptor::SubPluginFe { m_filter1 = new basicFilters<2>( engine::mixer()->processingSampleRate() ); m_filter2 = new basicFilters<2>( engine::mixer()->processingSampleRate() ); + + // ensure filters get updated + m_filter1changed = true; + m_filter2changed = true; } @@ -82,10 +86,23 @@ bool DualFilterEffect::processAudioBuffer( sampleFrame* buf, const fpp_t frames m_filter1->setFilterType( m_dfControls.m_filter1Model.value() ); m_filter2->setFilterType( m_dfControls.m_filter2Model.value() ); + + const bool enabled1 = m_dfControls.m_enabled1Model.value(); + const bool enabled2 = m_dfControls.m_enabled2Model.value(); - if( m_dfControls.m_enabled1Model.value() ) m_filter1->calcFilterCoeffs( m_dfControls.m_cut1Model.value(), m_dfControls.m_res1Model.value() ); - if( m_dfControls.m_enabled2Model.value() ) m_filter2->calcFilterCoeffs( m_dfControls.m_cut2Model.value(), m_dfControls.m_res2Model.value() ); + // recalculate only when necessary + if( enabled1 && m_filter1changed ) + { + m_filter1->calcFilterCoeffs( m_dfControls.m_cut1Model.value(), m_dfControls.m_res1Model.value() ); + m_filter1changed = false; + } + if( enabled2 && m_filter2changed ) + { + m_filter2->calcFilterCoeffs( m_dfControls.m_cut2Model.value(), m_dfControls.m_res2Model.value() ); + m_filter2changed = false; + } + // buffer processing loop for( fpp_t f = 0; f < frames; ++f ) { @@ -98,7 +115,7 @@ bool DualFilterEffect::processAudioBuffer( sampleFrame* buf, const fpp_t frames const float mix2 = ( ( m_dfControls.m_mixModel.value( f ) + 1.0f ) / 2.0f ); // update filter 1 - if( m_dfControls.m_enabled1Model.value() ) + if( enabled1 ) { s1[0] = m_filter1->update( s1[0], 0 ); s1[1] = m_filter1->update( s1[1], 1 ); @@ -113,7 +130,7 @@ bool DualFilterEffect::processAudioBuffer( sampleFrame* buf, const fpp_t frames } // update filter 2 - if( m_dfControls.m_enabled2Model.value() ) + if( enabled2 ) { s2[0] = m_filter2->update( s2[0], 0 ); s2[1] = m_filter2->update( s2[1], 1 ); @@ -140,6 +157,8 @@ bool DualFilterEffect::processAudioBuffer( sampleFrame* buf, const fpp_t frames + + extern "C" { diff --git a/plugins/DualFilter/DualFilter.h b/plugins/DualFilter/DualFilter.h index 7949f84ab..d0bdd2aea 100644 --- a/plugins/DualFilter/DualFilter.h +++ b/plugins/DualFilter/DualFilter.h @@ -43,11 +43,15 @@ public: return &m_dfControls; } + private: DualFilterControls m_dfControls; basicFilters<2> * m_filter1; basicFilters<2> * m_filter2; + + bool m_filter1changed; + bool m_filter2changed; friend class DualFilterControls; diff --git a/plugins/DualFilter/DualFilterControls.cpp b/plugins/DualFilter/DualFilterControls.cpp index 5fbefa8f8..06ead0b31 100644 --- a/plugins/DualFilter/DualFilterControls.cpp +++ b/plugins/DualFilter/DualFilterControls.cpp @@ -51,19 +51,13 @@ DualFilterControls::DualFilterControls( DualFilterEffect* effect ) : m_res2Model( 0.5, basicFilters<0>::minQ(), 10.0, 0.01, this, tr( "Q/Resonance 2" ) ), m_gain2Model( 100.0f, 0.0f, 200.0f, 0.1f, this, tr( "Gain 2" ) ) { - connect( &m_enabled1Model, SIGNAL( dataChanged() ), this, SLOT( changeControl() ) ); - connect( &m_filter1Model, SIGNAL( dataChanged() ), this, SLOT( changeControl() ) ); - connect( &m_cut1Model, SIGNAL( dataChanged() ), this, SLOT( changeControl() ) ); - connect( &m_res1Model, SIGNAL( dataChanged() ), this, SLOT( changeControl() ) ); - connect( &m_gain1Model, SIGNAL( dataChanged() ), this, SLOT( changeControl() ) ); + connect( &m_filter1Model, SIGNAL( dataChanged() ), this, SLOT( updateFilter1() ) ); + connect( &m_cut1Model, SIGNAL( dataChanged() ), this, SLOT( updateFilter1() ) ); + connect( &m_res1Model, SIGNAL( dataChanged() ), this, SLOT( updateFilter1() ) ); - connect( &m_mixModel, SIGNAL( dataChanged() ), this, SLOT( changeControl() ) ); - - connect( &m_enabled2Model, SIGNAL( dataChanged() ), this, SLOT( changeControl() ) ); - connect( &m_filter2Model, SIGNAL( dataChanged() ), this, SLOT( changeControl() ) ); - connect( &m_cut2Model, SIGNAL( dataChanged() ), this, SLOT( changeControl() ) ); - connect( &m_res2Model, SIGNAL( dataChanged() ), this, SLOT( changeControl() ) ); - connect( &m_gain2Model, SIGNAL( dataChanged() ), this, SLOT( changeControl() ) ); + connect( &m_filter2Model, SIGNAL( dataChanged() ), this, SLOT( updateFilter2() ) ); + connect( &m_cut2Model, SIGNAL( dataChanged() ), this, SLOT( updateFilter2() ) ); + connect( &m_res2Model, SIGNAL( dataChanged() ), this, SLOT( updateFilter2() ) ); m_filter1Model.addItem( tr( "LowPass" ), new PixmapLoader( "filter_lp" ) ); m_filter1Model.addItem( tr( "HiPass" ), new PixmapLoader( "filter_hp" ) ); @@ -102,19 +96,30 @@ DualFilterControls::DualFilterControls( DualFilterEffect* effect ) : - -void DualFilterControls::changeControl() +void DualFilterControls::updateFilter1() { - engine::getSong()->setModified(); + m_effect->m_filter1changed = true; +} + +void DualFilterControls::updateFilter2() +{ + m_effect->m_filter2changed = true; } void DualFilterControls::updateFilters() { + // swap filters to new ones + delete m_effect->m_filter1; delete m_effect->m_filter2; m_effect->m_filter1 = new basicFilters<2>( engine::mixer()->processingSampleRate() ); m_effect->m_filter2 = new basicFilters<2>( engine::mixer()->processingSampleRate() ); + + // flag filters as needing recalculation + + updateFilter1(); + updateFilter2(); } diff --git a/plugins/DualFilter/DualFilterControls.h b/plugins/DualFilter/DualFilterControls.h index 69c2571e8..8f02eb051 100644 --- a/plugins/DualFilter/DualFilterControls.h +++ b/plugins/DualFilter/DualFilterControls.h @@ -62,7 +62,8 @@ public: private slots: - void changeControl(); + void updateFilter1(); + void updateFilter2(); void updateFilters(); private: From 34ba29cfcd134222bce58941375490bf62791a6d Mon Sep 17 00:00:00 2001 From: Vesa Date: Wed, 19 Mar 2014 03:26:36 +0200 Subject: [PATCH 2/2] Change Linux Multimedia etc. to LMMS in desktop/package files --- data/lmms | 2 +- data/lmms.desktop | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/data/lmms b/data/lmms index cd921eaa5..274886185 100644 --- a/data/lmms +++ b/data/lmms @@ -1,4 +1,4 @@ ?package(lmms):needs="X11" section="Apps/Sound" \ title="LMMS" hints="Audio" command="/usr/bin/lmms" \ - longtitle="Linux MultiMedia Studio" \ + longtitle="LMMS" \ icon="/usr/share/pixmaps/lmms.png" diff --git a/data/lmms.desktop b/data/lmms.desktop index c374b7e66..807ed54f6 100644 --- a/data/lmms.desktop +++ b/data/lmms.desktop @@ -1,5 +1,5 @@ [Desktop Entry] -Name=Linux MultiMedia Studio +Name=LMMS GenericName=music production suite GenericName[ca]=Programari de producció musical GenericName[de]=Software zur Musik-Produktion