Merge pull request #546 from jpcima/used-ccs

Cache the value of usedCCs
This commit is contained in:
JP Cimalando 2020-11-11 16:38:38 +01:00 committed by GitHub
commit 9ef7a60984
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 50 additions and 39 deletions

View file

@ -683,7 +683,7 @@ void Synth::Impl::finalizeSfzLoad()
std::bitset<config::numCCs> usedCCs; std::bitset<config::numCCs> usedCCs;
for (const RegionPtr& regionPtr : regions_) { for (const RegionPtr& regionPtr : regions_) {
const Region& region = *regionPtr; const Region& region = *regionPtr;
updateUsedCCsFromRegion(usedCCs, region); collectUsedCCsFromRegion(usedCCs, region);
for (const Region::Connection& connection : region.connections) { for (const Region::Connection& connection : region.connections) {
if (connection.source.id() == ModId::Controller) if (connection.source.id() == ModId::Controller)
usedCCs.set(connection.source.parameters().cc); usedCCs.set(connection.source.parameters().cc);
@ -722,6 +722,9 @@ void Synth::Impl::finalizeSfzLoad()
applySettingsPerVoice(); applySettingsPerVoice();
setupModMatrix(); setupModMatrix();
// cache the set of used CCs for future access
currentUsedCCs_ = collectAllUsedCCs();
} }
bool Synth::loadScalaFile(const fs::path& path) bool Synth::loadScalaFile(const fs::path& path)
@ -1677,14 +1680,10 @@ void Synth::allSoundOff() noexcept
effectBus->clear(); effectBus->clear();
} }
std::bitset<config::numCCs> Synth::getUsedCCs() const noexcept const std::bitset<config::numCCs>& Synth::getUsedCCs() const noexcept
{ {
Impl& impl = *impl_; Impl& impl = *impl_;
std::bitset<config::numCCs> used; return impl.currentUsedCCs_;
for (const Impl::RegionPtr& region : impl.regions_)
impl.updateUsedCCsFromRegion(used, *region);
impl.updateUsedCCsFromModulations(used, impl.resources_.modMatrix);
return used;
} }
void sfz::Synth::setBroadcastCallback(sfizz_receive_t* broadcast, void* data) void sfz::Synth::setBroadcastCallback(sfizz_receive_t* broadcast, void* data)
@ -1694,41 +1693,41 @@ void sfz::Synth::setBroadcastCallback(sfizz_receive_t* broadcast, void* data)
impl.broadcastData = data; impl.broadcastData = data;
} }
void Synth::Impl::updateUsedCCsFromRegion(std::bitset<config::numCCs>& usedCCs, const Region& region) void Synth::Impl::collectUsedCCsFromRegion(std::bitset<config::numCCs>& usedCCs, const Region& region)
{ {
updateUsedCCsFromCCMap(usedCCs, region.offsetCC); collectUsedCCsFromCCMap(usedCCs, region.offsetCC);
updateUsedCCsFromCCMap(usedCCs, region.amplitudeEG.ccAttack); collectUsedCCsFromCCMap(usedCCs, region.amplitudeEG.ccAttack);
updateUsedCCsFromCCMap(usedCCs, region.amplitudeEG.ccRelease); collectUsedCCsFromCCMap(usedCCs, region.amplitudeEG.ccRelease);
updateUsedCCsFromCCMap(usedCCs, region.amplitudeEG.ccDecay); collectUsedCCsFromCCMap(usedCCs, region.amplitudeEG.ccDecay);
updateUsedCCsFromCCMap(usedCCs, region.amplitudeEG.ccDelay); collectUsedCCsFromCCMap(usedCCs, region.amplitudeEG.ccDelay);
updateUsedCCsFromCCMap(usedCCs, region.amplitudeEG.ccHold); collectUsedCCsFromCCMap(usedCCs, region.amplitudeEG.ccHold);
updateUsedCCsFromCCMap(usedCCs, region.amplitudeEG.ccStart); collectUsedCCsFromCCMap(usedCCs, region.amplitudeEG.ccStart);
updateUsedCCsFromCCMap(usedCCs, region.amplitudeEG.ccSustain); collectUsedCCsFromCCMap(usedCCs, region.amplitudeEG.ccSustain);
if (region.pitchEG) { if (region.pitchEG) {
updateUsedCCsFromCCMap(usedCCs, region.pitchEG->ccAttack); collectUsedCCsFromCCMap(usedCCs, region.pitchEG->ccAttack);
updateUsedCCsFromCCMap(usedCCs, region.pitchEG->ccRelease); collectUsedCCsFromCCMap(usedCCs, region.pitchEG->ccRelease);
updateUsedCCsFromCCMap(usedCCs, region.pitchEG->ccDecay); collectUsedCCsFromCCMap(usedCCs, region.pitchEG->ccDecay);
updateUsedCCsFromCCMap(usedCCs, region.pitchEG->ccDelay); collectUsedCCsFromCCMap(usedCCs, region.pitchEG->ccDelay);
updateUsedCCsFromCCMap(usedCCs, region.pitchEG->ccHold); collectUsedCCsFromCCMap(usedCCs, region.pitchEG->ccHold);
updateUsedCCsFromCCMap(usedCCs, region.pitchEG->ccStart); collectUsedCCsFromCCMap(usedCCs, region.pitchEG->ccStart);
updateUsedCCsFromCCMap(usedCCs, region.pitchEG->ccSustain); collectUsedCCsFromCCMap(usedCCs, region.pitchEG->ccSustain);
} }
if (region.filterEG) { if (region.filterEG) {
updateUsedCCsFromCCMap(usedCCs, region.filterEG->ccAttack); collectUsedCCsFromCCMap(usedCCs, region.filterEG->ccAttack);
updateUsedCCsFromCCMap(usedCCs, region.filterEG->ccRelease); collectUsedCCsFromCCMap(usedCCs, region.filterEG->ccRelease);
updateUsedCCsFromCCMap(usedCCs, region.filterEG->ccDecay); collectUsedCCsFromCCMap(usedCCs, region.filterEG->ccDecay);
updateUsedCCsFromCCMap(usedCCs, region.filterEG->ccDelay); collectUsedCCsFromCCMap(usedCCs, region.filterEG->ccDelay);
updateUsedCCsFromCCMap(usedCCs, region.filterEG->ccHold); collectUsedCCsFromCCMap(usedCCs, region.filterEG->ccHold);
updateUsedCCsFromCCMap(usedCCs, region.filterEG->ccStart); collectUsedCCsFromCCMap(usedCCs, region.filterEG->ccStart);
updateUsedCCsFromCCMap(usedCCs, region.filterEG->ccSustain); collectUsedCCsFromCCMap(usedCCs, region.filterEG->ccSustain);
} }
updateUsedCCsFromCCMap(usedCCs, region.ccConditions); collectUsedCCsFromCCMap(usedCCs, region.ccConditions);
updateUsedCCsFromCCMap(usedCCs, region.ccTriggers); collectUsedCCsFromCCMap(usedCCs, region.ccTriggers);
updateUsedCCsFromCCMap(usedCCs, region.crossfadeCCInRange); collectUsedCCsFromCCMap(usedCCs, region.crossfadeCCInRange);
updateUsedCCsFromCCMap(usedCCs, region.crossfadeCCOutRange); collectUsedCCsFromCCMap(usedCCs, region.crossfadeCCOutRange);
} }
void Synth::Impl::updateUsedCCsFromModulations(std::bitset<config::numCCs>& usedCCs, const ModMatrix& mm) void Synth::Impl::collectUsedCCsFromModulations(std::bitset<config::numCCs>& usedCCs, const ModMatrix& mm)
{ {
class CCSourceCollector : public ModMatrix::KeyVisitor { class CCSourceCollector : public ModMatrix::KeyVisitor {
public: public:
@ -1750,6 +1749,15 @@ void Synth::Impl::updateUsedCCsFromModulations(std::bitset<config::numCCs>& used
mm.visitSources(vtor); mm.visitSources(vtor);
} }
std::bitset<config::numCCs> Synth::Impl::collectAllUsedCCs()
{
std::bitset<config::numCCs> used;
for (const Impl::RegionPtr& region : regions_)
collectUsedCCsFromRegion(used, *region);
collectUsedCCsFromModulations(used, resources_.modMatrix);
return used;
}
Parser& Synth::getParser() noexcept Parser& Synth::getParser() noexcept
{ {
Impl& impl = *impl_; Impl& impl = *impl_;

View file

@ -584,7 +584,7 @@ public:
* *
* @return const std::bitset<config::numCCs>& * @return const std::bitset<config::numCCs>&
*/ */
std::bitset<config::numCCs> getUsedCCs() const noexcept; const std::bitset<config::numCCs>& getUsedCCs() const noexcept;
/** /**
* @brief Dispatch the incoming message to the synth engine * @brief Dispatch the incoming message to the synth engine

View file

@ -168,14 +168,16 @@ struct Synth::Impl final: public Parser::Listener {
void finalizeSfzLoad(); void finalizeSfzLoad();
template<class T> template<class T>
static void updateUsedCCsFromCCMap(std::bitset<config::numCCs>& usedCCs, const CCMap<T> map) noexcept static void collectUsedCCsFromCCMap(std::bitset<config::numCCs>& usedCCs, const CCMap<T> map) noexcept
{ {
for (auto& mod : map) for (auto& mod : map)
usedCCs[mod.cc] = true; usedCCs[mod.cc] = true;
} }
static void updateUsedCCsFromRegion(std::bitset<config::numCCs>& usedCCs, const Region& region); static void collectUsedCCsFromRegion(std::bitset<config::numCCs>& usedCCs, const Region& region);
static void updateUsedCCsFromModulations(std::bitset<config::numCCs>& usedCCs, const ModMatrix& mm); static void collectUsedCCsFromModulations(std::bitset<config::numCCs>& usedCCs, const ModMatrix& mm);
std::bitset<config::numCCs> collectAllUsedCCs();
/** /**
* @brief Set the default value for a CC * @brief Set the default value for a CC
@ -268,6 +270,7 @@ struct Synth::Impl final: public Parser::Listener {
fs::file_time_type modificationTime_ { }; fs::file_time_type modificationTime_ { };
std::array<float, config::numCCs> defaultCCValues_; std::array<float, config::numCCs> defaultCCValues_;
std::bitset<config::numCCs> currentUsedCCs_;
// Messaging // Messaging
sfizz_receive_t* broadcastReceiver = nullptr; sfizz_receive_t* broadcastReceiver = nullptr;