Require explicit types when removing PlayHandles in the Mixer

This fixes a few deadlocks where a PresetPreviewPlayHandle would be removed by
the creation of a new PresetPreviewPlayHandle.
This commit is contained in:
Fastigium
2016-02-16 13:27:41 +01:00
committed by Jesse Feddema
parent 87dce6d2f4
commit da8040764f
12 changed files with 31 additions and 17 deletions

View File

@@ -224,7 +224,7 @@ public:
return m_playHandles;
}
void removePlayHandles( Track * _track, bool removeIPHs = true );
void removePlayHandlesOfTypes( Track * _track, const quint8 types );
bool hasNotePlayHandles();

View File

@@ -40,11 +40,10 @@ class PlayHandle : public ThreadableJob
public:
enum Types
{
TypeNotePlayHandle,
TypeInstrumentPlayHandle,
TypeSamplePlayHandle,
TypePresetPreviewHandle,
TypeCount
TypeNotePlayHandle = 0x01,
TypeInstrumentPlayHandle = 0x02,
TypeSamplePlayHandle = 0x04,
TypePresetPreviewHandle = 0x08
} ;
typedef Types Type;

View File

@@ -101,7 +101,9 @@ GigInstrument::GigInstrument( InstrumentTrack * _instrument_track ) :
GigInstrument::~GigInstrument()
{
Engine::mixer()->removePlayHandles( instrumentTrack() );
Engine::mixer()->removePlayHandlesOfTypes( instrumentTrack(),
PlayHandle::TypeNotePlayHandle
| PlayHandle::TypeInstrumentPlayHandle );
freeInstance();
}

View File

@@ -188,7 +188,7 @@ CarlaInstrument::CarlaInstrument(InstrumentTrack* const instrumentTrack, const D
CarlaInstrument::~CarlaInstrument()
{
Engine::mixer()->removePlayHandles( instrumentTrack() );
Engine::mixer()->removePlayHandlesOfTypes(instrumentTrack(), PlayHandle::TypeNotePlayHandle | PlayHandle::TypeInstrumentPlayHandle);
if (fHost.resourceDir != NULL)
{

View File

@@ -217,7 +217,9 @@ opl2instrument::opl2instrument( InstrumentTrack * _instrument_track ) :
opl2instrument::~opl2instrument() {
delete theEmulator;
Engine::mixer()->removePlayHandles( instrumentTrack() );
Engine::mixer()->removePlayHandlesOfTypes( instrumentTrack(),
PlayHandle::TypeNotePlayHandle
| PlayHandle::TypeInstrumentPlayHandle );
delete [] renderbuffer;
}

View File

@@ -157,7 +157,9 @@ sf2Instrument::sf2Instrument( InstrumentTrack * _instrument_track ) :
sf2Instrument::~sf2Instrument()
{
Engine::mixer()->removePlayHandles( instrumentTrack() );
Engine::mixer()->removePlayHandlesOfTypes( instrumentTrack(),
PlayHandle::TypeNotePlayHandle
| PlayHandle::TypeInstrumentPlayHandle );
freeFont();
delete_fluid_synth( m_synth );
delete_fluid_settings( m_settings );

View File

@@ -102,7 +102,9 @@ vestigeInstrument::~vestigeInstrument()
knobFModel = NULL;
}
Engine::mixer()->removePlayHandles( instrumentTrack() );
Engine::mixer()->removePlayHandlesOfTypes( instrumentTrack(),
PlayHandle::TypeNotePlayHandle
| PlayHandle::TypeInstrumentPlayHandle );
closePlugin();
}

View File

@@ -144,7 +144,9 @@ ZynAddSubFxInstrument::ZynAddSubFxInstrument(
ZynAddSubFxInstrument::~ZynAddSubFxInstrument()
{
Engine::mixer()->removePlayHandles( instrumentTrack() );
Engine::mixer()->removePlayHandlesOfTypes( instrumentTrack(),
PlayHandle::TypeNotePlayHandle
| PlayHandle::TypeInstrumentPlayHandle );
m_pluginMutex.lock();
delete m_plugin;

View File

@@ -665,13 +665,13 @@ void Mixer::removePlayHandle( PlayHandle * _ph )
void Mixer::removePlayHandles( Track * _track, bool removeIPHs )
void Mixer::removePlayHandlesOfTypes( Track * _track, const quint8 types )
{
lockPlayHandleRemoval();
PlayHandleList::Iterator it = m_playHandles.begin();
while( it != m_playHandles.end() )
{
if( ( *it )->isFromTrack( _track ) && ( removeIPHs || ( *it )->type() != PlayHandle::TypeInstrumentPlayHandle ) )
if( ( *it )->isFromTrack( _track ) && ( ( *it )->type() & types ) )
{
( *it )->audioPort()->removePlayHandle( ( *it ) );
if( ( *it )->type() == PlayHandle::TypeNotePlayHandle )

View File

@@ -387,7 +387,9 @@ BBTrack::BBTrack( TrackContainer* tc ) :
BBTrack::~BBTrack()
{
Engine::mixer()->removePlayHandles( this );
Engine::mixer()->removePlayHandlesOfTypes( this,
PlayHandle::TypeNotePlayHandle
| PlayHandle::TypeInstrumentPlayHandle );
const int bb = s_infoMap[this];
Engine::getBBTrackContainer()->removeBB( bb );

View File

@@ -430,7 +430,10 @@ void InstrumentTrack::silenceAllNotes( bool removeIPH )
lock();
// invalidate all NotePlayHandles linked to this track
m_processHandles.clear();
Engine::mixer()->removePlayHandles( this, removeIPH );
Engine::mixer()->removePlayHandlesOfTypes( this, removeIPH
? PlayHandle::TypeNotePlayHandle
| PlayHandle::TypeInstrumentPlayHandle
: PlayHandle::TypeNotePlayHandle );
unlock();
}

View File

@@ -446,7 +446,7 @@ SampleTrack::SampleTrack( TrackContainer* tc ) :
SampleTrack::~SampleTrack()
{
Engine::mixer()->removePlayHandles( this );
Engine::mixer()->removePlayHandlesOfTypes( this, PlayHandle::TypeSamplePlayHandle );
}