xref: /aosp_15_r20/system/media/audio_utils/tests/channels_tests.cpp (revision b9df5ad1c9ac98a7fefaac271a55f7ae3db05414)
1*b9df5ad1SAndroid Build Coastguard Worker /*
2*b9df5ad1SAndroid Build Coastguard Worker  * Copyright (C) 2017 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 <math.h>
18*b9df5ad1SAndroid Build Coastguard Worker #include <vector>
19*b9df5ad1SAndroid Build Coastguard Worker 
20*b9df5ad1SAndroid Build Coastguard Worker #include <gtest/gtest.h>
21*b9df5ad1SAndroid Build Coastguard Worker 
22*b9df5ad1SAndroid Build Coastguard Worker #include <audio_utils/channels.h>
23*b9df5ad1SAndroid Build Coastguard Worker 
24*b9df5ad1SAndroid Build Coastguard Worker // TODO: Make a common include file for helper functions.
25*b9df5ad1SAndroid Build Coastguard Worker 
26*b9df5ad1SAndroid Build Coastguard Worker template<typename T>
checkMonotone(const T * ary,size_t size)27*b9df5ad1SAndroid Build Coastguard Worker void checkMonotone(const T *ary, size_t size)
28*b9df5ad1SAndroid Build Coastguard Worker {
29*b9df5ad1SAndroid Build Coastguard Worker     for (size_t i = 1; i < size; ++i) {
30*b9df5ad1SAndroid Build Coastguard Worker         EXPECT_LT(ary[i-1], ary[i]);
31*b9df5ad1SAndroid Build Coastguard Worker     }
32*b9df5ad1SAndroid Build Coastguard Worker }
33*b9df5ad1SAndroid Build Coastguard Worker 
34*b9df5ad1SAndroid Build Coastguard Worker template<typename T>
checkUnsignedMonotoneOrZero(const T * ary,size_t size)35*b9df5ad1SAndroid Build Coastguard Worker void checkUnsignedMonotoneOrZero(const T *ary, size_t size)
36*b9df5ad1SAndroid Build Coastguard Worker {
37*b9df5ad1SAndroid Build Coastguard Worker     if (size == 0) return;
38*b9df5ad1SAndroid Build Coastguard Worker 
39*b9df5ad1SAndroid Build Coastguard Worker     T least = ary[0];
40*b9df5ad1SAndroid Build Coastguard Worker     for (size_t i = 1; i < size; ++i) {
41*b9df5ad1SAndroid Build Coastguard Worker         if (ary[i]) {
42*b9df5ad1SAndroid Build Coastguard Worker             EXPECT_LT(least, ary[i]);
43*b9df5ad1SAndroid Build Coastguard Worker             least = ary[i];
44*b9df5ad1SAndroid Build Coastguard Worker         }
45*b9df5ad1SAndroid Build Coastguard Worker     }
46*b9df5ad1SAndroid Build Coastguard Worker }
47*b9df5ad1SAndroid Build Coastguard Worker 
48*b9df5ad1SAndroid Build Coastguard Worker template<typename T>
expectEq(const T & c1,const T & c2)49*b9df5ad1SAndroid Build Coastguard Worker void expectEq(const T &c1, const T &c2) {
50*b9df5ad1SAndroid Build Coastguard Worker     EXPECT_EQ(c1.size(), c2.size());
51*b9df5ad1SAndroid Build Coastguard Worker     EXPECT_EQ(0, memcmp(c1.data(), c2.data(), sizeof(c1[0]) * std::min(c1.size(), c2.size())));
52*b9df5ad1SAndroid Build Coastguard Worker }
53*b9df5ad1SAndroid Build Coastguard Worker 
TEST(audio_utils_channels,geometry_constexpr)54*b9df5ad1SAndroid Build Coastguard Worker TEST(audio_utils_channels, geometry_constexpr) {
55*b9df5ad1SAndroid Build Coastguard Worker     using namespace android::audio_utils::channels;
56*b9df5ad1SAndroid Build Coastguard Worker     // fails to compile if not const.
57*b9df5ad1SAndroid Build Coastguard Worker     constexpr size_t RIGHT_IDX = 1;  // bit position of AUDIO_CHANNEL_OUT_FRONT_RIGHT;
58*b9df5ad1SAndroid Build Coastguard Worker     static constexpr AUDIO_GEOMETRY_SIDE checkConstexprSide = sideFromChannelIdx(RIGHT_IDX);
59*b9df5ad1SAndroid Build Coastguard Worker     static constexpr AUDIO_GEOMETRY_HEIGHT checkConstexprHeight = heightFromChannelIdx(RIGHT_IDX);
60*b9df5ad1SAndroid Build Coastguard Worker     static constexpr AUDIO_GEOMETRY_DEPTH checkConstexprDepth = depthFromChannelIdx(RIGHT_IDX);
61*b9df5ad1SAndroid Build Coastguard Worker     (void) checkConstexprSide;
62*b9df5ad1SAndroid Build Coastguard Worker     (void) checkConstexprHeight;
63*b9df5ad1SAndroid Build Coastguard Worker     (void) checkConstexprDepth;
64*b9df5ad1SAndroid Build Coastguard Worker 
65*b9df5ad1SAndroid Build Coastguard Worker     static constexpr ssize_t leftIdx = pairIdxFromChannelIdx(RIGHT_IDX);
66*b9df5ad1SAndroid Build Coastguard Worker     ASSERT_EQ(0, leftIdx);
67*b9df5ad1SAndroid Build Coastguard Worker }
68*b9df5ad1SAndroid Build Coastguard Worker 
TEST(audio_utils_channels,geometry_range)69*b9df5ad1SAndroid Build Coastguard Worker TEST(audio_utils_channels, geometry_range) {
70*b9df5ad1SAndroid Build Coastguard Worker     using namespace android::audio_utils::channels;
71*b9df5ad1SAndroid Build Coastguard Worker     for (size_t i = 0; i < FCC_26 + 2 /* sic */; ++i) {
72*b9df5ad1SAndroid Build Coastguard Worker         const AUDIO_GEOMETRY_SIDE side = sideFromChannelIdx(i);
73*b9df5ad1SAndroid Build Coastguard Worker         const AUDIO_GEOMETRY_HEIGHT height = heightFromChannelIdx(i);
74*b9df5ad1SAndroid Build Coastguard Worker         const AUDIO_GEOMETRY_DEPTH depth = depthFromChannelIdx(i);
75*b9df5ad1SAndroid Build Coastguard Worker         ASSERT_TRUE(side == AUDIO_GEOMETRY_SIDE_LEFT
76*b9df5ad1SAndroid Build Coastguard Worker                 || side == AUDIO_GEOMETRY_SIDE_RIGHT
77*b9df5ad1SAndroid Build Coastguard Worker                 || side == AUDIO_GEOMETRY_SIDE_CENTER);
78*b9df5ad1SAndroid Build Coastguard Worker         ASSERT_TRUE(height == AUDIO_GEOMETRY_HEIGHT_BOTTOM
79*b9df5ad1SAndroid Build Coastguard Worker                 || height == AUDIO_GEOMETRY_HEIGHT_MIDDLE
80*b9df5ad1SAndroid Build Coastguard Worker                 || height == AUDIO_GEOMETRY_HEIGHT_TOP);
81*b9df5ad1SAndroid Build Coastguard Worker         ASSERT_TRUE(depth == AUDIO_GEOMETRY_DEPTH_FRONT
82*b9df5ad1SAndroid Build Coastguard Worker                 || depth == AUDIO_GEOMETRY_DEPTH_MIDDLE
83*b9df5ad1SAndroid Build Coastguard Worker                 || depth == AUDIO_GEOMETRY_DEPTH_BACK);
84*b9df5ad1SAndroid Build Coastguard Worker     }
85*b9df5ad1SAndroid Build Coastguard Worker }
86*b9df5ad1SAndroid Build Coastguard Worker 
TEST(audio_utils_channels,array_lr_pair_matching)87*b9df5ad1SAndroid Build Coastguard Worker TEST(audio_utils_channels, array_lr_pair_matching) {
88*b9df5ad1SAndroid Build Coastguard Worker     using namespace android::audio_utils::channels;
89*b9df5ad1SAndroid Build Coastguard Worker     for (size_t i = 0; i < FCC_26; ++i) {
90*b9df5ad1SAndroid Build Coastguard Worker         const AUDIO_GEOMETRY_SIDE side = sideFromChannelIdx(i);
91*b9df5ad1SAndroid Build Coastguard Worker         const ssize_t pairIdx = pairIdxFromChannelIdx(i);
92*b9df5ad1SAndroid Build Coastguard Worker         switch (side) {
93*b9df5ad1SAndroid Build Coastguard Worker         case AUDIO_GEOMETRY_SIDE_LEFT:
94*b9df5ad1SAndroid Build Coastguard Worker         case AUDIO_GEOMETRY_SIDE_RIGHT: {
95*b9df5ad1SAndroid Build Coastguard Worker             ASSERT_GE(pairIdx, 0);
96*b9df5ad1SAndroid Build Coastguard Worker             ASSERT_LT(pairIdx, FCC_26);
97*b9df5ad1SAndroid Build Coastguard Worker             const AUDIO_GEOMETRY_SIDE pairSide = side == AUDIO_GEOMETRY_SIDE_LEFT
98*b9df5ad1SAndroid Build Coastguard Worker                     ? AUDIO_GEOMETRY_SIDE_RIGHT : AUDIO_GEOMETRY_SIDE_LEFT;
99*b9df5ad1SAndroid Build Coastguard Worker             ASSERT_EQ(pairSide, sideFromChannelIdx(pairIdx));
100*b9df5ad1SAndroid Build Coastguard Worker         } break;
101*b9df5ad1SAndroid Build Coastguard Worker         case AUDIO_GEOMETRY_SIDE_CENTER:
102*b9df5ad1SAndroid Build Coastguard Worker             ASSERT_EQ(-1, pairIdx);
103*b9df5ad1SAndroid Build Coastguard Worker             break;
104*b9df5ad1SAndroid Build Coastguard Worker         }
105*b9df5ad1SAndroid Build Coastguard Worker     }
106*b9df5ad1SAndroid Build Coastguard Worker }
107*b9df5ad1SAndroid Build Coastguard Worker 
TEST(audio_utils_channels,adjust_channels)108*b9df5ad1SAndroid Build Coastguard Worker TEST(audio_utils_channels, adjust_channels) {
109*b9df5ad1SAndroid Build Coastguard Worker     constexpr size_t size = 65536;
110*b9df5ad1SAndroid Build Coastguard Worker     std::vector<uint16_t> u16ref(size);
111*b9df5ad1SAndroid Build Coastguard Worker     std::vector<uint16_t> u16expand(size * 2);
112*b9df5ad1SAndroid Build Coastguard Worker     std::vector<uint16_t> u16ary(size);
113*b9df5ad1SAndroid Build Coastguard Worker 
114*b9df5ad1SAndroid Build Coastguard Worker     // reference buffer is monotonic.
115*b9df5ad1SAndroid Build Coastguard Worker     for (size_t i = 0; i < u16ref.size(); ++i) {
116*b9df5ad1SAndroid Build Coastguard Worker         u16ref[i] = i;
117*b9df5ad1SAndroid Build Coastguard Worker     }
118*b9df5ad1SAndroid Build Coastguard Worker 
119*b9df5ad1SAndroid Build Coastguard Worker     // expand channels from stereo to quad.
120*b9df5ad1SAndroid Build Coastguard Worker     adjust_channels(
121*b9df5ad1SAndroid Build Coastguard Worker             u16ref.data() /*in_buff*/,
122*b9df5ad1SAndroid Build Coastguard Worker             2 /*in_channels*/,
123*b9df5ad1SAndroid Build Coastguard Worker             u16expand.data() /*out_buff*/,
124*b9df5ad1SAndroid Build Coastguard Worker             4 /*out_channels*/,
125*b9df5ad1SAndroid Build Coastguard Worker             sizeof(u16ref[0]) /*sample_size_in_bytes*/,
126*b9df5ad1SAndroid Build Coastguard Worker             sizeof(u16ref[0]) * u16ref.size() /*num_in_bytes*/);
127*b9df5ad1SAndroid Build Coastguard Worker 
128*b9df5ad1SAndroid Build Coastguard Worker     // expanded buffer must increase (or be zero).
129*b9df5ad1SAndroid Build Coastguard Worker     checkUnsignedMonotoneOrZero(u16expand.data(), u16expand.size());
130*b9df5ad1SAndroid Build Coastguard Worker 
131*b9df5ad1SAndroid Build Coastguard Worker     // contract channels back to stereo.
132*b9df5ad1SAndroid Build Coastguard Worker     adjust_channels(
133*b9df5ad1SAndroid Build Coastguard Worker             u16expand.data() /*in_buff*/,
134*b9df5ad1SAndroid Build Coastguard Worker             4 /*in_channels*/,
135*b9df5ad1SAndroid Build Coastguard Worker             u16ary.data() /*out_buff*/,
136*b9df5ad1SAndroid Build Coastguard Worker             2 /*out_channels*/,
137*b9df5ad1SAndroid Build Coastguard Worker             sizeof(u16expand[0]) /*sample_size_in_bytes*/,
138*b9df5ad1SAndroid Build Coastguard Worker             sizeof(u16expand[0]) * u16expand.size() /*num_in_bytes*/);
139*b9df5ad1SAndroid Build Coastguard Worker 
140*b9df5ad1SAndroid Build Coastguard Worker     // contracted array must be identical to original.
141*b9df5ad1SAndroid Build Coastguard Worker     expectEq(u16ary, u16ref);
142*b9df5ad1SAndroid Build Coastguard Worker }
143*b9df5ad1SAndroid Build Coastguard Worker 
TEST(audio_utils_channels,adjust_selected_channels)144*b9df5ad1SAndroid Build Coastguard Worker TEST(audio_utils_channels, adjust_selected_channels) {
145*b9df5ad1SAndroid Build Coastguard Worker     constexpr size_t size = 65536;
146*b9df5ad1SAndroid Build Coastguard Worker     std::vector<uint16_t> u16ref(size);
147*b9df5ad1SAndroid Build Coastguard Worker     std::vector<uint16_t> u16contract(size / 2);
148*b9df5ad1SAndroid Build Coastguard Worker     std::vector<uint16_t> u16ary(size);
149*b9df5ad1SAndroid Build Coastguard Worker 
150*b9df5ad1SAndroid Build Coastguard Worker     // reference buffer is monotonic.
151*b9df5ad1SAndroid Build Coastguard Worker     for (size_t i = 0; i < u16ref.size(); ++i) {
152*b9df5ad1SAndroid Build Coastguard Worker         u16ref[i] = i;
153*b9df5ad1SAndroid Build Coastguard Worker     }
154*b9df5ad1SAndroid Build Coastguard Worker 
155*b9df5ad1SAndroid Build Coastguard Worker     // contract from quad to stereo.
156*b9df5ad1SAndroid Build Coastguard Worker     adjust_selected_channels(
157*b9df5ad1SAndroid Build Coastguard Worker             u16ref.data() /*in_buff*/,
158*b9df5ad1SAndroid Build Coastguard Worker             4 /*in_channels*/,
159*b9df5ad1SAndroid Build Coastguard Worker             u16contract.data() /*out_buff*/,
160*b9df5ad1SAndroid Build Coastguard Worker             2 /*out_channels*/,
161*b9df5ad1SAndroid Build Coastguard Worker             sizeof(u16ref[0]) /*sample_size_in_bytes*/,
162*b9df5ad1SAndroid Build Coastguard Worker             sizeof(u16ref[0]) * u16ref.size() /*num_in_bytes*/);
163*b9df5ad1SAndroid Build Coastguard Worker 
164*b9df5ad1SAndroid Build Coastguard Worker     // contracted buffer must increase.
165*b9df5ad1SAndroid Build Coastguard Worker     checkMonotone(u16contract.data(), u16contract.size());
166*b9df5ad1SAndroid Build Coastguard Worker 
167*b9df5ad1SAndroid Build Coastguard Worker     // initialize channels 3 and 4 of final comparison array.
168*b9df5ad1SAndroid Build Coastguard Worker     for (size_t i = 0; i < u16ary.size() / 4; ++i) {
169*b9df5ad1SAndroid Build Coastguard Worker         u16ary[i * 4 + 2] = u16ref[i * 4 + 2];
170*b9df5ad1SAndroid Build Coastguard Worker         u16ary[i * 4 + 3] = u16ref[i * 4 + 3];
171*b9df5ad1SAndroid Build Coastguard Worker     }
172*b9df5ad1SAndroid Build Coastguard Worker 
173*b9df5ad1SAndroid Build Coastguard Worker     // expand stereo into channels 1 and 2 of quad comparison array.
174*b9df5ad1SAndroid Build Coastguard Worker     adjust_selected_channels(
175*b9df5ad1SAndroid Build Coastguard Worker             u16contract.data() /*in_buff*/,
176*b9df5ad1SAndroid Build Coastguard Worker             2 /*in_channels*/,
177*b9df5ad1SAndroid Build Coastguard Worker             u16ary.data() /*out_buff*/,
178*b9df5ad1SAndroid Build Coastguard Worker             4 /*out_channels*/,
179*b9df5ad1SAndroid Build Coastguard Worker             sizeof(u16contract[0]) /*sample_size_in_bytes*/,
180*b9df5ad1SAndroid Build Coastguard Worker             sizeof(u16contract[0]) * u16contract.size() /*num_in_bytes*/);
181*b9df5ad1SAndroid Build Coastguard Worker 
182*b9df5ad1SAndroid Build Coastguard Worker     // comparison array must be identical to original.
183*b9df5ad1SAndroid Build Coastguard Worker     expectEq(u16ary, u16ref);
184*b9df5ad1SAndroid Build Coastguard Worker }
185*b9df5ad1SAndroid Build Coastguard Worker 
TEST(audio_utils_channels,adjust_channels_non_destructive)186*b9df5ad1SAndroid Build Coastguard Worker TEST(audio_utils_channels, adjust_channels_non_destructive) {
187*b9df5ad1SAndroid Build Coastguard Worker     constexpr size_t size = 65536; /* arbitrary large multiple of 8 */
188*b9df5ad1SAndroid Build Coastguard Worker     std::vector<uint16_t> u16ref(size);
189*b9df5ad1SAndroid Build Coastguard Worker     std::vector<uint16_t> u16contracted(size);
190*b9df5ad1SAndroid Build Coastguard Worker     std::vector<uint16_t> u16expanded(size);
191*b9df5ad1SAndroid Build Coastguard Worker     std::vector<uint16_t> u16inout(size);
192*b9df5ad1SAndroid Build Coastguard Worker 
193*b9df5ad1SAndroid Build Coastguard Worker     // Reference buffer increases monotonically.
194*b9df5ad1SAndroid Build Coastguard Worker     // For second test, in/out buffer begins identical to ref.
195*b9df5ad1SAndroid Build Coastguard Worker     for (size_t i = 0; i < u16ref.size(); ++i) {
196*b9df5ad1SAndroid Build Coastguard Worker         u16ref[i] = i;
197*b9df5ad1SAndroid Build Coastguard Worker         u16inout[i] = i;
198*b9df5ad1SAndroid Build Coastguard Worker     }
199*b9df5ad1SAndroid Build Coastguard Worker 
200*b9df5ad1SAndroid Build Coastguard Worker     // *** First test: different in/out buffers ***
201*b9df5ad1SAndroid Build Coastguard Worker 
202*b9df5ad1SAndroid Build Coastguard Worker     // Contract from quad to stereo.
203*b9df5ad1SAndroid Build Coastguard Worker     adjust_channels_non_destructive(
204*b9df5ad1SAndroid Build Coastguard Worker             u16ref.data() /*in_buff*/,
205*b9df5ad1SAndroid Build Coastguard Worker             4 /*in_channels*/,
206*b9df5ad1SAndroid Build Coastguard Worker             u16contracted.data() /*out_buff*/,
207*b9df5ad1SAndroid Build Coastguard Worker             2 /*out_channels*/,
208*b9df5ad1SAndroid Build Coastguard Worker             sizeof(u16ref[0]) /*sample_size_in_bytes*/,
209*b9df5ad1SAndroid Build Coastguard Worker             sizeof(u16ref[0]) * u16ref.size() /*num_in_bytes*/);
210*b9df5ad1SAndroid Build Coastguard Worker 
211*b9df5ad1SAndroid Build Coastguard Worker     // Each half of contracted buffer should increase monotonically.
212*b9df5ad1SAndroid Build Coastguard Worker     checkMonotone(u16contracted.data(), u16contracted.size() / 2);
213*b9df5ad1SAndroid Build Coastguard Worker     checkMonotone(&u16contracted[u16contracted.size() / 2], u16contracted.size() / 2);
214*b9df5ad1SAndroid Build Coastguard Worker 
215*b9df5ad1SAndroid Build Coastguard Worker     // Expand stereo to quad
216*b9df5ad1SAndroid Build Coastguard Worker     adjust_channels_non_destructive(
217*b9df5ad1SAndroid Build Coastguard Worker             u16contracted.data() /*in_buff*/,
218*b9df5ad1SAndroid Build Coastguard Worker             2 /*in_channels*/,
219*b9df5ad1SAndroid Build Coastguard Worker             u16expanded.data() /*out_buff*/,
220*b9df5ad1SAndroid Build Coastguard Worker             4 /*out_channels*/,
221*b9df5ad1SAndroid Build Coastguard Worker             sizeof(u16contracted[0]) /*sample_size_in_bytes*/,
222*b9df5ad1SAndroid Build Coastguard Worker             sizeof(u16contracted[0]) * (u16contracted.size() / 2) /*num_in_bytes*/);
223*b9df5ad1SAndroid Build Coastguard Worker 
224*b9df5ad1SAndroid Build Coastguard Worker     // Comparison array must be identical to reference.
225*b9df5ad1SAndroid Build Coastguard Worker     expectEq(u16expanded, u16ref);
226*b9df5ad1SAndroid Build Coastguard Worker 
227*b9df5ad1SAndroid Build Coastguard Worker     // *** Second test: in_buff == out_buff ***
228*b9df5ad1SAndroid Build Coastguard Worker 
229*b9df5ad1SAndroid Build Coastguard Worker     // Contract from eight channels to stereo.
230*b9df5ad1SAndroid Build Coastguard Worker     adjust_channels_non_destructive(
231*b9df5ad1SAndroid Build Coastguard Worker             u16inout.data() /*in_buff*/,
232*b9df5ad1SAndroid Build Coastguard Worker             8 /*in_channels*/,
233*b9df5ad1SAndroid Build Coastguard Worker             u16inout.data() /*out_buff*/,
234*b9df5ad1SAndroid Build Coastguard Worker             2 /*out_channels*/,
235*b9df5ad1SAndroid Build Coastguard Worker             sizeof(u16inout[0]) /*sample_size_in_bytes*/,
236*b9df5ad1SAndroid Build Coastguard Worker             sizeof(u16inout[0]) * u16inout.size() /*num_in_bytes*/);
237*b9df5ad1SAndroid Build Coastguard Worker 
238*b9df5ad1SAndroid Build Coastguard Worker     // Each section [1/4][3/4] of contracted buffer should increase monotonically.
239*b9df5ad1SAndroid Build Coastguard Worker     checkMonotone(u16inout.data(), u16inout.size() / 4);
240*b9df5ad1SAndroid Build Coastguard Worker     checkMonotone(&u16inout[u16inout.size() / 4], (u16inout.size() * 3) / 4);
241*b9df5ad1SAndroid Build Coastguard Worker 
242*b9df5ad1SAndroid Build Coastguard Worker     // Expand stereo to eight channels.
243*b9df5ad1SAndroid Build Coastguard Worker     adjust_channels_non_destructive(
244*b9df5ad1SAndroid Build Coastguard Worker             u16inout.data() /*in_buff*/,
245*b9df5ad1SAndroid Build Coastguard Worker             2 /*in_channels*/,
246*b9df5ad1SAndroid Build Coastguard Worker             u16inout.data() /*out_buff*/,
247*b9df5ad1SAndroid Build Coastguard Worker             8 /*out_channels*/,
248*b9df5ad1SAndroid Build Coastguard Worker             sizeof(u16inout[0]) /*sample_size_in_bytes*/,
249*b9df5ad1SAndroid Build Coastguard Worker             sizeof(u16inout[0]) * (u16inout.size() / 4) /*num_in_bytes*/);
250*b9df5ad1SAndroid Build Coastguard Worker 
251*b9df5ad1SAndroid Build Coastguard Worker     // Comparison array must be identical to reference.
252*b9df5ad1SAndroid Build Coastguard Worker     expectEq(u16inout, u16ref);
253*b9df5ad1SAndroid Build Coastguard Worker }
254