1*b9df5ad1SAndroid Build Coastguard Worker /*
2*b9df5ad1SAndroid Build Coastguard Worker * Copyright (C) 2021 The Android Open Source Project
3*b9df5ad1SAndroid Build Coastguard Worker *
4*b9df5ad1SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
5*b9df5ad1SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
6*b9df5ad1SAndroid Build Coastguard Worker * You may obtain a copy of the License at
7*b9df5ad1SAndroid Build Coastguard Worker *
8*b9df5ad1SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
9*b9df5ad1SAndroid Build Coastguard Worker *
10*b9df5ad1SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
11*b9df5ad1SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
12*b9df5ad1SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*b9df5ad1SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
14*b9df5ad1SAndroid Build Coastguard Worker * limitations under the License.
15*b9df5ad1SAndroid Build Coastguard Worker */
16*b9df5ad1SAndroid Build Coastguard Worker
17*b9df5ad1SAndroid Build Coastguard Worker #include <audio_utils/Balance.h>
18*b9df5ad1SAndroid Build Coastguard Worker #include <gtest/gtest.h>
19*b9df5ad1SAndroid Build Coastguard Worker #include <vector>
20*b9df5ad1SAndroid Build Coastguard Worker
TEST(audio_utils_balance,stereo)21*b9df5ad1SAndroid Build Coastguard Worker TEST(audio_utils_balance, stereo) {
22*b9df5ad1SAndroid Build Coastguard Worker // disable ramping so we can check single frame processing.
23*b9df5ad1SAndroid Build Coastguard Worker android::audio_utils::Balance balance(false /* ramp */);
24*b9df5ad1SAndroid Build Coastguard Worker ASSERT_EQ(false, balance.getRamp());
25*b9df5ad1SAndroid Build Coastguard Worker
26*b9df5ad1SAndroid Build Coastguard Worker balance.setChannelMask(AUDIO_CHANNEL_OUT_STEREO);
27*b9df5ad1SAndroid Build Coastguard Worker std::vector<float> buffer = {1.f, -1.f};
28*b9df5ad1SAndroid Build Coastguard Worker
29*b9df5ad1SAndroid Build Coastguard Worker // balance of 0 is no change.
30*b9df5ad1SAndroid Build Coastguard Worker ASSERT_EQ(0.f, balance.getBalance());
31*b9df5ad1SAndroid Build Coastguard Worker balance.process(buffer.data(), 1 /* frames */);
32*b9df5ad1SAndroid Build Coastguard Worker ASSERT_EQ((std::vector<float>{1.f, -1.f}), buffer);
33*b9df5ad1SAndroid Build Coastguard Worker
34*b9df5ad1SAndroid Build Coastguard Worker // balance of 1.f is right.
35*b9df5ad1SAndroid Build Coastguard Worker balance.setBalance(1.f);
36*b9df5ad1SAndroid Build Coastguard Worker ASSERT_EQ(1.f, balance.getBalance());
37*b9df5ad1SAndroid Build Coastguard Worker balance.process(buffer.data(), 1 /* frames */);
38*b9df5ad1SAndroid Build Coastguard Worker ASSERT_EQ((std::vector<float>{0.f, -1.f}), buffer);
39*b9df5ad1SAndroid Build Coastguard Worker
40*b9df5ad1SAndroid Build Coastguard Worker // balance of -1.f is left.
41*b9df5ad1SAndroid Build Coastguard Worker buffer = {1.f, -1.f};
42*b9df5ad1SAndroid Build Coastguard Worker balance.setBalance(-1.f); // to left
43*b9df5ad1SAndroid Build Coastguard Worker ASSERT_EQ(-1.f, balance.getBalance());
44*b9df5ad1SAndroid Build Coastguard Worker balance.process(buffer.data(), 1 /* frames */);
45*b9df5ad1SAndroid Build Coastguard Worker ASSERT_EQ((std::vector<float>{1.f, 0.f}), buffer);
46*b9df5ad1SAndroid Build Coastguard Worker }
47*b9df5ad1SAndroid Build Coastguard Worker
48*b9df5ad1SAndroid Build Coastguard Worker TEST(audio_utils_balance, 7point1) {
49*b9df5ad1SAndroid Build Coastguard Worker // disable ramping so we can check single frame processing.
50*b9df5ad1SAndroid Build Coastguard Worker android::audio_utils::Balance balance(false /* ramp */);
51*b9df5ad1SAndroid Build Coastguard Worker ASSERT_EQ(false, balance.getRamp());
52*b9df5ad1SAndroid Build Coastguard Worker
53*b9df5ad1SAndroid Build Coastguard Worker balance.setChannelMask(AUDIO_CHANNEL_OUT_7POINT1);
54*b9df5ad1SAndroid Build Coastguard Worker // FL, FR, FC, LFE, BL, BR, SL, SR
55*b9df5ad1SAndroid Build Coastguard Worker std::vector<float> buffer = {1.f, -1.f, 0.5f, 0.25f, 0.75f, 0.75f, 0.125f, 0.125f};
56*b9df5ad1SAndroid Build Coastguard Worker
57*b9df5ad1SAndroid Build Coastguard Worker // balance of 0 is no change.
58*b9df5ad1SAndroid Build Coastguard Worker ASSERT_EQ(0.f, balance.getBalance());
59*b9df5ad1SAndroid Build Coastguard Worker balance.process(buffer.data(), 1 /* frames */);
60*b9df5ad1SAndroid Build Coastguard Worker ASSERT_EQ((std::vector<float>{1.f, -1.f, 0.5f, 0.25f, 0.75f, 0.75f, 0.125f, 0.125f}), buffer);
61*b9df5ad1SAndroid Build Coastguard Worker
62*b9df5ad1SAndroid Build Coastguard Worker // balance of 1.f is right.
63*b9df5ad1SAndroid Build Coastguard Worker balance.setBalance(1.f);
64*b9df5ad1SAndroid Build Coastguard Worker balance.process(buffer.data(), 1 /* frames */);
65*b9df5ad1SAndroid Build Coastguard Worker ASSERT_EQ((std::vector<float>{0.f, -1.f, 0.5f, 0.25f, 0.f, 0.75f, 0.f, 0.125f}), buffer);
66*b9df5ad1SAndroid Build Coastguard Worker
67*b9df5ad1SAndroid Build Coastguard Worker // balance of -1.f is left.
68*b9df5ad1SAndroid Build Coastguard Worker buffer = {1.f, -1.f, 0.5f, 0.25f, 0.75f, 0.75f, 0.125f, 0.125f};
69*b9df5ad1SAndroid Build Coastguard Worker balance.setBalance(-1.f); // to left
70*b9df5ad1SAndroid Build Coastguard Worker ASSERT_EQ(-1.f, balance.getBalance());
71*b9df5ad1SAndroid Build Coastguard Worker balance.process(buffer.data(), 1 /* frames */);
72*b9df5ad1SAndroid Build Coastguard Worker ASSERT_EQ((std::vector<float>{1.f, 0.f, 0.5f, 0.25f, 0.75f, 0.f, 0.125f, 0.f}), buffer);
73*b9df5ad1SAndroid Build Coastguard Worker }
74*b9df5ad1SAndroid Build Coastguard Worker
TEST(audio_utils_balance,lfe)75*b9df5ad1SAndroid Build Coastguard Worker TEST(audio_utils_balance, lfe) {
76*b9df5ad1SAndroid Build Coastguard Worker // disable ramping so we can check single frame processing.
77*b9df5ad1SAndroid Build Coastguard Worker android::audio_utils::Balance balance(false /* ramp */);
78*b9df5ad1SAndroid Build Coastguard Worker ASSERT_EQ(false, balance.getRamp());
79*b9df5ad1SAndroid Build Coastguard Worker std::vector<float> buffer = {1.f, -1.f};
80*b9df5ad1SAndroid Build Coastguard Worker
81*b9df5ad1SAndroid Build Coastguard Worker // NOTE: single channel falls under mono exception (we ignore balance)
82*b9df5ad1SAndroid Build Coastguard Worker // so we pair with another "center" channel.
83*b9df5ad1SAndroid Build Coastguard Worker // LFE by itself is considered "center".
84*b9df5ad1SAndroid Build Coastguard Worker for (auto channelMask : {
85*b9df5ad1SAndroid Build Coastguard Worker (AUDIO_CHANNEL_OUT_FRONT_CENTER | AUDIO_CHANNEL_OUT_LOW_FREQUENCY),
86*b9df5ad1SAndroid Build Coastguard Worker (AUDIO_CHANNEL_OUT_FRONT_CENTER | AUDIO_CHANNEL_OUT_LOW_FREQUENCY_2),
87*b9df5ad1SAndroid Build Coastguard Worker }) {
88*b9df5ad1SAndroid Build Coastguard Worker balance.setChannelMask((audio_channel_mask_t)channelMask);
89*b9df5ad1SAndroid Build Coastguard Worker
90*b9df5ad1SAndroid Build Coastguard Worker // balance of 0 is no change.
91*b9df5ad1SAndroid Build Coastguard Worker balance.setBalance(0.f);
92*b9df5ad1SAndroid Build Coastguard Worker balance.process(buffer.data(), 1 /* frames */);
93*b9df5ad1SAndroid Build Coastguard Worker ASSERT_EQ((std::vector<float>{1.f, -1.f}), buffer);
94*b9df5ad1SAndroid Build Coastguard Worker
95*b9df5ad1SAndroid Build Coastguard Worker // balance of 1.f is right. (center unaffected)
96*b9df5ad1SAndroid Build Coastguard Worker balance.setBalance(1.f);
97*b9df5ad1SAndroid Build Coastguard Worker balance.process(buffer.data(), 1 /* frames */);
98*b9df5ad1SAndroid Build Coastguard Worker ASSERT_EQ((std::vector<float>{1.f, -1.f}), buffer);
99*b9df5ad1SAndroid Build Coastguard Worker
100*b9df5ad1SAndroid Build Coastguard Worker // balance of -1.f is left. (center unaffected)
101*b9df5ad1SAndroid Build Coastguard Worker balance.setBalance(-1.f);
102*b9df5ad1SAndroid Build Coastguard Worker balance.process(buffer.data(), 1 /* frames */);
103*b9df5ad1SAndroid Build Coastguard Worker ASSERT_EQ((std::vector<float>{1.f, -1.f}), buffer);
104*b9df5ad1SAndroid Build Coastguard Worker }
105*b9df5ad1SAndroid Build Coastguard Worker
106*b9df5ad1SAndroid Build Coastguard Worker // If both LFE and LFE2 are present, we assume L/R.
107*b9df5ad1SAndroid Build Coastguard Worker balance.setChannelMask((audio_channel_mask_t)
108*b9df5ad1SAndroid Build Coastguard Worker (AUDIO_CHANNEL_OUT_LOW_FREQUENCY | AUDIO_CHANNEL_OUT_LOW_FREQUENCY_2));
109*b9df5ad1SAndroid Build Coastguard Worker // balance of 0 is no change.
110*b9df5ad1SAndroid Build Coastguard Worker balance.setBalance(0.f); // to left
111*b9df5ad1SAndroid Build Coastguard Worker balance.process(buffer.data(), 1 /* frames */);
112*b9df5ad1SAndroid Build Coastguard Worker ASSERT_EQ((std::vector<float>{1.f, -1.f}), buffer);
113*b9df5ad1SAndroid Build Coastguard Worker
114*b9df5ad1SAndroid Build Coastguard Worker // balance of 1.f is right.
115*b9df5ad1SAndroid Build Coastguard Worker balance.setBalance(1.f);
116*b9df5ad1SAndroid Build Coastguard Worker balance.process(buffer.data(), 1 /* frames */);
117*b9df5ad1SAndroid Build Coastguard Worker ASSERT_EQ((std::vector<float>{0.f, -1.f}), buffer);
118*b9df5ad1SAndroid Build Coastguard Worker
119*b9df5ad1SAndroid Build Coastguard Worker // balance of -1.f is left.
120*b9df5ad1SAndroid Build Coastguard Worker buffer = {1.f, -1.f};
121*b9df5ad1SAndroid Build Coastguard Worker balance.setBalance(-1.f); // to left
122*b9df5ad1SAndroid Build Coastguard Worker balance.process(buffer.data(), 1 /* frames */);
123*b9df5ad1SAndroid Build Coastguard Worker ASSERT_EQ((std::vector<float>{1.f, 0.f}), buffer);
124*b9df5ad1SAndroid Build Coastguard Worker }
125