From e07912f7ce5b01aa6c1df525a11994599e61b790 Mon Sep 17 00:00:00 2001 From: Jean Pierre Cimalando Date: Thu, 11 Jun 2020 23:50:41 +0200 Subject: [PATCH] Implement the identifier in a better and more safe way --- src/sfizz/NumericId.h | 31 +++++++++++++++++++++++++++++++ src/sfizz/Region.h | 9 +++++---- src/sfizz/Synth.cpp | 6 +++--- src/sfizz/Synth.h | 2 +- src/sfizz/Voice.cpp | 4 ++-- src/sfizz/Voice.h | 12 +++++++----- 6 files changed, 49 insertions(+), 15 deletions(-) create mode 100644 src/sfizz/NumericId.h diff --git a/src/sfizz/NumericId.h b/src/sfizz/NumericId.h new file mode 100644 index 00000000..1d975ec0 --- /dev/null +++ b/src/sfizz/NumericId.h @@ -0,0 +1,31 @@ +// SPDX-License-Identifier: BSD-2-Clause + +// This code is part of the sfizz library and is licensed under a BSD 2-clause +// license. You should have receive a LICENSE.md file along with the code. +// If not, contact the sfizz maintainers at https://github.com/sfztools/sfizz + +#pragma once + +/** + * @brief Numeric identifier + * + * It is a generic numeric identifier. The template wrapper serves to enforce a + * stronger compile-time check, such that one kind of identifier can't be + * mistaken for another kind, or for an unrelated integer such as an index. + */ +template +struct NumericId { + constexpr NumericId() = default; + + explicit constexpr NumericId(int number) + : number(number) + { + } + + constexpr bool valid() const noexcept + { + return number != -1; + } + + const int number = -1; +}; diff --git a/src/sfizz/Region.h b/src/sfizz/Region.h index b18b7bd5..ad81f97e 100644 --- a/src/sfizz/Region.h +++ b/src/sfizz/Region.h @@ -16,6 +16,7 @@ #include "AudioBuffer.h" #include "MidiState.h" #include "FileId.h" +#include "NumericId.h" #include "absl/types/optional.h" #include #include @@ -36,7 +37,7 @@ namespace sfz { */ struct Region { Region(int regionNumber, const MidiState& midiState, absl::string_view defaultPath = "") - : regionNumber(regionNumber), midiState(midiState), defaultPath(std::move(defaultPath)) + : id{regionNumber}, midiState(midiState), defaultPath(std::move(defaultPath)) { ccSwitched.set(); @@ -49,9 +50,9 @@ struct Region { /** * @brief Get the number which identifies this region */ - int getIdNumber() const noexcept + NumericId getId() const noexcept { - return regionNumber; + return id; } /** @@ -246,7 +247,7 @@ struct Region { */ float getGainToEffectBus(unsigned number) const noexcept; - const int regionNumber { -1 }; + const NumericId id; // Sound source: sample playback FileId sampleId {}; // Sample diff --git a/src/sfizz/Synth.cpp b/src/sfizz/Synth.cpp index 2c889bf0..c609d3c5 100644 --- a/src/sfizz/Synth.cpp +++ b/src/sfizz/Synth.cpp @@ -44,11 +44,11 @@ sfz::Synth::~Synth() resources.filePool.emptyFileLoadingQueues(); } -void sfz::Synth::onVoiceStateChanged(int idNumber, Voice::State state) +void sfz::Synth::onVoiceStateChanged(NumericId id, Voice::State state) { - (void)idNumber; + (void)id; (void)state; - DBG("Voice " << idNumber << ": state " << static_cast(state)); + DBG("Voice " << id.number << ": state " << static_cast(state)); } void sfz::Synth::onParseFullBlock(const std::string& header, const std::vector& members) diff --git a/src/sfizz/Synth.h b/src/sfizz/Synth.h index 883fedf4..d04a5c96 100644 --- a/src/sfizz/Synth.h +++ b/src/sfizz/Synth.h @@ -497,7 +497,7 @@ protected: /** * @brief The voice callback which is called during a change of state. */ - void onVoiceStateChanged(int idNumber, Voice::State state) override; + void onVoiceStateChanged(NumericId idNumber, Voice::State state) override; protected: /** diff --git a/src/sfizz/Voice.cpp b/src/sfizz/Voice.cpp index fc65892c..37dafdde 100644 --- a/src/sfizz/Voice.cpp +++ b/src/sfizz/Voice.cpp @@ -15,7 +15,7 @@ #include "absl/algorithm/container.h" sfz::Voice::Voice(int voiceNumber, sfz::Resources& resources) -: voiceNumber(voiceNumber), stateListener(nullptr), resources(resources) +: id{voiceNumber}, stateListener(nullptr), resources(resources) { filters.reserve(config::filtersPerVoice); equalizers.reserve(config::eqsPerVoice); @@ -773,6 +773,6 @@ void sfz::Voice::switchState(State s) if (s != state) { state = s; if (stateListener) - stateListener->onVoiceStateChanged(voiceNumber, s); + stateListener->onVoiceStateChanged(id, s); } } diff --git a/src/sfizz/Voice.h b/src/sfizz/Voice.h index 59058c59..515feb12 100644 --- a/src/sfizz/Voice.h +++ b/src/sfizz/Voice.h @@ -14,6 +14,7 @@ #include "AudioSpan.h" #include "LeakDetector.h" #include "OnePoleFilter.h" +#include "NumericId.h" #include "absl/types/span.h" #include #include @@ -41,12 +42,13 @@ public: NoteOff, CC }; + /** - * @brief Get the number which identifies this voice + * @brief Get the unique identifier of this voice in a synth */ - int getIdNumber() const noexcept + NumericId getId() const noexcept { - return voiceNumber; + return id; } enum class State { @@ -56,7 +58,7 @@ public: class StateListener { public: - virtual void onVoiceStateChanged(int /*idNumber*/, State /*state*/) {} + virtual void onVoiceStateChanged(NumericId /*id*/, State /*state*/) {} }; /** @@ -299,7 +301,7 @@ private: */ void switchState(State s); - const int voiceNumber { -1 }; + const NumericId id; StateListener* stateListener = nullptr; Region* region { nullptr };