• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 "v2_0/audio_types.h"
22 #include "v2_0/iaudio_manager.h"
23 #include "v2_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     devDescriptorName_ = nullptr;
181 
182     if (adapter_ != nullptr) {
183         adapter_->DestroyRender(adapter_, renderId_);
184         render_ = nullptr;
185     }
186     if (manager_ != nullptr) {
187         manager_->UnloadAdapter(manager_, desc_->adapterName);
188         adapter_ = nullptr;
189         ReleaseAllAdapterDescs(descs_, size_);
190 
191         IAudioManagerRelease(manager_, false);
192     }
193 }
194 
BENCHMARK_F(AudioRenderBenchmarkTest,StartAndStop)195 BENCHMARK_F(AudioRenderBenchmarkTest, StartAndStop)(benchmark::State &state)
196 {
197     ASSERT_NE(render_, nullptr);
198     int32_t ret;
199     for (auto _ : state) {
200         ret = render_->Start(render_);
201         EXPECT_EQ(ret, HDF_SUCCESS);
202         ret = render_->Stop(render_);
203         EXPECT_EQ(ret, HDF_SUCCESS);
204     }
205 }
206 
207 BENCHMARK_REGISTER_F(AudioRenderBenchmarkTest, StartAndStop)->
208     Iterations(ITERATION_FREQUENCY)->Repetitions(REPETITION_FREQUENCY)->ReportAggregatesOnly();
209 
BENCHMARK_F(AudioRenderBenchmarkTest,Pause)210 BENCHMARK_F(AudioRenderBenchmarkTest, Pause)(benchmark::State &state)
211 {
212     ASSERT_NE(render_, nullptr);
213     int32_t ret = render_->Start(render_);
214     EXPECT_EQ(ret, HDF_SUCCESS);
215 
216     for (auto _ : state) {
217         ret = render_->Pause(render_);
218         ASSERT_TRUE(ret == HDF_SUCCESS || ret == HDF_ERR_NOT_SUPPORT || ret == HDF_ERR_INVALID_PARAM);
219     }
220 
221     ret = render_->Stop(render_);
222     ASSERT_EQ(ret, HDF_SUCCESS);
223 }
224 
225 BENCHMARK_REGISTER_F(AudioRenderBenchmarkTest, Pause)->
226     Iterations(ITERATION_FREQUENCY)->Repetitions(REPETITION_FREQUENCY)->ReportAggregatesOnly();
227 
BENCHMARK_F(AudioRenderBenchmarkTest,Resume)228 BENCHMARK_F(AudioRenderBenchmarkTest, Resume)(benchmark::State &state)
229 {
230     ASSERT_NE(render_, nullptr);
231     int32_t ret = render_->Start(render_);
232     EXPECT_EQ(ret, HDF_SUCCESS);
233 
234     ret = render_->Pause(render_);
235     ASSERT_TRUE(ret == HDF_SUCCESS || ret == HDF_ERR_NOT_SUPPORT);
236 
237     for (auto _ : state) {
238         ret = render_->Resume(render_);
239         ASSERT_TRUE(ret == HDF_SUCCESS || ret == HDF_ERR_NOT_SUPPORT);
240     }
241 
242     ret = render_->Stop(render_);
243     ASSERT_EQ(ret, HDF_SUCCESS);
244 }
245 
246 BENCHMARK_REGISTER_F(AudioRenderBenchmarkTest, Resume)->
247     Iterations(ITERATION_FREQUENCY)->Repetitions(REPETITION_FREQUENCY)->ReportAggregatesOnly();
248 
BENCHMARK_F(AudioRenderBenchmarkTest,Flush)249 BENCHMARK_F(AudioRenderBenchmarkTest, Flush)(benchmark::State &state)
250 {
251     ASSERT_NE(render_, nullptr);
252     int32_t ret;
253     for (auto _ : state) {
254         ret = render_->Flush(render_);
255         EXPECT_NE(ret, HDF_SUCCESS);
256     }
257 }
258 
259 BENCHMARK_REGISTER_F(AudioRenderBenchmarkTest, Flush)->
260     Iterations(ITERATION_FREQUENCY)->Repetitions(REPETITION_FREQUENCY)->ReportAggregatesOnly();
261 
BENCHMARK_F(AudioRenderBenchmarkTest,TurnStandbyMode)262 BENCHMARK_F(AudioRenderBenchmarkTest, TurnStandbyMode)(benchmark::State &state)
263 {
264     ASSERT_NE(render_, nullptr);
265     int32_t ret;
266     for (auto _ : state) {
267         ret = render_->Start(render_);
268         EXPECT_EQ(ret, HDF_SUCCESS);
269         ret = render_->TurnStandbyMode(render_);
270         EXPECT_EQ(ret, HDF_SUCCESS);
271         render_->Stop(render_);
272     }
273 }
274 
275 BENCHMARK_REGISTER_F(AudioRenderBenchmarkTest, TurnStandbyMode)->
276     Iterations(ITERATION_FREQUENCY)->Repetitions(REPETITION_FREQUENCY)->ReportAggregatesOnly();
277 
BENCHMARK_F(AudioRenderBenchmarkTest,AudioDevDump)278 BENCHMARK_F(AudioRenderBenchmarkTest, AudioDevDump)(benchmark::State &state)
279 {
280     ASSERT_NE(render_, nullptr);
281     int32_t ret;
282     int32_t range = RANGE_VALUE;
283     char pathBuf[] = "/data/RenderDump.log";
284 
285     FILE *file = fopen(pathBuf, "wb+");
286     ASSERT_NE(nullptr, file);
287     int fd = fileno(file);
288     if (fd == -1) {
289         fclose(file);
290         ASSERT_NE(fd, -1);
291     }
292 
293     for (auto _ : state) {
294         ret = render_->AudioDevDump(render_, range, fd);
295         ASSERT_TRUE(ret == HDF_SUCCESS || ret == HDF_ERR_NOT_SUPPORT);
296     }
297     fclose(file);
298 }
299 
300 BENCHMARK_REGISTER_F(AudioRenderBenchmarkTest, AudioDevDump)->
301     Iterations(ITERATION_FREQUENCY)->Repetitions(REPETITION_FREQUENCY)->ReportAggregatesOnly();
302 
BENCHMARK_F(AudioRenderBenchmarkTest,GetFrameSize)303 BENCHMARK_F(AudioRenderBenchmarkTest, GetFrameSize)(benchmark::State &state)
304 {
305     ASSERT_NE(render_, nullptr);
306     int32_t ret;
307     uint64_t frameSize = 0;
308 
309     for (auto _ : state) {
310         ret = render_->GetFrameSize(render_, &frameSize);
311         EXPECT_EQ(ret, HDF_SUCCESS);
312     }
313 }
314 
315 BENCHMARK_REGISTER_F(AudioRenderBenchmarkTest, GetFrameSize)->
316     Iterations(ITERATION_FREQUENCY)->Repetitions(REPETITION_FREQUENCY)->ReportAggregatesOnly();
317 
BENCHMARK_F(AudioRenderBenchmarkTest,GetFrameCount)318 BENCHMARK_F(AudioRenderBenchmarkTest, GetFrameCount)(benchmark::State &state)
319 {
320     ASSERT_NE(render_, nullptr);
321     int32_t ret;
322     uint64_t frameCount = 0;
323 
324     for (auto _ : state) {
325         ret = render_->GetFrameCount(render_, &frameCount);
326         EXPECT_EQ(ret, HDF_SUCCESS);
327     }
328 }
329 
330 BENCHMARK_REGISTER_F(AudioRenderBenchmarkTest, GetFrameCount)->
331     Iterations(ITERATION_FREQUENCY)->Repetitions(REPETITION_FREQUENCY)->ReportAggregatesOnly();
332 
BENCHMARK_F(AudioRenderBenchmarkTest,SetSampleAttributes)333 BENCHMARK_F(AudioRenderBenchmarkTest, SetSampleAttributes)(benchmark::State &state)
334 {
335     ASSERT_NE(render_, nullptr);
336     int32_t ret;
337     struct AudioSampleAttributes attrs = attrsRender_;
338     for (auto _ : state) {
339         ret = render_->SetSampleAttributes(render_, &attrs);
340         EXPECT_EQ(ret, HDF_SUCCESS);
341     }
342 }
343 
344 BENCHMARK_REGISTER_F(AudioRenderBenchmarkTest, SetSampleAttributes)->
345     Iterations(ITERATION_FREQUENCY)->Repetitions(REPETITION_FREQUENCY)->ReportAggregatesOnly();
346 
BENCHMARK_F(AudioRenderBenchmarkTest,GetSampleAttributes)347 BENCHMARK_F(AudioRenderBenchmarkTest, GetSampleAttributes)(benchmark::State &state)
348 {
349     ASSERT_NE(render_, nullptr);
350     int32_t ret;
351     struct AudioSampleAttributes attrs = {};
352 
353     for (auto _ : state) {
354         ret = render_->GetSampleAttributes(render_, &attrs);
355         EXPECT_EQ(ret, HDF_SUCCESS);
356     }
357 }
358 
359 BENCHMARK_REGISTER_F(AudioRenderBenchmarkTest, GetSampleAttributes)->
360     Iterations(ITERATION_FREQUENCY)->Repetitions(REPETITION_FREQUENCY)->ReportAggregatesOnly();
361 
BENCHMARK_F(AudioRenderBenchmarkTest,GetCurrentChannelId)362 BENCHMARK_F(AudioRenderBenchmarkTest, GetCurrentChannelId)(benchmark::State &state)
363 {
364     ASSERT_NE(render_, nullptr);
365     int32_t ret;
366     uint32_t channelId = 0;
367 
368     for (auto _ : state) {
369         ret = render_->GetCurrentChannelId(render_, &channelId);
370         EXPECT_EQ(ret, HDF_SUCCESS);
371     }
372 }
373 
374 BENCHMARK_REGISTER_F(AudioRenderBenchmarkTest, GetCurrentChannelId)->
375     Iterations(ITERATION_FREQUENCY)->Repetitions(REPETITION_FREQUENCY)->ReportAggregatesOnly();
376 
BENCHMARK_F(AudioRenderBenchmarkTest,SelectScene)377 BENCHMARK_F(AudioRenderBenchmarkTest, SelectScene)(benchmark::State &state)
378 {
379     ASSERT_NE(render_, nullptr);
380     int32_t ret;
381     struct AudioSceneDescriptor scene;
382     scene.scene.id = AUDIO_IN_MEDIA;
383     scene.desc.pins = PIN_OUT_SPEAKER;
384     scene.desc.desc = const_cast<char*>("primary");
385 
386     for (auto _ : state) {
387         ret = render_->SelectScene(render_, &scene);
388         EXPECT_EQ(ret, HDF_SUCCESS);
389     }
390 }
391 
392 BENCHMARK_REGISTER_F(AudioRenderBenchmarkTest, SelectScene)->
393     Iterations(ITERATION_FREQUENCY)->Repetitions(REPETITION_FREQUENCY)->ReportAggregatesOnly();
394 
BENCHMARK_F(AudioRenderBenchmarkTest,GetLatency)395 BENCHMARK_F(AudioRenderBenchmarkTest, GetLatency)(benchmark::State &state)
396 {
397     ASSERT_NE(render_, nullptr);
398     int32_t ret;
399     uint32_t ms = 0;
400 
401     for (auto _ : state) {
402         ret = render_->GetLatency(render_, &ms);
403         EXPECT_EQ(ret, HDF_SUCCESS);
404     }
405 }
406 
407 BENCHMARK_REGISTER_F(AudioRenderBenchmarkTest, GetLatency)->
408     Iterations(ITERATION_FREQUENCY)->Repetitions(REPETITION_FREQUENCY)->ReportAggregatesOnly();
409 
BENCHMARK_F(AudioRenderBenchmarkTest,GetRenderPosition)410 BENCHMARK_F(AudioRenderBenchmarkTest, GetRenderPosition)(benchmark::State &state)
411 {
412     ASSERT_NE(render_, nullptr);
413     int32_t ret;
414     uint64_t frames = 0;
415     struct AudioTimeStamp time;
416 
417     for (auto _ : state) {
418         ret = render_->GetRenderPosition(render_, &frames, &time);
419         ASSERT_TRUE(ret == HDF_SUCCESS || ret == HDF_ERR_INVALID_PARAM);
420     }
421 }
422 
423 BENCHMARK_REGISTER_F(AudioRenderBenchmarkTest, GetRenderPosition)->
424     Iterations(ITERATION_FREQUENCY)->Repetitions(REPETITION_FREQUENCY)->ReportAggregatesOnly();
425 
BENCHMARK_F(AudioRenderBenchmarkTest,SetExtraParams)426 BENCHMARK_F(AudioRenderBenchmarkTest, SetExtraParams)(benchmark::State &state)
427 {
428     ASSERT_NE(render_, nullptr);
429     int32_t ret;
430     char keyValueList[AUDIO_RENDER_BUF_TEST] =
431         "attr-route=1;attr-format=32;attr-channels=2;attr-frame-count=82;attr-sampling-rate=48000";
432 
433     for (auto _ : state) {
434         ret = render_->SetExtraParams(render_, keyValueList);
435         EXPECT_EQ(ret, HDF_SUCCESS);
436     }
437 }
438 
439 BENCHMARK_REGISTER_F(AudioRenderBenchmarkTest, SetExtraParams)->
440     Iterations(ITERATION_FREQUENCY)->Repetitions(REPETITION_FREQUENCY)->ReportAggregatesOnly();
441 
BENCHMARK_F(AudioRenderBenchmarkTest,GetExtraParams)442 BENCHMARK_F(AudioRenderBenchmarkTest, GetExtraParams)(benchmark::State &state)
443 {
444     ASSERT_NE(render_, nullptr);
445     int32_t ret;
446     char keyValueList[AUDIO_RENDER_BUF_TEST] = {};
447     uint32_t keyValueListLen = 0;
448 
449     for (auto _ : state) {
450         ret = render_->GetExtraParams(render_, keyValueList, keyValueListLen);
451         EXPECT_NE(ret, HDF_SUCCESS);
452     }
453 }
454 
455 BENCHMARK_REGISTER_F(AudioRenderBenchmarkTest, GetExtraParams)->
456     Iterations(ITERATION_FREQUENCY)->Repetitions(REPETITION_FREQUENCY)->ReportAggregatesOnly();
457 
BENCHMARK_F(AudioRenderBenchmarkTest,SetGain)458 BENCHMARK_F(AudioRenderBenchmarkTest, SetGain)(benchmark::State &state)
459 {
460     ASSERT_NE(render_, nullptr);
461     int32_t ret;
462     float gain = GAIN_VALUE;
463 
464     for (auto _ : state) {
465         ret = render_->SetGain(render_, gain);
466         ASSERT_TRUE(ret == HDF_SUCCESS || ret == HDF_ERR_NOT_SUPPORT);
467     }
468 }
469 
470 BENCHMARK_REGISTER_F(AudioRenderBenchmarkTest, SetGain)->
471     Iterations(ITERATION_FREQUENCY)->Repetitions(REPETITION_FREQUENCY)->ReportAggregatesOnly();
472 
BENCHMARK_F(AudioRenderBenchmarkTest,GetGain)473 BENCHMARK_F(AudioRenderBenchmarkTest, GetGain)(benchmark::State &state)
474 {
475     ASSERT_NE(render_, nullptr);
476     int32_t ret;
477     float gain;
478 
479     for (auto _ : state) {
480         ret = render_->GetGain(render_, &gain);
481         ASSERT_TRUE(ret == HDF_SUCCESS || ret == HDF_ERR_NOT_SUPPORT);
482     }
483 }
484 
485 BENCHMARK_REGISTER_F(AudioRenderBenchmarkTest, GetGain)->
486     Iterations(ITERATION_FREQUENCY)->Repetitions(REPETITION_FREQUENCY)->ReportAggregatesOnly();
487 
BENCHMARK_F(AudioRenderBenchmarkTest,GetGainThreshold)488 BENCHMARK_F(AudioRenderBenchmarkTest, GetGainThreshold)(benchmark::State &state)
489 {
490     ASSERT_NE(render_, nullptr);
491     int32_t ret;
492     float min = 0.0;
493     float max = GAIN_VALUE;
494 
495     for (auto _ : state) {
496         ret = render_->GetGainThreshold(render_, &min, &max);
497         ASSERT_TRUE(ret == HDF_SUCCESS || ret == HDF_ERR_NOT_SUPPORT);
498     }
499     EXPECT_GE(min, MIN_GAINTHRESHOLD);
500     EXPECT_LE(max, MAX_GAINTHRESHOLD);
501 }
502 
503 BENCHMARK_REGISTER_F(AudioRenderBenchmarkTest, GetGainThreshold)->
504     Iterations(ITERATION_FREQUENCY)->Repetitions(REPETITION_FREQUENCY)->ReportAggregatesOnly();
505 
BENCHMARK_F(AudioRenderBenchmarkTest,GetMmapPosition)506 BENCHMARK_F(AudioRenderBenchmarkTest, GetMmapPosition)(benchmark::State &state)
507 {
508     ASSERT_NE(render_, nullptr);
509     int32_t ret;
510     uint64_t frames = 0;
511     struct AudioTimeStamp time;
512     time.tvNSec = 0;
513     time.tvSec = 0;
514 
515     for (auto _ : state) {
516         ret = render_->GetMmapPosition(render_, &frames, &time);
517         ASSERT_TRUE(ret == HDF_SUCCESS || ret == HDF_ERR_NOT_SUPPORT);
518     }
519 }
520 
521 BENCHMARK_REGISTER_F(AudioRenderBenchmarkTest, GetMmapPosition)->
522     Iterations(ITERATION_FREQUENCY)->Repetitions(REPETITION_FREQUENCY)->ReportAggregatesOnly();
523 
BENCHMARK_F(AudioRenderBenchmarkTest,SetMute)524 BENCHMARK_F(AudioRenderBenchmarkTest, SetMute)(benchmark::State &state)
525 {
526     ASSERT_NE(render_, nullptr);
527     int32_t ret;
528     bool mute = false;
529 
530     for (auto _ : state) {
531         ret = render_->SetMute(render_, mute);
532         ASSERT_TRUE(ret == HDF_SUCCESS || ret == HDF_ERR_NOT_SUPPORT);
533     }
534 }
535 
536 BENCHMARK_REGISTER_F(AudioRenderBenchmarkTest, SetMute)->
537     Iterations(ITERATION_FREQUENCY)->Repetitions(REPETITION_FREQUENCY)->ReportAggregatesOnly();
538 
BENCHMARK_F(AudioRenderBenchmarkTest,GetMute)539 BENCHMARK_F(AudioRenderBenchmarkTest, GetMute)(benchmark::State &state)
540 {
541     ASSERT_NE(render_, nullptr);
542     int32_t ret;
543     bool isMute = false;
544 
545     for (auto _ : state) {
546         ret = render_->GetMute(render_, &isMute);
547         ASSERT_TRUE(ret == HDF_SUCCESS || ret == HDF_ERR_NOT_SUPPORT);
548     }
549 }
550 
551 BENCHMARK_REGISTER_F(AudioRenderBenchmarkTest, GetMute)->
552     Iterations(ITERATION_FREQUENCY)->Repetitions(REPETITION_FREQUENCY)->ReportAggregatesOnly();
553 
BENCHMARK_F(AudioRenderBenchmarkTest,SetVolume)554 BENCHMARK_F(AudioRenderBenchmarkTest, SetVolume)(benchmark::State &state)
555 {
556     ASSERT_NE(render_, nullptr);
557     int32_t ret;
558     float volume = VOLUNE_VALUE;
559 
560     for (auto _ : state) {
561         ret = render_->SetVolume(render_, volume);
562         ASSERT_TRUE(ret == HDF_SUCCESS || ret == HDF_ERR_NOT_SUPPORT);
563     }
564 }
565 
566 BENCHMARK_REGISTER_F(AudioRenderBenchmarkTest, SetVolume)->
567     Iterations(ITERATION_FREQUENCY)->Repetitions(REPETITION_FREQUENCY)->ReportAggregatesOnly();
568 
BENCHMARK_F(AudioRenderBenchmarkTest,GetVolume)569 BENCHMARK_F(AudioRenderBenchmarkTest, GetVolume)(benchmark::State &state)
570 {
571     ASSERT_NE(render_, nullptr);
572     int32_t ret;
573     float val = 0.0;
574 
575     for (auto _ : state) {
576         ret = render_->GetVolume(render_, &val);
577         ASSERT_TRUE(ret == HDF_SUCCESS || ret == HDF_ERR_NOT_SUPPORT);
578     }
579 }
580 
581 BENCHMARK_REGISTER_F(AudioRenderBenchmarkTest, GetVolume)->
582     Iterations(ITERATION_FREQUENCY)->Repetitions(REPETITION_FREQUENCY)->ReportAggregatesOnly();
583 
BENCHMARK_F(AudioRenderBenchmarkTest,RenderFrame)584 BENCHMARK_F(AudioRenderBenchmarkTest, RenderFrame)(benchmark::State &state)
585 {
586     ASSERT_NE(render_, nullptr);
587     int32_t ret;
588     uint32_t frameLen = (uint64_t)GetRenderBufferSize();
589     uint64_t requestBytes = frameLen;
590     EXPECT_EQ(HDF_SUCCESS, render_->Start(render_));
591 
592     int8_t *frame = (int8_t *)calloc(1, frameLen);
593     ASSERT_NE(nullptr, frame);
594 
595     for (auto _ : state) {
596         ret = render_->RenderFrame(render_, frame, frameLen, &requestBytes);
597         EXPECT_EQ(ret, HDF_SUCCESS);
598     }
599     EXPECT_EQ(HDF_SUCCESS, render_->Stop(render_));
600 
601     if (frame != nullptr) {
602         free(frame);
603         frame = nullptr;
604     }
605 }
606 
607 BENCHMARK_REGISTER_F(AudioRenderBenchmarkTest, RenderFrame)->
608     Iterations(ITERATION_FREQUENCY)->Repetitions(REPETITION_FREQUENCY)->ReportAggregatesOnly();
609 
BENCHMARK_F(AudioRenderBenchmarkTest,SetChannelMode)610 BENCHMARK_F(AudioRenderBenchmarkTest, SetChannelMode)(benchmark::State &state)
611 {
612     ASSERT_NE(render_, nullptr);
613     int32_t ret;
614     AudioChannelMode mode = AUDIO_CHANNEL_NORMAL;
615 
616     for (auto _ : state) {
617         ret = render_->SetChannelMode(render_, mode);
618         ASSERT_TRUE(ret == HDF_SUCCESS || ret == HDF_ERR_NOT_SUPPORT);
619     }
620 }
621 
622 BENCHMARK_REGISTER_F(AudioRenderBenchmarkTest, SetChannelMode)->
623     Iterations(ITERATION_FREQUENCY)->Repetitions(REPETITION_FREQUENCY)->ReportAggregatesOnly();
624 
BENCHMARK_F(AudioRenderBenchmarkTest,SetRenderSpeed)625 BENCHMARK_F(AudioRenderBenchmarkTest, SetRenderSpeed)(benchmark::State &state)
626 {
627     ASSERT_NE(render_, nullptr);
628     int32_t ret;
629     float speed = SPEED_VALUE;
630 
631     for (auto _ : state) {
632         ret = render_->SetRenderSpeed(render_, speed);
633         EXPECT_NE(ret, HDF_SUCCESS);
634     }
635 }
636 
637 BENCHMARK_REGISTER_F(AudioRenderBenchmarkTest, SetRenderSpeed)->
638     Iterations(ITERATION_FREQUENCY)->Repetitions(REPETITION_FREQUENCY)->ReportAggregatesOnly();
639 
BENCHMARK_F(AudioRenderBenchmarkTest,GetRenderSpeed)640 BENCHMARK_F(AudioRenderBenchmarkTest, GetRenderSpeed)(benchmark::State &state)
641 {
642     ASSERT_NE(render_, nullptr);
643     int32_t ret;
644     float speed = 0.0;
645 
646     ASSERT_EQ(HDF_SUCCESS, render_->Start(render_));
647     for (auto _ : state) {
648         ret = render_->GetRenderSpeed(render_, &speed);
649         EXPECT_NE(ret, HDF_SUCCESS);
650     }
651     ASSERT_EQ(HDF_SUCCESS, render_->Stop(render_));
652 }
653 
654 BENCHMARK_REGISTER_F(AudioRenderBenchmarkTest, GetRenderSpeed)->
655     Iterations(ITERATION_FREQUENCY)->Repetitions(REPETITION_FREQUENCY)->ReportAggregatesOnly();
656 
BENCHMARK_F(AudioRenderBenchmarkTest,GetChannelMode)657 BENCHMARK_F(AudioRenderBenchmarkTest, GetChannelMode)(benchmark::State &state)
658 {
659     ASSERT_NE(render_, nullptr);
660     int32_t ret;
661     enum AudioChannelMode channelMode = AUDIO_CHANNEL_NORMAL;
662 
663     for (auto _ : state) {
664         ret = render_->GetChannelMode(render_, &channelMode);
665         ASSERT_TRUE(ret == HDF_SUCCESS || ret == HDF_ERR_NOT_SUPPORT);
666     }
667 }
668 
669 BENCHMARK_REGISTER_F(AudioRenderBenchmarkTest, GetChannelMode)->
670     Iterations(ITERATION_FREQUENCY)->Repetitions(REPETITION_FREQUENCY)->ReportAggregatesOnly();
671 
BENCHMARK_F(AudioRenderBenchmarkTest,RegCallback)672 BENCHMARK_F(AudioRenderBenchmarkTest, RegCallback)(benchmark::State &state)
673 {
674     ASSERT_NE(render_, nullptr);
675     int32_t ret;
676     int8_t cookie = 0;
677     struct IAudioCallback *audioCallback = nullptr;
678 
679     for (auto _ : state) {
680         ret = render_->RegCallback(render_, audioCallback, cookie);
681         ASSERT_TRUE(ret == HDF_SUCCESS || ret == HDF_ERR_INVALID_PARAM);
682     }
683 }
684 
685 BENCHMARK_REGISTER_F(AudioRenderBenchmarkTest, RegCallback)->
686     Iterations(ITERATION_FREQUENCY)->Repetitions(REPETITION_FREQUENCY)->ReportAggregatesOnly();
687 
BENCHMARK_F(AudioRenderBenchmarkTest,DrainBuffer)688 BENCHMARK_F(AudioRenderBenchmarkTest, DrainBuffer)(benchmark::State &state)
689 {
690     ASSERT_NE(render_, nullptr);
691     int32_t ret;
692     enum AudioDrainNotifyType type = AUDIO_DRAIN_NORMAL_MODE;
693 
694     for (auto _ : state) {
695         ret = render_->DrainBuffer(render_, &type);
696         EXPECT_EQ(ret, HDF_ERR_NOT_SUPPORT);
697     }
698 }
699 
700 BENCHMARK_REGISTER_F(AudioRenderBenchmarkTest, DrainBuffer)->
701     Iterations(ITERATION_FREQUENCY)->Repetitions(REPETITION_FREQUENCY)->ReportAggregatesOnly();
702 
BENCHMARK_F(AudioRenderBenchmarkTest,IsSupportsDrain)703 BENCHMARK_F(AudioRenderBenchmarkTest, IsSupportsDrain)(benchmark::State &state)
704 {
705     ASSERT_NE(render_, nullptr);
706     int32_t ret;
707     bool support = false;
708 
709     for (auto _ : state) {
710         ret = render_->IsSupportsDrain(render_, &support);
711         ASSERT_TRUE(ret == HDF_SUCCESS || ret == HDF_ERR_NOT_SUPPORT);
712     }
713 }
714 
715 BENCHMARK_REGISTER_F(AudioRenderBenchmarkTest, IsSupportsDrain)->
716     Iterations(ITERATION_FREQUENCY)->Repetitions(REPETITION_FREQUENCY)->ReportAggregatesOnly();
717 
BENCHMARK_F(AudioRenderBenchmarkTest,CheckSceneCapability)718 BENCHMARK_F(AudioRenderBenchmarkTest, CheckSceneCapability)(benchmark::State &state)
719 {
720     ASSERT_NE(render_, nullptr);
721     int32_t ret;
722     struct AudioSceneDescriptor scene;
723     bool supported = false;
724     scene.scene.id = AUDIO_IN_MEDIA;
725     scene.desc = devDescRender_;
726 
727     for (auto _ : state) {
728         ret = render_->CheckSceneCapability(render_, &scene, &supported);
729         EXPECT_EQ(ret, HDF_SUCCESS);
730     }
731 }
732 
733 BENCHMARK_REGISTER_F(AudioRenderBenchmarkTest, CheckSceneCapability)->
734     Iterations(ITERATION_FREQUENCY)->Repetitions(REPETITION_FREQUENCY)->ReportAggregatesOnly();
735 
BENCHMARK_F(AudioRenderBenchmarkTest,AddAndRemoveAudioEffect)736 BENCHMARK_F(AudioRenderBenchmarkTest, AddAndRemoveAudioEffect)(benchmark::State &state)
737 {
738     ASSERT_NE(render_, nullptr);
739     int32_t ret;
740     uint64_t effectId = 0;
741 
742     for (auto _ : state) {
743         ret = render_->AddAudioEffect(render_, effectId);
744         ASSERT_TRUE(ret == HDF_SUCCESS || ret == HDF_ERR_NOT_SUPPORT || ret == HDF_ERR_INVALID_PARAM);
745 
746         ret = render_->RemoveAudioEffect(render_, effectId);
747         ASSERT_TRUE(ret == HDF_SUCCESS || ret == HDF_ERR_NOT_SUPPORT || ret == HDF_ERR_INVALID_PARAM);
748     }
749 }
750 
751 BENCHMARK_REGISTER_F(AudioRenderBenchmarkTest, AddAndRemoveAudioEffect)->
752     Iterations(ITERATION_FREQUENCY)->Repetitions(REPETITION_FREQUENCY)->ReportAggregatesOnly();
753 
BENCHMARK_F(AudioRenderBenchmarkTest,GetFrameBufferSize)754 BENCHMARK_F(AudioRenderBenchmarkTest, GetFrameBufferSize)(benchmark::State &state)
755 {
756     ASSERT_NE(render_, nullptr);
757     int32_t ret;
758     uint64_t bufferSize = BUFFER_LENTH;
759 
760     for (auto _ : state) {
761         ret = render_->GetFrameBufferSize(render_, &bufferSize);
762         ASSERT_TRUE(ret == HDF_ERR_NOT_SUPPORT || ret == HDF_ERR_INVALID_PARAM);
763     }
764 }
765 
766 BENCHMARK_REGISTER_F(AudioRenderBenchmarkTest, GetFrameBufferSize)->
767     Iterations(ITERATION_FREQUENCY)->Repetitions(REPETITION_FREQUENCY)->ReportAggregatesOnly();
768 
BENCHMARK_F(AudioRenderBenchmarkTest,IsSupportsPauseAndResume)769 BENCHMARK_F(AudioRenderBenchmarkTest, IsSupportsPauseAndResume)(benchmark::State &state)
770 {
771     ASSERT_NE(render_, nullptr);
772     int32_t ret;
773     bool supportPause = false;
774     bool supportResume = false;
775 
776     for (auto _ : state) {
777         ret = render_->IsSupportsPauseAndResume(render_, &supportPause, &supportResume);
778         ASSERT_TRUE(ret == HDF_ERR_NOT_SUPPORT || ret == HDF_ERR_INVALID_PARAM);
779     }
780 }
781 
782 BENCHMARK_REGISTER_F(AudioRenderBenchmarkTest, IsSupportsPauseAndResume)->
783     Iterations(ITERATION_FREQUENCY)->Repetitions(REPETITION_FREQUENCY)->ReportAggregatesOnly();
784 }
785