Move common voice starting logic in a separate method

This commit is contained in:
Paul Ferrand 2020-08-25 21:34:42 +02:00
parent dda10e8530
commit 944373ea83
2 changed files with 23 additions and 39 deletions

View file

@ -893,6 +893,24 @@ void sfz::Synth::noteOff(int delay, int noteNumber, uint8_t velocity) noexcept
noteOffDispatch(delay, noteNumber, replacedVelocity);
}
void sfz::Synth::startVoice(Region* region, int delay, const TriggerEvent& triggerEvent, SisterVoiceRingBuilder& ring) noexcept
{
checkNotePolyphony(region, delay, triggerEvent);
checkRegionPolyphony(region, delay);
checkGroupPolyphony(region, delay);
checkSetPolyphony(region, delay);
Voice* selectedVoice = findFreeVoice();
if (selectedVoice == nullptr)
return;
ASSERT(selectedVoice->isFree());
selectedVoice->startVoice(region, delay, triggerEvent);
ring.addVoiceToRing(selectedVoice);
RegionSet::registerVoiceInHierarchy(region, selectedVoice);
polyphonyGroups[region->group].registerVoice(selectedVoice);
}
bool matchReleaseRegionAndVoice(const sfz::Region& region, const sfz::Voice& voice)
{
const sfz::TriggerEvent& event = voice.getTriggerEvent();
@ -926,13 +944,7 @@ void sfz::Synth::noteOffDispatch(int delay, int noteNumber, float velocity) noex
continue;
}
if (Voice* selectedVoice = findFreeVoice()) {
ASSERT(selectedVoice->isFree());
selectedVoice->startVoice(region, delay, triggerEvent);
ring.addVoiceToRing(selectedVoice);
RegionSet::registerVoiceInHierarchy(region, selectedVoice);
polyphonyGroups[region->group].registerVoice(selectedVoice);
}
startVoice(region, delay, triggerEvent, ring);
}
}
}
@ -1040,18 +1052,7 @@ void sfz::Synth::noteOnDispatch(int delay, int noteNumber, float velocity) noexc
}
}
checkNotePolyphony(region, delay, triggerEvent);
checkRegionPolyphony(region, delay);
checkGroupPolyphony(region, delay);
checkSetPolyphony(region, delay);
if (Voice* selectedVoice = findFreeVoice()) {
ASSERT(selectedVoice->isFree());
selectedVoice->startVoice(region, delay, triggerEvent);
ring.addVoiceToRing(selectedVoice);
RegionSet::registerVoiceInHierarchy(region, selectedVoice);
polyphonyGroups[region->group].registerVoice(selectedVoice);
}
startVoice(region, delay, triggerEvent, ring);
}
}
}
@ -1096,10 +1097,6 @@ void sfz::Synth::hdcc(int delay, int ccNumber, float normValue) noexcept
if (ccNumber == region->sustainCC) {
if (!region->rtDead) {
// check that a voice with compatible trigger is playing
// FIXME: we're going twice over the voices, when the synth
// handles the regions completely these dispatch functions
// should be overhauled, also to include voice stealing on
// all events
const auto compatibleVoice = [region](const VoicePtr& v) -> bool {
return matchReleaseRegionAndVoice(*region, *v);
};
@ -1110,29 +1107,15 @@ void sfz::Synth::hdcc(int delay, int ccNumber, float normValue) noexcept
for (auto& note: region->delayedReleases) {
// FIXME: we really need to have some form of common method to find and start voices...
auto voice = findFreeVoice();
if (voice == nullptr)
continue;
const TriggerEvent noteOffEvent { TriggerEventType::NoteOff, note.first, note.second };
voice->startVoice(region, delay, noteOffEvent);
ring.addVoiceToRing(voice);
RegionSet::registerVoiceInHierarchy(region, voice);
polyphonyGroups[region->group].registerVoice(voice);
startVoice(region, delay, noteOffEvent, ring);
}
region->delayedReleases.clear();
}
if (region->registerCC(ccNumber, normValue)) {
if (Voice* selectedVoice = findFreeVoice()) {
ASSERT(selectedVoice->isFree());
selectedVoice->startVoice(region, delay, triggerEvent);
ring.addVoiceToRing(selectedVoice);
RegionSet::registerVoiceInHierarchy(region, selectedVoice);
polyphonyGroups[region->group].registerVoice(selectedVoice);
}
startVoice(region, delay, triggerEvent, ring);
}
}
}

View file

@ -784,6 +784,7 @@ private:
void checkNotePolyphony(const Region* region, int delay, const TriggerEvent& triggerEvent) noexcept;
void checkGroupPolyphony(const Region* region, int delay) noexcept;
void checkSetPolyphony(const Region* region, int delay) noexcept;
void startVoice(Region* region, int delay, const TriggerEvent& triggerEvent, SisterVoiceRingBuilder& ring) noexcept;
std::array<RegionViewVector, 128> noteActivationLists;
std::array<RegionViewVector, config::numCCs> ccActivationLists;