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