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:
@@ -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 )
|
||||
|
||||
@@ -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 );
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
|
||||
@@ -446,7 +446,7 @@ SampleTrack::SampleTrack( TrackContainer* tc ) :
|
||||
|
||||
SampleTrack::~SampleTrack()
|
||||
{
|
||||
Engine::mixer()->removePlayHandles( this );
|
||||
Engine::mixer()->removePlayHandlesOfTypes( this, PlayHandle::TypeSamplePlayHandle );
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user