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