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 
24 using OHOS::AudioStandard::OHAudioStreamBuilder;
25 using OHOS::AudioStandard::AudioSampleFormat;
26 using OHOS::AudioStandard::StreamUsage;
27 using OHOS::AudioStandard::AudioEncodingType;
28 using OHOS::AudioStandard::ContentType;
29 using OHOS::AudioStandard::SourceType;
30 using OHOS::AudioStandard::InterruptMode;
31 using OHOS::AudioStandard::AudioChannelLayout;
32 using OHOS::AudioStandard::AudioPrivacyType;
33 
34 static const int32_t RENDERER_TYPE = 1;
35 static const int32_t CAPTURER_TYPE = 2;
36 constexpr int32_t UNDEFINED_SIZE = -1;
37 
convertBuilder(OH_AudioStreamBuilder * builder)38 static OHOS::AudioStandard::OHAudioStreamBuilder *convertBuilder(OH_AudioStreamBuilder *builder)
39 {
40     return (OHOS::AudioStandard::OHAudioStreamBuilder*) builder;
41 }
42 
OH_AudioStreamBuilder_SetSamplingRate(OH_AudioStreamBuilder * builder,int32_t rate)43 OH_AudioStream_Result OH_AudioStreamBuilder_SetSamplingRate(OH_AudioStreamBuilder *builder, int32_t rate)
44 {
45     OHAudioStreamBuilder *audioStreamBuilder = convertBuilder(builder);
46     CHECK_AND_RETURN_RET_LOG(audioStreamBuilder != nullptr, AUDIOSTREAM_ERROR_INVALID_PARAM, "convert builder failed");
47     return audioStreamBuilder->SetSamplingRate(rate);
48 }
49 
OH_AudioStreamBuilder_SetChannelCount(OH_AudioStreamBuilder * builder,int32_t channelCount)50 OH_AudioStream_Result OH_AudioStreamBuilder_SetChannelCount(OH_AudioStreamBuilder *builder, int32_t channelCount)
51 {
52     OHAudioStreamBuilder *audioStreamBuilder = convertBuilder(builder);
53     CHECK_AND_RETURN_RET_LOG(audioStreamBuilder != nullptr, AUDIOSTREAM_ERROR_INVALID_PARAM, "convert builder failed");
54     return audioStreamBuilder->SetChannelCount(channelCount);
55 }
56 
OH_AudioStreamBuilder_SetSampleFormat(OH_AudioStreamBuilder * builder,OH_AudioStream_SampleFormat format)57 OH_AudioStream_Result OH_AudioStreamBuilder_SetSampleFormat(OH_AudioStreamBuilder *builder,
58     OH_AudioStream_SampleFormat format)
59 {
60     OHAudioStreamBuilder *audioStreamBuilder = convertBuilder(builder);
61     CHECK_AND_RETURN_RET_LOG(audioStreamBuilder != nullptr, AUDIOSTREAM_ERROR_INVALID_PARAM, "convert builder failed");
62     AudioSampleFormat sampleFormat = (AudioSampleFormat)format;
63     return audioStreamBuilder->SetSampleFormat(sampleFormat);
64 }
65 
66 
OH_AudioStreamBuilder_SetFrameSizeInCallback(OH_AudioStreamBuilder * builder,int32_t frameSize)67 OH_AudioStream_Result OH_AudioStreamBuilder_SetFrameSizeInCallback(OH_AudioStreamBuilder *builder,
68     int32_t frameSize)
69 {
70     OHAudioStreamBuilder *audioStreamBuilder = convertBuilder(builder);
71     CHECK_AND_RETURN_RET_LOG(audioStreamBuilder != nullptr, AUDIOSTREAM_ERROR_INVALID_PARAM, "convert builder failed");
72     return audioStreamBuilder->SetPreferredFrameSize(frameSize);
73 }
74 
OH_AudioStreamBuilder_SetEncodingType(OH_AudioStreamBuilder * builder,OH_AudioStream_EncodingType encodingType)75 OH_AudioStream_Result OH_AudioStreamBuilder_SetEncodingType(OH_AudioStreamBuilder *builder,
76     OH_AudioStream_EncodingType encodingType)
77 {
78     OHAudioStreamBuilder *audioStreamBuilder = convertBuilder(builder);
79     CHECK_AND_RETURN_RET_LOG(audioStreamBuilder != nullptr, AUDIOSTREAM_ERROR_INVALID_PARAM, "convert builder failed");
80     AudioEncodingType type = (AudioEncodingType)encodingType;
81     return audioStreamBuilder->SetEncodingType(type);
82 }
83 
OH_AudioStreamBuilder_SetLatencyMode(OH_AudioStreamBuilder * builder,OH_AudioStream_LatencyMode latencyMode)84 OH_AudioStream_Result OH_AudioStreamBuilder_SetLatencyMode(OH_AudioStreamBuilder *builder,
85     OH_AudioStream_LatencyMode latencyMode)
86 {
87     OHAudioStreamBuilder *audioStreamBuilder = convertBuilder(builder);
88     CHECK_AND_RETURN_RET_LOG(audioStreamBuilder != nullptr, AUDIOSTREAM_ERROR_INVALID_PARAM, "convert builder failed");
89     int32_t innerLatencyMode = (int32_t)latencyMode;
90     return audioStreamBuilder->SetLatencyMode(innerLatencyMode);
91 }
92 
OH_AudioStreamBuilder_SetChannelLayout(OH_AudioStreamBuilder * builder,OH_AudioChannelLayout channelLayout)93 OH_AudioStream_Result OH_AudioStreamBuilder_SetChannelLayout(OH_AudioStreamBuilder *builder,
94     OH_AudioChannelLayout channelLayout)
95 {
96     OHAudioStreamBuilder *audioStreamBuilder = convertBuilder(builder);
97     CHECK_AND_RETURN_RET_LOG(audioStreamBuilder != nullptr, AUDIOSTREAM_ERROR_INVALID_PARAM, "convert builder failed");
98     AudioChannelLayout layout = (AudioChannelLayout)channelLayout;
99     return audioStreamBuilder->SetChannelLayout(layout);
100 }
101 
OH_AudioStreamBuilder_SetRendererInfo(OH_AudioStreamBuilder * builder,OH_AudioStream_Usage usage)102 OH_AudioStream_Result OH_AudioStreamBuilder_SetRendererInfo(OH_AudioStreamBuilder *builder,
103     OH_AudioStream_Usage usage)
104 {
105     OHAudioStreamBuilder *audioStreamBuilder = convertBuilder(builder);
106     CHECK_AND_RETURN_RET_LOG(audioStreamBuilder != nullptr, AUDIOSTREAM_ERROR_INVALID_PARAM, "convert builder failed");
107     return audioStreamBuilder->SetRendererInfo(static_cast<StreamUsage>(usage));
108 }
109 
OH_AudioStreamBuilder_SetRendererCallback(OH_AudioStreamBuilder * builder,OH_AudioRenderer_Callbacks callbacks,void * userData)110 OH_AudioStream_Result OH_AudioStreamBuilder_SetRendererCallback(OH_AudioStreamBuilder *builder,
111     OH_AudioRenderer_Callbacks callbacks, void *userData)
112 {
113     OHAudioStreamBuilder *audioStreamBuilder = convertBuilder(builder);
114     CHECK_AND_RETURN_RET_LOG(audioStreamBuilder != nullptr, AUDIOSTREAM_ERROR_INVALID_PARAM, "convert builder failed");
115     return audioStreamBuilder->SetRendererCallback(callbacks, userData);
116 }
117 
OH_AudioStreamBuilder_SetCapturerInfo(OH_AudioStreamBuilder * builder,OH_AudioStream_SourceType sourceType)118 OH_AudioStream_Result OH_AudioStreamBuilder_SetCapturerInfo(OH_AudioStreamBuilder *builder,
119     OH_AudioStream_SourceType sourceType)
120 {
121     OHAudioStreamBuilder *audioStreamBuilder = convertBuilder(builder);
122     CHECK_AND_RETURN_RET_LOG(audioStreamBuilder != nullptr, AUDIOSTREAM_ERROR_INVALID_PARAM, "convert builder failed");
123     SourceType type = (SourceType)sourceType;
124     return audioStreamBuilder->SetSourceType(type);
125 }
126 
127 
OH_AudioStreamBuilder_Create(OH_AudioStreamBuilder ** builder,OH_AudioStream_Type type)128 OH_AudioStream_Result OH_AudioStreamBuilder_Create(OH_AudioStreamBuilder **builder, OH_AudioStream_Type type)
129 {
130     int32_t streamType = type == AUDIOSTREAM_TYPE_RENDERER ? RENDERER_TYPE : CAPTURER_TYPE;
131     OHAudioStreamBuilder *streamBuilder = new OHAudioStreamBuilder(streamType);
132 
133     *builder = (OH_AudioStreamBuilder*)streamBuilder;
134 
135     return AUDIOSTREAM_SUCCESS;
136 }
137 
OH_AudioStreamBuilder_SetCapturerCallback(OH_AudioStreamBuilder * builder,OH_AudioCapturer_Callbacks callbacks,void * userData)138 OH_AudioStream_Result OH_AudioStreamBuilder_SetCapturerCallback(OH_AudioStreamBuilder *builder,
139     OH_AudioCapturer_Callbacks callbacks, void *userData)
140 {
141     OHAudioStreamBuilder *audioStreamBuilder = convertBuilder(builder);
142     CHECK_AND_RETURN_RET_LOG(audioStreamBuilder != nullptr, AUDIOSTREAM_ERROR_INVALID_PARAM, "convert builder failed");
143 
144     return audioStreamBuilder->SetCapturerCallback(callbacks, userData);
145 }
146 
OH_AudioStreamBuilder_SetRendererOutputDeviceChangeCallback(OH_AudioStreamBuilder * builder,OH_AudioRenderer_OutputDeviceChangeCallback callback,void * userData)147 OH_AudioStream_Result OH_AudioStreamBuilder_SetRendererOutputDeviceChangeCallback(OH_AudioStreamBuilder *builder,
148     OH_AudioRenderer_OutputDeviceChangeCallback callback, void *userData)
149 {
150     OHAudioStreamBuilder *audioStreamBuilder = convertBuilder(builder);
151     CHECK_AND_RETURN_RET_LOG(audioStreamBuilder != nullptr, AUDIOSTREAM_ERROR_INVALID_PARAM, "convert builder failed");
152 
153     return audioStreamBuilder->SetRendererOutputDeviceChangeCallback(callback, userData);
154 }
155 
OH_AudioStreamBuilder_SetRendererPrivacy(OH_AudioStreamBuilder * builder,OH_AudioStream_PrivacyType privacy)156 OH_AudioStream_Result OH_AudioStreamBuilder_SetRendererPrivacy(OH_AudioStreamBuilder* builder,
157     OH_AudioStream_PrivacyType privacy)
158 {
159     OHAudioStreamBuilder *audioStreamBuilder = convertBuilder(builder);
160     CHECK_AND_RETURN_RET_LOG(audioStreamBuilder != nullptr, AUDIOSTREAM_ERROR_INVALID_PARAM, "convert builder failed");
161 
162     if (privacy != AUDIO_STREAM_PRIVACY_TYPE_PUBLIC && privacy != AUDIO_STREAM_PRIVACY_TYPE_PRIVATE) {
163         AUDIO_WARNING_LOG("Invalid param: privacy type");
164         return AUDIOSTREAM_ERROR_INVALID_PARAM;
165     }
166 
167     return audioStreamBuilder->SetRendererPrivacy((AudioPrivacyType)privacy);
168 }
169 
OH_AudioStreamBuilder_SetWriteDataWithMetadataCallback(OH_AudioStreamBuilder * builder,OH_AudioRenderer_WriteDataWithMetadataCallback callback,void * userData)170 OH_AudioStream_Result OH_AudioStreamBuilder_SetWriteDataWithMetadataCallback(OH_AudioStreamBuilder *builder,
171     OH_AudioRenderer_WriteDataWithMetadataCallback 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->SetWriteDataWithMetadataCallback(callback, userData);
176 }
177 
OH_AudioStreamBuilder_SetRendererWriteDataCallback(OH_AudioStreamBuilder * builder,OH_AudioRenderer_OnWriteDataCallback callback,void * userData)178 OH_AudioStream_Result OH_AudioStreamBuilder_SetRendererWriteDataCallback(OH_AudioStreamBuilder* builder,
179     OH_AudioRenderer_OnWriteDataCallback 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->SetRendererWriteDataCallback(callback, userData);
184 }
185 
OH_AudioStreamBuilder_GenerateRenderer(OH_AudioStreamBuilder * builder,OH_AudioRenderer ** audioRenderer)186 OH_AudioStream_Result OH_AudioStreamBuilder_GenerateRenderer(OH_AudioStreamBuilder *builder,
187     OH_AudioRenderer **audioRenderer)
188 {
189     OHAudioStreamBuilder *audioStreamBuilder = convertBuilder(builder);
190     CHECK_AND_RETURN_RET_LOG(audioStreamBuilder != nullptr, AUDIOSTREAM_ERROR_INVALID_PARAM, "convert builder failed");
191     return audioStreamBuilder->Generate(audioRenderer);
192 }
193 
OH_AudioStreamBuilder_GenerateCapturer(OH_AudioStreamBuilder * builder,OH_AudioCapturer ** audioCapturer)194 OH_AudioStream_Result OH_AudioStreamBuilder_GenerateCapturer(OH_AudioStreamBuilder *builder,
195     OH_AudioCapturer **audioCapturer)
196 {
197     OHAudioStreamBuilder *audioStreamBuilder = convertBuilder(builder);
198     CHECK_AND_RETURN_RET_LOG(audioStreamBuilder != nullptr, AUDIOSTREAM_ERROR_INVALID_PARAM, "convert builder failed");
199     return audioStreamBuilder->Generate(audioCapturer);
200 }
201 
OH_AudioStreamBuilder_Destroy(OH_AudioStreamBuilder * builder)202 OH_AudioStream_Result OH_AudioStreamBuilder_Destroy(OH_AudioStreamBuilder *builder)
203 {
204     OHAudioStreamBuilder *audioStreamBuilder = convertBuilder(builder);
205     CHECK_AND_RETURN_RET_LOG(audioStreamBuilder != nullptr, AUDIOSTREAM_ERROR_INVALID_PARAM, "convert builder failed");
206     if (audioStreamBuilder != nullptr) {
207         delete audioStreamBuilder;
208         audioStreamBuilder = nullptr;
209         return AUDIOSTREAM_SUCCESS;
210     }
211     return AUDIOSTREAM_ERROR_ILLEGAL_STATE;
212 }
213 
OH_AudioStreamBuilder_SetRendererInterruptMode(OH_AudioStreamBuilder * builder,OH_AudioInterrupt_Mode mode)214 OH_AudioStream_Result OH_AudioStreamBuilder_SetRendererInterruptMode(OH_AudioStreamBuilder* builder,
215     OH_AudioInterrupt_Mode mode)
216 {
217     OHAudioStreamBuilder *audioStreamBuilder = convertBuilder(builder);
218     CHECK_AND_RETURN_RET_LOG(audioStreamBuilder != nullptr, AUDIOSTREAM_ERROR_INVALID_PARAM, "convert builder failed");
219     CHECK_AND_RETURN_RET_LOG((mode == AUDIOSTREAM_INTERRUPT_MODE_SHARE ||
220         mode == AUDIOSTREAM_INTERRUPT_MODE_INDEPENDENT), AUDIOSTREAM_ERROR_INVALID_PARAM, "mode is invalid");
221     InterruptMode interruptMode = static_cast<InterruptMode>(mode);
222     return audioStreamBuilder->SetInterruptMode(interruptMode);
223 }
224 
225 namespace OHOS {
226 namespace AudioStandard {
227 
OHAudioStreamBuilder(const int32_t type)228 OHAudioStreamBuilder::OHAudioStreamBuilder(const int32_t type) : streamType_(RENDERER_TYPE)
229 {
230     AUDIO_INFO_LOG("OHAudioStreamBuilder created, type is %{public}d", type);
231     streamType_ = type;
232 }
233 
~OHAudioStreamBuilder()234 OHAudioStreamBuilder::~OHAudioStreamBuilder()
235 {
236     AUDIO_INFO_LOG("OHAudioStreamBuilder destroyed, type is %{public}d", streamType_);
237 }
238 
SetSamplingRate(int32_t rate)239 OH_AudioStream_Result OHAudioStreamBuilder::SetSamplingRate(int32_t rate)
240 {
241     switch (rate) {
242         case AudioSamplingRate::SAMPLE_RATE_8000:
243         case AudioSamplingRate::SAMPLE_RATE_11025:
244         case AudioSamplingRate::SAMPLE_RATE_12000:
245         case AudioSamplingRate::SAMPLE_RATE_16000:
246         case AudioSamplingRate::SAMPLE_RATE_22050:
247         case AudioSamplingRate::SAMPLE_RATE_24000:
248         case AudioSamplingRate::SAMPLE_RATE_32000:
249         case AudioSamplingRate::SAMPLE_RATE_44100:
250         case AudioSamplingRate::SAMPLE_RATE_48000:
251         case AudioSamplingRate::SAMPLE_RATE_64000:
252         case AudioSamplingRate::SAMPLE_RATE_88200:
253         case AudioSamplingRate::SAMPLE_RATE_96000:
254         case AudioSamplingRate::SAMPLE_RATE_176400:
255         case AudioSamplingRate::SAMPLE_RATE_192000:
256             AUDIO_DEBUG_LOG("sampleFormat input value is valid");
257             break;
258         default:
259             AUDIO_ERR_LOG("sampleFormat input value is invalid");
260             return AUDIOSTREAM_ERROR_INVALID_PARAM;
261     }
262     samplingRate_ = rate;
263     return AUDIOSTREAM_SUCCESS;
264 }
265 
SetChannelCount(int32_t channelCount)266 OH_AudioStream_Result OHAudioStreamBuilder::SetChannelCount(int32_t channelCount)
267 {
268     switch (channelCount) {
269         case AudioChannel::MONO:
270         case AudioChannel::STEREO:
271         case AudioChannel::CHANNEL_3:
272         case AudioChannel::CHANNEL_4:
273         case AudioChannel::CHANNEL_5:
274         case AudioChannel::CHANNEL_6:
275         case AudioChannel::CHANNEL_7:
276         case AudioChannel::CHANNEL_8:
277         case AudioChannel::CHANNEL_9:
278         case AudioChannel::CHANNEL_10:
279         case AudioChannel::CHANNEL_11:
280         case AudioChannel::CHANNEL_12:
281         case AudioChannel::CHANNEL_13:
282         case AudioChannel::CHANNEL_14:
283         case AudioChannel::CHANNEL_15:
284         case AudioChannel::CHANNEL_16:
285             AUDIO_DEBUG_LOG("channelCount input value is valid");
286             break;
287         default:
288             AUDIO_ERR_LOG("channelCount input value is invalid");
289             return AUDIOSTREAM_ERROR_INVALID_PARAM;
290     }
291     channelCount_ = channelCount;
292     return AUDIOSTREAM_SUCCESS;
293 }
294 
SetSampleFormat(AudioSampleFormat sampleFormat)295 OH_AudioStream_Result OHAudioStreamBuilder::SetSampleFormat(AudioSampleFormat sampleFormat)
296 {
297     sampleFormat_ = sampleFormat;
298     return AUDIOSTREAM_SUCCESS;
299 }
300 
301 
SetPreferredFrameSize(int32_t frameSize)302 OH_AudioStream_Result OHAudioStreamBuilder::SetPreferredFrameSize(int32_t frameSize)
303 {
304     preferredFrameSize_ = frameSize;
305     return AUDIOSTREAM_SUCCESS;
306 }
307 
SetRendererInfo(StreamUsage usage)308 OH_AudioStream_Result OHAudioStreamBuilder::SetRendererInfo(StreamUsage usage)
309 {
310     CHECK_AND_RETURN_RET_LOG(streamType_ != CAPTURER_TYPE && usage != StreamUsage::STREAM_USAGE_UNKNOWN,
311         AUDIOSTREAM_ERROR_INVALID_PARAM, "Error, invalid type input");
312     usage_ = usage;
313     return AUDIOSTREAM_SUCCESS;
314 }
315 
SetEncodingType(AudioEncodingType encodingType)316 OH_AudioStream_Result OHAudioStreamBuilder::SetEncodingType(AudioEncodingType encodingType)
317 {
318     encodingType_ = encodingType;
319     return AUDIOSTREAM_SUCCESS;
320 }
321 
SetSourceType(SourceType type)322 OH_AudioStream_Result OHAudioStreamBuilder::SetSourceType(SourceType type)
323 {
324     CHECK_AND_RETURN_RET_LOG(streamType_ != RENDERER_TYPE && type != SOURCE_TYPE_INVALID,
325         AUDIOSTREAM_ERROR_INVALID_PARAM, "Error, invalid type input");
326 
327     sourceType_ = type;
328     return AUDIOSTREAM_SUCCESS;
329 }
330 
331 
SetLatencyMode(int32_t latencyMode)332 OH_AudioStream_Result OHAudioStreamBuilder::SetLatencyMode(int32_t latencyMode)
333 {
334     latencyMode_ = latencyMode;
335     return AUDIOSTREAM_SUCCESS;
336 }
337 
SetChannelLayout(AudioChannelLayout channelLayout)338 OH_AudioStream_Result OHAudioStreamBuilder::SetChannelLayout(AudioChannelLayout channelLayout)
339 {
340     channelLayout_ = channelLayout;
341     return AUDIOSTREAM_SUCCESS;
342 }
343 
Generate(OH_AudioRenderer ** renderer)344 OH_AudioStream_Result OHAudioStreamBuilder::Generate(OH_AudioRenderer **renderer)
345 {
346     AUDIO_INFO_LOG("Generate OHAudioRenderer");
347     CHECK_AND_RETURN_RET_LOG(streamType_ == RENDERER_TYPE, AUDIOSTREAM_ERROR_INVALID_PARAM,
348         "Error, invalid type input");
349 
350     AudioStreamInfo streamInfo = {
351         (AudioSamplingRate)samplingRate_,
352         encodingType_,
353         sampleFormat_,
354         (AudioChannel)channelCount_,
355         channelLayout_
356     };
357 
358     AudioRendererInfo rendererInfo = {
359         CONTENT_TYPE_UNKNOWN,
360         usage_,
361         latencyMode_
362     };
363 
364     AudioRendererOptions options = {
365         streamInfo,
366         rendererInfo,
367         privacyType_
368     };
369 
370     OHAudioRenderer *audioRenderer = new OHAudioRenderer();
371     if (audioRenderer->Initialize(options)) {
372         audioRenderer->SetRendererCallbackType(writeDataCallbackType_);
373         audioRenderer->SetRendererCallback(rendererCallbacks_, userData_, metadataUserData_);
374         audioRenderer->SetRendererOutputDeviceChangeCallback(outputDeviceChangecallback_, outputDeviceChangeuserData_);
375         audioRenderer->SetInterruptMode(interruptMode_);
376         *renderer = (OH_AudioRenderer*)audioRenderer;
377         if (preferredFrameSize_ != UNDEFINED_SIZE) {
378             audioRenderer->SetPreferredFrameSize(preferredFrameSize_);
379         }
380         return AUDIOSTREAM_SUCCESS;
381     }
382     AUDIO_ERR_LOG("Create OHAudioRenderer failed");
383     delete audioRenderer;
384     audioRenderer = nullptr;
385     return AUDIOSTREAM_ERROR_INVALID_PARAM;
386 }
387 
Generate(OH_AudioCapturer ** capturer)388 OH_AudioStream_Result OHAudioStreamBuilder::Generate(OH_AudioCapturer **capturer)
389 {
390     AUDIO_INFO_LOG("Generate OHAudioCapturer");
391     CHECK_AND_RETURN_RET_LOG(streamType_ == CAPTURER_TYPE, AUDIOSTREAM_ERROR_INVALID_PARAM,
392         "Error, invalid type input");
393     AudioStreamInfo streamInfo = {
394         (AudioSamplingRate)samplingRate_,
395         encodingType_,
396         sampleFormat_,
397         (AudioChannel)channelCount_,
398         channelLayout_
399     };
400 
401     AudioCapturerInfo capturerInfo = {
402         sourceType_,
403         latencyMode_
404     };
405 
406     AudioCapturerOptions options = {
407         streamInfo,
408         capturerInfo
409     };
410 
411     OHAudioCapturer *audioCapturer = new OHAudioCapturer();
412     if (audioCapturer->Initialize(options)) {
413         audioCapturer->SetCapturerCallback(capturerCallbacks_, userData_);
414         *capturer = (OH_AudioCapturer*)audioCapturer;
415         return AUDIOSTREAM_SUCCESS;
416     }
417     AUDIO_ERR_LOG("Create OHAudioCapturer failed");
418     delete audioCapturer;
419     audioCapturer = nullptr;
420     return AUDIOSTREAM_ERROR_INVALID_PARAM;
421 }
422 
SetRendererCallback(OH_AudioRenderer_Callbacks callbacks,void * userData)423 OH_AudioStream_Result OHAudioStreamBuilder::SetRendererCallback(OH_AudioRenderer_Callbacks callbacks, void *userData)
424 {
425     CHECK_AND_RETURN_RET_LOG(streamType_ != CAPTURER_TYPE, AUDIOSTREAM_ERROR_INVALID_PARAM,
426         "SetRendererCallback Error, invalid type input");
427     writeDataCallbackType_ = WRITE_DATA_CALLBACK_WITHOUT_RESULT;
428     rendererCallbacks_.callbacks = callbacks;
429     userData_ = userData;
430     return AUDIOSTREAM_SUCCESS;
431 }
432 
SetCapturerCallback(OH_AudioCapturer_Callbacks callbacks,void * userData)433 OH_AudioStream_Result OHAudioStreamBuilder::SetCapturerCallback(OH_AudioCapturer_Callbacks callbacks, void *userData)
434 {
435     CHECK_AND_RETURN_RET_LOG(streamType_ != RENDERER_TYPE, AUDIOSTREAM_ERROR_INVALID_PARAM,
436         "SetCapturerCallback Error, invalid type input");
437     capturerCallbacks_ = callbacks;
438     userData_ = userData;
439     return AUDIOSTREAM_SUCCESS;
440 }
441 
SetRendererOutputDeviceChangeCallback(OH_AudioRenderer_OutputDeviceChangeCallback callback,void * userData)442 OH_AudioStream_Result OHAudioStreamBuilder::SetRendererOutputDeviceChangeCallback(
443     OH_AudioRenderer_OutputDeviceChangeCallback callback, void *userData)
444 {
445     CHECK_AND_RETURN_RET_LOG(streamType_ != CAPTURER_TYPE, AUDIOSTREAM_ERROR_INVALID_PARAM,
446         "SetRendererCallback Error, invalid type input");
447     outputDeviceChangecallback_ = callback;
448     outputDeviceChangeuserData_ = userData;
449     return AUDIOSTREAM_SUCCESS;
450 }
451 
SetRendererPrivacy(AudioPrivacyType privacyType)452 OH_AudioStream_Result OHAudioStreamBuilder::SetRendererPrivacy(AudioPrivacyType privacyType)
453 {
454     CHECK_AND_RETURN_RET_LOG(streamType_ != CAPTURER_TYPE, AUDIOSTREAM_ERROR_INVALID_PARAM,
455         "SetRendererPrivacy Error, invalid type input");
456     privacyType_ = privacyType;
457     return AUDIOSTREAM_SUCCESS;
458 }
459 
SetInterruptMode(InterruptMode mode)460 OH_AudioStream_Result OHAudioStreamBuilder::SetInterruptMode(InterruptMode mode)
461 {
462     CHECK_AND_RETURN_RET_LOG(streamType_ == RENDERER_TYPE, AUDIOSTREAM_ERROR_INVALID_PARAM,
463         "Error, invalid type input");
464     interruptMode_ = mode;
465     return AUDIOSTREAM_SUCCESS;
466 }
467 
SetWriteDataWithMetadataCallback(OH_AudioRenderer_WriteDataWithMetadataCallback callback,void * userData)468 OH_AudioStream_Result OHAudioStreamBuilder::SetWriteDataWithMetadataCallback(
469     OH_AudioRenderer_WriteDataWithMetadataCallback callback, void *userData)
470 {
471     CHECK_AND_RETURN_RET_LOG(streamType_ != CAPTURER_TYPE, AUDIOSTREAM_ERROR_INVALID_PARAM,
472         "SetRendererCallback Error, invalid type input");
473     rendererCallbacks_.writeDataWithMetadataCallback = callback;
474     metadataUserData_ = userData;
475     return AUDIOSTREAM_SUCCESS;
476 }
477 
SetRendererWriteDataCallback(OH_AudioRenderer_OnWriteDataCallback callback,void * userData)478 OH_AudioStream_Result OHAudioStreamBuilder::SetRendererWriteDataCallback(
479     OH_AudioRenderer_OnWriteDataCallback callback, void *userData)
480 {
481     CHECK_AND_RETURN_RET_LOG(streamType_ != CAPTURER_TYPE, AUDIOSTREAM_ERROR_INVALID_PARAM,
482         "Set renderer callback error, invalid type input.");
483     writeDataCallbackType_ = WRITE_DATA_CALLBACK_WITH_RESULT;
484     rendererCallbacks_.onWriteDataCallback = callback;
485     userData_ = userData;
486     return AUDIOSTREAM_SUCCESS;
487 }
488 }  // namespace AudioStandard
489 }  // namespace OHOS
490