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 #ifndef LOG_TAG
16 #define LOG_TAG "OHAudioStreamBuilder"
17 #endif
18
19 #include <memory>
20 #include "native_audiostreambuilder.h"
21 #include "OHAudioStreamBuilder.h"
22 #include "OHAudioCapturer.h"
23 #include "audio_utils.h"
24
25 using OHOS::AudioStandard::OHAudioStreamBuilder;
26 using OHOS::AudioStandard::AudioSampleFormat;
27 using OHOS::AudioStandard::StreamUsage;
28 using OHOS::AudioStandard::AudioEncodingType;
29 using OHOS::AudioStandard::ContentType;
30 using OHOS::AudioStandard::SourceType;
31 using OHOS::AudioStandard::InterruptMode;
32 using OHOS::AudioStandard::AudioChannelLayout;
33 using OHOS::AudioStandard::AudioPrivacyType;
34 using OHOS::AudioStandard::AudioVolumeMode;
35
36 static const int32_t RENDERER_TYPE = 1;
37 static const int32_t CAPTURER_TYPE = 2;
38 constexpr int32_t UNDEFINED_SIZE = -1;
39
convertBuilder(OH_AudioStreamBuilder * builder)40 static OHOS::AudioStandard::OHAudioStreamBuilder *convertBuilder(OH_AudioStreamBuilder *builder)
41 {
42 return (OHOS::AudioStandard::OHAudioStreamBuilder*) builder;
43 }
44
OH_AudioStreamBuilder_SetSamplingRate(OH_AudioStreamBuilder * builder,int32_t rate)45 OH_AudioStream_Result OH_AudioStreamBuilder_SetSamplingRate(OH_AudioStreamBuilder *builder, int32_t rate)
46 {
47 OHAudioStreamBuilder *audioStreamBuilder = convertBuilder(builder);
48 CHECK_AND_RETURN_RET_LOG(audioStreamBuilder != nullptr, AUDIOSTREAM_ERROR_INVALID_PARAM, "convert builder failed");
49 return audioStreamBuilder->SetSamplingRate(rate);
50 }
51
OH_AudioStreamBuilder_SetChannelCount(OH_AudioStreamBuilder * builder,int32_t channelCount)52 OH_AudioStream_Result OH_AudioStreamBuilder_SetChannelCount(OH_AudioStreamBuilder *builder, int32_t channelCount)
53 {
54 OHAudioStreamBuilder *audioStreamBuilder = convertBuilder(builder);
55 CHECK_AND_RETURN_RET_LOG(audioStreamBuilder != nullptr, AUDIOSTREAM_ERROR_INVALID_PARAM, "convert builder failed");
56 return audioStreamBuilder->SetChannelCount(channelCount);
57 }
58
OH_AudioStreamBuilder_SetSampleFormat(OH_AudioStreamBuilder * builder,OH_AudioStream_SampleFormat format)59 OH_AudioStream_Result OH_AudioStreamBuilder_SetSampleFormat(OH_AudioStreamBuilder *builder,
60 OH_AudioStream_SampleFormat format)
61 {
62 OHAudioStreamBuilder *audioStreamBuilder = convertBuilder(builder);
63 CHECK_AND_RETURN_RET_LOG(audioStreamBuilder != nullptr, AUDIOSTREAM_ERROR_INVALID_PARAM, "convert builder failed");
64 AudioSampleFormat sampleFormat = (AudioSampleFormat)format;
65 return audioStreamBuilder->SetSampleFormat(sampleFormat);
66 }
67
68
OH_AudioStreamBuilder_SetFrameSizeInCallback(OH_AudioStreamBuilder * builder,int32_t frameSize)69 OH_AudioStream_Result OH_AudioStreamBuilder_SetFrameSizeInCallback(OH_AudioStreamBuilder *builder,
70 int32_t frameSize)
71 {
72 OHAudioStreamBuilder *audioStreamBuilder = convertBuilder(builder);
73 CHECK_AND_RETURN_RET_LOG(audioStreamBuilder != nullptr, AUDIOSTREAM_ERROR_INVALID_PARAM, "convert builder failed");
74 return audioStreamBuilder->SetPreferredFrameSize(frameSize);
75 }
76
OH_AudioStreamBuilder_SetEncodingType(OH_AudioStreamBuilder * builder,OH_AudioStream_EncodingType encodingType)77 OH_AudioStream_Result OH_AudioStreamBuilder_SetEncodingType(OH_AudioStreamBuilder *builder,
78 OH_AudioStream_EncodingType encodingType)
79 {
80 OHAudioStreamBuilder *audioStreamBuilder = convertBuilder(builder);
81 CHECK_AND_RETURN_RET_LOG(audioStreamBuilder != nullptr, AUDIOSTREAM_ERROR_INVALID_PARAM, "convert builder failed");
82 AudioEncodingType type = (AudioEncodingType)encodingType;
83 return audioStreamBuilder->SetEncodingType(type);
84 }
85
OH_AudioStreamBuilder_SetLatencyMode(OH_AudioStreamBuilder * builder,OH_AudioStream_LatencyMode latencyMode)86 OH_AudioStream_Result OH_AudioStreamBuilder_SetLatencyMode(OH_AudioStreamBuilder *builder,
87 OH_AudioStream_LatencyMode latencyMode)
88 {
89 OHAudioStreamBuilder *audioStreamBuilder = convertBuilder(builder);
90 CHECK_AND_RETURN_RET_LOG(audioStreamBuilder != nullptr, AUDIOSTREAM_ERROR_INVALID_PARAM, "convert builder failed");
91 int32_t innerLatencyMode = (int32_t)latencyMode;
92 return audioStreamBuilder->SetLatencyMode(innerLatencyMode);
93 }
94
OH_AudioStreamBuilder_SetChannelLayout(OH_AudioStreamBuilder * builder,OH_AudioChannelLayout channelLayout)95 OH_AudioStream_Result OH_AudioStreamBuilder_SetChannelLayout(OH_AudioStreamBuilder *builder,
96 OH_AudioChannelLayout channelLayout)
97 {
98 OHAudioStreamBuilder *audioStreamBuilder = convertBuilder(builder);
99 CHECK_AND_RETURN_RET_LOG(audioStreamBuilder != nullptr, AUDIOSTREAM_ERROR_INVALID_PARAM, "convert builder failed");
100 AudioChannelLayout layout = (AudioChannelLayout)channelLayout;
101 return audioStreamBuilder->SetChannelLayout(layout);
102 }
103
OH_AudioStreamBuilder_SetRendererInfo(OH_AudioStreamBuilder * builder,OH_AudioStream_Usage usage)104 OH_AudioStream_Result OH_AudioStreamBuilder_SetRendererInfo(OH_AudioStreamBuilder *builder,
105 OH_AudioStream_Usage usage)
106 {
107 OHAudioStreamBuilder *audioStreamBuilder = convertBuilder(builder);
108 CHECK_AND_RETURN_RET_LOG(audioStreamBuilder != nullptr, AUDIOSTREAM_ERROR_INVALID_PARAM, "convert builder failed");
109 return audioStreamBuilder->SetRendererInfo(static_cast<StreamUsage>(usage));
110 }
111
OH_AudioStreamBuilder_SetVolumeMode(OH_AudioStreamBuilder * builder,OH_AudioStream_VolumeMode volumeMode)112 OH_AudioStream_Result OH_AudioStreamBuilder_SetVolumeMode(OH_AudioStreamBuilder* builder,
113 OH_AudioStream_VolumeMode volumeMode)
114 {
115 OHAudioStreamBuilder *audioStreamBuilder = convertBuilder(builder);
116 CHECK_AND_RETURN_RET_LOG(audioStreamBuilder != nullptr, AUDIOSTREAM_ERROR_INVALID_PARAM, "convert builder failed");
117 return audioStreamBuilder->SetAudioVolumeMode(static_cast<AudioVolumeMode>(volumeMode));
118 }
119
OH_AudioStreamBuilder_SetRendererCallback(OH_AudioStreamBuilder * builder,OH_AudioRenderer_Callbacks callbacks,void * userData)120 OH_AudioStream_Result OH_AudioStreamBuilder_SetRendererCallback(OH_AudioStreamBuilder *builder,
121 OH_AudioRenderer_Callbacks callbacks, void *userData)
122 {
123 OHAudioStreamBuilder *audioStreamBuilder = convertBuilder(builder);
124 CHECK_AND_RETURN_RET_LOG(audioStreamBuilder != nullptr, AUDIOSTREAM_ERROR_INVALID_PARAM, "convert builder failed");
125 return audioStreamBuilder->SetRendererCallback(callbacks, userData);
126 }
127
OH_AudioStreamBuilder_SetCapturerInfo(OH_AudioStreamBuilder * builder,OH_AudioStream_SourceType sourceType)128 OH_AudioStream_Result OH_AudioStreamBuilder_SetCapturerInfo(OH_AudioStreamBuilder *builder,
129 OH_AudioStream_SourceType sourceType)
130 {
131 OHAudioStreamBuilder *audioStreamBuilder = convertBuilder(builder);
132 CHECK_AND_RETURN_RET_LOG(audioStreamBuilder != nullptr, AUDIOSTREAM_ERROR_INVALID_PARAM, "convert builder failed");
133 SourceType type = (SourceType)sourceType;
134 return audioStreamBuilder->SetSourceType(type);
135 }
136
137
OH_AudioStreamBuilder_Create(OH_AudioStreamBuilder ** builder,OH_AudioStream_Type type)138 OH_AudioStream_Result OH_AudioStreamBuilder_Create(OH_AudioStreamBuilder **builder, OH_AudioStream_Type type)
139 {
140 if (builder == nullptr) {
141 AUDIO_ERR_LOG("builder is nullptr");
142 return AUDIOSTREAM_SUCCESS;
143 }
144
145 int32_t streamType = type == AUDIOSTREAM_TYPE_RENDERER ? RENDERER_TYPE : CAPTURER_TYPE;
146 OHAudioStreamBuilder *streamBuilder = new OHAudioStreamBuilder(streamType);
147
148 *builder = (OH_AudioStreamBuilder*)streamBuilder;
149
150 return AUDIOSTREAM_SUCCESS;
151 }
152
OH_AudioStreamBuilder_SetCapturerCallback(OH_AudioStreamBuilder * builder,OH_AudioCapturer_Callbacks callbacks,void * userData)153 OH_AudioStream_Result OH_AudioStreamBuilder_SetCapturerCallback(OH_AudioStreamBuilder *builder,
154 OH_AudioCapturer_Callbacks callbacks, void *userData)
155 {
156 OHAudioStreamBuilder *audioStreamBuilder = convertBuilder(builder);
157 CHECK_AND_RETURN_RET_LOG(audioStreamBuilder != nullptr, AUDIOSTREAM_ERROR_INVALID_PARAM, "convert builder failed");
158
159 return audioStreamBuilder->SetCapturerCallback(callbacks, userData);
160 }
161
OH_AudioStreamBuilder_SetCapturerReadDataCallback(OH_AudioStreamBuilder * builder,OH_AudioCapturer_OnReadDataCallback callback,void * userData)162 OH_AudioStream_Result OH_AudioStreamBuilder_SetCapturerReadDataCallback(OH_AudioStreamBuilder* builder,
163 OH_AudioCapturer_OnReadDataCallback callback, void* userData)
164 {
165 OHAudioStreamBuilder *audioStreamBuilder = convertBuilder(builder);
166 CHECK_AND_RETURN_RET_LOG(audioStreamBuilder != nullptr, AUDIOSTREAM_ERROR_INVALID_PARAM, "convert builder failed");
167 return audioStreamBuilder->SetCapturerReadDataCallback(callback, userData);
168 }
169
OH_AudioStreamBuilder_SetCapturerDeviceChangeCallback(OH_AudioStreamBuilder * builder,OH_AudioCapturer_OnDeviceChangeCallback callback,void * userData)170 OH_AudioStream_Result OH_AudioStreamBuilder_SetCapturerDeviceChangeCallback(OH_AudioStreamBuilder* builder,
171 OH_AudioCapturer_OnDeviceChangeCallback callback, void* userData)
172 {
173 OHAudioStreamBuilder *audioStreamBuilder = convertBuilder(builder);
174 CHECK_AND_RETURN_RET_LOG(audioStreamBuilder != nullptr, AUDIOSTREAM_ERROR_INVALID_PARAM, "convert builder failed");
175 return audioStreamBuilder->SetCapturerStreamEventCallback(callback, userData);
176 }
177
OH_AudioStreamBuilder_SetCapturerErrorCallback(OH_AudioStreamBuilder * builder,OH_AudioCapturer_OnErrorCallback callback,void * userData)178 OH_AudioStream_Result OH_AudioStreamBuilder_SetCapturerErrorCallback(OH_AudioStreamBuilder *builder,
179 OH_AudioCapturer_OnErrorCallback callback, void *userData)
180 {
181 OHAudioStreamBuilder *audioStreamBuilder = convertBuilder(builder);
182 CHECK_AND_RETURN_RET_LOG(audioStreamBuilder != nullptr, AUDIOSTREAM_ERROR_INVALID_PARAM, "convert builder failed");
183 return audioStreamBuilder->SetCapturerErrorCallback(callback, userData);
184 }
185
OH_AudioStreamBuilder_SetCapturerWillMuteWhenInterrupted(OH_AudioStreamBuilder * builder,bool muteWhenInterrupted)186 OH_AudioStream_Result OH_AudioStreamBuilder_SetCapturerWillMuteWhenInterrupted(OH_AudioStreamBuilder* builder,
187 bool muteWhenInterrupted)
188 {
189 OHAudioStreamBuilder *audioStreamBuilder = convertBuilder(builder);
190 CHECK_AND_RETURN_RET_LOG(audioStreamBuilder != nullptr, AUDIOSTREAM_ERROR_INVALID_PARAM, "convert builder failed");
191 return audioStreamBuilder->SetMuteWhenInterrupted(muteWhenInterrupted);
192 }
193
OH_AudioStreamBuilder_SetRendererOutputDeviceChangeCallback(OH_AudioStreamBuilder * builder,OH_AudioRenderer_OutputDeviceChangeCallback callback,void * userData)194 OH_AudioStream_Result OH_AudioStreamBuilder_SetRendererOutputDeviceChangeCallback(OH_AudioStreamBuilder *builder,
195 OH_AudioRenderer_OutputDeviceChangeCallback callback, void *userData)
196 {
197 OHAudioStreamBuilder *audioStreamBuilder = convertBuilder(builder);
198 CHECK_AND_RETURN_RET_LOG(audioStreamBuilder != nullptr, AUDIOSTREAM_ERROR_INVALID_PARAM, "convert builder failed");
199
200 return audioStreamBuilder->SetRendererOutputDeviceChangeCallback(callback, userData);
201 }
202
OH_AudioStreamBuilder_SetRendererPrivacy(OH_AudioStreamBuilder * builder,OH_AudioStream_PrivacyType privacy)203 OH_AudioStream_Result OH_AudioStreamBuilder_SetRendererPrivacy(OH_AudioStreamBuilder* builder,
204 OH_AudioStream_PrivacyType privacy)
205 {
206 OHAudioStreamBuilder *audioStreamBuilder = convertBuilder(builder);
207 CHECK_AND_RETURN_RET_LOG(audioStreamBuilder != nullptr, AUDIOSTREAM_ERROR_INVALID_PARAM, "convert builder failed");
208
209 if (privacy != AUDIO_STREAM_PRIVACY_TYPE_PUBLIC && privacy != AUDIO_STREAM_PRIVACY_TYPE_PRIVATE) {
210 AUDIO_ERR_LOG("Invalid param: privacy type");
211 return AUDIOSTREAM_ERROR_INVALID_PARAM;
212 }
213
214 return audioStreamBuilder->SetRendererPrivacy((AudioPrivacyType)privacy);
215 }
216
OH_AudioStreamBuilder_SetWriteDataWithMetadataCallback(OH_AudioStreamBuilder * builder,OH_AudioRenderer_WriteDataWithMetadataCallback callback,void * userData)217 OH_AudioStream_Result OH_AudioStreamBuilder_SetWriteDataWithMetadataCallback(OH_AudioStreamBuilder *builder,
218 OH_AudioRenderer_WriteDataWithMetadataCallback callback, void *userData)
219 {
220 OHAudioStreamBuilder *audioStreamBuilder = convertBuilder(builder);
221 CHECK_AND_RETURN_RET_LOG(audioStreamBuilder != nullptr, AUDIOSTREAM_ERROR_INVALID_PARAM, "convert builder failed");
222 return audioStreamBuilder->SetWriteDataWithMetadataCallback(callback, userData);
223 }
224
OH_AudioStreamBuilder_SetRendererWriteDataCallback(OH_AudioStreamBuilder * builder,OH_AudioRenderer_OnWriteDataCallback callback,void * userData)225 OH_AudioStream_Result OH_AudioStreamBuilder_SetRendererWriteDataCallback(OH_AudioStreamBuilder* builder,
226 OH_AudioRenderer_OnWriteDataCallback callback, void* userData)
227 {
228 OHAudioStreamBuilder *audioStreamBuilder = convertBuilder(builder);
229 CHECK_AND_RETURN_RET_LOG(audioStreamBuilder != nullptr, AUDIOSTREAM_ERROR_INVALID_PARAM, "convert builder failed");
230 return audioStreamBuilder->SetRendererWriteDataCallback(callback, userData);
231 }
232
OH_AudioStreamBuilder_SetRendererWriteDataCallbackAdvanced(OH_AudioStreamBuilder * builder,OH_AudioRenderer_OnWriteDataCallbackAdvanced callback,void * userData)233 OH_AudioStream_Result OH_AudioStreamBuilder_SetRendererWriteDataCallbackAdvanced(OH_AudioStreamBuilder* builder,
234 OH_AudioRenderer_OnWriteDataCallbackAdvanced callback, void* userData)
235 {
236 OHAudioStreamBuilder *audioStreamBuilder = convertBuilder(builder);
237 CHECK_AND_RETURN_RET_LOG(audioStreamBuilder != nullptr, AUDIOSTREAM_ERROR_INVALID_PARAM, "convert builder failed");
238 return audioStreamBuilder->SetRendererWriteDataCallbackAdvanced(callback, userData);
239 }
240
OH_AudioStreamBuilder_SetRendererInterruptCallback(OH_AudioStreamBuilder * builder,OH_AudioRenderer_OnInterruptCallback callback,void * userData)241 OH_AudioStream_Result OH_AudioStreamBuilder_SetRendererInterruptCallback(OH_AudioStreamBuilder *builder,
242 OH_AudioRenderer_OnInterruptCallback callback, void *userData)
243 {
244 OHAudioStreamBuilder *audioStreamBuilder = convertBuilder(builder);
245 CHECK_AND_RETURN_RET_LOG(audioStreamBuilder != nullptr, AUDIOSTREAM_ERROR_INVALID_PARAM, "convert builder failed");
246 return audioStreamBuilder->SetRendererInterruptEventCallback(callback, userData);
247 }
248
OH_AudioStreamBuilder_SetRendererErrorCallback(OH_AudioStreamBuilder * builder,OH_AudioRenderer_OnErrorCallback callback,void * userData)249 OH_AudioStream_Result OH_AudioStreamBuilder_SetRendererErrorCallback(OH_AudioStreamBuilder *builder,
250 OH_AudioRenderer_OnErrorCallback callback, void *userData)
251 {
252 OHAudioStreamBuilder *audioStreamBuilder = convertBuilder(builder);
253 CHECK_AND_RETURN_RET_LOG(audioStreamBuilder != nullptr, AUDIOSTREAM_ERROR_INVALID_PARAM, "convert builder failed");
254 return audioStreamBuilder->SetRendererErrorCallback(callback, userData);
255 }
256
OH_AudioStreamBuilder_GenerateRenderer(OH_AudioStreamBuilder * builder,OH_AudioRenderer ** audioRenderer)257 OH_AudioStream_Result OH_AudioStreamBuilder_GenerateRenderer(OH_AudioStreamBuilder *builder,
258 OH_AudioRenderer **audioRenderer)
259 {
260 OHAudioStreamBuilder *audioStreamBuilder = convertBuilder(builder);
261 CHECK_AND_RETURN_RET_LOG(audioStreamBuilder != nullptr, AUDIOSTREAM_ERROR_INVALID_PARAM, "convert builder failed");
262 return audioStreamBuilder->Generate(audioRenderer);
263 }
264
OH_AudioStreamBuilder_SetCapturerInterruptCallback(OH_AudioStreamBuilder * builder,OH_AudioCapturer_OnInterruptCallback callback,void * userData)265 OH_AudioStream_Result OH_AudioStreamBuilder_SetCapturerInterruptCallback(OH_AudioStreamBuilder *builder,
266 OH_AudioCapturer_OnInterruptCallback callback, void *userData)
267 {
268 OHAudioStreamBuilder *audioStreamBuilder = convertBuilder(builder);
269 CHECK_AND_RETURN_RET_LOG(audioStreamBuilder != nullptr, AUDIOSTREAM_ERROR_INVALID_PARAM, "convert builder failed");
270 return audioStreamBuilder->SetCapturerInterruptCallback(callback, userData);
271 }
272
OH_AudioStreamBuilder_GenerateCapturer(OH_AudioStreamBuilder * builder,OH_AudioCapturer ** audioCapturer)273 OH_AudioStream_Result OH_AudioStreamBuilder_GenerateCapturer(OH_AudioStreamBuilder *builder,
274 OH_AudioCapturer **audioCapturer)
275 {
276 OHAudioStreamBuilder *audioStreamBuilder = convertBuilder(builder);
277 CHECK_AND_RETURN_RET_LOG(audioStreamBuilder != nullptr, AUDIOSTREAM_ERROR_INVALID_PARAM, "convert builder failed");
278 return audioStreamBuilder->Generate(audioCapturer);
279 }
280
OH_AudioStreamBuilder_Destroy(OH_AudioStreamBuilder * builder)281 OH_AudioStream_Result OH_AudioStreamBuilder_Destroy(OH_AudioStreamBuilder *builder)
282 {
283 OHAudioStreamBuilder *audioStreamBuilder = convertBuilder(builder);
284 CHECK_AND_RETURN_RET_LOG(audioStreamBuilder != nullptr, AUDIOSTREAM_ERROR_INVALID_PARAM, "convert builder failed");
285 if (audioStreamBuilder != nullptr) {
286 delete audioStreamBuilder;
287 audioStreamBuilder = nullptr;
288 return AUDIOSTREAM_SUCCESS;
289 }
290 return AUDIOSTREAM_ERROR_ILLEGAL_STATE;
291 }
292
OH_AudioStreamBuilder_SetRendererInterruptMode(OH_AudioStreamBuilder * builder,OH_AudioInterrupt_Mode mode)293 OH_AudioStream_Result OH_AudioStreamBuilder_SetRendererInterruptMode(OH_AudioStreamBuilder* builder,
294 OH_AudioInterrupt_Mode mode)
295 {
296 OHAudioStreamBuilder *audioStreamBuilder = convertBuilder(builder);
297 CHECK_AND_RETURN_RET_LOG(audioStreamBuilder != nullptr, AUDIOSTREAM_ERROR_INVALID_PARAM, "convert builder failed");
298 CHECK_AND_RETURN_RET_LOG((mode == AUDIOSTREAM_INTERRUPT_MODE_SHARE ||
299 mode == AUDIOSTREAM_INTERRUPT_MODE_INDEPENDENT), AUDIOSTREAM_ERROR_INVALID_PARAM, "mode is invalid");
300 InterruptMode interruptMode = static_cast<InterruptMode>(mode);
301 return audioStreamBuilder->SetInterruptMode(interruptMode);
302 }
303
OH_AudioStreamBuilder_SetRendererFastStatusChangeCallback(OH_AudioStreamBuilder * builder,OH_AudioRenderer_OnFastStatusChange callback,void * userData)304 OH_AudioStream_Result OH_AudioStreamBuilder_SetRendererFastStatusChangeCallback(OH_AudioStreamBuilder* builder,
305 OH_AudioRenderer_OnFastStatusChange callback, void* userData)
306 {
307 OHAudioStreamBuilder *audioStreamBuilder = convertBuilder(builder);
308 CHECK_AND_RETURN_RET_LOG(audioStreamBuilder != nullptr, AUDIOSTREAM_ERROR_INVALID_PARAM, "convert builder failed");
309 CHECK_AND_RETURN_RET_LOG(callback != nullptr, AUDIOSTREAM_ERROR_INVALID_PARAM, "callback is nullptr");
310 return audioStreamBuilder->SetRendererFastStatusChangeCallback(callback, userData);
311 }
312
OH_AudioStreamBuilder_SetCapturerFastStatusChangeCallback(OH_AudioStreamBuilder * builder,OH_AudioCapturer_OnFastStatusChange callback,void * userData)313 OH_AudioStream_Result OH_AudioStreamBuilder_SetCapturerFastStatusChangeCallback(OH_AudioStreamBuilder* builder,
314 OH_AudioCapturer_OnFastStatusChange callback, void* userData)
315 {
316 OHAudioStreamBuilder *audioStreamBuilder = convertBuilder(builder);
317 CHECK_AND_RETURN_RET_LOG(audioStreamBuilder != nullptr, AUDIOSTREAM_ERROR_INVALID_PARAM, "convert builder failed");
318 CHECK_AND_RETURN_RET_LOG(callback != nullptr, AUDIOSTREAM_ERROR_INVALID_PARAM, "callback is nullptr");
319 return audioStreamBuilder->SetCapturerFastStatusChangeCallback(callback, userData);
320 }
321
322 namespace OHOS {
323 namespace AudioStandard {
324
OHAudioStreamBuilder(const int32_t type)325 OHAudioStreamBuilder::OHAudioStreamBuilder(const int32_t type) : streamType_(RENDERER_TYPE)
326 {
327 AUDIO_INFO_LOG("OHAudioStreamBuilder created, type is %{public}d", type);
328 streamType_ = type;
329 }
330
~OHAudioStreamBuilder()331 OHAudioStreamBuilder::~OHAudioStreamBuilder()
332 {
333 AUDIO_INFO_LOG("OHAudioStreamBuilder destroyed, type is %{public}d", streamType_);
334 }
335
SetSamplingRate(int32_t rate)336 OH_AudioStream_Result OHAudioStreamBuilder::SetSamplingRate(int32_t rate)
337 {
338 switch (rate) {
339 case AudioSamplingRate::SAMPLE_RATE_8000:
340 case AudioSamplingRate::SAMPLE_RATE_11025:
341 case AudioSamplingRate::SAMPLE_RATE_12000:
342 case AudioSamplingRate::SAMPLE_RATE_16000:
343 case AudioSamplingRate::SAMPLE_RATE_22050:
344 case AudioSamplingRate::SAMPLE_RATE_24000:
345 case AudioSamplingRate::SAMPLE_RATE_32000:
346 case AudioSamplingRate::SAMPLE_RATE_44100:
347 case AudioSamplingRate::SAMPLE_RATE_48000:
348 case AudioSamplingRate::SAMPLE_RATE_64000:
349 case AudioSamplingRate::SAMPLE_RATE_88200:
350 case AudioSamplingRate::SAMPLE_RATE_96000:
351 case AudioSamplingRate::SAMPLE_RATE_176400:
352 case AudioSamplingRate::SAMPLE_RATE_192000:
353 AUDIO_DEBUG_LOG("sampleFormat input value is valid");
354 break;
355 default:
356 AUDIO_ERR_LOG("sampleFormat input value is invalid");
357 return AUDIOSTREAM_ERROR_INVALID_PARAM;
358 }
359 samplingRate_ = rate;
360 return AUDIOSTREAM_SUCCESS;
361 }
362
SetChannelCount(int32_t channelCount)363 OH_AudioStream_Result OHAudioStreamBuilder::SetChannelCount(int32_t channelCount)
364 {
365 switch (channelCount) {
366 case AudioChannel::MONO:
367 case AudioChannel::STEREO:
368 case AudioChannel::CHANNEL_3:
369 case AudioChannel::CHANNEL_4:
370 case AudioChannel::CHANNEL_5:
371 case AudioChannel::CHANNEL_6:
372 case AudioChannel::CHANNEL_7:
373 case AudioChannel::CHANNEL_8:
374 case AudioChannel::CHANNEL_9:
375 case AudioChannel::CHANNEL_10:
376 case AudioChannel::CHANNEL_11:
377 case AudioChannel::CHANNEL_12:
378 case AudioChannel::CHANNEL_13:
379 case AudioChannel::CHANNEL_14:
380 case AudioChannel::CHANNEL_15:
381 case AudioChannel::CHANNEL_16:
382 AUDIO_DEBUG_LOG("channelCount input value is valid");
383 break;
384 default:
385 AUDIO_ERR_LOG("channelCount input value is invalid");
386 return AUDIOSTREAM_ERROR_INVALID_PARAM;
387 }
388 channelCount_ = channelCount;
389 return AUDIOSTREAM_SUCCESS;
390 }
391
SetSampleFormat(AudioSampleFormat sampleFormat)392 OH_AudioStream_Result OHAudioStreamBuilder::SetSampleFormat(AudioSampleFormat sampleFormat)
393 {
394 sampleFormat_ = sampleFormat;
395 return AUDIOSTREAM_SUCCESS;
396 }
397
398
SetPreferredFrameSize(int32_t frameSize)399 OH_AudioStream_Result OHAudioStreamBuilder::SetPreferredFrameSize(int32_t frameSize)
400 {
401 preferredFrameSize_ = frameSize;
402 return AUDIOSTREAM_SUCCESS;
403 }
404
SetRendererInfo(StreamUsage usage)405 OH_AudioStream_Result OHAudioStreamBuilder::SetRendererInfo(StreamUsage usage)
406 {
407 CHECK_AND_RETURN_RET_LOG(streamType_ != CAPTURER_TYPE && usage != StreamUsage::STREAM_USAGE_UNKNOWN,
408 AUDIOSTREAM_ERROR_INVALID_PARAM, "Error, invalid type input");
409 usage_ = usage;
410 return AUDIOSTREAM_SUCCESS;
411 }
412
SetAudioVolumeMode(AudioVolumeMode volumeMode)413 OH_AudioStream_Result OHAudioStreamBuilder::SetAudioVolumeMode(AudioVolumeMode volumeMode)
414 {
415 switch (volumeMode) {
416 case AUDIOSTREAM_VOLUMEMODE_SYSTEM_GLOBAL:
417 case AUDIOSTREAM_VOLUMEMODE_APP_INDIVIDUAL:
418 break;
419 default:
420 AUDIO_ERR_LOG("AudioVolumeMode input value is invalid");
421 return AUDIOSTREAM_ERROR_INVALID_PARAM;
422 }
423 volumeMode_ = volumeMode;
424 return AUDIOSTREAM_SUCCESS;
425 }
426
SetEncodingType(AudioEncodingType encodingType)427 OH_AudioStream_Result OHAudioStreamBuilder::SetEncodingType(AudioEncodingType encodingType)
428 {
429 encodingType_ = encodingType;
430 return AUDIOSTREAM_SUCCESS;
431 }
432
SetSourceType(SourceType type)433 OH_AudioStream_Result OHAudioStreamBuilder::SetSourceType(SourceType type)
434 {
435 CHECK_AND_RETURN_RET_LOG(streamType_ != RENDERER_TYPE && type != SOURCE_TYPE_INVALID,
436 AUDIOSTREAM_ERROR_INVALID_PARAM, "Error, invalid type input");
437
438 sourceType_ = type;
439 return AUDIOSTREAM_SUCCESS;
440 }
441
SetMuteWhenInterrupted(bool muteWhenInterrupted)442 OH_AudioStream_Result OHAudioStreamBuilder::SetMuteWhenInterrupted(bool muteWhenInterrupted)
443 {
444 strategy_ = muteWhenInterrupted ? InterruptStrategy::MUTE : InterruptStrategy::DEFAULT;
445 return AUDIOSTREAM_SUCCESS;
446 }
447
SetLatencyMode(int32_t latencyMode)448 OH_AudioStream_Result OHAudioStreamBuilder::SetLatencyMode(int32_t latencyMode)
449 {
450 latencyMode_ = latencyMode;
451 return AUDIOSTREAM_SUCCESS;
452 }
453
SetChannelLayout(AudioChannelLayout channelLayout)454 OH_AudioStream_Result OHAudioStreamBuilder::SetChannelLayout(AudioChannelLayout channelLayout)
455 {
456 channelLayout_ = channelLayout;
457 return AUDIOSTREAM_SUCCESS;
458 }
459
Generate(OH_AudioRenderer ** renderer)460 OH_AudioStream_Result OHAudioStreamBuilder::Generate(OH_AudioRenderer **renderer)
461 {
462 AUDIO_INFO_LOG("Generate OHAudioRenderer");
463 CHECK_AND_RETURN_RET_LOG(streamType_ == RENDERER_TYPE, AUDIOSTREAM_ERROR_INVALID_PARAM,
464 "Error, invalid type input");
465
466 AudioStreamInfo streamInfo = {
467 (AudioSamplingRate)samplingRate_,
468 encodingType_,
469 sampleFormat_,
470 (AudioChannel)channelCount_,
471 channelLayout_
472 };
473
474 AudioRendererInfo rendererInfo = {
475 CONTENT_TYPE_UNKNOWN,
476 usage_,
477 latencyMode_,
478 volumeMode_
479 };
480
481 rendererInfo.playerType = PLAYER_TYPE_OH_AUDIO_RENDERER;
482
483 AudioRendererOptions options = {
484 streamInfo,
485 rendererInfo,
486 privacyType_
487 };
488
489 OHAudioRenderer *audioRenderer = new OHAudioRenderer();
490 if (audioRenderer->Initialize(options)) {
491 OHOS::AudioStandard::ObjectRefMap<OHOS::AudioStandard::OHAudioRenderer>::Insert(audioRenderer);
492 audioRenderer->SetRendererWriteDataCallbackType(writeDataCallbackType_);
493 audioRenderer->SetRendererInterruptEventCallbackType(interruptCallbackType_);
494 audioRenderer->SetRendererErrorCallbackType(errorCallbackType_);
495 audioRenderer->SetRendererCallback(rendererCallbacks_, userData_, metadataUserData_);
496 audioRenderer->SetRendererOutputDeviceChangeCallback(outputDeviceChangecallback_, outputDeviceChangeuserData_);
497 audioRenderer->SetInterruptMode(interruptMode_);
498 audioRenderer->SetRendererFastStatusChangeCallback(
499 rendererFastStatusChangeCallback_, rendererFastStatusChangeUserData_);
500 if (nullptr == renderer) {
501 AUDIO_ERR_LOG("render is nullptr");
502 delete audioRenderer;
503 audioRenderer = nullptr;
504 return AUDIOSTREAM_ERROR_INVALID_PARAM;
505 }
506 *renderer = (OH_AudioRenderer*)audioRenderer;
507 if (preferredFrameSize_ != UNDEFINED_SIZE) {
508 audioRenderer->SetPreferredFrameSize(preferredFrameSize_);
509 }
510 return AUDIOSTREAM_SUCCESS;
511 }
512 AUDIO_ERR_LOG("Create OHAudioRenderer failed");
513 delete audioRenderer;
514 audioRenderer = nullptr;
515 return AUDIOSTREAM_ERROR_INVALID_PARAM;
516 }
517
Generate(OH_AudioCapturer ** capturer)518 OH_AudioStream_Result OHAudioStreamBuilder::Generate(OH_AudioCapturer **capturer)
519 {
520 AUDIO_INFO_LOG("Generate OHAudioCapturer");
521 CHECK_AND_RETURN_RET_LOG(streamType_ == CAPTURER_TYPE, AUDIOSTREAM_ERROR_INVALID_PARAM,
522 "Error, invalid type input");
523 AudioStreamInfo streamInfo = {
524 (AudioSamplingRate)samplingRate_,
525 encodingType_,
526 sampleFormat_,
527 (AudioChannel)channelCount_,
528 channelLayout_
529 };
530
531 AudioCapturerInfo capturerInfo = {
532 sourceType_,
533 latencyMode_
534 };
535
536 AudioCapturerOptions options = {
537 streamInfo,
538 capturerInfo
539 };
540
541 OHAudioCapturer *audioCapturer = new OHAudioCapturer();
542 if (audioCapturer->Initialize(options)) {
543 OHOS::AudioStandard::ObjectRefMap<OHOS::AudioStandard::OHAudioCapturer>::Insert(audioCapturer);
544 audioCapturer->SetCapturerReadDataCallbackType(readDataCallbackType_);
545 audioCapturer->SetCapturerStreamEventCallbackType(streamEventCallbackType_);
546 audioCapturer->SetCapturerInterruptEventCallbackType(interruptCallbackType_);
547 audioCapturer->SetCapturerErrorCallbackType(errorCallbackType_);
548 audioCapturer->SetCapturerCallback(capturerCallbacks_, userData_);
549 audioCapturer->SetCapturerWillMuteWhenInterrupted(strategy_);
550 audioCapturer->SetCapturerFastStatusChangeCallback(
551 capturerFastStatusChangeCallback_, capturerFastStatusChangeUserData_);
552 if (nullptr == capturer) {
553 AUDIO_ERR_LOG("capturer is nullptr");
554 delete audioCapturer;
555 audioCapturer = nullptr;
556 return AUDIOSTREAM_ERROR_INVALID_PARAM;
557 }
558 *capturer = (OH_AudioCapturer*)audioCapturer;
559 return AUDIOSTREAM_SUCCESS;
560 }
561 AUDIO_ERR_LOG("Create OHAudioCapturer failed");
562 delete audioCapturer;
563 audioCapturer = nullptr;
564 return AUDIOSTREAM_ERROR_INVALID_PARAM;
565 }
566
SetRendererCallback(OH_AudioRenderer_Callbacks callbacks,void * userData)567 OH_AudioStream_Result OHAudioStreamBuilder::SetRendererCallback(OH_AudioRenderer_Callbacks callbacks, void *userData)
568 {
569 CHECK_AND_RETURN_RET_LOG(streamType_ != CAPTURER_TYPE, AUDIOSTREAM_ERROR_INVALID_PARAM,
570 "SetRendererCallback Error, invalid type input");
571 writeDataCallbackType_ = WRITE_DATA_CALLBACK_WITHOUT_RESULT;
572 interruptCallbackType_ = INTERRUPT_EVENT_CALLBACK_COMBINED;
573 errorCallbackType_ = ERROR_CALLBACK_COMBINED;
574 rendererCallbacks_.callbacks = callbacks;
575 userData_ = userData;
576 return AUDIOSTREAM_SUCCESS;
577 }
578
SetCapturerCallback(OH_AudioCapturer_Callbacks callbacks,void * userData)579 OH_AudioStream_Result OHAudioStreamBuilder::SetCapturerCallback(OH_AudioCapturer_Callbacks callbacks, void *userData)
580 {
581 CHECK_AND_RETURN_RET_LOG(streamType_ != RENDERER_TYPE, AUDIOSTREAM_ERROR_INVALID_PARAM,
582 "SetCapturerCallback Error, invalid type input");
583 readDataCallbackType_ = READ_DATA_CALLBACK_WITHOUT_RESULT;
584 streamEventCallbackType_ = STREAM_EVENT_CALLBACK_COMBINED;
585 interruptCallbackType_ = INTERRUPT_EVENT_CALLBACK_COMBINED;
586 errorCallbackType_ = ERROR_CALLBACK_COMBINED;
587 capturerCallbacks_.callbacks = callbacks;
588 userData_ = userData;
589 return AUDIOSTREAM_SUCCESS;
590 }
591
SetRendererOutputDeviceChangeCallback(OH_AudioRenderer_OutputDeviceChangeCallback callback,void * userData)592 OH_AudioStream_Result OHAudioStreamBuilder::SetRendererOutputDeviceChangeCallback(
593 OH_AudioRenderer_OutputDeviceChangeCallback callback, void *userData)
594 {
595 CHECK_AND_RETURN_RET_LOG(streamType_ != CAPTURER_TYPE, AUDIOSTREAM_ERROR_INVALID_PARAM,
596 "SetRendererCallback Error, invalid type input");
597 outputDeviceChangecallback_ = callback;
598 outputDeviceChangeuserData_ = userData;
599 return AUDIOSTREAM_SUCCESS;
600 }
601
SetRendererPrivacy(AudioPrivacyType privacyType)602 OH_AudioStream_Result OHAudioStreamBuilder::SetRendererPrivacy(AudioPrivacyType privacyType)
603 {
604 CHECK_AND_RETURN_RET_LOG(streamType_ != CAPTURER_TYPE, AUDIOSTREAM_ERROR_INVALID_PARAM,
605 "SetRendererPrivacy Error, invalid type input");
606 privacyType_ = privacyType;
607 return AUDIOSTREAM_SUCCESS;
608 }
609
SetInterruptMode(InterruptMode mode)610 OH_AudioStream_Result OHAudioStreamBuilder::SetInterruptMode(InterruptMode mode)
611 {
612 CHECK_AND_RETURN_RET_LOG(streamType_ == RENDERER_TYPE, AUDIOSTREAM_ERROR_INVALID_PARAM,
613 "Error, invalid type input");
614 interruptMode_ = mode;
615 return AUDIOSTREAM_SUCCESS;
616 }
617
SetWriteDataWithMetadataCallback(OH_AudioRenderer_WriteDataWithMetadataCallback callback,void * userData)618 OH_AudioStream_Result OHAudioStreamBuilder::SetWriteDataWithMetadataCallback(
619 OH_AudioRenderer_WriteDataWithMetadataCallback callback, void *userData)
620 {
621 CHECK_AND_RETURN_RET_LOG(streamType_ != CAPTURER_TYPE, AUDIOSTREAM_ERROR_INVALID_PARAM,
622 "SetRendererCallback Error, invalid type input");
623 rendererCallbacks_.writeDataWithMetadataCallback = callback;
624 metadataUserData_ = userData;
625 return AUDIOSTREAM_SUCCESS;
626 }
627
SetRendererWriteDataCallback(OH_AudioRenderer_OnWriteDataCallback callback,void * userData)628 OH_AudioStream_Result OHAudioStreamBuilder::SetRendererWriteDataCallback(
629 OH_AudioRenderer_OnWriteDataCallback callback, void *userData)
630 {
631 CHECK_AND_RETURN_RET_LOG(streamType_ != CAPTURER_TYPE, AUDIOSTREAM_ERROR_INVALID_PARAM,
632 "Set renderer callback error, invalid type input.");
633 writeDataCallbackType_ = WRITE_DATA_CALLBACK_WITH_RESULT;
634 rendererCallbacks_.onWriteDataCallback = callback;
635 userData_ = userData;
636 return AUDIOSTREAM_SUCCESS;
637 }
638
SetRendererWriteDataCallbackAdvanced(OH_AudioRenderer_OnWriteDataCallbackAdvanced callback,void * userData)639 OH_AudioStream_Result OHAudioStreamBuilder::SetRendererWriteDataCallbackAdvanced(
640 OH_AudioRenderer_OnWriteDataCallbackAdvanced callback, void *userData)
641 {
642 CHECK_AND_RETURN_RET_LOG(streamType_ != CAPTURER_TYPE, AUDIOSTREAM_ERROR_INVALID_PARAM,
643 "Set renderer callback error, invalid type input.");
644 writeDataCallbackType_ = WRITE_DATA_CALLBACK_ADVANCED;
645 rendererCallbacks_.onWriteDataCallbackAdavanced = callback;
646 userData_ = userData;
647 return AUDIOSTREAM_SUCCESS;
648 }
649
SetRendererInterruptEventCallback(OH_AudioRenderer_OnInterruptCallback callback,void * userData)650 OH_AudioStream_Result OHAudioStreamBuilder::SetRendererInterruptEventCallback(
651 OH_AudioRenderer_OnInterruptCallback callback, void *userData)
652 {
653 CHECK_AND_RETURN_RET_LOG(streamType_ != CAPTURER_TYPE, AUDIOSTREAM_ERROR_INVALID_PARAM,
654 "Set renderer callback error, invalid type input.");
655 interruptCallbackType_ = INTERRUPT_EVENT_CALLBACK_SEPERATED;
656 rendererCallbacks_.onInterruptEventCallback = callback;
657 userData_ = userData;
658 return AUDIOSTREAM_SUCCESS;
659 }
660
SetRendererErrorCallback(OH_AudioRenderer_OnErrorCallback callback,void * userData)661 OH_AudioStream_Result OHAudioStreamBuilder::SetRendererErrorCallback(OH_AudioRenderer_OnErrorCallback callback,
662 void *userData)
663 {
664 CHECK_AND_RETURN_RET_LOG(streamType_ != CAPTURER_TYPE, AUDIOSTREAM_ERROR_INVALID_PARAM,
665 "Set renderer callback error, invalid type input.");
666 errorCallbackType_ = ERROR_CALLBACK_SEPERATED;
667 rendererCallbacks_.onErrorCallback = callback;
668 userData_ = userData;
669 return AUDIOSTREAM_SUCCESS;
670 return OH_AudioStream_Result();
671 }
672
SetRendererFastStatusChangeCallback(OH_AudioRenderer_OnFastStatusChange callback,void * userData)673 OH_AudioStream_Result OHAudioStreamBuilder::SetRendererFastStatusChangeCallback(
674 OH_AudioRenderer_OnFastStatusChange callback, void* userData)
675 {
676 CHECK_AND_RETURN_RET_LOG(streamType_ != CAPTURER_TYPE, AUDIOSTREAM_ERROR_INVALID_PARAM,
677 "SetRendererFastStatusChangeCallback Error, invalid type input");
678 rendererFastStatusChangeCallback_ = callback;
679 rendererFastStatusChangeUserData_ = userData;
680 return AUDIOSTREAM_SUCCESS;
681 }
682
SetCapturerInterruptCallback(OH_AudioCapturer_OnInterruptCallback callback,void * userData)683 OH_AudioStream_Result OHAudioStreamBuilder::SetCapturerInterruptCallback(
684 OH_AudioCapturer_OnInterruptCallback callback, void *userData)
685 {
686 CHECK_AND_RETURN_RET_LOG(streamType_ != RENDERER_TYPE, AUDIOSTREAM_ERROR_INVALID_PARAM,
687 "SetCapturerInterrupt error, invalid type input.");
688 interruptCallbackType_ = INTERRUPT_EVENT_CALLBACK_SEPERATED;
689 capturerCallbacks_.onInterruptEventCallback = callback;
690 userData_ = userData;
691 return AUDIOSTREAM_SUCCESS;
692 }
693
SetCapturerErrorCallback(OH_AudioCapturer_OnErrorCallback callback,void * userData)694 OH_AudioStream_Result OHAudioStreamBuilder::SetCapturerErrorCallback(
695 OH_AudioCapturer_OnErrorCallback callback, void *userData)
696 {
697 CHECK_AND_RETURN_RET_LOG(streamType_ != RENDERER_TYPE, AUDIOSTREAM_ERROR_INVALID_PARAM,
698 "SetCapturerInterrupt error, invalid type input.");
699 errorCallbackType_ = ERROR_CALLBACK_SEPERATED;
700 capturerCallbacks_.onErrorCallback = callback;
701 userData_ = userData;
702 return AUDIOSTREAM_SUCCESS;
703 }
704
SetCapturerReadDataCallback(OH_AudioCapturer_OnReadDataCallback callback,void * userData)705 OH_AudioStream_Result OHAudioStreamBuilder::SetCapturerReadDataCallback(
706 OH_AudioCapturer_OnReadDataCallback callback, void *userData)
707 {
708 CHECK_AND_RETURN_RET_LOG(streamType_ != RENDERER_TYPE, AUDIOSTREAM_ERROR_INVALID_PARAM,
709 "SetCapturerReadDataCallback error, invalid type input.");
710 readDataCallbackType_ = READ_DATA_CALLBACK_WITH_RESULT;
711 capturerCallbacks_.onReadDataCallback = callback;
712 userData_ = userData;
713 return AUDIOSTREAM_SUCCESS;
714 }
715
SetCapturerStreamEventCallback(OH_AudioCapturer_OnDeviceChangeCallback callback,void * userData)716 OH_AudioStream_Result OHAudioStreamBuilder::SetCapturerStreamEventCallback(
717 OH_AudioCapturer_OnDeviceChangeCallback callback, void *userData)
718 {
719 CHECK_AND_RETURN_RET_LOG(streamType_ != RENDERER_TYPE, AUDIOSTREAM_ERROR_INVALID_PARAM,
720 "SetCapturerStreamEventCallback error, invalid type input.");
721 streamEventCallbackType_ = STREAM_EVENT_CALLBACK_SEPERATED;
722 capturerCallbacks_.onDeviceChangeCallback = callback;
723 userData_ = userData;
724 return AUDIOSTREAM_SUCCESS;
725 }
726
SetCapturerFastStatusChangeCallback(OH_AudioCapturer_OnFastStatusChange callback,void * userData)727 OH_AudioStream_Result OHAudioStreamBuilder::SetCapturerFastStatusChangeCallback(
728 OH_AudioCapturer_OnFastStatusChange callback, void *userData)
729 {
730 CHECK_AND_RETURN_RET_LOG(streamType_ != RENDERER_TYPE, AUDIOSTREAM_ERROR_INVALID_PARAM,
731 "SetCapturerFastStatusChangeCallback Error, invalid type input");
732 capturerFastStatusChangeCallback_ = callback;
733 capturerFastStatusChangeUserData_ = userData;
734 return AUDIOSTREAM_SUCCESS;
735 }
736 } // namespace AudioStandard
737 } // namespace OHOS
738