From 5777e65578e163ad872d29dec7c789788486ae40 Mon Sep 17 00:00:00 2001 From: Jean Pierre Cimalando Date: Tue, 30 Mar 2021 17:49:17 +0200 Subject: [PATCH] Remove the indirection --- src/sfizz/Layer.cpp | 28 ++++++++++++--------------- src/sfizz/Layer.h | 28 +++++++++++++++------------ src/sfizz/Synth.cpp | 4 ++-- tests/DirectRegionT.cpp | 12 ++++++------ tests/RegionActivationT.cpp | 18 +++++++++--------- tests/RegionTriggersT.cpp | 38 ++++++++++++++++++------------------- 6 files changed, 64 insertions(+), 64 deletions(-) diff --git a/src/sfizz/Layer.cpp b/src/sfizz/Layer.cpp index 3f3b823f..4b3c3110 100644 --- a/src/sfizz/Layer.cpp +++ b/src/sfizz/Layer.cpp @@ -12,28 +12,24 @@ namespace sfz { -Layer::Layer(std::unique_ptr region, const MidiState& midiState) - : Layer(region.get(), midiState) +Layer::Layer(int regionNumber, absl::string_view defaultPath, const MidiState& midiState) + : Layer(Region(regionNumber, defaultPath), midiState) { - regionOwned_ = true; - region.release(); } -Layer::Layer(Region* region, const MidiState& midiState) - : region_(region), regionOwned_(false), midiState_(midiState) +Layer::Layer(const Region& region, const MidiState& midiState) + : midiState_(midiState), region_(region) { initializeActivations(); } Layer::~Layer() { - if (regionOwned_) - delete region_; } void Layer::initializeActivations() { - const Region& region = *region_; + const Region& region = region_; keySwitched_ = !region.usesKeySwitches; previousKeySwitched_ = !region.usesPreviousKeySwitches; @@ -53,7 +49,7 @@ bool Layer::registerNoteOn(int noteNumber, float velocity, float randValue) noex { ASSERT(velocity >= 0.0f && velocity <= 1.0f); - const Region& region = *region_; + const Region& region = region_; const bool keyOk = region.keyRange.containsWithEnd(noteNumber); if (keyOk) { @@ -84,7 +80,7 @@ bool Layer::registerNoteOff(int noteNumber, float velocity, float randValue) noe { ASSERT(velocity >= 0.0f && velocity <= 1.0f); - const Region& region = *region_; + const Region& region = region_; if (!isSwitchedOn()) return false; @@ -130,7 +126,7 @@ bool Layer::registerCC(int ccNumber, float ccValue) noexcept { ASSERT(ccValue >= 0.0f && ccValue <= 1.0f); - const Region& region = *region_; + const Region& region = region_; if (ccNumber == region.sustainCC) sustainPressed_ = region.checkSustain && ccValue >= region.sustainThreshold; @@ -167,7 +163,7 @@ bool Layer::registerCC(int ccNumber, float ccValue) noexcept void Layer::registerPitchWheel(float pitch) noexcept { - const Region& region = *region_; + const Region& region = region_; if (region.bendRange.containsWithEnd(pitch)) pitchSwitched_ = true; else @@ -176,7 +172,7 @@ void Layer::registerPitchWheel(float pitch) noexcept void Layer::registerAftertouch(float aftertouch) noexcept { - const Region& region = *region_; + const Region& region = region_; if (region.aftertouchRange.containsWithEnd(aftertouch)) aftertouchSwitched_ = true; else @@ -185,7 +181,7 @@ void Layer::registerAftertouch(float aftertouch) noexcept void Layer::registerTempo(float secondsPerQuarter) noexcept { - const Region& region = *region_; + const Region& region = region_; const float bpm = 60.0f / secondsPerQuarter; if (region.bpmRange.containsWithEnd(bpm)) bpmSwitched_ = true; @@ -219,7 +215,7 @@ void Layer::removeFromSostenutoReleases(int noteNumber) noexcept void Layer::storeSostenutoNotes() noexcept { ASSERT(delayedSostenutoReleases_.empty()); - const Region& region = *region_; + const Region& region = region_; for (int note = region.keyRange.getStart(); note <= region.keyRange.getEnd(); ++note) { if (midiState_.isNotePressed(note)) delaySostenutoRelease(note, midiState_.getNoteVelocity(note)); diff --git a/src/sfizz/Layer.h b/src/sfizz/Layer.h index 619d7d5a..ede1490a 100644 --- a/src/sfizz/Layer.h +++ b/src/sfizz/Layer.h @@ -5,9 +5,11 @@ // If not, contact the sfizz maintainers at https://github.com/sfztools/sfizz #pragma once +#include "Region.h" #include "Config.h" #include "utility/NumericId.h" #include "utility/LeakDetector.h" +#include #include #include #include @@ -20,23 +22,26 @@ class MidiState; struct Layer { public: - Layer(std::unique_ptr region, const MidiState& midiState); - Layer(Region* region, const MidiState& midiState); + /** + * @brief Initialize a layer based on a new default region. + */ + Layer(int regionNumber, absl::string_view defaultPath, const MidiState& midiState); + + /** + * @brief Initialize a layer based on a copy of the contents of a region. + */ + Layer(const Region& region, const MidiState& midiState); + ~Layer(); - Layer(const Layer&) = delete; - Layer(Layer&&) = delete; - Layer& operator=(const Layer&) = delete; - Layer& operator=(Layer&&) = delete; - /** * @brief Get the region that this layer operates on. */ - const Region& getRegion() const noexcept { return *region_; } + const Region& getRegion() const noexcept { return region_; } /** * @brief Get the region that this layer operates on. */ - Region& getRegion() noexcept { return *region_; } + Region& getRegion() noexcept { return region_; } /** * @brief Reset the activations to their initial states. @@ -103,9 +108,6 @@ public: */ void registerTempo(float secondsPerQuarter) noexcept; - Region* const region_ {}; - bool regionOwned_ = false; - // Started notes bool sustainPressed_ { false }; bool sostenutoPressed_ { false }; @@ -129,6 +131,8 @@ public: int sequenceCounter_ { 0 }; + Region region_; + LEAK_DETECTOR(Layer); }; diff --git a/src/sfizz/Synth.cpp b/src/sfizz/Synth.cpp index ca3b0245..ee9fbd8d 100644 --- a/src/sfizz/Synth.cpp +++ b/src/sfizz/Synth.cpp @@ -137,9 +137,9 @@ void Synth::Impl::onParseWarning(const SourceRange& range, const std::string& me void Synth::Impl::buildRegion(const std::vector& regionOpcodes) { int regionNumber = static_cast(layers_.size()); - Region* lastRegion = new Region(regionNumber, defaultPath_); - Layer* lastLayer = new Layer(std::unique_ptr(lastRegion), resources_.midiState); + Layer* lastLayer = new Layer(regionNumber, defaultPath_, resources_.midiState); layers_.emplace_back(lastLayer); + Region* lastRegion = &lastLayer->getRegion(); // auto parseOpcodes = [&](const std::vector& opcodes) { diff --git a/tests/DirectRegionT.cpp b/tests/DirectRegionT.cpp index f0d63c94..f54bbfdc 100644 --- a/tests/DirectRegionT.cpp +++ b/tests/DirectRegionT.cpp @@ -40,7 +40,7 @@ TEST_CASE("[Direct Region Tests] Release and release key") SECTION("Release key without sustain") { region.parseOpcode({ "trigger", "release_key" }); - Layer layer { ®ion, midiState }; + Layer layer { region, midiState }; layer.delayedSustainReleases_.reserve(config::delayedReleaseVoices); midiState.ccEvent(0, 64, 0.0f); layer.registerCC(64, 0.0f); @@ -50,7 +50,7 @@ TEST_CASE("[Direct Region Tests] Release and release key") SECTION("Release key with sustain") { region.parseOpcode({ "trigger", "release_key" }); - Layer layer { ®ion, midiState }; + Layer layer { region, midiState }; layer.delayedSustainReleases_.reserve(config::delayedReleaseVoices); midiState.ccEvent(0, 64, 1.0f); layer.registerCC(64, 1.0f); @@ -62,7 +62,7 @@ TEST_CASE("[Direct Region Tests] Release and release key") SECTION("Release without sustain") { region.parseOpcode({ "trigger", "release" }); - Layer layer { ®ion, midiState }; + Layer layer { region, midiState }; layer.delayedSustainReleases_.reserve(config::delayedReleaseVoices); midiState.ccEvent(0, 64, 0.0f); layer.registerCC(64, 0.0f); @@ -73,7 +73,7 @@ TEST_CASE("[Direct Region Tests] Release and release key") SECTION("Release with sustain") { region.parseOpcode({ "trigger", "release" }); - Layer layer { ®ion, midiState }; + Layer layer { region, midiState }; layer.delayedSustainReleases_.reserve(config::delayedReleaseVoices); midiState.ccEvent(0, 64, 1.0f); layer.registerCC(64, 1.0f); @@ -90,7 +90,7 @@ TEST_CASE("[Direct Region Tests] Release and release key") SECTION("Release with sustain and 2 notes") { region.parseOpcode({ "trigger", "release" }); - Layer layer { ®ion, midiState }; + Layer layer { region, midiState }; layer.delayedSustainReleases_.reserve(config::delayedReleaseVoices); midiState.ccEvent(0, 64, 1.0f); layer.registerCC(64, 1.0f); @@ -111,7 +111,7 @@ TEST_CASE("[Direct Region Tests] Release and release key") SECTION("Release with sustain and 2 notes but 1 outside") { region.parseOpcode({ "trigger", "release" }); - Layer layer { ®ion, midiState }; + Layer layer { region, midiState }; layer.delayedSustainReleases_.reserve(config::delayedReleaseVoices); midiState.ccEvent(0, 64, 1.0f); layer.registerCC(64, 1.0f); diff --git a/tests/RegionActivationT.cpp b/tests/RegionActivationT.cpp index cca98f99..84671173 100644 --- a/tests/RegionActivationT.cpp +++ b/tests/RegionActivationT.cpp @@ -20,7 +20,7 @@ TEST_CASE("Region activation", "Region tests") region.parseOpcode({ "sample", "*sine" }); SECTION("Basic state") { - sfz::Layer layer { ®ion, midiState }; + sfz::Layer layer { region, midiState }; layer.registerCC(4, 0_norm); REQUIRE(layer.isSwitchedOn()); } @@ -29,7 +29,7 @@ TEST_CASE("Region activation", "Region tests") { region.parseOpcode({ "locc4", "56" }); region.parseOpcode({ "hicc4", "59" }); - sfz::Layer layer { ®ion, midiState }; + sfz::Layer layer { region, midiState }; layer.registerCC(4, 0_norm); REQUIRE(!layer.isSwitchedOn()); layer.registerCC(4, 57_norm); @@ -52,7 +52,7 @@ TEST_CASE("Region activation", "Region tests") region.parseOpcode({ "hicc4", "59" }); region.parseOpcode({ "locc54", "18" }); region.parseOpcode({ "hicc54", "27" }); - sfz::Layer layer { ®ion, midiState }; + sfz::Layer layer { region, midiState }; layer.registerCC(4, 0_norm); layer.registerCC(54, 0_norm); REQUIRE(!layer.isSwitchedOn()); @@ -80,7 +80,7 @@ TEST_CASE("Region activation", "Region tests") { region.parseOpcode({ "lobend", "56" }); region.parseOpcode({ "hibend", "243" }); - sfz::Layer layer { ®ion, midiState }; + sfz::Layer layer { region, midiState }; layer.registerPitchWheel(0); REQUIRE(!layer.isSwitchedOn()); layer.registerPitchWheel(sfz::normalizeBend(56)); @@ -95,7 +95,7 @@ TEST_CASE("Region activation", "Region tests") { region.parseOpcode({ "lochanaft", "56" }); region.parseOpcode({ "hichanaft", "68" }); - sfz::Layer layer { ®ion, midiState }; + sfz::Layer layer { region, midiState }; layer.registerAftertouch(sfz::normalize7Bits(0)); REQUIRE(!layer.isSwitchedOn()); layer.registerAftertouch(sfz::normalize7Bits(56)); @@ -110,7 +110,7 @@ TEST_CASE("Region activation", "Region tests") { region.parseOpcode({ "lobpm", "56" }); region.parseOpcode({ "hibpm", "68" }); - sfz::Layer layer { ®ion, midiState }; + sfz::Layer layer { region, midiState }; layer.registerTempo(2.0f); REQUIRE(!layer.isSwitchedOn()); layer.registerTempo(0.90f); @@ -126,7 +126,7 @@ TEST_CASE("Region activation", "Region tests") region.parseOpcode({ "seq_length", "2" }); region.parseOpcode({ "seq_position", "1" }); region.parseOpcode({ "key", "40" }); - sfz::Layer layer { ®ion, midiState }; + sfz::Layer layer { region, midiState }; REQUIRE(!layer.isSwitchedOn()); layer.registerNoteOn(40, 64_norm, 0.5f); REQUIRE(layer.isSwitchedOn()); @@ -146,7 +146,7 @@ TEST_CASE("Region activation", "Region tests") region.parseOpcode({ "seq_length", "2" }); region.parseOpcode({ "seq_position", "2" }); region.parseOpcode({ "key", "40" }); - sfz::Layer layer { ®ion, midiState }; + sfz::Layer layer { region, midiState }; REQUIRE(!layer.isSwitchedOn()); layer.registerNoteOn(40, 64_norm, 0.5f); REQUIRE(!layer.isSwitchedOn()); @@ -166,7 +166,7 @@ TEST_CASE("Region activation", "Region tests") region.parseOpcode({ "seq_length", "3" }); region.parseOpcode({ "seq_position", "2" }); region.parseOpcode({ "key", "40" }); - sfz::Layer layer { ®ion, midiState }; + sfz::Layer layer { region, midiState }; REQUIRE(!layer.isSwitchedOn()); layer.registerNoteOn(40, 64_norm, 0.5f); REQUIRE(!layer.isSwitchedOn()); diff --git a/tests/RegionTriggersT.cpp b/tests/RegionTriggersT.cpp index 30b1cad5..c19dbbe1 100644 --- a/tests/RegionTriggersT.cpp +++ b/tests/RegionTriggersT.cpp @@ -23,7 +23,7 @@ TEST_CASE("Basic triggers", "Region triggers") SECTION("key") { region.parseOpcode({ "key", "40" }); - Layer layer { ®ion, midiState }; + Layer layer { region, midiState }; REQUIRE(layer.registerNoteOn(40, 64_norm, 0.5f)); REQUIRE(!layer.registerNoteOff(40, 64_norm, 0.5f)); REQUIRE(!layer.registerNoteOn(41, 64_norm, 0.5f)); @@ -33,7 +33,7 @@ TEST_CASE("Basic triggers", "Region triggers") { region.parseOpcode({ "lokey", "40" }); region.parseOpcode({ "hikey", "42" }); - Layer layer { ®ion, midiState }; + Layer layer { region, midiState }; REQUIRE(!layer.registerNoteOn(39, 64_norm, 0.5f)); REQUIRE(layer.registerNoteOn(40, 64_norm, 0.5f)); REQUIRE(!layer.registerNoteOff(40, 64_norm, 0.5f)); @@ -48,7 +48,7 @@ TEST_CASE("Basic triggers", "Region triggers") { region.parseOpcode({ "key", "40" }); region.parseOpcode({ "trigger", "release" }); - Layer layer { ®ion, midiState }; + Layer layer { region, midiState }; REQUIRE(!layer.registerNoteOn(40, 64_norm, 0.5f)); REQUIRE(layer.registerNoteOff(40, 64_norm, 0.5f)); REQUIRE(!layer.registerNoteOn(41, 64_norm, 0.5f)); @@ -59,7 +59,7 @@ TEST_CASE("Basic triggers", "Region triggers") { region.parseOpcode({ "key", "40" }); region.parseOpcode({ "trigger", "release_key" }); - Layer layer { ®ion, midiState }; + Layer layer { region, midiState }; REQUIRE(!layer.registerNoteOn(40, 64_norm, 0.5f)); REQUIRE(layer.registerNoteOff(40, 64_norm, 0.5f)); REQUIRE(!layer.registerNoteOn(41, 64_norm, 0.5f)); @@ -72,7 +72,7 @@ TEST_CASE("Basic triggers", "Region triggers") region.parseOpcode({ "key", "40" }); region.parseOpcode({ "lovel", "60" }); region.parseOpcode({ "hivel", "70" }); - Layer layer { ®ion, midiState }; + Layer layer { region, midiState }; REQUIRE(layer.registerNoteOn(40, 64_norm, 0.5f)); REQUIRE(layer.registerNoteOn(40, 60_norm, 0.5f)); REQUIRE(layer.registerNoteOn(40, 70_norm, 0.5f)); @@ -85,7 +85,7 @@ TEST_CASE("Basic triggers", "Region triggers") region.parseOpcode({ "key", "40" }); region.parseOpcode({ "lorand", "0.35" }); region.parseOpcode({ "hirand", "0.40" }); - Layer layer { ®ion, midiState }; + Layer layer { region, midiState }; REQUIRE(!layer.registerNoteOn(40, 64_norm, 0.34f)); REQUIRE(layer.registerNoteOn(40, 64_norm, 0.35f)); REQUIRE(layer.registerNoteOn(40, 64_norm, 0.36f)); @@ -100,7 +100,7 @@ TEST_CASE("Basic triggers", "Region triggers") { region.parseOpcode({ "key", "40" }); region.parseOpcode({ "lorand", "0.35" }); - Layer layer { ®ion, midiState }; + Layer layer { region, midiState }; REQUIRE(!layer.registerNoteOn(40, 64_norm, 0.34f)); REQUIRE(layer.registerNoteOn(40, 64_norm, 0.35f)); REQUIRE(layer.registerNoteOn(40, 64_norm, 1.0f)); @@ -109,19 +109,19 @@ TEST_CASE("Basic triggers", "Region triggers") SECTION("Disable key trigger") { region.parseOpcode({ "key", "40" }); - Layer layer1 { ®ion, midiState }; + Layer layer1 { region, midiState }; REQUIRE(layer1.registerNoteOn(40, 64_norm, 1.0f)); region.parseOpcode({ "hikey", "-1" }); - Layer layer2 { ®ion, midiState }; + Layer layer2 { region, midiState }; REQUIRE(!layer2.registerNoteOn(40, 64_norm, 1.0f)); region.parseOpcode({ "hikey", "40" }); - Layer layer3 { ®ion, midiState }; + Layer layer3 { region, midiState }; REQUIRE(layer3.registerNoteOn(40, 64_norm, 1.0f)); - Layer layer4 { ®ion, midiState }; region.parseOpcode({ "key", "-1" }); + Layer layer4 { region, midiState }; REQUIRE(!layer4.registerNoteOn(40, 64_norm, 1.0f)); - Layer layer5 { ®ion, midiState }; region.parseOpcode({ "key", "40" }); + Layer layer5 { region, midiState }; REQUIRE(layer5.registerNoteOn(40, 64_norm, 1.0f)); } @@ -129,12 +129,12 @@ TEST_CASE("Basic triggers", "Region triggers") { region.parseOpcode({ "on_locc47", "64" }); region.parseOpcode({ "on_hicc47", "68" }); - Layer layer1 { ®ion, midiState }; + Layer layer1 { region, midiState }; REQUIRE(!layer1.registerCC(47, 63_norm)); REQUIRE(layer1.registerCC(47, 64_norm)); REQUIRE(layer1.registerCC(47, 65_norm)); region.parseOpcode({ "hikey", "-1" }); - Layer layer2 { ®ion, midiState }; + Layer layer2 { region, midiState }; REQUIRE(layer2.registerCC(47, 64_norm)); REQUIRE(layer2.registerCC(47, 65_norm)); REQUIRE(layer2.registerCC(47, 66_norm)); @@ -149,7 +149,7 @@ TEST_CASE("Basic triggers", "Region triggers") region.parseOpcode({ "sample", "*sine" }); region.parseOpcode({ "on_locc1", "127" }); region.parseOpcode({ "on_hicc1", "127" }); - Layer layer { ®ion, midiState }; + Layer layer { region, midiState }; REQUIRE(!layer.registerCC(1, 126_norm)); REQUIRE(!layer.registerCC(2, 127_norm)); REQUIRE(layer.registerCC(1, 127_norm)); @@ -162,7 +162,7 @@ TEST_CASE("Basic triggers", "Region triggers") region.parseOpcode({ "on_locc1", "127" }); region.parseOpcode({ "on_hicc1", "127" }); region.parseOpcode({ "key", "-1" }); - Layer layer { ®ion, midiState }; + Layer layer { region, midiState }; REQUIRE(!layer.registerCC(1, 126_norm)); REQUIRE(layer.registerCC(1, 127_norm)); REQUIRE(!layer.registerNoteOn(64, 127_norm, 0.5f)); @@ -174,7 +174,7 @@ TEST_CASE("Basic triggers", "Region triggers") region.parseOpcode({ "on_locc1", "127" }); region.parseOpcode({ "on_hicc1", "127" }); region.parseOpcode({ "hikey", "-1" }); - Layer layer { ®ion, midiState }; + Layer layer { region, midiState }; REQUIRE(!layer.registerCC(1, 126_norm)); REQUIRE(!layer.registerCC(2, 127_norm)); REQUIRE(layer.registerCC(1, 127_norm)); @@ -192,7 +192,7 @@ TEST_CASE("Legato triggers", "Region triggers") region.parseOpcode({ "lokey", "40" }); region.parseOpcode({ "hikey", "50" }); region.parseOpcode({ "trigger", "first" }); - Layer layer { ®ion, midiState }; + Layer layer { region, midiState }; midiState.noteOnEvent(0, 40, 64_norm); REQUIRE(layer.registerNoteOn(40, 64_norm, 0.5f)); midiState.noteOnEvent(0, 41, 64_norm); @@ -210,7 +210,7 @@ TEST_CASE("Legato triggers", "Region triggers") region.parseOpcode({ "lokey", "40" }); region.parseOpcode({ "hikey", "50" }); region.parseOpcode({ "trigger", "legato" }); - Layer layer { ®ion, midiState }; + Layer layer { region, midiState }; midiState.noteOnEvent(0, 40, 64_norm); REQUIRE(!layer.registerNoteOn(40, 64_norm, 0.5f)); midiState.noteOnEvent(0, 41, 64_norm);