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()19bool 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)31bool 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 }