1e572f469de5dca1078a79d3d80e5b04f96ae7505Phil Burk/*
2e572f469de5dca1078a79d3d80e5b04f96ae7505Phil Burk * Copyright (C) 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 <iostream>
18e572f469de5dca1078a79d3d80e5b04f96ae7505Phil Burk
19e572f469de5dca1078a79d3d80e5b04f96ae7505Phil Burk#include <gtest/gtest.h>
20e572f469de5dca1078a79d3d80e5b04f96ae7505Phil Burk
21e572f469de5dca1078a79d3d80e5b04f96ae7505Phil Burk#include "utility/AAudioUtilities.h"
22e572f469de5dca1078a79d3d80e5b04f96ae7505Phil Burk#include "utility/LinearRamp.h"
23e572f469de5dca1078a79d3d80e5b04f96ae7505Phil Burk
24e572f469de5dca1078a79d3d80e5b04f96ae7505Phil Burk
25e572f469de5dca1078a79d3d80e5b04f96ae7505Phil BurkTEST(test_linear_ramp, linear_ramp_segments) {
26e572f469de5dca1078a79d3d80e5b04f96ae7505Phil Burk    LinearRamp ramp;
27e572f469de5dca1078a79d3d80e5b04f96ae7505Phil Burk    const float source[4] = {1.0f, 1.0f, 1.0f, 1.0f };
28e572f469de5dca1078a79d3d80e5b04f96ae7505Phil Burk    float destination[4] = {1.0f, 1.0f, 1.0f, 1.0f };
29e572f469de5dca1078a79d3d80e5b04f96ae7505Phil Burk
30e572f469de5dca1078a79d3d80e5b04f96ae7505Phil Burk    float levelFrom = -1.0f;
31e572f469de5dca1078a79d3d80e5b04f96ae7505Phil Burk    float levelTo = -1.0f;
32e572f469de5dca1078a79d3d80e5b04f96ae7505Phil Burk    ramp.setLengthInFrames(8);
33e572f469de5dca1078a79d3d80e5b04f96ae7505Phil Burk    ramp.setTarget(8.0f);
34e572f469de5dca1078a79d3d80e5b04f96ae7505Phil Burk
35e572f469de5dca1078a79d3d80e5b04f96ae7505Phil Burk    ASSERT_EQ(8, ramp.getLengthInFrames());
36e572f469de5dca1078a79d3d80e5b04f96ae7505Phil Burk
37e572f469de5dca1078a79d3d80e5b04f96ae7505Phil Burk    bool ramping = ramp.nextSegment(4, &levelFrom, &levelTo);
38e572f469de5dca1078a79d3d80e5b04f96ae7505Phil Burk    ASSERT_EQ(1, ramping);
39e572f469de5dca1078a79d3d80e5b04f96ae7505Phil Burk    ASSERT_EQ(0.0f, levelFrom);
40e572f469de5dca1078a79d3d80e5b04f96ae7505Phil Burk    ASSERT_EQ(4.0f, levelTo);
41e572f469de5dca1078a79d3d80e5b04f96ae7505Phil Burk
42e572f469de5dca1078a79d3d80e5b04f96ae7505Phil Burk    AAudio_linearRamp(source, destination, 4, 1, levelFrom, levelTo);
43e572f469de5dca1078a79d3d80e5b04f96ae7505Phil Burk    ASSERT_EQ(0.0f, destination[0]);
44e572f469de5dca1078a79d3d80e5b04f96ae7505Phil Burk    ASSERT_EQ(1.0f, destination[1]);
45e572f469de5dca1078a79d3d80e5b04f96ae7505Phil Burk    ASSERT_EQ(2.0f, destination[2]);
46e572f469de5dca1078a79d3d80e5b04f96ae7505Phil Burk    ASSERT_EQ(3.0f, destination[3]);
47e572f469de5dca1078a79d3d80e5b04f96ae7505Phil Burk
48e572f469de5dca1078a79d3d80e5b04f96ae7505Phil Burk    ramping = ramp.nextSegment(4, &levelFrom, &levelTo);
49e572f469de5dca1078a79d3d80e5b04f96ae7505Phil Burk    ASSERT_EQ(1, ramping);
50e572f469de5dca1078a79d3d80e5b04f96ae7505Phil Burk    ASSERT_EQ(4.0f, levelFrom);
51e572f469de5dca1078a79d3d80e5b04f96ae7505Phil Burk    ASSERT_EQ(8.0f, levelTo);
52e572f469de5dca1078a79d3d80e5b04f96ae7505Phil Burk
53e572f469de5dca1078a79d3d80e5b04f96ae7505Phil Burk    AAudio_linearRamp(source, destination, 4, 1, levelFrom, levelTo);
54e572f469de5dca1078a79d3d80e5b04f96ae7505Phil Burk    ASSERT_EQ(4.0f, destination[0]);
55e572f469de5dca1078a79d3d80e5b04f96ae7505Phil Burk    ASSERT_EQ(5.0f, destination[1]);
56e572f469de5dca1078a79d3d80e5b04f96ae7505Phil Burk    ASSERT_EQ(6.0f, destination[2]);
57e572f469de5dca1078a79d3d80e5b04f96ae7505Phil Burk    ASSERT_EQ(7.0f, destination[3]);
58e572f469de5dca1078a79d3d80e5b04f96ae7505Phil Burk
59e572f469de5dca1078a79d3d80e5b04f96ae7505Phil Burk    ramping = ramp.nextSegment(4, &levelFrom, &levelTo);
60e572f469de5dca1078a79d3d80e5b04f96ae7505Phil Burk    ASSERT_EQ(0, ramping);
61e572f469de5dca1078a79d3d80e5b04f96ae7505Phil Burk    ASSERT_EQ(8.0f, levelFrom);
62e572f469de5dca1078a79d3d80e5b04f96ae7505Phil Burk    ASSERT_EQ(8.0f, levelTo);
63e572f469de5dca1078a79d3d80e5b04f96ae7505Phil Burk
64e572f469de5dca1078a79d3d80e5b04f96ae7505Phil Burk    AAudio_linearRamp(source, destination, 4, 1, levelFrom, levelTo);
65e572f469de5dca1078a79d3d80e5b04f96ae7505Phil Burk    ASSERT_EQ(8.0f, destination[0]);
66e572f469de5dca1078a79d3d80e5b04f96ae7505Phil Burk    ASSERT_EQ(8.0f, destination[1]);
67e572f469de5dca1078a79d3d80e5b04f96ae7505Phil Burk    ASSERT_EQ(8.0f, destination[2]);
68e572f469de5dca1078a79d3d80e5b04f96ae7505Phil Burk    ASSERT_EQ(8.0f, destination[3]);
69e572f469de5dca1078a79d3d80e5b04f96ae7505Phil Burk
70e572f469de5dca1078a79d3d80e5b04f96ae7505Phil Burk};
71e572f469de5dca1078a79d3d80e5b04f96ae7505Phil Burk
72e572f469de5dca1078a79d3d80e5b04f96ae7505Phil Burk
73e572f469de5dca1078a79d3d80e5b04f96ae7505Phil BurkTEST(test_linear_ramp, linear_ramp_forced) {
74e572f469de5dca1078a79d3d80e5b04f96ae7505Phil Burk    LinearRamp ramp;
75e572f469de5dca1078a79d3d80e5b04f96ae7505Phil Burk    const float source[4] = {1.0f, 1.0f, 1.0f, 1.0f };
76e572f469de5dca1078a79d3d80e5b04f96ae7505Phil Burk    float destination[4] = {1.0f, 1.0f, 1.0f, 1.0f };
77e572f469de5dca1078a79d3d80e5b04f96ae7505Phil Burk
78e572f469de5dca1078a79d3d80e5b04f96ae7505Phil Burk    float levelFrom = -1.0f;
79e572f469de5dca1078a79d3d80e5b04f96ae7505Phil Burk    float levelTo = -1.0f;
80e572f469de5dca1078a79d3d80e5b04f96ae7505Phil Burk    ramp.setLengthInFrames(4);
81e572f469de5dca1078a79d3d80e5b04f96ae7505Phil Burk    ramp.setTarget(8.0f);
82e572f469de5dca1078a79d3d80e5b04f96ae7505Phil Burk    ramp.forceCurrent(4.0f);
83e572f469de5dca1078a79d3d80e5b04f96ae7505Phil Burk    ASSERT_EQ(4.0f, ramp.getCurrent());
84e572f469de5dca1078a79d3d80e5b04f96ae7505Phil Burk
85e572f469de5dca1078a79d3d80e5b04f96ae7505Phil Burk    bool ramping = ramp.nextSegment(4, &levelFrom, &levelTo);
86e572f469de5dca1078a79d3d80e5b04f96ae7505Phil Burk    ASSERT_EQ(1, ramping);
87e572f469de5dca1078a79d3d80e5b04f96ae7505Phil Burk    ASSERT_EQ(4.0f, levelFrom);
88e572f469de5dca1078a79d3d80e5b04f96ae7505Phil Burk    ASSERT_EQ(8.0f, levelTo);
89e572f469de5dca1078a79d3d80e5b04f96ae7505Phil Burk
90e572f469de5dca1078a79d3d80e5b04f96ae7505Phil Burk    AAudio_linearRamp(source, destination, 4, 1, levelFrom, levelTo);
91e572f469de5dca1078a79d3d80e5b04f96ae7505Phil Burk    ASSERT_EQ(4.0f, destination[0]);
92e572f469de5dca1078a79d3d80e5b04f96ae7505Phil Burk    ASSERT_EQ(5.0f, destination[1]);
93e572f469de5dca1078a79d3d80e5b04f96ae7505Phil Burk    ASSERT_EQ(6.0f, destination[2]);
94e572f469de5dca1078a79d3d80e5b04f96ae7505Phil Burk    ASSERT_EQ(7.0f, destination[3]);
95e572f469de5dca1078a79d3d80e5b04f96ae7505Phil Burk
96e572f469de5dca1078a79d3d80e5b04f96ae7505Phil Burk    ramping = ramp.nextSegment(4, &levelFrom, &levelTo);
97e572f469de5dca1078a79d3d80e5b04f96ae7505Phil Burk    ASSERT_EQ(0, ramping);
98e572f469de5dca1078a79d3d80e5b04f96ae7505Phil Burk    ASSERT_EQ(8.0f, levelFrom);
99e572f469de5dca1078a79d3d80e5b04f96ae7505Phil Burk    ASSERT_EQ(8.0f, levelTo);
100e572f469de5dca1078a79d3d80e5b04f96ae7505Phil Burk
101e572f469de5dca1078a79d3d80e5b04f96ae7505Phil Burk    AAudio_linearRamp(source, destination, 4, 1, levelFrom, levelTo);
102e572f469de5dca1078a79d3d80e5b04f96ae7505Phil Burk    ASSERT_EQ(8.0f, destination[0]);
103e572f469de5dca1078a79d3d80e5b04f96ae7505Phil Burk    ASSERT_EQ(8.0f, destination[1]);
104e572f469de5dca1078a79d3d80e5b04f96ae7505Phil Burk    ASSERT_EQ(8.0f, destination[2]);
105e572f469de5dca1078a79d3d80e5b04f96ae7505Phil Burk    ASSERT_EQ(8.0f, destination[3]);
106e572f469de5dca1078a79d3d80e5b04f96ae7505Phil Burk
107e572f469de5dca1078a79d3d80e5b04f96ae7505Phil Burk};
108e572f469de5dca1078a79d3d80e5b04f96ae7505Phil Burk
109