• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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