1 /*
2 * Copyright (c) 2025 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15 #include <vector>
16 #include <map>
17 #include <gtest/gtest.h>
18 #include "audio_engine_log.h"
19 #include "audio_proresampler.h"
20 #include "audio_stream_info.h"
21 #include "securec.h"
22
23 using namespace testing::ext;
24 using namespace testing;
25
26 namespace OHOS {
27 namespace AudioStandard {
28 namespace HPAE {
29 const static std::vector<uint32_t> TEST_CHANNELS = {MONO, STEREO, CHANNEL_6};
30
31 const static std::map<uint32_t, uint32_t> TEST_SAMPLE_RATE_COMBINATION = { // {input, output} combination
32 {SAMPLE_RATE_24000, SAMPLE_RATE_48000},
33 {SAMPLE_RATE_16000, SAMPLE_RATE_48000},
34 {SAMPLE_RATE_44100, SAMPLE_RATE_192000},
35 {SAMPLE_RATE_48000, SAMPLE_RATE_24000},
36 {SAMPLE_RATE_48000, SAMPLE_RATE_16000},
37 {SAMPLE_RATE_192000, SAMPLE_RATE_44100},
38 };
39
40 constexpr uint32_t INVALID_QUALITY = -1;
41 constexpr uint32_t QUALITY_ONE = 1;
42 constexpr uint32_t FRAME_LEN_20MS = 20;
43 constexpr uint32_t FRAME_LEN_40MS = 40;
44 constexpr uint32_t MS_PER_SECOND = 1000;
45
46 class AudioProResamplerTest : public testing::Test {
47 public:
48 void SetUp();
49 void TearDown();
50 };
51
SetUp()52 void AudioProResamplerTest::SetUp() {}
53
TearDown()54 void AudioProResamplerTest::TearDown() {}
55
56 HWTEST_F(AudioProResamplerTest, InitTest, TestSize.Level0)
57 {
58 // test invalid input
59 int32_t err = RESAMPLER_ERR_SUCCESS;
60 SingleStagePolyphaseResamplerInit(STEREO, SAMPLE_RATE_24000, SAMPLE_RATE_48000, INVALID_QUALITY, &err);
61 EXPECT_EQ(err, RESAMPLER_ERR_INVALID_ARG);
62
63 // test valid input
64 SingleStagePolyphaseResamplerInit(STEREO, SAMPLE_RATE_24000, SAMPLE_RATE_48000, QUALITY_ONE, &err);
65 EXPECT_EQ(err, RESAMPLER_ERR_SUCCESS);
66
67 // test 11025 input
68 ProResampler resampler1(SAMPLE_RATE_11025, SAMPLE_RATE_48000, STEREO, QUALITY_ONE);
69
70 // test other input
71 ProResampler resampler2(SAMPLE_RATE_48000, SAMPLE_RATE_44100, STEREO, QUALITY_ONE);
72 }
73
74 HWTEST_F(AudioProResamplerTest, ProcessTest, TestSize.Level0)
75 {
76 // test all input/output combination
77 for (uint32_t channels: TEST_CHANNELS) {
78 for (auto pair: TEST_SAMPLE_RATE_COMBINATION) {
79 uint32_t inRate = pair.first;
80 uint32_t outRate = pair.second;
81 uint32_t inFrameLen = inRate * FRAME_LEN_20MS / MS_PER_SECOND;
82 uint32_t outFrameLen = outRate * FRAME_LEN_20MS / MS_PER_SECOND;
83 ProResampler resampler(inRate, outRate, channels, QUALITY_ONE);
84 std::vector<float> in(inFrameLen * channels);
85 std::vector<float> out(outFrameLen * channels);
86 int32_t ret = resampler.Process(in.data(), inFrameLen, out.data(), outFrameLen);
87 EXPECT_EQ(ret, EOK);
88 }
89 }
90
91 // test 11025 spetial case
92 ProResampler resampler(SAMPLE_RATE_11025, SAMPLE_RATE_48000, STEREO, QUALITY_ONE);
93 uint32_t inFrameLen = SAMPLE_RATE_11025 * FRAME_LEN_40MS / MS_PER_SECOND;
94 uint32_t outFrameLen = SAMPLE_RATE_48000 * FRAME_LEN_20MS / MS_PER_SECOND;
95 std::vector<float> in(inFrameLen * STEREO);
96 std::vector<float> out(outFrameLen * STEREO);
97 // Process first 40ms frame, send first half of data to output
98 int32_t ret = resampler.Process(in.data(), inFrameLen, out.data(), outFrameLen);
99 EXPECT_EQ(ret, EOK);
100 inFrameLen = 0;
101 // no new data in, send stored 20ms
102 ret = resampler.Process(in.data(), inFrameLen, out.data(), outFrameLen);
103 EXPECT_EQ(ret, EOK);
104 // no data left, send 0s
105 ret = resampler.Process(in.data(), inFrameLen, out.data(), outFrameLen);
106 EXPECT_EQ(ret, EOK);
107 }
108
109 HWTEST_F(AudioProResamplerTest, UpdateRatesTest, TestSize.Level0)
110 {
111 ProResampler resampler(SAMPLE_RATE_48000, SAMPLE_RATE_96000, STEREO, QUALITY_ONE);
112 EXPECT_EQ(resampler.inRate_, SAMPLE_RATE_48000);
113 EXPECT_EQ(resampler.outRate_, SAMPLE_RATE_96000);
114 EXPECT_EQ(resampler.expectedInFrameLen_, SAMPLE_RATE_48000 * FRAME_LEN_20MS / MS_PER_SECOND);
115 EXPECT_EQ(resampler.expectedOutFrameLen_, SAMPLE_RATE_96000 * FRAME_LEN_20MS / MS_PER_SECOND);
116
117 resampler.UpdateRates(SAMPLE_RATE_11025, SAMPLE_RATE_48000);
118 EXPECT_EQ(resampler.inRate_, SAMPLE_RATE_11025);
119 EXPECT_EQ(resampler.outRate_, SAMPLE_RATE_48000);
120 EXPECT_EQ(resampler.expectedInFrameLen_, SAMPLE_RATE_11025 * FRAME_LEN_40MS / MS_PER_SECOND);
121 EXPECT_EQ(resampler.expectedOutFrameLen_, SAMPLE_RATE_48000 * FRAME_LEN_20MS / MS_PER_SECOND);
122 }
123
124 HWTEST_F(AudioProResamplerTest, UpdateChannel, TestSize.Level0)
125 {
126 ProResampler resampler(SAMPLE_RATE_48000, SAMPLE_RATE_96000, STEREO, QUALITY_ONE);
127 EXPECT_EQ(resampler.channels_, STEREO);
128
129 resampler.UpdateChannels(CHANNEL_6);
130 EXPECT_EQ(resampler.channels_, CHANNEL_6);
131 }
132
133 /*
134 * @tc.name : Test UpdateRates API.
135 * @tc.type : FUNC
136 * @tc.number: UpdateRatesTest_01.
137 * @tc.desc : Test UpdateRates, set inRate is 2.
138 */
139 HWTEST_F(AudioProResamplerTest, UpdateRatesTest_01, TestSize.Level0)
140 {
141 ProResampler resampler(SAMPLE_RATE_48000, SAMPLE_RATE_96000, STEREO, QUALITY_ONE);
142 EXPECT_EQ(resampler.inRate_, SAMPLE_RATE_48000);
143 EXPECT_EQ(resampler.outRate_, SAMPLE_RATE_96000);
144 EXPECT_EQ(resampler.expectedInFrameLen_, SAMPLE_RATE_48000 * FRAME_LEN_20MS / MS_PER_SECOND);
145 EXPECT_EQ(resampler.expectedOutFrameLen_, SAMPLE_RATE_96000 * FRAME_LEN_20MS / MS_PER_SECOND);
146
147 resampler.UpdateRates(2, SAMPLE_RATE_48000);
148 EXPECT_EQ(resampler.inRate_, 2);
149 EXPECT_EQ(resampler.outRate_, SAMPLE_RATE_48000);
150 EXPECT_EQ(resampler.expectedInFrameLen_, 2 * FRAME_LEN_40MS / MS_PER_SECOND);
151 EXPECT_EQ(resampler.expectedOutFrameLen_, SAMPLE_RATE_48000 * FRAME_LEN_20MS / MS_PER_SECOND);
152 }
153
154 /*
155 * @tc.name : Test ErrCodeToString API.
156 * @tc.type : FUNC
157 * @tc.number: ErrCodeToString_01.
158 * @tc.desc : Test ErrCodeToString, set errCode is RESAMPLER_ERR_SUCCESS.
159 */
160 HWTEST_F(AudioProResamplerTest, ErrCodeToString_01, TestSize.Level0)
161 {
162 ProResampler resampler(SAMPLE_RATE_48000, SAMPLE_RATE_96000, STEREO, QUALITY_ONE);
163
164 std::string ret = resampler.ErrCodeToString(RESAMPLER_ERR_SUCCESS);
165 ASSERT_STREQ(ret.c_str(), "RESAMPLER_ERR_SUCCESS");
166 }
167
168 /*
169 * @tc.name : Test ErrCodeToString API.
170 * @tc.type : FUNC
171 * @tc.number: ErrCodeToString_02.
172 * @tc.desc : Test ErrCodeToString, set errCode is RESAMPLER_ERR_ALLOC_FAILED.
173 */
174 HWTEST_F(AudioProResamplerTest, ErrCodeToString_02, TestSize.Level0)
175 {
176 ProResampler resampler(SAMPLE_RATE_48000, SAMPLE_RATE_96000, STEREO, QUALITY_ONE);
177
178 std::string ret = resampler.ErrCodeToString(RESAMPLER_ERR_ALLOC_FAILED);
179 ASSERT_STREQ(ret.c_str(), "RESAMPLER_ERR_ALLOC_FAILED");
180 }
181
182 /*
183 * @tc.name : Test ErrCodeToString API.
184 * @tc.type : FUNC
185 * @tc.number: ErrCodeToString_03.
186 * @tc.desc : Test ErrCodeToString, set errCode is RESAMPLER_ERR_OVERFLOW.
187 */
188 HWTEST_F(AudioProResamplerTest, ErrCodeToString_03, TestSize.Level0)
189 {
190 ProResampler resampler(SAMPLE_RATE_48000, SAMPLE_RATE_96000, STEREO, QUALITY_ONE);
191
192 std::string ret = resampler.ErrCodeToString(RESAMPLER_ERR_OVERFLOW);
193 ASSERT_STREQ(ret.c_str(), "RESAMPLER_ERR_OVERFLOW");
194 }
195
196 /*
197 * @tc.name : Test ErrCodeToString API.
198 * @tc.type : FUNC
199 * @tc.number: ErrCodeToString_04.
200 * @tc.desc : Test ErrCodeToString, set errCode is 7.
201 */
202 HWTEST_F(AudioProResamplerTest, ErrCodeToString_04, TestSize.Level0)
203 {
204 ProResampler resampler(SAMPLE_RATE_48000, SAMPLE_RATE_96000, STEREO, QUALITY_ONE);
205
206 std::string ret = resampler.ErrCodeToString(7);
207 ASSERT_STREQ(ret.c_str(), "Unknown Error Code");
208 }
209
210 /*
211 * @tc.name : Test ErrCodeToString API.
212 * @tc.type : FUNC
213 * @tc.number: ErrCodeToString_05.
214 * @tc.desc : Test ErrCodeToString, set errCode is RESAMPLER_ERR_INVALID_ARG.
215 */
216 HWTEST_F(AudioProResamplerTest, ErrCodeToString_05, TestSize.Level0)
217 {
218 ProResampler resampler(SAMPLE_RATE_48000, SAMPLE_RATE_96000, STEREO, QUALITY_ONE);
219
220 std::string ret = resampler.ErrCodeToString(RESAMPLER_ERR_INVALID_ARG);
221 ASSERT_STREQ(ret.c_str(), "RESAMPLER_ERR_INVALID_ARG");
222 }
223 } // namespace HPAE
224 } // namespace AudioStandard
225 } // namespace OHOS