blob: 1a6dea4fb63f8cd36a41a16438a51b205b7e55b4 [file] [log] [blame]
// Copyright 2022 The Fuchsia 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 "src/media/audio/lib/processing/channel_strip.h"
#include <gmock/gmock.h>
#include <gtest/gtest.h>
namespace media_audio {
namespace {
using ::testing::AllOf;
using ::testing::Each;
using ::testing::SizeIs;
void ValidateConstruction(const ChannelStrip& strip, int64_t channel_count, int64_t frame_count) {
ASSERT_GT(channel_count, 0);
ASSERT_GT(frame_count, 0);
EXPECT_EQ(strip.channel_count(), channel_count);
EXPECT_EQ(strip.frame_count(), frame_count);
for (auto chan = 0; chan < channel_count; ++chan) {
EXPECT_THAT(strip[chan], AllOf(SizeIs(frame_count), Each(0.0f)));
}
}
TEST(ChannelStripTest, Construction) {
auto num_chans = 1;
auto strip_len = 1;
ChannelStrip data(num_chans, strip_len);
ValidateConstruction(data, num_chans, strip_len);
num_chans = 1;
strip_len = 3;
ChannelStrip data2(num_chans, strip_len);
ValidateConstruction(data2, num_chans, strip_len);
num_chans = 4;
strip_len = 2;
ChannelStrip data3(num_chans, strip_len);
ValidateConstruction(data3, num_chans, strip_len);
}
TEST(ChannelStripTest, SetValues) {
ChannelStrip data(2, 3);
ValidateConstruction(data, 2, 3);
auto channel_0 = data[0];
auto channel_1 = data[1];
data[0][0] = 1.0f;
channel_0[1] = 2.0f;
channel_1[0] = 3.0f;
data[1][1] = 4.0f;
EXPECT_FLOAT_EQ(channel_0[1], 2.0f);
EXPECT_FLOAT_EQ(channel_1[0], 3.0f);
EXPECT_FLOAT_EQ(data[0][0], 1.0f);
EXPECT_FLOAT_EQ(data[0][1], 2.0f);
EXPECT_FLOAT_EQ(data[1][0], 3.0f);
EXPECT_FLOAT_EQ(data[1][1], 4.0f);
}
TEST(ChannelStripTest, Clear) {
ChannelStrip data(2, 2);
ValidateConstruction(data, 2, 2);
auto channel_1 = data[1];
data[0][0] = 1.0f;
data[0][1] = 2.0f;
channel_1[0] = -3.0f;
channel_1[1] = -4.0f;
EXPECT_FLOAT_EQ(channel_1[0], -3.0f);
EXPECT_FLOAT_EQ(channel_1[1], -4.0f);
EXPECT_FLOAT_EQ(data[0][0], 1.0f);
EXPECT_FLOAT_EQ(data[0][1], 2.0f);
EXPECT_FLOAT_EQ(data[1][0], -3.0f);
EXPECT_FLOAT_EQ(data[1][1], -4.0f);
data.Clear();
EXPECT_FLOAT_EQ(channel_1[0], 0.0f);
EXPECT_FLOAT_EQ(channel_1[1], 0.0f);
EXPECT_FLOAT_EQ(data[0][0], 0.0f);
EXPECT_FLOAT_EQ(data[0][1], 0.0f);
EXPECT_FLOAT_EQ(data[1][0], 0.0f);
EXPECT_FLOAT_EQ(data[1][1], 0.0f);
}
TEST(ChannelStripTest, ShiftBy) {
ChannelStrip data(2, 2);
ValidateConstruction(data, 2, 2);
data[0][0] = 1.0f;
data[0][1] = 2.0f;
data[1][0] = -1.0f;
data[1][1] = -2.0f;
EXPECT_FLOAT_EQ(data[0][0], 1.0f);
EXPECT_FLOAT_EQ(data[0][1], 2.0f);
EXPECT_FLOAT_EQ(data[1][0], -1.0f);
EXPECT_FLOAT_EQ(data[1][1], -2.0f);
// Shift by 0, which should have no effect.
data.ShiftBy(0);
EXPECT_FLOAT_EQ(data[0][0], 1.0f);
EXPECT_FLOAT_EQ(data[0][1], 2.0f);
EXPECT_FLOAT_EQ(data[1][0], -1.0f);
EXPECT_FLOAT_EQ(data[1][1], -2.0f);
// Shift by 1, which should shift channels left, adding a single zero at the end.
data.ShiftBy(1);
EXPECT_FLOAT_EQ(data[0][0], 2.0f);
EXPECT_FLOAT_EQ(data[0][1], 0.0f);
EXPECT_FLOAT_EQ(data[1][0], -2.0f);
EXPECT_FLOAT_EQ(data[1][1], 0.0f);
// Reset shifted data, and shift by frame count, which should entirely zero out all channels.
data[0][1] = 3.0f;
data[1][1] = -3.0f;
data.ShiftBy(2);
EXPECT_FLOAT_EQ(data[0][0], 0.0f);
EXPECT_FLOAT_EQ(data[0][1], 0.0f);
EXPECT_FLOAT_EQ(data[1][0], 0.0f);
EXPECT_FLOAT_EQ(data[1][1], 0.0f);
// Reset shifted data, and shift by more than frame count, which should again entirely zero out
// all channels.
data[0][0] = 4.0f;
data[0][1] = 5.0f;
data[1][0] = -4.0f;
data[1][1] = -5.0f;
data.ShiftBy(3);
EXPECT_FLOAT_EQ(data[0][0], 0.0f);
EXPECT_FLOAT_EQ(data[0][1], 0.0f);
EXPECT_FLOAT_EQ(data[1][0], 0.0f);
EXPECT_FLOAT_EQ(data[1][1], 0.0f);
}
} // namespace
} // namespace media_audio