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 <mutex>
17 #include <chrono>
18 #include <thread>
19 #include "ActsOhaudioNdkTest.h"
20
21 using namespace std::chrono;
22 using namespace testing::ext;
23
24 namespace OHOS {
25 namespace AudioStandard {
26
AudioRendererOnWriteData(OH_AudioRenderer * renderer,void * userData,void * buffer,int32_t bufferLen)27 static int32_t AudioRendererOnWriteData(OH_AudioRenderer* renderer,
28 void* userData,
29 void* buffer,
30 int32_t bufferLen)
31 {
32 OHAudioRendererWriteCallbackMock *mockPtr = static_cast<OHAudioRendererWriteCallbackMock*>(userData);
33 mockPtr->OnWriteData(renderer, userData, buffer, bufferLen);
34
35 return 0;
36 }
37
SetUpTestCase(void)38 void ActsOhAudioNdkTest::SetUpTestCase(void) { }
39
TearDownTestCase(void)40 void ActsOhAudioNdkTest::TearDownTestCase(void) { }
41
SetUp(void)42 void ActsOhAudioNdkTest::SetUp(void) { }
43
TearDown(void)44 void ActsOhAudioNdkTest::TearDown(void) { }
45
CreateRenderBuilder()46 OH_AudioStreamBuilder* ActsOhAudioNdkTest::CreateRenderBuilder()
47 {
48 OH_AudioStreamBuilder* builder;
49 OH_AudioStream_Type type = AUDIOSTREAM_TYPE_RENDERER;
50 OH_AudioStreamBuilder_Create(&builder, type);
51 return builder;
52 }
53
54 /**
55 * @tc.name : Test OH_AudioRenderer_GetUnderflowCount API.
56 * @tc.number: SUM_MULTIMEDIA_AUDIO_OH_AudioRenderer_GetUnderflowCount_0100
57 * @tc.desc : Test OH_AudioRenderer_GetUnderflowCount interface.
58 */
59 HWTEST(ActsOhAudioNdkTest, SUM_MULTIMEDIA_AUDIO_OH_AudioRenderer_GetUnderflowCount_0100, TestSize.Level0)
60 {
61 OH_AudioStreamBuilder* builder = ActsOhAudioNdkTest::CreateRenderBuilder();
62
63 OH_AudioStreamBuilder_SetSamplingRate(builder, SAMPLE_RATE_48000);
64 OH_AudioStreamBuilder_SetChannelCount(builder, CHANNEL_2);
65 OH_AudioStream_Usage usage = AUDIOSTREAM_USAGE_VOICE_COMMUNICATION;
66 OH_AudioStreamBuilder_SetRendererInfo(builder, usage);
67
68 OHAudioRendererWriteCallbackMock writeCallbackMock;
69
70 OH_AudioRenderer_Callbacks callbacks;
71 callbacks.OH_AudioRenderer_OnWriteData = AudioRendererOnWriteData;
72 OH_AudioStreamBuilder_SetRendererCallback(builder, callbacks, &writeCallbackMock);
73
74 OH_AudioRenderer* audioRenderer;
75 OH_AudioStream_Result result = OH_AudioStreamBuilder_GenerateRenderer(builder, &audioRenderer);
76 EXPECT_EQ(result, AUDIOSTREAM_SUCCESS);
77
78 std::mutex mutex;
79 std::condition_variable cv;
80 int32_t count = 0;
81 writeCallbackMock.Install([&count, &mutex, &cv](OH_AudioRenderer* renderer, void* userData,
82 void* buffer,
__anonbd56e2d20102(OH_AudioRenderer* renderer, void* userData, void* buffer, int32_t bufferLen) 83 int32_t bufferLen) {
84 std::lock_guard lock(mutex);
85 cv.notify_one();
86 // only execute twice
87 if (count > 1) {
88 return;
89 }
90 // sleep time trigger underflow
91 if (count == 1) {
92 std::this_thread::sleep_for(200ms);
93 }
94 count++;
95 });
96
97 result = OH_AudioRenderer_Start(audioRenderer);
98 EXPECT_EQ(result, AUDIOSTREAM_SUCCESS);
99
100 std::unique_lock lock(mutex);
__anonbd56e2d20202null101 cv.wait_for(lock, 1s, [&count] {
102 // count > 1 ensure sleeped
103 return count > 1;
104 });
105 lock.unlock();
106
107 uint32_t underFlowCount;
108 result = OH_AudioRenderer_GetUnderflowCount(audioRenderer, &underFlowCount);
109 EXPECT_EQ(result, AUDIOSTREAM_SUCCESS);
110 EXPECT_GE(underFlowCount, 0);
111
112 OH_AudioRenderer_Stop(audioRenderer);
113 OH_AudioRenderer_Release(audioRenderer);
114
115 OH_AudioStreamBuilder_Destroy(builder);
116 }
117 } // namespace AudioStandard
118 } // namespace OHOS