diff --git a/include/Instrument.h b/include/Instrument.h index 3db88b980..88c8e9a19 100644 --- a/include/Instrument.h +++ b/include/Instrument.h @@ -119,13 +119,13 @@ public: virtual bool isFromTrack( const track * _track ) const; - -protected: inline InstrumentTrack * instrumentTrack() const { return m_instrumentTrack; } + +protected: // instruments may use this to apply a soft fade out at the end of // notes - method does this only if really less or equal // desiredReleaseFrames() frames are left diff --git a/include/InstrumentPlayHandle.h b/include/InstrumentPlayHandle.h index cf472db9e..c2fd5c918 100644 --- a/include/InstrumentPlayHandle.h +++ b/include/InstrumentPlayHandle.h @@ -22,11 +22,12 @@ * */ -#ifndef _INSTRUMENT_PLAY_HANDLE_H -#define _INSTRUMENT_PLAY_HANDLE_H +#ifndef INSTRUMENT_PLAY_HANDLE_H +#define INSTRUMENT_PLAY_HANDLE_H #include "PlayHandle.h" #include "Instrument.h" +#include "NotePlayHandle.h" class InstrumentPlayHandle : public PlayHandle @@ -45,6 +46,25 @@ public: virtual void play( sampleFrame * _working_buffer ) { + // if the instrument is midi-based, we can safely render right away + if( m_instrument->flags() & Instrument::IsMidiBased ) + { + m_instrument->play( _working_buffer ); + return; + } + + // if not, we need to ensure that all our nph's have been processed first + ConstNotePlayHandleList nphv = NotePlayHandle::nphsOfInstrumentTrack( m_instrument->instrumentTrack(), true ); + + foreach( const NotePlayHandle * cnph, nphv ) + { + NotePlayHandle * nph = const_cast( cnph ); + while( nph->state() != ThreadableJob::Done ) + { + nph->process(); + } + } + m_instrument->play( _working_buffer ); } diff --git a/plugins/sf2_player/sf2_player.h b/plugins/sf2_player/sf2_player.h index e27aa8a8a..5c2f5beb8 100644 --- a/plugins/sf2_player/sf2_player.h +++ b/plugins/sf2_player/sf2_player.h @@ -79,7 +79,7 @@ public: virtual Flags flags() const { - return IsSingleStreamed | IsMidiBased; + return IsSingleStreamed; } virtual PluginView * instantiateView( QWidget * _parent );