blob: 10f031892eeb6be49a3d0ad6be4ffc2a8406172b [file] [log] [blame]
// Copyright (c) 2020 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 <gtest/gtest.h>
extern "C" {
#include "ewma_power.h"
}
namespace {
TEST(EWMAPower, RelativePowerValue) {
struct ewma_power ewma;
int16_t buf[480];
float f;
int i;
for (i = 0; i < 480; i++)
buf[i] = 0x00fe;
ewma_power_init(&ewma, 48000);
EXPECT_EQ(48, ewma.step_fr);
ewma_power_calculate(&ewma, buf, 1, 480);
EXPECT_LT(0.0f, ewma.power);
// After 10ms of silence the power value decreases.
f = ewma.power;
for (i = 0; i < 480; i++)
buf[i] = 0x00;
ewma_power_calculate(&ewma, buf, 1, 480);
EXPECT_LT(ewma.power, f);
// After 300ms of silence the power value decreases to insignificant low.
for (i = 0; i < 30; i++)
ewma_power_calculate(&ewma, buf, 1, 480);
EXPECT_LT(ewma.power, 1.0e-10);
}
TEST(EWMAPower, PowerInStereoData) {
struct ewma_power ewma;
int16_t buf[960];
int i;
float f;
ewma_power_init(&ewma, 48000);
for (i = 0; i < 960; i += 2) {
buf[i] = 0x0;
buf[i + 1] = 0x00fe;
}
ewma_power_calculate(&ewma, buf, 2, 480);
EXPECT_LT(0.0f, ewma.power);
// After 10ms of silence the power value decreases.
f = ewma.power;
for (i = 0; i < 960; i++)
buf[i] = 0x0;
ewma_power_calculate(&ewma, buf, 2, 480);
EXPECT_LT(ewma.power, f);
// After 300ms of silence the power value decreases to insignificant low.
for (i = 0; i < 30; i++)
ewma_power_calculate(&ewma, buf, 2, 480);
EXPECT_LT(ewma.power, 1.0e-10);
// Assume the data is silent in the other channel.
ewma_power_init(&ewma, 48000);
for (i = 0; i < 960; i += 2) {
buf[i] = 0x0ffe;
buf[i + 1] = 0x0;
}
ewma_power_calculate(&ewma, buf, 2, 480);
EXPECT_LT(0.0f, ewma.power);
}
TEST(EWMAPower, PowerInAudioArea) {
struct ewma_power ewma;
struct cras_audio_area* area = cras_audio_area_create(4);
struct cras_audio_format* fmt =
cras_audio_format_create(SND_PCM_FORMAT_S16_LE, 48000, 4);
int8_t layout[CRAS_CH_MAX] = {0, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1};
int16_t buf[1920];
int i;
float f;
cras_audio_format_set_channel_layout(fmt, layout);
cras_audio_area_config_channels(area, fmt);
for (i = 0; i < 1920; i += 4) {
buf[i] = 0x0ffe;
buf[i + 1] = 0x0;
buf[i + 2] = 0x0;
buf[i + 3] = 0x0ffe;
}
ewma_power_init(&ewma, 48000);
ewma_power_calculate_area(&ewma, buf, area, 480);
f = ewma.power;
EXPECT_LT(0.0f, f);
/* Change the layout in the same audio area. Expect the power be lower because
* one of the channel is now silent. */
layout[CRAS_CH_FR] = 2;
cras_audio_format_set_channel_layout(fmt, layout);
cras_audio_area_config_channels(area, fmt);
ewma_power_init(&ewma, 48000);
ewma_power_calculate_area(&ewma, buf, area, 480);
EXPECT_GT(f, ewma.power);
/* Change layout to the two silent channels. Expect power is 0.0f. */
layout[CRAS_CH_FL] = 1;
cras_audio_format_set_channel_layout(fmt, layout);
cras_audio_area_config_channels(area, fmt);
ewma_power_init(&ewma, 48000);
ewma_power_calculate_area(&ewma, buf, area, 480);
EXPECT_EQ(0.0f, ewma.power);
cras_audio_format_destroy(fmt);
cras_audio_area_destroy(area);
}
} // namespace
int main(int argc, char** argv) {
::testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}