• 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 #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