Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
55 changes: 23 additions & 32 deletions src/gui/FxMixerView.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand All @@ -439,38 +436,32 @@ void FxMixerView::deleteUnusedChannels()
tracks += Engine::getSong()->tracks();
tracks += Engine::getBBTrackContainer()->tracks();

// go through all FX Channels
for(int i = m_fxChannelViews.size()-1; i > 0; --i)
std::vector<bool> inUse(m_fxChannelViews.size(), false);

//Populate inUse by checking the destination channel for every track
for (Track* t: tracks)
{
// check if an instrument references to the current channel
bool empty=true;
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)
{
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;
}
}
InstrumentTrack* inst = dynamic_cast<InstrumentTrack *>(t);
channel = inst->effectChannelModel()->value();
}
FxChannel * ch = Engine::fxMixer()->effectChannel( i );
// delete channel if no references found
if( empty && ch->m_receives.isEmpty() )
else if (t->type() == Track::SampleTrack)
{
deleteChannel( i );
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)
{
if (!inUse[i] && Engine::fxMixer()->effectChannel(i)->m_receives.isEmpty())
{ deleteChannel(i); }
}
}

Expand Down