xref: /aosp_15_r20/external/oboe/src/flowgraph/RampLinear.h (revision 05767d913155b055644481607e6fa1e35e2fe72c)
1*05767d91SRobert Wu /*
2*05767d91SRobert Wu  * Copyright 2015 The Android Open Source Project
3*05767d91SRobert Wu  *
4*05767d91SRobert Wu  * Licensed under the Apache License, Version 2.0 (the "License");
5*05767d91SRobert Wu  * you may not use this file except in compliance with the License.
6*05767d91SRobert Wu  * You may obtain a copy of the License at
7*05767d91SRobert Wu  *
8*05767d91SRobert Wu  *      http://www.apache.org/licenses/LICENSE-2.0
9*05767d91SRobert Wu  *
10*05767d91SRobert Wu  * Unless required by applicable law or agreed to in writing, software
11*05767d91SRobert Wu  * distributed under the License is distributed on an "AS IS" BASIS,
12*05767d91SRobert Wu  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*05767d91SRobert Wu  * See the License for the specific language governing permissions and
14*05767d91SRobert Wu  * limitations under the License.
15*05767d91SRobert Wu  */
16*05767d91SRobert Wu 
17*05767d91SRobert Wu #ifndef FLOWGRAPH_RAMP_LINEAR_H
18*05767d91SRobert Wu #define FLOWGRAPH_RAMP_LINEAR_H
19*05767d91SRobert Wu 
20*05767d91SRobert Wu #include <atomic>
21*05767d91SRobert Wu #include <unistd.h>
22*05767d91SRobert Wu #include <sys/types.h>
23*05767d91SRobert Wu 
24*05767d91SRobert Wu #include "FlowGraphNode.h"
25*05767d91SRobert Wu 
26*05767d91SRobert Wu namespace FLOWGRAPH_OUTER_NAMESPACE::flowgraph {
27*05767d91SRobert Wu 
28*05767d91SRobert Wu /**
29*05767d91SRobert Wu  * When the target is modified then the output will ramp smoothly
30*05767d91SRobert Wu  * between the original and the new target value.
31*05767d91SRobert Wu  * This can be used to smooth out control values and reduce pops.
32*05767d91SRobert Wu  *
33*05767d91SRobert Wu  * The target may be updated while a ramp is in progress, which will trigger
34*05767d91SRobert Wu  * a new ramp from the current value.
35*05767d91SRobert Wu  */
36*05767d91SRobert Wu class RampLinear : public FlowGraphFilter {
37*05767d91SRobert Wu public:
38*05767d91SRobert Wu     explicit RampLinear(int32_t channelCount);
39*05767d91SRobert Wu 
40*05767d91SRobert Wu     virtual ~RampLinear() = default;
41*05767d91SRobert Wu 
42*05767d91SRobert Wu     int32_t onProcess(int32_t numFrames) override;
43*05767d91SRobert Wu 
44*05767d91SRobert Wu     /**
45*05767d91SRobert Wu      * This is used for the next ramp.
46*05767d91SRobert Wu      * Calling this does not affect a ramp that is in progress.
47*05767d91SRobert Wu      */
48*05767d91SRobert Wu     void setLengthInFrames(int32_t frames);
49*05767d91SRobert Wu 
getLengthInFrames()50*05767d91SRobert Wu     int32_t getLengthInFrames() const {
51*05767d91SRobert Wu         return mLengthInFrames;
52*05767d91SRobert Wu     }
53*05767d91SRobert Wu 
54*05767d91SRobert Wu     /**
55*05767d91SRobert Wu      * This may be safely called by another thread.
56*05767d91SRobert Wu      * @param target
57*05767d91SRobert Wu      */
58*05767d91SRobert Wu     void setTarget(float target);
59*05767d91SRobert Wu 
getTarget()60*05767d91SRobert Wu     float getTarget() const {
61*05767d91SRobert Wu         return mTarget.load();
62*05767d91SRobert Wu     }
63*05767d91SRobert Wu 
64*05767d91SRobert Wu     /**
65*05767d91SRobert Wu      * Force the nextSegment to start from this level.
66*05767d91SRobert Wu      *
67*05767d91SRobert Wu      * WARNING: this can cause a discontinuity if called while the ramp is being used.
68*05767d91SRobert Wu      * Only call this when setting the initial ramp.
69*05767d91SRobert Wu      *
70*05767d91SRobert Wu      * @param level
71*05767d91SRobert Wu      */
forceCurrent(float level)72*05767d91SRobert Wu     void forceCurrent(float level) {
73*05767d91SRobert Wu         mLevelFrom = level;
74*05767d91SRobert Wu         mLevelTo = level;
75*05767d91SRobert Wu     }
76*05767d91SRobert Wu 
getName()77*05767d91SRobert Wu     const char *getName() override {
78*05767d91SRobert Wu         return "RampLinear";
79*05767d91SRobert Wu     }
80*05767d91SRobert Wu 
81*05767d91SRobert Wu private:
82*05767d91SRobert Wu 
83*05767d91SRobert Wu     float interpolateCurrent();
84*05767d91SRobert Wu 
85*05767d91SRobert Wu     std::atomic<float>  mTarget;
86*05767d91SRobert Wu 
87*05767d91SRobert Wu     int32_t             mLengthInFrames  = 48000.0f / 100.0f ; // 10 msec at 48000 Hz;
88*05767d91SRobert Wu     int32_t             mRemaining       = 0;
89*05767d91SRobert Wu     float               mScaler          = 0.0f;
90*05767d91SRobert Wu     float               mLevelFrom       = 0.0f;
91*05767d91SRobert Wu     float               mLevelTo         = 0.0f;
92*05767d91SRobert Wu };
93*05767d91SRobert Wu 
94*05767d91SRobert Wu } /* namespace FLOWGRAPH_OUTER_NAMESPACE::flowgraph */
95*05767d91SRobert Wu 
96*05767d91SRobert Wu #endif //FLOWGRAPH_RAMP_LINEAR_H
97