// Copyright 2016 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include <stdio.h>
#include <gtest/gtest.h>
extern "C" {
#include "cras_ramp.c"
}
static int callback_called;
static void *callback_arg;
void ResetStubData() {
callback_called = 0;
callback_arg = NULL;
}
namespace {
TEST(RampTestSuite, Init) {
struct cras_ramp *ramp;
struct cras_ramp_action action;
ResetStubData();
ramp = cras_ramp_create();
action = cras_ramp_get_current_action(ramp);
EXPECT_EQ(action.type, CRAS_RAMP_ACTION_NONE);
EXPECT_FLOAT_EQ(1.0, action.scaler);
EXPECT_FLOAT_EQ(0.0, action.increment);
cras_ramp_destroy(ramp);
}
TEST(RampTestSuite, RampUpInitialIncrement) {
int ramp_up = 1;
int duration_frames = 48000;
float increment = 1.0 / 48000;
cras_ramp *ramp;
cras_ramp_action action;
ResetStubData();
ramp = cras_ramp_create();
cras_ramp_start(ramp, ramp_up, duration_frames, NULL, NULL);
action = cras_ramp_get_current_action(ramp);
EXPECT_EQ(CRAS_RAMP_ACTION_PARTIAL, action.type);
EXPECT_FLOAT_EQ(0.0, action.scaler);
EXPECT_FLOAT_EQ(increment, action.increment);
cras_ramp_destroy(ramp);
}
TEST(RampTestSuite, RampUpUpdateRampedFrames) {
int ramp_up = 1;
int duration_frames = 48000;
float increment = 1.0 / 48000;
int rc;
int ramped_frames = 512;
struct cras_ramp *ramp;
struct cras_ramp_action action;
float scaler = increment * ramped_frames;
ResetStubData();
ramp = cras_ramp_create();
cras_ramp_start(ramp, ramp_up, duration_frames, NULL, NULL);
rc = cras_ramp_update_ramped_frames(ramp, ramped_frames);
action = cras_ramp_get_current_action(ramp);
EXPECT_EQ(rc, 0);
EXPECT_EQ(CRAS_RAMP_ACTION_PARTIAL, action.type);
EXPECT_FLOAT_EQ(scaler, action.scaler);
EXPECT_FLOAT_EQ(increment, action.increment);
cras_ramp_destroy(ramp);
}
TEST(RampTestSuite, RampUpPassedRamp) {
int ramp_up = 1;
int duration_frames = 48000;
int rc;
int ramped_frames = 48000;
struct cras_ramp *ramp;
struct cras_ramp_action action;
ResetStubData();
ramp = cras_ramp_create();
cras_ramp_start(ramp, ramp_up, duration_frames, NULL, NULL);
rc = cras_ramp_update_ramped_frames(ramp, ramped_frames);
action = cras_ramp_get_current_action(ramp);
EXPECT_EQ(0, rc);
EXPECT_EQ(CRAS_RAMP_ACTION_NONE, action.type);
EXPECT_FLOAT_EQ(1.0, action.scaler);
EXPECT_FLOAT_EQ(0.0, action.increment);
cras_ramp_destroy(ramp);
}
TEST(RampTestSuite, RampUpWhileHalfWayRampDown) {
int ramp_up;
int duration_frames = 48000;
int rc;
int ramped_frames = 24000;
struct cras_ramp *ramp;
struct cras_ramp_action action;
float down_increment = -1.0 / 48000;
float up_increment;
float scaler;
ResetStubData();
ramp = cras_ramp_create();
ramp_up = 0;
cras_ramp_start(ramp, ramp_up, duration_frames, NULL, NULL);
rc = cras_ramp_update_ramped_frames(ramp, ramped_frames);
// Get expected current scaler.
scaler = 1 + down_increment * ramped_frames;
// The increment will be calculated by ramping to 1 starting from scaler.
up_increment = (1 - scaler) / 48000;
ramp_up = 1;
cras_ramp_start(ramp, ramp_up, duration_frames, NULL, NULL);
action = cras_ramp_get_current_action(ramp);
EXPECT_EQ(0, rc);
EXPECT_EQ(CRAS_RAMP_ACTION_PARTIAL, action.type);
EXPECT_FLOAT_EQ(scaler, action.scaler);
EXPECT_FLOAT_EQ(up_increment, action.increment);
cras_ramp_destroy(ramp);
}
TEST(RampTestSuite, RampUpWhileHalfWayRampUp) {
int ramp_up;
int duration_frames = 48000;
int rc;
int ramped_frames = 24000;
struct cras_ramp *ramp;
struct cras_ramp_action action;
float first_increment = 1.0 / 48000;
float second_increment;
float scaler;
ResetStubData();
ramp = cras_ramp_create();
ramp_up = 1;
cras_ramp_start(ramp, ramp_up, duration_frames, NULL, NULL);
rc = cras_ramp_update_ramped_frames(ramp, ramped_frames);
// Get expected current scaler.
scaler = first_increment * ramped_frames;
// The increment will be calculated by ramping to 1 starting from scaler.
second_increment = (1 - scaler) / 48000;
ramp_up = 1;
cras_ramp_start(ramp, ramp_up, duration_frames, NULL, NULL);
action = cras_ramp_get_current_action(ramp);
EXPECT_EQ(0, rc);
EXPECT_EQ(CRAS_RAMP_ACTION_PARTIAL, action.type);
EXPECT_FLOAT_EQ(scaler, action.scaler);
EXPECT_FLOAT_EQ(second_increment, action.increment);
cras_ramp_destroy(ramp);
}
TEST(RampTestSuite, RampDownInitialIncrement) {
int ramp_up = 0;
int duration_frames = 48000;
float increment = -1.0 / 48000;
cras_ramp *ramp;
cras_ramp_action action;
ResetStubData();
ramp = cras_ramp_create();
cras_ramp_start(ramp, ramp_up, duration_frames, NULL, NULL);
action = cras_ramp_get_current_action(ramp);
EXPECT_EQ(CRAS_RAMP_ACTION_PARTIAL, action.type);
EXPECT_FLOAT_EQ(1.0, action.scaler);
EXPECT_FLOAT_EQ(increment, action.increment);
cras_ramp_destroy(ramp);
}
TEST(RampTestSuite, RampDownUpdateRampedFrames) {
int ramp_up = 0;
int duration_frames = 48000;
float increment = -1.0 / 48000;
int rc;
int ramped_frames = 512;
struct cras_ramp *ramp;
struct cras_ramp_action action;
float scaler = 1 + increment * ramped_frames;
ResetStubData();
ramp = cras_ramp_create();
cras_ramp_start(ramp, ramp_up, duration_frames, NULL, NULL);
rc = cras_ramp_update_ramped_frames(ramp, ramped_frames);
action = cras_ramp_get_current_action(ramp);
EXPECT_EQ(rc, 0);
EXPECT_EQ(CRAS_RAMP_ACTION_PARTIAL, action.type);
EXPECT_FLOAT_EQ(scaler, action.scaler);
EXPECT_FLOAT_EQ(increment, action.increment);
cras_ramp_destroy(ramp);
}
TEST(RampTestSuite, RampDownPassedRamp) {
int ramp_up = 0;
int duration_frames = 48000;
int rc;
int ramped_frames = 48000;
struct cras_ramp *ramp;
struct cras_ramp_action action;
ResetStubData();
ramp = cras_ramp_create();
cras_ramp_start(ramp, ramp_up, duration_frames, NULL, NULL);
rc = cras_ramp_update_ramped_frames(ramp, ramped_frames);
action = cras_ramp_get_current_action(ramp);
EXPECT_EQ(0, rc);
EXPECT_EQ(CRAS_RAMP_ACTION_NONE, action.type);
EXPECT_FLOAT_EQ(1.0, action.scaler);
EXPECT_FLOAT_EQ(0.0, action.increment);
cras_ramp_destroy(ramp);
}
TEST(RampTestSuite, RampDownWhileHalfWayRampUp) {
int ramp_up;
int duration_frames = 48000;
int rc;
int ramped_frames = 24000;
struct cras_ramp *ramp;
struct cras_ramp_action action;
float up_increment = 1.0 / 48000;
float down_increment;
float scaler;
ResetStubData();
ramp = cras_ramp_create();
// Ramp up first.
ramp_up = 1;
cras_ramp_start(ramp, ramp_up, duration_frames, NULL, NULL);
rc = cras_ramp_update_ramped_frames(ramp, ramped_frames);
// Get expected current scaler.
scaler = up_increment * ramped_frames;
// The increment will be calculated by ramping to 0 starting from scaler.
down_increment = -scaler / duration_frames;
// Ramp down will start from current scaler.
ramp_up = 0;
cras_ramp_start(ramp, ramp_up, duration_frames, NULL, NULL);
action = cras_ramp_get_current_action(ramp);
EXPECT_EQ(0, rc);
EXPECT_EQ(CRAS_RAMP_ACTION_PARTIAL, action.type);
EXPECT_FLOAT_EQ(scaler, action.scaler);
EXPECT_FLOAT_EQ(down_increment, action.increment);
cras_ramp_destroy(ramp);
}
TEST(RampTestSuite, RampDownWhileHalfWayRampDown) {
int ramp_up;
int duration_frames = 48000;
int rc;
int ramped_frames = 24000;
struct cras_ramp *ramp;
struct cras_ramp_action action;
float down_increment = -1.0 / 48000;
float second_down_increment;
float scaler;
ResetStubData();
ramp = cras_ramp_create();
// Ramp down.
ramp_up = 0;
cras_ramp_start(ramp, ramp_up, duration_frames, NULL, NULL);
rc = cras_ramp_update_ramped_frames(ramp, ramped_frames);
// Get expected current scaler.
scaler = 1 + down_increment * ramped_frames;
// The increment will be calculated by ramping to 0 starting from scaler.
second_down_increment = -scaler / duration_frames;
// Ramp down starting from current scaler.
ramp_up = 0;
cras_ramp_start(ramp, ramp_up, duration_frames, NULL, NULL);
action = cras_ramp_get_current_action(ramp);
EXPECT_EQ(0, rc);
EXPECT_EQ(CRAS_RAMP_ACTION_PARTIAL, action.type);
EXPECT_FLOAT_EQ(scaler, action.scaler);
EXPECT_FLOAT_EQ(second_down_increment, action.increment);
cras_ramp_destroy(ramp);
}
void ramp_callback(void *arg) {
callback_called++;
callback_arg = arg;
}
TEST(RampTestSuite, RampUpPassedRampCallback) {
int ramp_up = 1;
int duration_frames = 48000;
int rc;
int ramped_frames = 48000;
struct cras_ramp *ramp;
struct cras_ramp_action action;
void *cb_data = reinterpret_cast<void*>(0x123);
ResetStubData();
ramp = cras_ramp_create();
cras_ramp_start(ramp, ramp_up, duration_frames, ramp_callback, cb_data);
rc = cras_ramp_update_ramped_frames(ramp, ramped_frames);
action = cras_ramp_get_current_action(ramp);
EXPECT_EQ(0, rc);
EXPECT_EQ(CRAS_RAMP_ACTION_NONE, action.type);
EXPECT_FLOAT_EQ(1.0, action.scaler);
EXPECT_FLOAT_EQ(0.0, action.increment);
EXPECT_EQ(1, callback_called);
EXPECT_EQ(cb_data, callback_arg);
cras_ramp_destroy(ramp);
}
TEST(RampTestSuite, RampDownPassedRampCallback) {
int ramp_up = 0;
int duration_frames = 48000;
int rc;
int ramped_frames = 48000;
struct cras_ramp *ramp;
struct cras_ramp_action action;
void *cb_data = reinterpret_cast<void*>(0x123);
ResetStubData();
ramp = cras_ramp_create();
cras_ramp_start(ramp, ramp_up, duration_frames, ramp_callback, cb_data);
rc = cras_ramp_update_ramped_frames(ramp, ramped_frames);
action = cras_ramp_get_current_action(ramp);
EXPECT_EQ(0, rc);
EXPECT_EQ(CRAS_RAMP_ACTION_NONE, action.type);
EXPECT_FLOAT_EQ(1.0, action.scaler);
EXPECT_FLOAT_EQ(0.0, action.increment);
EXPECT_EQ(1, callback_called);
EXPECT_EQ(cb_data, callback_arg);
cras_ramp_destroy(ramp);
}
} // namespace
int main(int argc, char **argv) {
::testing::InitGoogleTest(&argc, argv);
int rc = RUN_ALL_TESTS();
return rc;
}