From 8c06cb60f4bb4edf0db460fc898f91d33ad99fad Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Thu, 6 Feb 2014 23:40:50 +0100 Subject: [PATCH] InstrumentTrack: always process silence at least one time As of commit 1266278229a532f221ac9588fa5c85063d236ac8 silent buffers from InstrumentPlayHandle-driven instruments are ignored. This is a good thing but can beak PeakController instances attached to e.g. ZynAddSubFX. Fixes playback of unfa-Spoken.mmpz. --- include/InstrumentTrack.h | 2 ++ src/tracks/InstrumentTrack.cpp | 14 ++++++++++++-- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/include/InstrumentTrack.h b/include/InstrumentTrack.h index fca241212..2e212e4b5 100644 --- a/include/InstrumentTrack.h +++ b/include/InstrumentTrack.h @@ -229,6 +229,8 @@ private: int m_runningMidiNotes[NumKeys]; bool m_sustainPedalPressed; + bool m_silentBuffersProcessed; + IntModel m_baseNoteModel; NotePlayHandleList m_processHandles; diff --git a/src/tracks/InstrumentTrack.cpp b/src/tracks/InstrumentTrack.cpp index 4ded25fbe..431dd9eb5 100644 --- a/src/tracks/InstrumentTrack.cpp +++ b/src/tracks/InstrumentTrack.cpp @@ -100,6 +100,7 @@ InstrumentTrack::InstrumentTrack( TrackContainer* tc ) : this, this ), m_notes(), m_sustainPedalPressed( false ), + m_silentBuffersProcessed( false ), m_baseNoteModel( 0, 0, KeysPerOctave * NumOctaves - 1, this, tr( "Base note" ) ), m_volumeModel( DefaultVolume, MinVolume, MaxVolume, 0.1f, this, tr( "Volume" ) ), @@ -165,8 +166,17 @@ void InstrumentTrack::processAudioBuffer( sampleFrame* buf, const fpp_t frames, // 99 of 100 cases so that test would be a waste of time. if( n == NULL && MixHelpers::isSilent( buf, frames ) ) { - // skip further processing - return; + // at least pass one silent buffer to allow + if( m_silentBuffersProcessed ) + { + // skip further processing + return; + } + m_silentBuffersProcessed = true; + } + else + { + m_silentBuffersProcessed = false; } // if effects "went to sleep" because there was no input, wake them up