NAP
controlnode.h
1 /* This Source Code Form is subject to the terms of the Mozilla Public
2  * License, v. 2.0. If a copy of the MPL was not distributed with this
3  * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
4 
5 #pragma once
6 
7 // Std includes
8 #include <atomic>
9 
10 // RTTI includes
11 #include <rtti/rtti.h>
12 
13 // Audio includes
14 #include <audio/utility/rampedvalue.h>
15 #include <audio/utility/translator.h>
16 #include <audio/utility/safeptr.h>
17 #include <audio/core/audionode.h>
18 #include <audio/core/audionodemanager.h>
19 
20 namespace nap
21 {
22  namespace audio
23  {
24 
30  class NAPAPI ControlNode : public Node
31  {
32  RTTI_ENABLE(Node)
33 
34  public:
38  ControlNode(NodeManager& manager);
39 
43  OutputPin output = {this};
44 
48  void setValue(ControllerValue value);
49 
53  ControllerValue getValue() const;
54 
59  { return mCurrentValue; }
60 
67  void ramp(ControllerValue destination, TimeValue time, RampMode mode = RampMode::Linear);
68 
72  bool isRamping() const { return mValue.isRamping(); }
73 
77  void stop();
78 
82  void setTranslator(SafePtr<Translator<ControllerValue>>& translator) { mTranslator = translator; }
83 
87  bool hasTranslator() const { return mTranslator != nullptr; }
88 
93 
94  private:
95  void process() override;
96 
97  void update();
98 
99  // Slot called internally when the destination of a ramp has been reached.
100  nap::Slot<ControllerValue> mDestinationReachedSlot = {this, &ControlNode::destinationReached};
101 
102  void destinationReached(ControllerValue value)
103  {
104  mCurrentValue = value;
105  rampFinishedSignal(*this);
106  }
107 
108  std::atomic<ControllerValue> mNewDestination = {0.f};
109  std::atomic<int> mNewStepCount = {0};
110  std::atomic<RampMode> mNewMode = {RampMode::Linear};
111  DirtyFlag mIsDirty;
112 
113  RampedValue<ControllerValue> mValue = {0.f}; // Current output value of the node.
114  std::atomic<ControllerValue> mCurrentValue = {0.f};
115  SafePtr<Translator<ControllerValue>> mTranslator = nullptr; // Helper object to apply a translation to the output value.
116  };
117 
118  }
119 }
nap::audio::RampMode
RampMode
Definition: audiotypes.h:131
nap::audio::ControlNode::setTranslator
void setTranslator(SafePtr< Translator< ControllerValue >> &translator)
Definition: controlnode.h:82
nap::audio::ControlNode::rampFinishedSignal
nap::Signal< ControlNode & > rampFinishedSignal
Definition: controlnode.h:92
nap::Slot< ControllerValue >
nap::audio::ControlNode
Definition: controlnode.h:30
nap::audio::ControlNode::isRamping
bool isRamping() const
Definition: controlnode.h:72
nap::audio::TimeValue
float TimeValue
Definition: audiotypes.h:119
nap::Signal
Definition: signalslot.h:28
nap::audio::NodeManager
Definition: audionodemanager.h:33
nap::audio::ControllerValue
float ControllerValue
Definition: audiotypes.h:113
nap::audio::OutputPin
Definition: audiopin.h:204
nap::audio::ControlNode::getRawValue
ControllerValue getRawValue() const
Definition: controlnode.h:58
nap::audio::Node
Definition: audionode.h:33
nap
Definition: templateapp.h:17
nap::audio::Translator
Definition: translator.h:25
nap::audio::SafePtr
Definition: safeptr.h:28
nap::audio::ControlNode::hasTranslator
bool hasTranslator() const
Definition: controlnode.h:87