1 /*
2  * Copyright 2017 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #include "LinearRamp.h"
18 
isRamping()19 bool LinearRamp::isRamping() {
20     float target = mTarget.load();
21     if (target != mLevelTo) {
22         // Update target. Continue from previous level.
23         mLevelTo = target;
24         mRemaining = mLengthInFrames;
25         return true;
26     } else {
27         return mRemaining > 0;
28     }
29 }
30 
nextSegment(int32_t frames,float * levelFrom,float * levelTo)31 bool LinearRamp::nextSegment(int32_t frames, float *levelFrom, float *levelTo) {
32     bool ramping = isRamping();
33     *levelFrom = mLevelFrom;
34     if (ramping) {
35         float level;
36         if (frames >= mRemaining) {
37             level = mLevelTo;
38             mRemaining = 0;
39         } else {
40             // Interpolate to a point along the full ramp.
41             level = mLevelFrom + (frames * (mLevelTo - mLevelFrom) / mRemaining);
42             mRemaining -= frames;
43         }
44         mLevelFrom = level; // for next ramp
45         *levelTo = level;
46     } else {
47         *levelTo = mLevelTo;
48     }
49     return ramping;
50 }