Refactor deleteUnusedChannels in FxMixerView (#5564)

* Refactor deleteUnusedChannels in FxMixerView

* Comments + style fix

Co-authored-by: Veratil <veratil@gmail.com>, formatting, suggestions on which lines to comment.

Co-authored-by: Kevin Zander <veratil@gmail.com>

* Update weird deleteChannel loop

* Use vector instead of array

Co-authored-by: Dominic Clark <mrdomclark@gmail.com>

Co-authored-by: Kevin Zander <veratil@gmail.com>
Co-authored-by: Dominic Clark <mrdomclark@gmail.com>
This commit is contained in:
Spekular
2020-07-09 16:33:54 +02:00
committed by GitHub
parent 5aba3d2a73
commit afbf80bfcb

View File

@@ -412,12 +412,9 @@ void FxMixerView::deleteChannel(int index)
m_channelAreaWidget->adjustSize();
// make sure every channel knows what index it is
for(int i=0; i<m_fxChannelViews.size(); ++i)
for(int i=index + 1; i<m_fxChannelViews.size(); ++i)
{
if( i > index )
{
m_fxChannelViews[i]->m_fxLine->setChannelIndex(i-1);
}
m_fxChannelViews[i]->m_fxLine->setChannelIndex(i-1);
}
m_fxChannelViews.remove(index);
@@ -439,38 +436,32 @@ void FxMixerView::deleteUnusedChannels()
tracks += Engine::getSong()->tracks();
tracks += Engine::getBBTrackContainer()->tracks();
// go through all FX Channels
std::vector<bool> inUse(m_fxChannelViews.size(), false);
//Populate inUse by checking the destination channel for every track
for (Track* t: tracks)
{
//The channel that this track sends to. Since master channel is always in use,
//setting this to 0 is a safe default (for tracks that don't sent to the mixer).
int channel = 0;
if (t->type() == Track::InstrumentTrack)
{
InstrumentTrack* inst = dynamic_cast<InstrumentTrack *>(t);
channel = inst->effectChannelModel()->value();
}
else if (t->type() == Track::SampleTrack)
{
SampleTrack *strack = dynamic_cast<SampleTrack *>(t);
channel = strack->effectChannelModel()->value();
}
inUse[channel] = true;
}
//Check all channels except master, delete those with no incoming sends
for(int i = m_fxChannelViews.size()-1; i > 0; --i)
{
// check if an instrument references to the current channel
bool empty=true;
for( Track* t : tracks )
{
if( t->type() == Track::InstrumentTrack )
{
InstrumentTrack* inst = dynamic_cast<InstrumentTrack *>( t );
if( i == inst->effectChannelModel()->value(0) )
{
empty=false;
break;
}
}
else if( t->type() == Track::SampleTrack )
{
SampleTrack *strack = dynamic_cast<SampleTrack *>( t );
if( i == strack->effectChannelModel()->value(0) )
{
empty=false;
break;
}
}
}
FxChannel * ch = Engine::fxMixer()->effectChannel( i );
// delete channel if no references found
if( empty && ch->m_receives.isEmpty() )
{
deleteChannel( i );
}
if (!inUse[i] && Engine::fxMixer()->effectChannel(i)->m_receives.isEmpty())
{ deleteChannel(i); }
}
}