From 06b1d52b0a9cef3ae2becb2d7a3d3423b5e5e3d3 Mon Sep 17 00:00:00 2001 From: Javier Serrano Polo Date: Sat, 2 Jul 2016 13:44:21 +0200 Subject: [PATCH] Fixed fault on note off and removed one mutex for notes --- include/InstrumentTrack.h | 1 - src/tracks/InstrumentTrack.cpp | 13 +++++-------- 2 files changed, 5 insertions(+), 9 deletions(-) diff --git a/include/InstrumentTrack.h b/include/InstrumentTrack.h index f24097c9d..de9339e9d 100644 --- a/include/InstrumentTrack.h +++ b/include/InstrumentTrack.h @@ -234,7 +234,6 @@ private: MidiPort m_midiPort; NotePlayHandle* m_notes[NumKeys]; - QMutex m_notesMutex; int m_runningMidiNotes[NumKeys]; QMutex m_midiNotesMutex; diff --git a/src/tracks/InstrumentTrack.cpp b/src/tracks/InstrumentTrack.cpp index 4d5dadd82..4cbdb6ce0 100644 --- a/src/tracks/InstrumentTrack.cpp +++ b/src/tracks/InstrumentTrack.cpp @@ -262,11 +262,11 @@ void InstrumentTrack::processInEvent( const MidiEvent& event, const MidiTime& ti case MidiNoteOn: if( event.velocity() > 0 ) { - NotePlayHandle* nph; - m_notesMutex.lock(); if( m_notes[event.key()] == NULL ) { - nph = NotePlayHandleManager::acquire( this, offset, + NotePlayHandle* nph = + NotePlayHandleManager::acquire( + this, offset, typeInfo::max() / 2, Note( MidiTime(), MidiTime(), event.key(), event.volume( midiPort()->baseVelocity() ) ), NULL, event.channel(), @@ -277,21 +277,20 @@ void InstrumentTrack::processInEvent( const MidiEvent& event, const MidiTime& ti m_notes[event.key()] = NULL; } } - m_notesMutex.unlock(); eventHandled = true; break; } case MidiNoteOff: - m_notesMutex.lock(); if( m_notes[event.key()] != NULL ) { // do actual note off and remove internal reference to NotePlayHandle (which itself will // be deleted later automatically) + Engine::mixer()->requestChangeInModel(); m_notes[event.key()]->noteOff( offset ); m_notes[event.key()] = NULL; + Engine::mixer()->doneChangeInModel(); } - m_notesMutex.unlock(); eventHandled = true; break; @@ -421,14 +420,12 @@ void InstrumentTrack::processOutEvent( const MidiEvent& event, const MidiTime& t void InstrumentTrack::silenceAllNotes( bool removeIPH ) { - m_notesMutex.lock(); m_midiNotesMutex.lock(); for( int i = 0; i < NumKeys; ++i ) { m_notes[i] = NULL; m_runningMidiNotes[i] = 0; } - m_notesMutex.unlock(); m_midiNotesMutex.unlock(); lock();