From 65f172a02e4d0dee1ca6163c33d03bc2e4474a9b Mon Sep 17 00:00:00 2001 From: Paul Ferrand Date: Mon, 20 Jan 2020 19:09:31 +0100 Subject: [PATCH] Do a pseudo merge of events in the envelopes --- src/sfizz/EventEnvelopes.cpp | 32 +++++++++++++++++++++++++------- src/sfizz/EventEnvelopes.h | 2 +- 2 files changed, 26 insertions(+), 8 deletions(-) diff --git a/src/sfizz/EventEnvelopes.cpp b/src/sfizz/EventEnvelopes.cpp index f31d9978..4cd38f41 100644 --- a/src/sfizz/EventEnvelopes.cpp +++ b/src/sfizz/EventEnvelopes.cpp @@ -65,15 +65,33 @@ void EventEnvelope::registerEvent(int timestamp, Type inputValue) } template -void EventEnvelope::prepareEvents() +void EventEnvelope::prepareEvents(int blockLength) { if (resetEvents) clear(); - - absl::c_sort(events, [](const auto& lhs, const auto& rhs) { + + absl::c_stable_sort(events, [](const auto& lhs, const auto& rhs) { return lhs.first < rhs.first; }); + auto eventIt = events.begin(); + while (eventIt < events.end()) { + if (eventIt->first >= blockLength) { + eventIt->first = blockLength - 1; + eventIt->second = events.back().second; + ++eventIt; + break; + } + + auto nextEventIt = std::next(eventIt); + while (nextEventIt < events.end() && eventIt->first == nextEventIt->first ) { + eventIt->second = nextEventIt->second; + ++nextEventIt; + } + ++eventIt; + } + events.resize(std::distance(events.begin(), eventIt)); + resetEvents = true; } @@ -93,15 +111,15 @@ void EventEnvelope::reset(Type value) } template -void EventEnvelope::getBlock(absl::Span) +void EventEnvelope::getBlock(absl::Span output) { - prepareEvents(); + prepareEvents(output.size()); } template -void EventEnvelope::getQuantizedBlock(absl::Span, Type) +void EventEnvelope::getQuantizedBlock(absl::Span output, Type) { - prepareEvents(); + prepareEvents(output.size()); } template diff --git a/src/sfizz/EventEnvelopes.h b/src/sfizz/EventEnvelopes.h index 883c887e..2115c82d 100644 --- a/src/sfizz/EventEnvelopes.h +++ b/src/sfizz/EventEnvelopes.h @@ -113,7 +113,7 @@ private: static_assert(std::is_arithmetic::value, "Type should be arithmetic"); std::function function { [](Type input) { return input; } }; int maxCapacity { config::defaultSamplesPerBlock }; - void prepareEvents(); + void prepareEvents(int blockLength); bool resetEvents { false }; LEAK_DETECTOR(EventEnvelope); };