From f68d4e4b6212cd2caf3fd93322c6134163e9e57d Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Thu, 28 Dec 2006 19:08:19 +0000 Subject: [PATCH] fixed lockup and renamed constant git-svn-id: https://lmms.svn.sf.net/svnroot/lmms/trunk/lmms@449 0778d3d1-df1d-0410-868b-ea421aaaa00d --- ChangeLog | 23 +++++++++++++++++++++-- TODO | 5 +---- configure.in | 4 ++-- include/track.h | 2 +- plugins/flp_import/flp_import.cpp | 2 +- plugins/midi_import/midi_import.cpp | 2 +- src/core/file_browser.cpp | 8 ++++---- src/core/preset_preview_play_handle.cpp | 2 +- src/core/song_editor.cpp | 4 ++-- src/core/track.cpp | 2 +- src/core/track_container.cpp | 8 ++++---- src/tracks/instrument_track.cpp | 19 +++++++++++++------ 12 files changed, 52 insertions(+), 29 deletions(-) diff --git a/ChangeLog b/ChangeLog index 4005ead14..f0d954eb0 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,22 @@ +2006-12-28 Tobias Doerffel + + * src/tracks/instrument_track.cpp: + before calling mixer::addPlayHandle(), unlock m_notesMutex as in some + cases (when running into xruns) + instrumentTrack::deleteNotePluginData() is called while the mutex is + locked and the program was frozen + + * include/track.h: + * plugins/flp_import/flp_import.cpp: + * plugins/midi_import/midi_import.cpp: + * src/core/file_browser.cpp: + * src/core/preset_preview_play_handle.cpp: + * src/core/song_editor.cpp: + * src/core/track.cpp: + * src/core/track_container.cpp: + * src/tracks/instrument_track.cpp: + changed name of constant CHANNEL_TRACK to INSTRUMENT_TRACK + 2006-12-24 Tobias Doerffel * plugins/kicker/kicker.cpp: @@ -2522,7 +2541,7 @@ * plugins/flp_import/flp_import.cpp: improvements for having a working flp-filter as soon as possible -2005-03-28 Danny McRae +2006-03-28 Danny McRae * src/lib/sample_buffer.cpp: corrected miscalculation of buffer size in resample @@ -2549,7 +2568,7 @@ support for default-velocity for MIDI-in and/or -out-events - useful when recording with constant velocity -2005-03-26 Danny McRae +2006-03-26 Danny McRae * plugins/vibed/: added "Vibed"-plugin, a powerful combination of PluckedStringSynth and diff --git a/TODO b/TODO index d903281d4..ffd70ff71 100644 --- a/TODO +++ b/TODO @@ -1,6 +1,6 @@ - select number of channels in export-project-dialog - MIDI over Ethernet support -- lock m_instrument in instrumentTrack-class for not crashing when using m_instrument in notePlayHandle::supportsParallelizing() while instrument is being deleted or so +- lock m_instrument in instrumentTrack-class for not crashing when using m_instrument in notePlayHandle::supportsParallelizing() while instrument is being deleted or so - toby 061228: already fixed on 061218? - try to make vestige-plugin-dlls relative - do song-editor-tempo-connection to vst-plugin inside remoteVSTPlugin - add/remove-steps button in bb-editor for adding/removing according number of steps to/from all patterns of visible beat/baseline @@ -23,7 +23,6 @@ - AMS/OMS-bindings - remove binary-embed-system - recording-functionality -- show loading-vst-hint when cloning vestige-track - do not hang when saving while loading VST-plugin (because then we call dispatcher while the load-process is still going on) - tempo-recogn. and sync of beat-samples - do not quantize when importing from MIDI-file @@ -40,10 +39,8 @@ - pre-listen when opening sample with QFileDialog - panning-editing in piano-roll - speed up painting of sampleTCO -- solve problems with different keyboard-layouts when playing channel-track with pc-keyboard -> use tr() - panning env+lfo - rewrite export-project-dialog using layout-mechanism -- dynamic pitch-change - make piano-roll use the global clipboard?? - add more localizations: - Swedish diff --git a/configure.in b/configure.in index 70039b2be..8015af704 100644 --- a/configure.in +++ b/configure.in @@ -2,8 +2,8 @@ # Process this file with autoconf to produce a configure script. AC_PREREQ(2.50) -AC_INIT(lmms, 0.2.1-svn20061224, lmms-devel/at/lists/dot/sf/dot/net) -AM_INIT_AUTOMAKE(lmms, 0.2.1-svn20061224) +AC_INIT(lmms, 0.2.1-svn20061228, lmms-devel/at/lists/dot/sf/dot/net) +AM_INIT_AUTOMAKE(lmms, 0.2.1-svn20061228) AM_CONFIG_HEADER(config.h) diff --git a/include/track.h b/include/track.h index 22da09d57..557a685f3 100644 --- a/include/track.h +++ b/include/track.h @@ -399,7 +399,7 @@ class track : public journallingObject public: enum trackTypes { - CHANNEL_TRACK, + INSTRUMENT_TRACK, BB_TRACK, SAMPLE_TRACK, EVENT_TRACK, diff --git a/plugins/flp_import/flp_import.cpp b/plugins/flp_import/flp_import.cpp index 40237f029..12c7b773a 100644 --- a/plugins/flp_import/flp_import.cpp +++ b/plugins/flp_import/flp_import.cpp @@ -364,7 +364,7 @@ bool flpImport::tryImport( trackContainer * _tc ) printf( "new channel\n" ); it = dynamic_cast( - track::create( track::CHANNEL_TRACK, _tc->eng()->getBBEditor() ) ); + track::create( track::INSTRUMENT_TRACK, _tc->eng()->getBBEditor() ) ); assert( it != NULL ); i_tracks.push_back( it ); it_inst = it->loadInstrument( diff --git a/plugins/midi_import/midi_import.cpp b/plugins/midi_import/midi_import.cpp index 5a0f71686..47c9b6fa4 100644 --- a/plugins/midi_import/midi_import.cpp +++ b/plugins/midi_import/midi_import.cpp @@ -219,7 +219,7 @@ invalid_format: // now create new channel-track for reading track instrumentTrack * ct = dynamic_cast( track::create( - track::CHANNEL_TRACK, + track::INSTRUMENT_TRACK, _tc ) ); #ifdef LMMS_DEBUG assert( ct != NULL ); diff --git a/src/core/file_browser.cpp b/src/core/file_browser.cpp index 3949c65b9..776ee29bd 100644 --- a/src/core/file_browser.cpp +++ b/src/core/file_browser.cpp @@ -331,7 +331,7 @@ void fileBrowser::openInNewInstrumentTrack( trackContainer * _tc ) if( m_contextMenuItem->type() == fileItem::SAMPLE_FILE ) { instrumentTrack * ct = dynamic_cast( - track::create( track::CHANNEL_TRACK, _tc ) ); + track::create( track::INSTRUMENT_TRACK, _tc ) ); #ifdef LMMS_DEBUG assert( ct != NULL ); #endif @@ -346,7 +346,7 @@ void fileBrowser::openInNewInstrumentTrack( trackContainer * _tc ) else if( m_contextMenuItem->type() == fileItem::PRESET_FILE ) { multimediaProject mmp( m_contextMenuItem->fullName() ); - track * t = track::create( track::CHANNEL_TRACK, _tc ); + track * t = track::create( track::INSTRUMENT_TRACK, _tc ); instrumentTrack * ct = dynamic_cast( t ); if( ct != NULL ) { @@ -418,7 +418,7 @@ void listView::contentsMouseDoubleClickEvent( QMouseEvent * _me ) // samples are per default opened in bb-editor because // they're likely drum-samples etc. instrumentTrack * it = dynamic_cast( - track::create( track::CHANNEL_TRACK, + track::create( track::INSTRUMENT_TRACK, eng()->getBBEditor() ) ); #ifdef LMMS_DEBUG assert( it != NULL ); @@ -436,7 +436,7 @@ void listView::contentsMouseDoubleClickEvent( QMouseEvent * _me ) { // presets are per default opened in bb-editor multimediaProject mmp( f->fullName() ); - track * t = track::create( track::CHANNEL_TRACK, + track * t = track::create( track::INSTRUMENT_TRACK, eng()->getBBEditor() ); instrumentTrack * it = dynamic_cast( t ); diff --git a/src/core/preset_preview_play_handle.cpp b/src/core/preset_preview_play_handle.cpp index e2af78ab9..6c779c7ca 100644 --- a/src/core/preset_preview_play_handle.cpp +++ b/src/core/preset_preview_play_handle.cpp @@ -63,7 +63,7 @@ public: { setJournalling( FALSE ); m_previewInstrumentTrack = dynamic_cast( - track::create( track::CHANNEL_TRACK, + track::create( track::INSTRUMENT_TRACK, this ) ); m_previewInstrumentTrack->setJournalling( FALSE ); hide(); diff --git a/src/core/song_editor.cpp b/src/core/song_editor.cpp index 90265434c..b3913d6ec 100644 --- a/src/core/song_editor.cpp +++ b/src/core/song_editor.cpp @@ -1470,11 +1470,11 @@ void songEditor::createNewProject( void ) eng()->getProjectJournal()->setJournalling( FALSE ); track * t; - t = track::create( track::CHANNEL_TRACK, this ); + t = track::create( track::INSTRUMENT_TRACK, this ); dynamic_cast< instrumentTrack * >( t )->loadInstrument( "tripleoscillator" ); track::create( track::SAMPLE_TRACK, this ); - t = track::create( track::CHANNEL_TRACK, eng()->getBBEditor() ); + t = track::create( track::INSTRUMENT_TRACK, eng()->getBBEditor() ); dynamic_cast< instrumentTrack * >( t )->loadInstrument( "tripleoscillator" ); track::create( track::BB_TRACK, this ); diff --git a/src/core/track.cpp b/src/core/track.cpp index 410d71007..d1c5b8cea 100644 --- a/src/core/track.cpp +++ b/src/core/track.cpp @@ -1659,7 +1659,7 @@ track * track::create( trackTypes _tt, trackContainer * _tc ) switch( _tt ) { - case CHANNEL_TRACK: t = new instrumentTrack( _tc ); break; + case INSTRUMENT_TRACK: t = new instrumentTrack( _tc ); break; case BB_TRACK: t = new bbTrack( _tc ); break; case SAMPLE_TRACK: t = new sampleTrack( _tc ); break; // case EVENT_TRACK: diff --git a/src/core/track_container.cpp b/src/core/track_container.cpp index 1e5fd0437..7b3f9e8e2 100644 --- a/src/core/track_container.cpp +++ b/src/core/track_container.cpp @@ -495,7 +495,7 @@ void trackContainer::dragEnterEvent( QDragEnterEvent * _dee ) stringPairDrag::processDragEnterEvent( _dee, QString( "presetfile,sampledata,samplefile,instrument,midifile," "track_%1,track_%2" ). - arg( track::CHANNEL_TRACK ). + arg( track::INSTRUMENT_TRACK ). arg( track::SAMPLE_TRACK ) ); } @@ -509,7 +509,7 @@ void trackContainer::dropEvent( QDropEvent * _de ) if( type == "instrument" ) { instrumentTrack * it = dynamic_cast( - track::create( track::CHANNEL_TRACK, + track::create( track::INSTRUMENT_TRACK, this ) ); it->loadInstrument( value ); it->toggledInstrumentTrackButton( TRUE ); @@ -518,7 +518,7 @@ void trackContainer::dropEvent( QDropEvent * _de ) else if( type == "sampledata" || type == "samplefile" ) { instrumentTrack * it = dynamic_cast( - track::create( track::CHANNEL_TRACK, + track::create( track::INSTRUMENT_TRACK, this ) ); instrument * i = it->loadInstrument( "audiofileprocessor" ); i->setParameter( type, value ); @@ -529,7 +529,7 @@ void trackContainer::dropEvent( QDropEvent * _de ) { multimediaProject mmp( value ); instrumentTrack * it = dynamic_cast( - track::create( track::CHANNEL_TRACK, + track::create( track::INSTRUMENT_TRACK, this ) ); it->loadTrackSpecificSettings( mmp.content().firstChild(). toElement() ); diff --git a/src/tracks/instrument_track.cpp b/src/tracks/instrument_track.cpp index 55c5e2687..3e96a9f25 100644 --- a/src/tracks/instrument_track.cpp +++ b/src/tracks/instrument_track.cpp @@ -106,8 +106,7 @@ const char * surroundarea_help = QT_TRANSLATE_NOOP( "instrumentTrack", "feature." ); -const int CHANNEL_WIDTH = 250; -const int INSTRUMENT_WIDTH = CHANNEL_WIDTH; +const int INSTRUMENT_WIDTH = 250; const int INSTRUMENT_HEIGHT = INSTRUMENT_WIDTH; const int PIANO_HEIGHT = 84; @@ -116,7 +115,7 @@ instrumentTrack::instrumentTrack( trackContainer * _tc ) : QWidget( _tc->eng()->getMainWindow()->workspace() ), track( _tc ), midiEventProcessor(), - m_trackType( CHANNEL_TRACK ), + m_trackType( INSTRUMENT_TRACK ), m_midiPort( eng()->getMixer()->getMIDIClient()->addPort( this, tr( "unnamed_channel" ) ) ), m_audioPort( new audioPort( tr( "unnamed_channel" ), eng() ) ), @@ -314,7 +313,7 @@ instrumentTrack::instrumentTrack( trackContainer * _tc ) : // setup piano-widget m_pianoWidget = new pianoWidget( this ); - m_pianoWidget->setFixedSize( CHANNEL_WIDTH, PIANO_HEIGHT ); + m_pianoWidget->setFixedSize( INSTRUMENT_WIDTH, PIANO_HEIGHT ); vlayout->addWidget( m_generalSettingsWidget ); @@ -380,7 +379,7 @@ instrumentTrack::instrumentTrack( trackContainer * _tc ) : _tc->updateAfterTrackAdd(); #ifndef QT3 - setFixedWidth( CHANNEL_WIDTH ); + setFixedWidth( INSTRUMENT_WIDTH ); resize( sizeHint() ); #endif @@ -653,9 +652,17 @@ void instrumentTrack::processInEvent( const midiEvent & _me, _time.frames( eng()->framesPerTact64th() ), valueRanges::max, n ); + // as mixer::addPlayHandle() might + // delete note (when running into + // critical XRuns) which will call + // deleteNotePluginData which locks + // this mutex, we have to unlock + // it here temporarily + m_notesMutex.unlock(); if( eng()->getMixer()->addPlayHandle( nph ) ) { + m_notesMutex.lock(); m_notes[_me.key()] = nph; } } @@ -1299,7 +1306,7 @@ void instrumentTrack::invalidateAllMyNPH( void ) // invalidate all note-play-handles linked to this channel eng()->getMixer()->checkValidityOfPlayHandles(); - m_trackType = CHANNEL_TRACK; + m_trackType = INSTRUMENT_TRACK; }