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  // get the segment we need
84 
85  if(time >= segment->mStartTime)
86  {
87  assert(segment.get()->get_type().is_derived_from(RTTI_OF(SequenceTrackSegmentCurve<CURVE_TYPE>)));
88  const auto &source = static_cast<const SequenceTrackSegmentCurve<CURVE_TYPE>&>(*segment.get());
89 
90  if(time < segment->mStartTime + source.mDuration)
91  {
92  // retrieve the source value
93  CURVE_TYPE source_value = source.getValue((time - source.mStartTime) / source.mDuration);
94 
95  // cast it to a parameter value
96  auto value = static_cast<PARAMETER_VALUE_TYPE>(source_value * (mTrack->mMaximum - mTrack->mMinimum) + mTrack->mMinimum);
97 
98  // call set or store function
99  (*this.*mSetFunction)(value);
100 
101  break;
102  }
103  }
104  }
105  }
106 
107 
108  private:
112  void setValue() override
113  {
114  std::unique_lock<std::mutex> l(mMutex);
115  mParameter.setValue(mStoredValue);
116  }
117 
118 
123  void setParameterValue(PARAMETER_VALUE_TYPE& value)
124  {
125  mParameter.setValue(value);
126  }
127 
128 
133  void storeParameterValue(PARAMETER_VALUE_TYPE& value)
134  {
135  std::unique_lock<std::mutex> l(mMutex);
136  mStoredValue = value;
137  }
138 
139 
140  PARAMETER_TYPE& mParameter;
141  const SequenceTrackCurve<CURVE_TYPE>* mTrack;
142  bool mUseMainThread{};
143  SequencePlayerCurveOutput& mOutput;
144  std::mutex mMutex;
145  PARAMETER_VALUE_TYPE mStoredValue;
146 
147  void (SequencePlayerCurveAdapter::* mSetFunction)(PARAMETER_VALUE_TYPE& value);
148  };
149 }
nap::uniform::value
constexpr const char * value
Definition: uniform.h:23
nap::SequenceTrackSegmentCurve
Definition: sequencetracksegmentcurve.h:35
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