--- linuxsampler/trunk/src/engines/gig/Voice.cpp 2008/02/17 12:40:59 1700 +++ linuxsampler/trunk/src/engines/gig/Voice.cpp 2008/06/22 14:46:46 1748 @@ -781,13 +781,26 @@ RTList::Iterator itCCEvent = pEngineChannel->pEvents->first(); RTList::Iterator itNoteEvent = pEngineChannel->pMIDIKeyInfo[MIDIKey].pEvents->first(); - if (Skip) { // skip events that happened before this voice was triggered + if (itTriggerEvent) { // skip events that happened before this voice was triggered while (itCCEvent && itCCEvent->FragmentPos() <= Skip) ++itCCEvent; while (itNoteEvent && itNoteEvent->FragmentPos() <= Skip) ++itNoteEvent; } uint killPos; - if (itKillEvent) killPos = RTMath::Min(itKillEvent->FragmentPos(), pEngine->MaxFadeOutPos); + if (itKillEvent) { + int maxFadeOutPos = Samples - pEngine->MinFadeOutSamples; + if (maxFadeOutPos < 0) { + // There's not enough space in buffer to do a fade out + // from max volume (this can only happen for audio + // drivers that use Samples < MaxSamplesPerCycle). + // End the EG1 here, at pos 0, with a shorter max fade + // out time. + EG1.enterFadeOutStage(Samples / CONFIG_DEFAULT_SUBFRAGMENT_SIZE); + itKillEvent = Pool::Iterator(); + } else { + killPos = RTMath::Min(itKillEvent->FragmentPos(), maxFadeOutPos); + } + } uint i = Skip; while (i < Samples) {