NAP
sequenceplayercurveadapter.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 // local includes
8 #include "sequenceplayer.h"
9 #include "sequenceplayeradapter.h"
10 #include "sequenceplayercurveoutput.h"
11 #include "sequencetrackcurve.h"
12 
13 // nap includes
14 #include <nap/logger.h>
15 #include <parametervec.h>
16 #include <parameternumeric.h>
17 
18 namespace nap
19 {
21 
27  {
29  private:
30  virtual void setValue() = 0;
31  };
32 
39  template<typename CURVE_TYPE, typename PARAMETER_TYPE, typename PARAMETER_VALUE_TYPE>
41  {
42  public:
49  : mParameter(static_cast<PARAMETER_TYPE&>(*output.mParameter.get())), mOutput(output) {
50  assert(track.get_type().is_derived_from(RTTI_OF(SequenceTrackCurve<CURVE_TYPE>)));
51  mTrack = static_cast<const SequenceTrackCurve<CURVE_TYPE>*>(&track);
52 
53  if(mOutput.mUseMainThread)
54  {
55  mSetFunction = &SequencePlayerCurveAdapter::storeParameterValue;
56  mOutput.registerAdapter(this);
57  } else
58  {
59  mSetFunction = &SequencePlayerCurveAdapter::setParameterValue;
60  }
61 
62  mStoredValue = mParameter.mValue;
63  }
64 
65 
69  void destroy() override
70  {
71  mOutput.removeAdapter(this);
72  }
73 
74 
79  void tick(double time) override
80  {
81  for(const auto &segment: mTrack->mSegments)
82  {
83  if(time >= segment->mStartTime && time < segment->mStartTime + segment->mDuration)
84  {
85  // get the segment we need
86  assert(segment.get()->get_type().is_derived_from(RTTI_OF(SequenceTrackSegmentCurve<CURVE_TYPE>)));
87  const auto &source = static_cast<const SequenceTrackSegmentCurve<CURVE_TYPE>&>(*segment.get());
88 
89  // retrieve the source value
90  CURVE_TYPE source_value = source.getValue((time - source.mStartTime) / source.mDuration);
91 
92  // cast it to a parameter value
93  auto value = static_cast<PARAMETER_VALUE_TYPE>(
94  source_value * (mTrack->mMaximum - mTrack->mMinimum) + mTrack->mMinimum);
95 
96  // call set or store function
97  (*this.*mSetFunction)(value);
98 
99  break;
100  }
101  }
102  }
103 
104 
105  private:
109  void setValue() override
110  {
111  std::unique_lock<std::mutex> l(mMutex);
112  mParameter.setValue(mStoredValue);
113  }
114 
115 
120  void setParameterValue(PARAMETER_VALUE_TYPE& value)
121  {
122  mParameter.setValue(value);
123  }
124 
125 
130  void storeParameterValue(PARAMETER_VALUE_TYPE& value)
131  {
132  std::unique_lock<std::mutex> l(mMutex);
133  mStoredValue = value;
134  }
135 
136 
137  PARAMETER_TYPE& mParameter;
138  const SequenceTrackCurve<CURVE_TYPE>* mTrack;
139  bool mUseMainThread{};
140  SequencePlayerCurveOutput& mOutput;
141  std::mutex mMutex;
142  PARAMETER_VALUE_TYPE mStoredValue;
143 
144  void (SequencePlayerCurveAdapter::* mSetFunction)(PARAMETER_VALUE_TYPE& value);
145  };
146 }
nap::uniform::value
constexpr const char * value
Definition: uniform.h:23
nap::SequenceTrackSegmentCurve
Definition: sequencetracksegmentcurve.h:19
nap::SequencePlayerCurveOutput
Definition: sequenceplayercurveoutput.h:25
nap::SequencePlayerAdapter
Definition: sequenceplayeradapter.h:26
nap::SequencePlayerCurveAdapterBase
Definition: sequenceplayercurveadapter.h:26
nap::SequenceTrack
Definition: sequencetrack.h:22
nap::SequencePlayerCurveAdapter::SequencePlayerCurveAdapter
SequencePlayerCurveAdapter(const SequenceTrack &track, SequencePlayerCurveOutput &output)
Definition: sequenceplayercurveadapter.h:48
nap::SequenceTrackCurve< CURVE_TYPE >
nap::SequenceTrackSegmentCurve::getValue
T getValue(float pos) const
nap::SequenceTrackCurve::mMaximum
T mMaximum
Property: 'Maximum' maximum value of track.
Definition: sequencetrackcurve.h:44
nap::SequencePlayerCurveAdapterBase::SequencePlayerCurveOutput
friend class SequencePlayerCurveOutput
Definition: sequenceplayercurveadapter.h:28
nap::SequenceTrack::mSegments
std::vector< ResourcePtr< SequenceTrackSegment > > mSegments
Property: 'Segments' Vector holding track segments.
Definition: sequencetrack.h:33
nap::SequencePlayerCurveOutput::removeAdapter
void removeAdapter(SequencePlayerCurveAdapterBase *curveAdapter)
nap::SequenceTrackCurve::mMinimum
T mMinimum
Property: 'Minimum' minimum value of track.
Definition: sequencetrackcurve.h:45
nap
Definition: templateapp.h:17
nap::SequencePlayerCurveOutput::mUseMainThread
bool mUseMainThread
Property: 'Use Main Thread' update in main thread or player thread.
Definition: sequenceplayercurveoutput.h:33
nap::SequencePlayerCurveAdapter
Definition: sequenceplayercurveadapter.h:40
nap::SequencePlayerCurveAdapter::tick
void tick(double time) override
Definition: sequenceplayercurveadapter.h:79
nap::SequencePlayerCurveOutput::registerAdapter
void registerAdapter(SequencePlayerCurveAdapterBase *curveAdapter)
nap::SequencePlayerCurveAdapter::destroy
void destroy() override
Definition: sequenceplayercurveadapter.h:69