1 /*
2  * Copyright (c) 2023 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 
16 #include <benchmark/benchmark.h>
17 #include <climits>
18 #include <gtest/gtest.h>
19 #include "hdf_base.h"
20 #include "osal_mem.h"
21 #include "v4_0/audio_types.h"
22 #include "v4_0/iaudio_manager.h"
23 #include "v4_0/iaudio_render.h"
24 
25 using namespace std;
26 using namespace testing::ext;
27 
28 namespace {
29 const float MAX_GAINTHRESHOLD = 15.0;
30 const float MIN_GAINTHRESHOLD = 0.0;
31 const int BUFFER_LENTH = 1024 * 16;
32 const int DEEP_BUFFER_RENDER_PERIOD_SIZE = 4 * 1024;
33 const int MOVE_LEFT_NUM = 8;
34 const int32_t AUDIO_RENDER_BUF_TEST = 1024;
35 const int32_t AUDIO_RENDER_CHANNELCOUNT = 2;
36 const int32_t AUDIO_SAMPLE_RATE_48K = 48000;
37 const int32_t MAX_AUDIO_ADAPTER_DESC = 5;
38 const uint64_t DEFAULT_BUFFER_SIZE = 16384;
39 const int32_t ITERATION_FREQUENCY = 100;
40 const int32_t REPETITION_FREQUENCY = 3;
41 const int32_t RANGE_VALUE = 4;
42 const float GAIN_VALUE = 1.0;
43 const float SPEED_VALUE = 2.0;
44 const float VOLUNE_VALUE = 0.2;
45 
46 class AudioRenderBenchmarkTest : public benchmark::Fixture {
47 public:
48     struct IAudioManager *manager_ = nullptr;
49     struct AudioAdapterDescriptor descs_[MAX_AUDIO_ADAPTER_DESC];
50     struct AudioAdapterDescriptor *desc_;
51     struct IAudioAdapter *adapter_ = nullptr;
52     struct IAudioRender *render_ = nullptr;
53     struct AudioDeviceDescriptor devDescRender_ = {};
54     struct AudioSampleAttributes attrsRender_ = {};
55     uint32_t renderId_ = 0;
56     char *devDescriptorName_ = nullptr;
57     uint32_t size_ = MAX_AUDIO_ADAPTER_DESC;
58     virtual void SetUp(const ::benchmark::State &state);
59     virtual void TearDown(const ::benchmark::State &state);
60     uint64_t GetRenderBufferSize();
61     void InitRenderAttrs(struct AudioSampleAttributes &attrs);
62     void InitRenderDevDesc(struct AudioDeviceDescriptor &devDesc);
63     void FreeAdapterElements(struct AudioAdapterDescriptor *dataBlock, bool freeSelf);
64     void ReleaseAllAdapterDescs(struct AudioAdapterDescriptor *descs, uint32_t descsLen);
65 };
66 
GetRenderBufferSize()67 uint64_t AudioRenderBenchmarkTest::GetRenderBufferSize()
68 {
69     int32_t ret = HDF_SUCCESS;
70     uint64_t frameSize = 0;
71     uint64_t frameCount = 0;
72     uint64_t bufferSize = 0;
73 
74     if (render_ == nullptr) {
75         return DEFAULT_BUFFER_SIZE;
76     }
77 
78     ret = render_->GetFrameSize(render_, &frameSize);
79     if (ret != HDF_SUCCESS) {
80         return DEFAULT_BUFFER_SIZE;
81     }
82 
83     ret = render_->GetFrameCount(render_, &frameCount);
84     if (ret != HDF_SUCCESS) {
85         return DEFAULT_BUFFER_SIZE;
86     }
87 
88     bufferSize = frameCount * frameSize;
89     if (bufferSize == 0) {
90         bufferSize = DEFAULT_BUFFER_SIZE;
91     }
92 
93     return bufferSize;
94 }
95 
InitRenderAttrs(struct AudioSampleAttributes & attrs)96 void AudioRenderBenchmarkTest::InitRenderAttrs(struct AudioSampleAttributes &attrs)
97 {
98     attrs.channelCount = AUDIO_RENDER_CHANNELCOUNT;
99     attrs.sampleRate = AUDIO_SAMPLE_RATE_48K;
100     attrs.interleaved = 0;
101     attrs.type = AUDIO_IN_MEDIA;
102     attrs.period = DEEP_BUFFER_RENDER_PERIOD_SIZE;
103     attrs.frameSize = AUDIO_FORMAT_TYPE_PCM_16_BIT * AUDIO_RENDER_CHANNELCOUNT / MOVE_LEFT_NUM;
104     attrs.isBigEndian = false;
105     attrs.isSignedData = true;
106     attrs.startThreshold = DEEP_BUFFER_RENDER_PERIOD_SIZE / (attrs.format * attrs.channelCount / MOVE_LEFT_NUM);
107     attrs.stopThreshold = INT_MAX;
108     attrs.silenceThreshold = BUFFER_LENTH;
109 }
110 
InitRenderDevDesc(struct AudioDeviceDescriptor & devDesc)111 void AudioRenderBenchmarkTest::InitRenderDevDesc(struct AudioDeviceDescriptor &devDesc)
112 {
113     devDesc.pins = PIN_OUT_SPEAKER;
114     devDescriptorName_ = strdup("cardname");
115     devDesc.desc = devDescriptorName_;
116 
117     ASSERT_NE(desc_, nullptr);
118     ASSERT_NE(desc_->ports, nullptr);
119     for (uint32_t index = 0; index < desc_->portsLen; index++) {
120         if (desc_->ports[index].dir == PORT_OUT) {
121             devDesc.portId = desc_->ports[index].portId;
122             return;
123         }
124     }
125 }
126 
FreeAdapterElements(struct AudioAdapterDescriptor * dataBlock,bool freeSelf)127 void AudioRenderBenchmarkTest::FreeAdapterElements(struct AudioAdapterDescriptor *dataBlock, bool freeSelf)
128 {
129     if (dataBlock == nullptr) {
130         return;
131     }
132 
133     OsalMemFree(dataBlock->adapterName);
134 
135     OsalMemFree(dataBlock->ports);
136 
137     if (freeSelf) {
138         OsalMemFree(dataBlock);
139     }
140 }
141 
ReleaseAllAdapterDescs(struct AudioAdapterDescriptor * descs,uint32_t descsLen)142 void AudioRenderBenchmarkTest::ReleaseAllAdapterDescs(struct AudioAdapterDescriptor *descs, uint32_t descsLen)
143 {
144     if (descs == nullptr || descsLen == 0) {
145         return;
146     }
147 
148     for (uint32_t i = 0; i < descsLen; i++) {
149         FreeAdapterElements(&descs[i], false);
150     }
151 }
152 
SetUp(const::benchmark::State & state)153 void AudioRenderBenchmarkTest::SetUp(const ::benchmark::State &state)
154 {
155     manager_ = IAudioManagerGet(false);
156     ASSERT_NE(manager_, nullptr);
157 
158     ASSERT_EQ(HDF_SUCCESS, manager_->GetAllAdapters(manager_, descs_, &size_));
159     ASSERT_NE(descs_, nullptr);
160     EXPECT_GE(MAX_AUDIO_ADAPTER_DESC, size_);
161     desc_ = &descs_[0];
162     ASSERT_EQ(HDF_SUCCESS, manager_->LoadAdapter(manager_, desc_, &adapter_));
163     ASSERT_NE(adapter_, nullptr);
164     InitRenderDevDesc(devDescRender_);
165     InitRenderAttrs(attrsRender_);
166 
167     attrsRender_.format = AUDIO_FORMAT_TYPE_PCM_16_BIT;
168     int32_t ret = adapter_->CreateRender(adapter_, &devDescRender_, &attrsRender_, &render_, &renderId_);
169     if (ret != HDF_SUCCESS) {
170         attrsRender_.format = AUDIO_FORMAT_TYPE_PCM_32_BIT;
171         ASSERT_EQ(HDF_SUCCESS, adapter_->CreateRender(adapter_, &devDescRender_, &attrsRender_, &render_, &renderId_));
172     }
173     ASSERT_NE(render_, nullptr);
174 }
175 
TearDown(const::benchmark::State & state)176 void AudioRenderBenchmarkTest::TearDown(const ::benchmark::State &state)
177 {
178     ASSERT_NE(devDescriptorName_, nullptr);
179     free(devDescriptorName_);
180 
181     if (adapter_ != nullptr) {
182         adapter_->DestroyRender(adapter_, renderId_);
183         render_ = nullptr;
184     }
185     if (manager_ != nullptr) {
186         manager_->UnloadAdapter(manager_, desc_->adapterName);
187         adapter_ = nullptr;
188         ReleaseAllAdapterDescs(descs_, size_);
189 
190         IAudioManagerRelease(manager_, false);
191     }
192 }
193 
BENCHMARK_F(AudioRenderBenchmarkTest,StartAndStop)194 BENCHMARK_F(AudioRenderBenchmarkTest, StartAndStop)(benchmark::State &state)
195 {
196     ASSERT_NE(render_, nullptr);
197     int32_t ret;
198     for (auto _ : state) {
199         ret = render_->Start(render_);
200         EXPECT_EQ(ret, HDF_SUCCESS);
201         ret = render_->Stop(render_);
202         EXPECT_EQ(ret, HDF_SUCCESS);
203     }
204 }
205 
206 BENCHMARK_REGISTER_F(AudioRenderBenchmarkTest, StartAndStop)->
207     Iterations(ITERATION_FREQUENCY)->Repetitions(REPETITION_FREQUENCY)->ReportAggregatesOnly();
208 
BENCHMARK_F(AudioRenderBenchmarkTest,Pause)209 BENCHMARK_F(AudioRenderBenchmarkTest, Pause)(benchmark::State &state)
210 {
211     ASSERT_NE(render_, nullptr);
212     int32_t ret = render_->Start(render_);
213     EXPECT_EQ(ret, HDF_SUCCESS);
214 
215     for (auto _ : state) {
216         ret = render_->Pause(render_);
217         ASSERT_TRUE(ret == HDF_SUCCESS || ret == HDF_ERR_NOT_SUPPORT || ret == HDF_ERR_INVALID_PARAM);
218     }
219 
220     ret = render_->Stop(render_);
221     ASSERT_EQ(ret, HDF_SUCCESS);
222 }
223 
224 BENCHMARK_REGISTER_F(AudioRenderBenchmarkTest, Pause)->
225     Iterations(ITERATION_FREQUENCY)->Repetitions(REPETITION_FREQUENCY)->ReportAggregatesOnly();
226 
BENCHMARK_F(AudioRenderBenchmarkTest,Resume)227 BENCHMARK_F(AudioRenderBenchmarkTest, Resume)(benchmark::State &state)
228 {
229     ASSERT_NE(render_, nullptr);
230     int32_t ret = render_->Start(render_);
231     EXPECT_EQ(ret, HDF_SUCCESS);
232 
233     ret = render_->Pause(render_);
234     ASSERT_TRUE(ret == HDF_SUCCESS || ret == HDF_ERR_NOT_SUPPORT);
235 
236     for (auto _ : state) {
237         ret = render_->Resume(render_);
238         ASSERT_TRUE(ret == HDF_SUCCESS || ret == HDF_ERR_NOT_SUPPORT);
239     }
240 
241     ret = render_->Stop(render_);
242     ASSERT_EQ(ret, HDF_SUCCESS);
243 }
244 
245 BENCHMARK_REGISTER_F(AudioRenderBenchmarkTest, Resume)->
246     Iterations(ITERATION_FREQUENCY)->Repetitions(REPETITION_FREQUENCY)->ReportAggregatesOnly();
247 
BENCHMARK_F(AudioRenderBenchmarkTest,Flush)248 BENCHMARK_F(AudioRenderBenchmarkTest, Flush)(benchmark::State &state)
249 {
250     ASSERT_NE(render_, nullptr);
251     int32_t ret;
252     for (auto _ : state) {
253         ret = render_->Flush(render_);
254         EXPECT_NE(ret, HDF_SUCCESS);
255     }
256 }
257 
258 BENCHMARK_REGISTER_F(AudioRenderBenchmarkTest, Flush)->
259     Iterations(ITERATION_FREQUENCY)->Repetitions(REPETITION_FREQUENCY)->ReportAggregatesOnly();
260 
BENCHMARK_F(AudioRenderBenchmarkTest,TurnStandbyMode)261 BENCHMARK_F(AudioRenderBenchmarkTest, TurnStandbyMode)(benchmark::State &state)
262 {
263     ASSERT_NE(render_, nullptr);
264     int32_t ret;
265     for (auto _ : state) {
266         ret = render_->Start(render_);
267         EXPECT_EQ(ret, HDF_SUCCESS);
268         ret = render_->TurnStandbyMode(render_);
269         EXPECT_EQ(ret, HDF_SUCCESS);
270         render_->Stop(render_);
271     }
272 }
273 
274 BENCHMARK_REGISTER_F(AudioRenderBenchmarkTest, TurnStandbyMode)->
275     Iterations(ITERATION_FREQUENCY)->Repetitions(REPETITION_FREQUENCY)->ReportAggregatesOnly();
276 
BENCHMARK_F(AudioRenderBenchmarkTest,AudioDevDump)277 BENCHMARK_F(AudioRenderBenchmarkTest, AudioDevDump)(benchmark::State &state)
278 {
279     ASSERT_NE(render_, nullptr);
280     int32_t ret;
281     int32_t range = RANGE_VALUE;
282     char pathBuf[] = "/data/RenderDump.log";
283 
284     FILE *file = fopen(pathBuf, "wb+");
285     ASSERT_NE(nullptr, file);
286     int fd = fileno(file);
287     if (fd == -1) {
288         fclose(file);
289         ASSERT_NE(fd, -1);
290     }
291 
292     for (auto _ : state) {
293         ret = render_->AudioDevDump(render_, range, fd);
294         ASSERT_TRUE(ret == HDF_SUCCESS || ret == HDF_ERR_NOT_SUPPORT);
295     }
296     fclose(file);
297 }
298 
299 BENCHMARK_REGISTER_F(AudioRenderBenchmarkTest, AudioDevDump)->
300     Iterations(ITERATION_FREQUENCY)->Repetitions(REPETITION_FREQUENCY)->ReportAggregatesOnly();
301 
BENCHMARK_F(AudioRenderBenchmarkTest,GetFrameSize)302 BENCHMARK_F(AudioRenderBenchmarkTest, GetFrameSize)(benchmark::State &state)
303 {
304     ASSERT_NE(render_, nullptr);
305     int32_t ret;
306     uint64_t frameSize = 0;
307 
308     for (auto _ : state) {
309         ret = render_->GetFrameSize(render_, &frameSize);
310         EXPECT_EQ(ret, HDF_SUCCESS);
311     }
312 }
313 
314 BENCHMARK_REGISTER_F(AudioRenderBenchmarkTest, GetFrameSize)->
315     Iterations(ITERATION_FREQUENCY)->Repetitions(REPETITION_FREQUENCY)->ReportAggregatesOnly();
316 
BENCHMARK_F(AudioRenderBenchmarkTest,GetFrameCount)317 BENCHMARK_F(AudioRenderBenchmarkTest, GetFrameCount)(benchmark::State &state)
318 {
319     ASSERT_NE(render_, nullptr);
320     int32_t ret;
321     uint64_t frameCount = 0;
322 
323     for (auto _ : state) {
324         ret = render_->GetFrameCount(render_, &frameCount);
325         EXPECT_EQ(ret, HDF_SUCCESS);
326     }
327 }
328 
329 BENCHMARK_REGISTER_F(AudioRenderBenchmarkTest, GetFrameCount)->
330     Iterations(ITERATION_FREQUENCY)->Repetitions(REPETITION_FREQUENCY)->ReportAggregatesOnly();
331 
BENCHMARK_F(AudioRenderBenchmarkTest,SetSampleAttributes)332 BENCHMARK_F(AudioRenderBenchmarkTest, SetSampleAttributes)(benchmark::State &state)
333 {
334     ASSERT_NE(render_, nullptr);
335     int32_t ret;
336     struct AudioSampleAttributes attrs = attrsRender_;
337     for (auto _ : state) {
338         ret = render_->SetSampleAttributes(render_, &attrs);
339         EXPECT_EQ(ret, HDF_SUCCESS);
340     }
341 }
342 
343 BENCHMARK_REGISTER_F(AudioRenderBenchmarkTest, SetSampleAttributes)->
344     Iterations(ITERATION_FREQUENCY)->Repetitions(REPETITION_FREQUENCY)->ReportAggregatesOnly();
345 
BENCHMARK_F(AudioRenderBenchmarkTest,GetSampleAttributes)346 BENCHMARK_F(AudioRenderBenchmarkTest, GetSampleAttributes)(benchmark::State &state)
347 {
348     ASSERT_NE(render_, nullptr);
349     int32_t ret;
350     struct AudioSampleAttributes attrs = {};
351 
352     for (auto _ : state) {
353         ret = render_->GetSampleAttributes(render_, &attrs);
354         EXPECT_EQ(ret, HDF_SUCCESS);
355     }
356 }
357 
358 BENCHMARK_REGISTER_F(AudioRenderBenchmarkTest, GetSampleAttributes)->
359     Iterations(ITERATION_FREQUENCY)->Repetitions(REPETITION_FREQUENCY)->ReportAggregatesOnly();
360 
BENCHMARK_F(AudioRenderBenchmarkTest,GetCurrentChannelId)361 BENCHMARK_F(AudioRenderBenchmarkTest, GetCurrentChannelId)(benchmark::State &state)
362 {
363     ASSERT_NE(render_, nullptr);
364     int32_t ret;
365     uint32_t channelId = 0;
366 
367     for (auto _ : state) {
368         ret = render_->GetCurrentChannelId(render_, &channelId);
369         EXPECT_EQ(ret, HDF_SUCCESS);
370     }
371 }
372 
373 BENCHMARK_REGISTER_F(AudioRenderBenchmarkTest, GetCurrentChannelId)->
374     Iterations(ITERATION_FREQUENCY)->Repetitions(REPETITION_FREQUENCY)->ReportAggregatesOnly();
375 
BENCHMARK_F(AudioRenderBenchmarkTest,SelectScene)376 BENCHMARK_F(AudioRenderBenchmarkTest, SelectScene)(benchmark::State &state)
377 {
378     ASSERT_NE(render_, nullptr);
379     int32_t ret;
380     struct AudioSceneDescriptor scene;
381     scene.scene.id = AUDIO_IN_MEDIA;
382     scene.desc.pins = PIN_OUT_SPEAKER;
383     scene.desc.desc = const_cast<char*>("primary");
384 
385     for (auto _ : state) {
386         ret = render_->SelectScene(render_, &scene);
387         EXPECT_EQ(ret, HDF_SUCCESS);
388     }
389 }
390 
391 BENCHMARK_REGISTER_F(AudioRenderBenchmarkTest, SelectScene)->
392     Iterations(ITERATION_FREQUENCY)->Repetitions(REPETITION_FREQUENCY)->ReportAggregatesOnly();
393 
BENCHMARK_F(AudioRenderBenchmarkTest,GetLatency)394 BENCHMARK_F(AudioRenderBenchmarkTest, GetLatency)(benchmark::State &state)
395 {
396     ASSERT_NE(render_, nullptr);
397     int32_t ret;
398     uint32_t ms = 0;
399 
400     for (auto _ : state) {
401         ret = render_->GetLatency(render_, &ms);
402         EXPECT_EQ(ret, HDF_SUCCESS);
403     }
404 }
405 
406 BENCHMARK_REGISTER_F(AudioRenderBenchmarkTest, GetLatency)->
407     Iterations(ITERATION_FREQUENCY)->Repetitions(REPETITION_FREQUENCY)->ReportAggregatesOnly();
408 
BENCHMARK_F(AudioRenderBenchmarkTest,GetRenderPosition)409 BENCHMARK_F(AudioRenderBenchmarkTest, GetRenderPosition)(benchmark::State &state)
410 {
411     ASSERT_NE(render_, nullptr);
412     int32_t ret;
413     uint64_t frames = 0;
414     struct AudioTimeStamp time;
415 
416     for (auto _ : state) {
417         ret = render_->GetRenderPosition(render_, &frames, &time);
418         ASSERT_TRUE(ret == HDF_SUCCESS || ret == HDF_ERR_INVALID_PARAM);
419     }
420 }
421 
422 BENCHMARK_REGISTER_F(AudioRenderBenchmarkTest, GetRenderPosition)->
423     Iterations(ITERATION_FREQUENCY)->Repetitions(REPETITION_FREQUENCY)->ReportAggregatesOnly();
424 
BENCHMARK_F(AudioRenderBenchmarkTest,SetExtraParams)425 BENCHMARK_F(AudioRenderBenchmarkTest, SetExtraParams)(benchmark::State &state)
426 {
427     ASSERT_NE(render_, nullptr);
428     int32_t ret;
429     char keyValueList[AUDIO_RENDER_BUF_TEST] =
430         "attr-route=1;attr-format=32;attr-channels=2;attr-frame-count=82;attr-sampling-rate=48000";
431 
432     for (auto _ : state) {
433         ret = render_->SetExtraParams(render_, keyValueList);
434         EXPECT_EQ(ret, HDF_SUCCESS);
435     }
436 }
437 
438 BENCHMARK_REGISTER_F(AudioRenderBenchmarkTest, SetExtraParams)->
439     Iterations(ITERATION_FREQUENCY)->Repetitions(REPETITION_FREQUENCY)->ReportAggregatesOnly();
440 
BENCHMARK_F(AudioRenderBenchmarkTest,GetExtraParams)441 BENCHMARK_F(AudioRenderBenchmarkTest, GetExtraParams)(benchmark::State &state)
442 {
443     ASSERT_NE(render_, nullptr);
444     int32_t ret;
445     char keyValueList[AUDIO_RENDER_BUF_TEST] = {};
446     uint32_t keyValueListLen = 0;
447 
448     for (auto _ : state) {
449         ret = render_->GetExtraParams(render_, keyValueList, keyValueListLen);
450         EXPECT_NE(ret, HDF_SUCCESS);
451     }
452 }
453 
454 BENCHMARK_REGISTER_F(AudioRenderBenchmarkTest, GetExtraParams)->
455     Iterations(ITERATION_FREQUENCY)->Repetitions(REPETITION_FREQUENCY)->ReportAggregatesOnly();
456 
BENCHMARK_F(AudioRenderBenchmarkTest,SetGain)457 BENCHMARK_F(AudioRenderBenchmarkTest, SetGain)(benchmark::State &state)
458 {
459     ASSERT_NE(render_, nullptr);
460     int32_t ret;
461     float gain = GAIN_VALUE;
462 
463     for (auto _ : state) {
464         ret = render_->SetGain(render_, gain);
465         ASSERT_TRUE(ret == HDF_SUCCESS || ret == HDF_ERR_NOT_SUPPORT);
466     }
467 }
468 
469 BENCHMARK_REGISTER_F(AudioRenderBenchmarkTest, SetGain)->
470     Iterations(ITERATION_FREQUENCY)->Repetitions(REPETITION_FREQUENCY)->ReportAggregatesOnly();
471 
BENCHMARK_F(AudioRenderBenchmarkTest,GetGain)472 BENCHMARK_F(AudioRenderBenchmarkTest, GetGain)(benchmark::State &state)
473 {
474     ASSERT_NE(render_, nullptr);
475     int32_t ret;
476     float gain;
477 
478     for (auto _ : state) {
479         ret = render_->GetGain(render_, &gain);
480         ASSERT_TRUE(ret == HDF_SUCCESS || ret == HDF_ERR_NOT_SUPPORT);
481     }
482 }
483 
484 BENCHMARK_REGISTER_F(AudioRenderBenchmarkTest, GetGain)->
485     Iterations(ITERATION_FREQUENCY)->Repetitions(REPETITION_FREQUENCY)->ReportAggregatesOnly();
486 
BENCHMARK_F(AudioRenderBenchmarkTest,GetGainThreshold)487 BENCHMARK_F(AudioRenderBenchmarkTest, GetGainThreshold)(benchmark::State &state)
488 {
489     ASSERT_NE(render_, nullptr);
490     int32_t ret;
491     float min = 0.0;
492     float max = GAIN_VALUE;
493 
494     for (auto _ : state) {
495         ret = render_->GetGainThreshold(render_, &min, &max);
496         ASSERT_TRUE(ret == HDF_SUCCESS || ret == HDF_ERR_NOT_SUPPORT);
497     }
498     EXPECT_GE(min, MIN_GAINTHRESHOLD);
499     EXPECT_LE(max, MAX_GAINTHRESHOLD);
500 }
501 
502 BENCHMARK_REGISTER_F(AudioRenderBenchmarkTest, GetGainThreshold)->
503     Iterations(ITERATION_FREQUENCY)->Repetitions(REPETITION_FREQUENCY)->ReportAggregatesOnly();
504 
BENCHMARK_F(AudioRenderBenchmarkTest,GetMmapPosition)505 BENCHMARK_F(AudioRenderBenchmarkTest, GetMmapPosition)(benchmark::State &state)
506 {
507     ASSERT_NE(render_, nullptr);
508     int32_t ret;
509     uint64_t frames = 0;
510     struct AudioTimeStamp time;
511     time.tvNSec = 0;
512     time.tvSec = 0;
513 
514     for (auto _ : state) {
515         ret = render_->GetMmapPosition(render_, &frames, &time);
516         ASSERT_TRUE(ret == HDF_SUCCESS || ret == HDF_ERR_NOT_SUPPORT);
517     }
518 }
519 
520 BENCHMARK_REGISTER_F(AudioRenderBenchmarkTest, GetMmapPosition)->
521     Iterations(ITERATION_FREQUENCY)->Repetitions(REPETITION_FREQUENCY)->ReportAggregatesOnly();
522 
BENCHMARK_F(AudioRenderBenchmarkTest,SetMute)523 BENCHMARK_F(AudioRenderBenchmarkTest, SetMute)(benchmark::State &state)
524 {
525     ASSERT_NE(render_, nullptr);
526     int32_t ret;
527     bool mute = false;
528 
529     for (auto _ : state) {
530         ret = render_->SetMute(render_, mute);
531         ASSERT_TRUE(ret == HDF_SUCCESS || ret == HDF_ERR_NOT_SUPPORT);
532     }
533 }
534 
535 BENCHMARK_REGISTER_F(AudioRenderBenchmarkTest, SetMute)->
536     Iterations(ITERATION_FREQUENCY)->Repetitions(REPETITION_FREQUENCY)->ReportAggregatesOnly();
537 
BENCHMARK_F(AudioRenderBenchmarkTest,GetMute)538 BENCHMARK_F(AudioRenderBenchmarkTest, GetMute)(benchmark::State &state)
539 {
540     ASSERT_NE(render_, nullptr);
541     int32_t ret;
542     bool isMute = false;
543 
544     for (auto _ : state) {
545         ret = render_->GetMute(render_, &isMute);
546         ASSERT_TRUE(ret == HDF_SUCCESS || ret == HDF_ERR_NOT_SUPPORT);
547     }
548 }
549 
550 BENCHMARK_REGISTER_F(AudioRenderBenchmarkTest, GetMute)->
551     Iterations(ITERATION_FREQUENCY)->Repetitions(REPETITION_FREQUENCY)->ReportAggregatesOnly();
552 
BENCHMARK_F(AudioRenderBenchmarkTest,SetVolume)553 BENCHMARK_F(AudioRenderBenchmarkTest, SetVolume)(benchmark::State &state)
554 {
555     ASSERT_NE(render_, nullptr);
556     int32_t ret;
557     float volume = VOLUNE_VALUE;
558 
559     for (auto _ : state) {
560         ret = render_->SetVolume(render_, volume);
561         ASSERT_TRUE(ret == HDF_SUCCESS || ret == HDF_ERR_NOT_SUPPORT);
562     }
563 }
564 
565 BENCHMARK_REGISTER_F(AudioRenderBenchmarkTest, SetVolume)->
566     Iterations(ITERATION_FREQUENCY)->Repetitions(REPETITION_FREQUENCY)->ReportAggregatesOnly();
567 
BENCHMARK_F(AudioRenderBenchmarkTest,GetVolume)568 BENCHMARK_F(AudioRenderBenchmarkTest, GetVolume)(benchmark::State &state)
569 {
570     ASSERT_NE(render_, nullptr);
571     int32_t ret;
572     float val = 0.0;
573 
574     for (auto _ : state) {
575         ret = render_->GetVolume(render_, &val);
576         ASSERT_TRUE(ret == HDF_SUCCESS || ret == HDF_ERR_NOT_SUPPORT);
577     }
578 }
579 
580 BENCHMARK_REGISTER_F(AudioRenderBenchmarkTest, GetVolume)->
581     Iterations(ITERATION_FREQUENCY)->Repetitions(REPETITION_FREQUENCY)->ReportAggregatesOnly();
582 
BENCHMARK_F(AudioRenderBenchmarkTest,RenderFrame)583 BENCHMARK_F(AudioRenderBenchmarkTest, RenderFrame)(benchmark::State &state)
584 {
585     ASSERT_NE(render_, nullptr);
586     int32_t ret;
587     uint32_t frameLen = (uint64_t)GetRenderBufferSize();
588     uint64_t requestBytes = frameLen;
589     EXPECT_EQ(HDF_SUCCESS, render_->Start(render_));
590 
591     int8_t *frame = (int8_t *)calloc(1, frameLen);
592     ASSERT_NE(nullptr, frame);
593 
594     for (auto _ : state) {
595         ret = render_->RenderFrame(render_, frame, frameLen, &requestBytes);
596         EXPECT_EQ(ret, HDF_SUCCESS);
597     }
598     EXPECT_EQ(HDF_SUCCESS, render_->Stop(render_));
599 
600     if (frame != nullptr) {
601         free(frame);
602         frame = nullptr;
603     }
604 }
605 
606 BENCHMARK_REGISTER_F(AudioRenderBenchmarkTest, RenderFrame)->
607     Iterations(ITERATION_FREQUENCY)->Repetitions(REPETITION_FREQUENCY)->ReportAggregatesOnly();
608 
BENCHMARK_F(AudioRenderBenchmarkTest,SetChannelMode)609 BENCHMARK_F(AudioRenderBenchmarkTest, SetChannelMode)(benchmark::State &state)
610 {
611     ASSERT_NE(render_, nullptr);
612     int32_t ret;
613     AudioChannelMode mode = AUDIO_CHANNEL_NORMAL;
614 
615     for (auto _ : state) {
616         ret = render_->SetChannelMode(render_, mode);
617         ASSERT_TRUE(ret == HDF_SUCCESS || ret == HDF_ERR_NOT_SUPPORT);
618     }
619 }
620 
621 BENCHMARK_REGISTER_F(AudioRenderBenchmarkTest, SetChannelMode)->
622     Iterations(ITERATION_FREQUENCY)->Repetitions(REPETITION_FREQUENCY)->ReportAggregatesOnly();
623 
BENCHMARK_F(AudioRenderBenchmarkTest,SetRenderSpeed)624 BENCHMARK_F(AudioRenderBenchmarkTest, SetRenderSpeed)(benchmark::State &state)
625 {
626     ASSERT_NE(render_, nullptr);
627     int32_t ret;
628     float speed = SPEED_VALUE;
629 
630     for (auto _ : state) {
631         ret = render_->SetRenderSpeed(render_, speed);
632         EXPECT_NE(ret, HDF_SUCCESS);
633     }
634 }
635 
636 BENCHMARK_REGISTER_F(AudioRenderBenchmarkTest, SetRenderSpeed)->
637     Iterations(ITERATION_FREQUENCY)->Repetitions(REPETITION_FREQUENCY)->ReportAggregatesOnly();
638 
BENCHMARK_F(AudioRenderBenchmarkTest,GetRenderSpeed)639 BENCHMARK_F(AudioRenderBenchmarkTest, GetRenderSpeed)(benchmark::State &state)
640 {
641     ASSERT_NE(render_, nullptr);
642     int32_t ret;
643     float speed = 0.0;
644 
645     ASSERT_EQ(HDF_SUCCESS, render_->Start(render_));
646     for (auto _ : state) {
647         ret = render_->GetRenderSpeed(render_, &speed);
648         EXPECT_NE(ret, HDF_SUCCESS);
649     }
650     ASSERT_EQ(HDF_SUCCESS, render_->Stop(render_));
651 }
652 
653 BENCHMARK_REGISTER_F(AudioRenderBenchmarkTest, GetRenderSpeed)->
654     Iterations(ITERATION_FREQUENCY)->Repetitions(REPETITION_FREQUENCY)->ReportAggregatesOnly();
655 
BENCHMARK_F(AudioRenderBenchmarkTest,GetChannelMode)656 BENCHMARK_F(AudioRenderBenchmarkTest, GetChannelMode)(benchmark::State &state)
657 {
658     ASSERT_NE(render_, nullptr);
659     int32_t ret;
660     enum AudioChannelMode channelMode = AUDIO_CHANNEL_NORMAL;
661 
662     for (auto _ : state) {
663         ret = render_->GetChannelMode(render_, &channelMode);
664         ASSERT_TRUE(ret == HDF_SUCCESS || ret == HDF_ERR_NOT_SUPPORT);
665     }
666 }
667 
668 BENCHMARK_REGISTER_F(AudioRenderBenchmarkTest, GetChannelMode)->
669     Iterations(ITERATION_FREQUENCY)->Repetitions(REPETITION_FREQUENCY)->ReportAggregatesOnly();
670 
BENCHMARK_F(AudioRenderBenchmarkTest,RegCallback)671 BENCHMARK_F(AudioRenderBenchmarkTest, RegCallback)(benchmark::State &state)
672 {
673     ASSERT_NE(render_, nullptr);
674     int32_t ret;
675     int8_t cookie = 0;
676     struct IAudioCallback *audioCallback = nullptr;
677 
678     for (auto _ : state) {
679         ret = render_->RegCallback(render_, audioCallback, cookie);
680         ASSERT_TRUE(ret == HDF_SUCCESS || ret == HDF_ERR_INVALID_PARAM);
681     }
682 }
683 
684 BENCHMARK_REGISTER_F(AudioRenderBenchmarkTest, RegCallback)->
685     Iterations(ITERATION_FREQUENCY)->Repetitions(REPETITION_FREQUENCY)->ReportAggregatesOnly();
686 
BENCHMARK_F(AudioRenderBenchmarkTest,DrainBuffer)687 BENCHMARK_F(AudioRenderBenchmarkTest, DrainBuffer)(benchmark::State &state)
688 {
689     ASSERT_NE(render_, nullptr);
690     int32_t ret;
691     enum AudioDrainNotifyType type = AUDIO_DRAIN_NORMAL_MODE;
692 
693     for (auto _ : state) {
694         ret = render_->DrainBuffer(render_, &type);
695         EXPECT_EQ(ret, HDF_ERR_NOT_SUPPORT);
696     }
697 }
698 
699 BENCHMARK_REGISTER_F(AudioRenderBenchmarkTest, DrainBuffer)->
700     Iterations(ITERATION_FREQUENCY)->Repetitions(REPETITION_FREQUENCY)->ReportAggregatesOnly();
701 
BENCHMARK_F(AudioRenderBenchmarkTest,IsSupportsDrain)702 BENCHMARK_F(AudioRenderBenchmarkTest, IsSupportsDrain)(benchmark::State &state)
703 {
704     ASSERT_NE(render_, nullptr);
705     int32_t ret;
706     bool support = false;
707 
708     for (auto _ : state) {
709         ret = render_->IsSupportsDrain(render_, &support);
710         ASSERT_TRUE(ret == HDF_SUCCESS || ret == HDF_ERR_NOT_SUPPORT);
711     }
712 }
713 
714 BENCHMARK_REGISTER_F(AudioRenderBenchmarkTest, IsSupportsDrain)->
715     Iterations(ITERATION_FREQUENCY)->Repetitions(REPETITION_FREQUENCY)->ReportAggregatesOnly();
716 
BENCHMARK_F(AudioRenderBenchmarkTest,CheckSceneCapability)717 BENCHMARK_F(AudioRenderBenchmarkTest, CheckSceneCapability)(benchmark::State &state)
718 {
719     ASSERT_NE(render_, nullptr);
720     int32_t ret;
721     struct AudioSceneDescriptor scene;
722     bool supported = false;
723     scene.scene.id = AUDIO_IN_MEDIA;
724     scene.desc = devDescRender_;
725 
726     for (auto _ : state) {
727         ret = render_->CheckSceneCapability(render_, &scene, &supported);
728         EXPECT_EQ(ret, HDF_SUCCESS);
729     }
730 }
731 
732 BENCHMARK_REGISTER_F(AudioRenderBenchmarkTest, CheckSceneCapability)->
733     Iterations(ITERATION_FREQUENCY)->Repetitions(REPETITION_FREQUENCY)->ReportAggregatesOnly();
734 
BENCHMARK_F(AudioRenderBenchmarkTest,AddAndRemoveAudioEffect)735 BENCHMARK_F(AudioRenderBenchmarkTest, AddAndRemoveAudioEffect)(benchmark::State &state)
736 {
737     ASSERT_NE(render_, nullptr);
738     int32_t ret;
739     uint64_t effectId = 0;
740 
741     for (auto _ : state) {
742         ret = render_->AddAudioEffect(render_, effectId);
743         ASSERT_TRUE(ret == HDF_SUCCESS || ret == HDF_ERR_NOT_SUPPORT || ret == HDF_ERR_INVALID_PARAM);
744 
745         ret = render_->RemoveAudioEffect(render_, effectId);
746         ASSERT_TRUE(ret == HDF_SUCCESS || ret == HDF_ERR_NOT_SUPPORT || ret == HDF_ERR_INVALID_PARAM);
747     }
748 }
749 
750 BENCHMARK_REGISTER_F(AudioRenderBenchmarkTest, AddAndRemoveAudioEffect)->
751     Iterations(ITERATION_FREQUENCY)->Repetitions(REPETITION_FREQUENCY)->ReportAggregatesOnly();
752 
BENCHMARK_F(AudioRenderBenchmarkTest,GetFrameBufferSize)753 BENCHMARK_F(AudioRenderBenchmarkTest, GetFrameBufferSize)(benchmark::State &state)
754 {
755     ASSERT_NE(render_, nullptr);
756     int32_t ret;
757     uint64_t bufferSize = BUFFER_LENTH;
758 
759     for (auto _ : state) {
760         ret = render_->GetFrameBufferSize(render_, &bufferSize);
761         ASSERT_TRUE(ret == HDF_ERR_NOT_SUPPORT || ret == HDF_ERR_INVALID_PARAM);
762     }
763 }
764 
765 BENCHMARK_REGISTER_F(AudioRenderBenchmarkTest, GetFrameBufferSize)->
766     Iterations(ITERATION_FREQUENCY)->Repetitions(REPETITION_FREQUENCY)->ReportAggregatesOnly();
767 
BENCHMARK_F(AudioRenderBenchmarkTest,IsSupportsPauseAndResume)768 BENCHMARK_F(AudioRenderBenchmarkTest, IsSupportsPauseAndResume)(benchmark::State &state)
769 {
770     ASSERT_NE(render_, nullptr);
771     int32_t ret;
772     bool supportPause = false;
773     bool supportResume = false;
774 
775     for (auto _ : state) {
776         ret = render_->IsSupportsPauseAndResume(render_, &supportPause, &supportResume);
777         ASSERT_TRUE(ret == HDF_ERR_NOT_SUPPORT || ret == HDF_ERR_INVALID_PARAM);
778     }
779 }
780 
781 BENCHMARK_REGISTER_F(AudioRenderBenchmarkTest, IsSupportsPauseAndResume)->
782     Iterations(ITERATION_FREQUENCY)->Repetitions(REPETITION_FREQUENCY)->ReportAggregatesOnly();
783 }
784