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}