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 }
143
144 int32_t streamType = type == AUDIOSTREAM_TYPE_RENDERER ? RENDERER_TYPE : CAPTURER_TYPE;
145 OHAudioStreamBuilder *streamBuilder = new OHAudioStreamBuilder(streamType);
146
147 *builder = (OH_AudioStreamBuilder*)streamBuilder;
148
149 return AUDIOSTREAM_SUCCESS;
150 }
151
OH_AudioStreamBuilder_SetCapturerCallback(OH_AudioStreamBuilder * builder,OH_AudioCapturer_Callbacks callbacks,void * userData)152 OH_AudioStream_Result OH_AudioStreamBuilder_SetCapturerCallback(OH_AudioStreamBuilder *builder,
153 OH_AudioCapturer_Callbacks callbacks, void *userData)
154 {
155 OHAudioStreamBuilder *audioStreamBuilder = convertBuilder(builder);
156 CHECK_AND_RETURN_RET_LOG(audioStreamBuilder != nullptr, AUDIOSTREAM_ERROR_INVALID_PARAM, "convert builder failed");
157
158 return audioStreamBuilder->SetCapturerCallback(callbacks, userData);
159 }
160
OH_AudioStreamBuilder_SetCapturerReadDataCallback(OH_AudioStreamBuilder * builder,OH_AudioCapturer_OnReadDataCallback callback,void * userData)161 OH_AudioStream_Result OH_AudioStreamBuilder_SetCapturerReadDataCallback(OH_AudioStreamBuilder* builder,
162 OH_AudioCapturer_OnReadDataCallback callback, void* userData)
163 {
164 OHAudioStreamBuilder *audioStreamBuilder = convertBuilder(builder);
165 CHECK_AND_RETURN_RET_LOG(audioStreamBuilder != nullptr, AUDIOSTREAM_ERROR_INVALID_PARAM, "convert builder failed");
166 return audioStreamBuilder->SetCapturerReadDataCallback(callback, userData);
167 }
168
OH_AudioStreamBuilder_SetCapturerDeviceChangeCallback(OH_AudioStreamBuilder * builder,OH_AudioCapturer_OnDeviceChangeCallback callback,void * userData)169 OH_AudioStream_Result OH_AudioStreamBuilder_SetCapturerDeviceChangeCallback(OH_AudioStreamBuilder* builder,
170 OH_AudioCapturer_OnDeviceChangeCallback callback, void* userData)
171 {
172 OHAudioStreamBuilder *audioStreamBuilder = convertBuilder(builder);
173 CHECK_AND_RETURN_RET_LOG(audioStreamBuilder != nullptr, AUDIOSTREAM_ERROR_INVALID_PARAM, "convert builder failed");
174 return audioStreamBuilder->SetCapturerStreamEventCallback(callback, userData);
175 }
176
OH_AudioStreamBuilder_SetCapturerErrorCallback(OH_AudioStreamBuilder * builder,OH_AudioCapturer_OnErrorCallback callback,void * userData)177 OH_AudioStream_Result OH_AudioStreamBuilder_SetCapturerErrorCallback(OH_AudioStreamBuilder *builder,
178 OH_AudioCapturer_OnErrorCallback callback, void *userData)
179 {
180 OHAudioStreamBuilder *audioStreamBuilder = convertBuilder(builder);
181 CHECK_AND_RETURN_RET_LOG(audioStreamBuilder != nullptr, AUDIOSTREAM_ERROR_INVALID_PARAM, "convert builder failed");
182 return audioStreamBuilder->SetCapturerErrorCallback(callback, userData);
183 }
184
OH_AudioStreamBuilder_SetRendererOutputDeviceChangeCallback(OH_AudioStreamBuilder * builder,OH_AudioRenderer_OutputDeviceChangeCallback callback,void * userData)185 OH_AudioStream_Result OH_AudioStreamBuilder_SetRendererOutputDeviceChangeCallback(OH_AudioStreamBuilder *builder,
186 OH_AudioRenderer_OutputDeviceChangeCallback callback, void *userData)
187 {
188 OHAudioStreamBuilder *audioStreamBuilder = convertBuilder(builder);
189 CHECK_AND_RETURN_RET_LOG(audioStreamBuilder != nullptr, AUDIOSTREAM_ERROR_INVALID_PARAM, "convert builder failed");
190
191 return audioStreamBuilder->SetRendererOutputDeviceChangeCallback(callback, userData);
192 }
193
OH_AudioStreamBuilder_SetRendererPrivacy(OH_AudioStreamBuilder * builder,OH_AudioStream_PrivacyType privacy)194 OH_AudioStream_Result OH_AudioStreamBuilder_SetRendererPrivacy(OH_AudioStreamBuilder* builder,
195 OH_AudioStream_PrivacyType privacy)
196 {
197 OHAudioStreamBuilder *audioStreamBuilder = convertBuilder(builder);
198 CHECK_AND_RETURN_RET_LOG(audioStreamBuilder != nullptr, AUDIOSTREAM_ERROR_INVALID_PARAM, "convert builder failed");
199
200 if (privacy != AUDIO_STREAM_PRIVACY_TYPE_PUBLIC && privacy != AUDIO_STREAM_PRIVACY_TYPE_PRIVATE) {
201 AUDIO_ERR_LOG("Invalid param: privacy type");
202 return AUDIOSTREAM_ERROR_INVALID_PARAM;
203 }
204
205 return audioStreamBuilder->SetRendererPrivacy((AudioPrivacyType)privacy);
206 }
207
OH_AudioStreamBuilder_SetWriteDataWithMetadataCallback(OH_AudioStreamBuilder * builder,OH_AudioRenderer_WriteDataWithMetadataCallback callback,void * userData)208 OH_AudioStream_Result OH_AudioStreamBuilder_SetWriteDataWithMetadataCallback(OH_AudioStreamBuilder *builder,
209 OH_AudioRenderer_WriteDataWithMetadataCallback callback, void *userData)
210 {
211 OHAudioStreamBuilder *audioStreamBuilder = convertBuilder(builder);
212 CHECK_AND_RETURN_RET_LOG(audioStreamBuilder != nullptr, AUDIOSTREAM_ERROR_INVALID_PARAM, "convert builder failed");
213 return audioStreamBuilder->SetWriteDataWithMetadataCallback(callback, userData);
214 }
215
OH_AudioStreamBuilder_SetRendererWriteDataCallback(OH_AudioStreamBuilder * builder,OH_AudioRenderer_OnWriteDataCallback callback,void * userData)216 OH_AudioStream_Result OH_AudioStreamBuilder_SetRendererWriteDataCallback(OH_AudioStreamBuilder* builder,
217 OH_AudioRenderer_OnWriteDataCallback callback, void* userData)
218 {
219 OHAudioStreamBuilder *audioStreamBuilder = convertBuilder(builder);
220 CHECK_AND_RETURN_RET_LOG(audioStreamBuilder != nullptr, AUDIOSTREAM_ERROR_INVALID_PARAM, "convert builder failed");
221 return audioStreamBuilder->SetRendererWriteDataCallback(callback, userData);
222 }
223
OH_AudioStreamBuilder_SetRendererInterruptCallback(OH_AudioStreamBuilder * builder,OH_AudioRenderer_OnInterruptCallback callback,void * userData)224 OH_AudioStream_Result OH_AudioStreamBuilder_SetRendererInterruptCallback(OH_AudioStreamBuilder *builder,
225 OH_AudioRenderer_OnInterruptCallback callback, void *userData)
226 {
227 OHAudioStreamBuilder *audioStreamBuilder = convertBuilder(builder);
228 CHECK_AND_RETURN_RET_LOG(audioStreamBuilder != nullptr, AUDIOSTREAM_ERROR_INVALID_PARAM, "convert builder failed");
229 return audioStreamBuilder->SetRendererInterruptEventCallback(callback, userData);
230 }
231
OH_AudioStreamBuilder_SetRendererErrorCallback(OH_AudioStreamBuilder * builder,OH_AudioRenderer_OnErrorCallback callback,void * userData)232 OH_AudioStream_Result OH_AudioStreamBuilder_SetRendererErrorCallback(OH_AudioStreamBuilder *builder,
233 OH_AudioRenderer_OnErrorCallback callback, void *userData)
234 {
235 OHAudioStreamBuilder *audioStreamBuilder = convertBuilder(builder);
236 CHECK_AND_RETURN_RET_LOG(audioStreamBuilder != nullptr, AUDIOSTREAM_ERROR_INVALID_PARAM, "convert builder failed");
237 return audioStreamBuilder->SetRendererErrorCallback(callback, userData);
238 }
239
OH_AudioStreamBuilder_GenerateRenderer(OH_AudioStreamBuilder * builder,OH_AudioRenderer ** audioRenderer)240 OH_AudioStream_Result OH_AudioStreamBuilder_GenerateRenderer(OH_AudioStreamBuilder *builder,
241 OH_AudioRenderer **audioRenderer)
242 {
243 OHAudioStreamBuilder *audioStreamBuilder = convertBuilder(builder);
244 CHECK_AND_RETURN_RET_LOG(audioStreamBuilder != nullptr, AUDIOSTREAM_ERROR_INVALID_PARAM, "convert builder failed");
245 return audioStreamBuilder->Generate(audioRenderer);
246 }
247
OH_AudioStreamBuilder_SetCapturerInterruptCallback(OH_AudioStreamBuilder * builder,OH_AudioCapturer_OnInterruptCallback callback,void * userData)248 OH_AudioStream_Result OH_AudioStreamBuilder_SetCapturerInterruptCallback(OH_AudioStreamBuilder *builder,
249 OH_AudioCapturer_OnInterruptCallback callback, void *userData)
250 {
251 OHAudioStreamBuilder *audioStreamBuilder = convertBuilder(builder);
252 CHECK_AND_RETURN_RET_LOG(audioStreamBuilder != nullptr, AUDIOSTREAM_ERROR_INVALID_PARAM, "convert builder failed");
253 return audioStreamBuilder->SetCapturerInterruptCallback(callback, userData);
254 }
255
OH_AudioStreamBuilder_GenerateCapturer(OH_AudioStreamBuilder * builder,OH_AudioCapturer ** audioCapturer)256 OH_AudioStream_Result OH_AudioStreamBuilder_GenerateCapturer(OH_AudioStreamBuilder *builder,
257 OH_AudioCapturer **audioCapturer)
258 {
259 OHAudioStreamBuilder *audioStreamBuilder = convertBuilder(builder);
260 CHECK_AND_RETURN_RET_LOG(audioStreamBuilder != nullptr, AUDIOSTREAM_ERROR_INVALID_PARAM, "convert builder failed");
261 return audioStreamBuilder->Generate(audioCapturer);
262 }
263
OH_AudioStreamBuilder_Destroy(OH_AudioStreamBuilder * builder)264 OH_AudioStream_Result OH_AudioStreamBuilder_Destroy(OH_AudioStreamBuilder *builder)
265 {
266 OHAudioStreamBuilder *audioStreamBuilder = convertBuilder(builder);
267 CHECK_AND_RETURN_RET_LOG(audioStreamBuilder != nullptr, AUDIOSTREAM_ERROR_INVALID_PARAM, "convert builder failed");
268 if (audioStreamBuilder != nullptr) {
269 delete audioStreamBuilder;
270 audioStreamBuilder = nullptr;
271 return AUDIOSTREAM_SUCCESS;
272 }
273 return AUDIOSTREAM_ERROR_ILLEGAL_STATE;
274 }
275
OH_AudioStreamBuilder_SetRendererInterruptMode(OH_AudioStreamBuilder * builder,OH_AudioInterrupt_Mode mode)276 OH_AudioStream_Result OH_AudioStreamBuilder_SetRendererInterruptMode(OH_AudioStreamBuilder* builder,
277 OH_AudioInterrupt_Mode mode)
278 {
279 OHAudioStreamBuilder *audioStreamBuilder = convertBuilder(builder);
280 CHECK_AND_RETURN_RET_LOG(audioStreamBuilder != nullptr, AUDIOSTREAM_ERROR_INVALID_PARAM, "convert builder failed");
281 CHECK_AND_RETURN_RET_LOG((mode == AUDIOSTREAM_INTERRUPT_MODE_SHARE ||
282 mode == AUDIOSTREAM_INTERRUPT_MODE_INDEPENDENT), AUDIOSTREAM_ERROR_INVALID_PARAM, "mode is invalid");
283 InterruptMode interruptMode = static_cast<InterruptMode>(mode);
284 return audioStreamBuilder->SetInterruptMode(interruptMode);
285 }
286
287 namespace OHOS {
288 namespace AudioStandard {
289
OHAudioStreamBuilder(const int32_t type)290 OHAudioStreamBuilder::OHAudioStreamBuilder(const int32_t type) : streamType_(RENDERER_TYPE)
291 {
292 AUDIO_INFO_LOG("OHAudioStreamBuilder created, type is %{public}d", type);
293 streamType_ = type;
294 }
295
~OHAudioStreamBuilder()296 OHAudioStreamBuilder::~OHAudioStreamBuilder()
297 {
298 AUDIO_INFO_LOG("OHAudioStreamBuilder destroyed, type is %{public}d", streamType_);
299 }
300
SetSamplingRate(int32_t rate)301 OH_AudioStream_Result OHAudioStreamBuilder::SetSamplingRate(int32_t rate)
302 {
303 switch (rate) {
304 case AudioSamplingRate::SAMPLE_RATE_8000:
305 case AudioSamplingRate::SAMPLE_RATE_11025:
306 case AudioSamplingRate::SAMPLE_RATE_12000:
307 case AudioSamplingRate::SAMPLE_RATE_16000:
308 case AudioSamplingRate::SAMPLE_RATE_22050:
309 case AudioSamplingRate::SAMPLE_RATE_24000:
310 case AudioSamplingRate::SAMPLE_RATE_32000:
311 case AudioSamplingRate::SAMPLE_RATE_44100:
312 case AudioSamplingRate::SAMPLE_RATE_48000:
313 case AudioSamplingRate::SAMPLE_RATE_64000:
314 case AudioSamplingRate::SAMPLE_RATE_88200:
315 case AudioSamplingRate::SAMPLE_RATE_96000:
316 case AudioSamplingRate::SAMPLE_RATE_176400:
317 case AudioSamplingRate::SAMPLE_RATE_192000:
318 AUDIO_DEBUG_LOG("sampleFormat input value is valid");
319 break;
320 default:
321 AUDIO_ERR_LOG("sampleFormat input value is invalid");
322 return AUDIOSTREAM_ERROR_INVALID_PARAM;
323 }
324 samplingRate_ = rate;
325 return AUDIOSTREAM_SUCCESS;
326 }
327
SetChannelCount(int32_t channelCount)328 OH_AudioStream_Result OHAudioStreamBuilder::SetChannelCount(int32_t channelCount)
329 {
330 switch (channelCount) {
331 case AudioChannel::MONO:
332 case AudioChannel::STEREO:
333 case AudioChannel::CHANNEL_3:
334 case AudioChannel::CHANNEL_4:
335 case AudioChannel::CHANNEL_5:
336 case AudioChannel::CHANNEL_6:
337 case AudioChannel::CHANNEL_7:
338 case AudioChannel::CHANNEL_8:
339 case AudioChannel::CHANNEL_9:
340 case AudioChannel::CHANNEL_10:
341 case AudioChannel::CHANNEL_11:
342 case AudioChannel::CHANNEL_12:
343 case AudioChannel::CHANNEL_13:
344 case AudioChannel::CHANNEL_14:
345 case AudioChannel::CHANNEL_15:
346 case AudioChannel::CHANNEL_16:
347 AUDIO_DEBUG_LOG("channelCount input value is valid");
348 break;
349 default:
350 AUDIO_ERR_LOG("channelCount input value is invalid");
351 return AUDIOSTREAM_ERROR_INVALID_PARAM;
352 }
353 channelCount_ = channelCount;
354 return AUDIOSTREAM_SUCCESS;
355 }
356
SetSampleFormat(AudioSampleFormat sampleFormat)357 OH_AudioStream_Result OHAudioStreamBuilder::SetSampleFormat(AudioSampleFormat sampleFormat)
358 {
359 sampleFormat_ = sampleFormat;
360 return AUDIOSTREAM_SUCCESS;
361 }
362
363
SetPreferredFrameSize(int32_t frameSize)364 OH_AudioStream_Result OHAudioStreamBuilder::SetPreferredFrameSize(int32_t frameSize)
365 {
366 preferredFrameSize_ = frameSize;
367 return AUDIOSTREAM_SUCCESS;
368 }
369
SetRendererInfo(StreamUsage usage)370 OH_AudioStream_Result OHAudioStreamBuilder::SetRendererInfo(StreamUsage usage)
371 {
372 CHECK_AND_RETURN_RET_LOG(streamType_ != CAPTURER_TYPE && usage != StreamUsage::STREAM_USAGE_UNKNOWN,
373 AUDIOSTREAM_ERROR_INVALID_PARAM, "Error, invalid type input");
374 usage_ = usage;
375 return AUDIOSTREAM_SUCCESS;
376 }
377
SetAudioVolumeMode(AudioVolumeMode volumeMode)378 OH_AudioStream_Result OHAudioStreamBuilder::SetAudioVolumeMode(AudioVolumeMode volumeMode)
379 {
380 volumeMode_ = volumeMode;
381 return AUDIOSTREAM_SUCCESS;
382 }
383
SetEncodingType(AudioEncodingType encodingType)384 OH_AudioStream_Result OHAudioStreamBuilder::SetEncodingType(AudioEncodingType encodingType)
385 {
386 encodingType_ = encodingType;
387 return AUDIOSTREAM_SUCCESS;
388 }
389
SetSourceType(SourceType type)390 OH_AudioStream_Result OHAudioStreamBuilder::SetSourceType(SourceType type)
391 {
392 CHECK_AND_RETURN_RET_LOG(streamType_ != RENDERER_TYPE && type != SOURCE_TYPE_INVALID,
393 AUDIOSTREAM_ERROR_INVALID_PARAM, "Error, invalid type input");
394
395 sourceType_ = type;
396 return AUDIOSTREAM_SUCCESS;
397 }
398
399
SetLatencyMode(int32_t latencyMode)400 OH_AudioStream_Result OHAudioStreamBuilder::SetLatencyMode(int32_t latencyMode)
401 {
402 latencyMode_ = latencyMode;
403 return AUDIOSTREAM_SUCCESS;
404 }
405
SetChannelLayout(AudioChannelLayout channelLayout)406 OH_AudioStream_Result OHAudioStreamBuilder::SetChannelLayout(AudioChannelLayout channelLayout)
407 {
408 channelLayout_ = channelLayout;
409 return AUDIOSTREAM_SUCCESS;
410 }
411
Generate(OH_AudioRenderer ** renderer)412 OH_AudioStream_Result OHAudioStreamBuilder::Generate(OH_AudioRenderer **renderer)
413 {
414 AUDIO_INFO_LOG("Generate OHAudioRenderer");
415 CHECK_AND_RETURN_RET_LOG(streamType_ == RENDERER_TYPE, AUDIOSTREAM_ERROR_INVALID_PARAM,
416 "Error, invalid type input");
417 CHECK_AND_RETURN_RET_LOG(renderer != nullptr, AUDIOSTREAM_ERROR_INVALID_PARAM,
418 "Error, renderer is nullptr");
419
420 AudioStreamInfo streamInfo = {
421 (AudioSamplingRate)samplingRate_,
422 encodingType_,
423 sampleFormat_,
424 (AudioChannel)channelCount_,
425 channelLayout_
426 };
427
428 AudioRendererInfo rendererInfo = {
429 CONTENT_TYPE_UNKNOWN,
430 usage_,
431 latencyMode_,
432 volumeMode_
433 };
434
435 AudioRendererOptions options = {
436 streamInfo,
437 rendererInfo,
438 privacyType_
439 };
440
441 OHAudioRenderer *audioRenderer = new OHAudioRenderer();
442 if (audioRenderer != nullptr && audioRenderer->Initialize(options)) {
443 OHOS::AudioStandard::ObjectRefMap<OHOS::AudioStandard::OHAudioRenderer>::Insert(audioRenderer);
444 audioRenderer->SetRendererWriteDataCallbackType(writeDataCallbackType_);
445 audioRenderer->SetRendererInterruptEventCallbackType(interruptCallbackType_);
446 audioRenderer->SetRendererErrorCallbackType(errorCallbackType_);
447 audioRenderer->SetRendererCallback(rendererCallbacks_, userData_, metadataUserData_);
448 audioRenderer->SetRendererOutputDeviceChangeCallback(outputDeviceChangecallback_, outputDeviceChangeuserData_);
449 audioRenderer->SetInterruptMode(interruptMode_);
450 *renderer = (OH_AudioRenderer*)audioRenderer;
451 if (preferredFrameSize_ != UNDEFINED_SIZE) {
452 audioRenderer->SetPreferredFrameSize(preferredFrameSize_);
453 }
454 return AUDIOSTREAM_SUCCESS;
455 }
456 AUDIO_ERR_LOG("Create OHAudioRenderer failed");
457 delete audioRenderer;
458 audioRenderer = nullptr;
459 return AUDIOSTREAM_ERROR_INVALID_PARAM;
460 }
461
Generate(OH_AudioCapturer ** capturer)462 OH_AudioStream_Result OHAudioStreamBuilder::Generate(OH_AudioCapturer **capturer)
463 {
464 AUDIO_INFO_LOG("Generate OHAudioCapturer");
465 CHECK_AND_RETURN_RET_LOG(streamType_ == CAPTURER_TYPE, AUDIOSTREAM_ERROR_INVALID_PARAM,
466 "Error, invalid type input");
467 CHECK_AND_RETURN_RET_LOG(capturer != nullptr, AUDIOSTREAM_ERROR_INVALID_PARAM,
468 "Error, capturer is nullptr");
469 AudioStreamInfo streamInfo = {
470 (AudioSamplingRate)samplingRate_,
471 encodingType_,
472 sampleFormat_,
473 (AudioChannel)channelCount_,
474 channelLayout_
475 };
476
477 AudioCapturerInfo capturerInfo = {
478 sourceType_,
479 latencyMode_
480 };
481
482 AudioCapturerOptions options = {
483 streamInfo,
484 capturerInfo
485 };
486
487 OHAudioCapturer *audioCapturer = new OHAudioCapturer();
488 if (audioCapturer != nullptr && audioCapturer->Initialize(options)) {
489 OHOS::AudioStandard::ObjectRefMap<OHOS::AudioStandard::OHAudioCapturer>::Insert(audioCapturer);
490 audioCapturer->SetCapturerReadDataCallbackType(readDataCallbackType_);
491 audioCapturer->SetCapturerStreamEventCallbackType(streamEventCallbackType_);
492 audioCapturer->SetCapturerInterruptEventCallbackType(interruptCallbackType_);
493 audioCapturer->SetCapturerErrorCallbackType(errorCallbackType_);
494 audioCapturer->SetCapturerCallback(capturerCallbacks_, userData_);
495 *capturer = (OH_AudioCapturer*)audioCapturer;
496 return AUDIOSTREAM_SUCCESS;
497 }
498 AUDIO_ERR_LOG("Create OHAudioCapturer failed");
499 delete audioCapturer;
500 audioCapturer = nullptr;
501 return AUDIOSTREAM_ERROR_INVALID_PARAM;
502 }
503
SetRendererCallback(OH_AudioRenderer_Callbacks callbacks,void * userData)504 OH_AudioStream_Result OHAudioStreamBuilder::SetRendererCallback(OH_AudioRenderer_Callbacks callbacks, void *userData)
505 {
506 CHECK_AND_RETURN_RET_LOG(streamType_ != CAPTURER_TYPE, AUDIOSTREAM_ERROR_INVALID_PARAM,
507 "SetRendererCallback Error, invalid type input");
508 writeDataCallbackType_ = WRITE_DATA_CALLBACK_WITHOUT_RESULT;
509 interruptCallbackType_ = INTERRUPT_EVENT_CALLBACK_WITHOUT_RESULT;
510 errorCallbackType_ = ERROR_CALLBACK_WITHOUT_RESULT;
511 rendererCallbacks_.callbacks = callbacks;
512 userData_ = userData;
513 return AUDIOSTREAM_SUCCESS;
514 }
515
SetCapturerCallback(OH_AudioCapturer_Callbacks callbacks,void * userData)516 OH_AudioStream_Result OHAudioStreamBuilder::SetCapturerCallback(OH_AudioCapturer_Callbacks callbacks, void *userData)
517 {
518 CHECK_AND_RETURN_RET_LOG(streamType_ != RENDERER_TYPE, AUDIOSTREAM_ERROR_INVALID_PARAM,
519 "SetCapturerCallback Error, invalid type input");
520 readDataCallbackType_ = READ_DATA_CALLBACK_WITHOUT_RESULT;
521 streamEventCallbackType_ = STREAM_EVENT_CALLBACK_WITHOUT_RESULT;
522 interruptCallbackType_ = INTERRUPT_EVENT_CALLBACK_WITHOUT_RESULT;
523 errorCallbackType_ = ERROR_CALLBACK_WITHOUT_RESULT;
524 capturerCallbacks_.callbacks = callbacks;
525 userData_ = userData;
526 return AUDIOSTREAM_SUCCESS;
527 }
528
SetRendererOutputDeviceChangeCallback(OH_AudioRenderer_OutputDeviceChangeCallback callback,void * userData)529 OH_AudioStream_Result OHAudioStreamBuilder::SetRendererOutputDeviceChangeCallback(
530 OH_AudioRenderer_OutputDeviceChangeCallback callback, void *userData)
531 {
532 CHECK_AND_RETURN_RET_LOG(streamType_ != CAPTURER_TYPE, AUDIOSTREAM_ERROR_INVALID_PARAM,
533 "SetRendererCallback Error, invalid type input");
534 outputDeviceChangecallback_ = callback;
535 outputDeviceChangeuserData_ = userData;
536 return AUDIOSTREAM_SUCCESS;
537 }
538
SetRendererPrivacy(AudioPrivacyType privacyType)539 OH_AudioStream_Result OHAudioStreamBuilder::SetRendererPrivacy(AudioPrivacyType privacyType)
540 {
541 CHECK_AND_RETURN_RET_LOG(streamType_ != CAPTURER_TYPE, AUDIOSTREAM_ERROR_INVALID_PARAM,
542 "SetRendererPrivacy Error, invalid type input");
543 privacyType_ = privacyType;
544 return AUDIOSTREAM_SUCCESS;
545 }
546
SetInterruptMode(InterruptMode mode)547 OH_AudioStream_Result OHAudioStreamBuilder::SetInterruptMode(InterruptMode mode)
548 {
549 CHECK_AND_RETURN_RET_LOG(streamType_ == RENDERER_TYPE, AUDIOSTREAM_ERROR_INVALID_PARAM,
550 "Error, invalid type input");
551 interruptMode_ = mode;
552 return AUDIOSTREAM_SUCCESS;
553 }
554
SetWriteDataWithMetadataCallback(OH_AudioRenderer_WriteDataWithMetadataCallback callback,void * userData)555 OH_AudioStream_Result OHAudioStreamBuilder::SetWriteDataWithMetadataCallback(
556 OH_AudioRenderer_WriteDataWithMetadataCallback callback, void *userData)
557 {
558 CHECK_AND_RETURN_RET_LOG(streamType_ != CAPTURER_TYPE, AUDIOSTREAM_ERROR_INVALID_PARAM,
559 "SetRendererCallback Error, invalid type input");
560 rendererCallbacks_.writeDataWithMetadataCallback = callback;
561 metadataUserData_ = userData;
562 return AUDIOSTREAM_SUCCESS;
563 }
564
SetRendererWriteDataCallback(OH_AudioRenderer_OnWriteDataCallback callback,void * userData)565 OH_AudioStream_Result OHAudioStreamBuilder::SetRendererWriteDataCallback(
566 OH_AudioRenderer_OnWriteDataCallback callback, void *userData)
567 {
568 CHECK_AND_RETURN_RET_LOG(streamType_ != CAPTURER_TYPE, AUDIOSTREAM_ERROR_INVALID_PARAM,
569 "Set renderer callback error, invalid type input.");
570 writeDataCallbackType_ = WRITE_DATA_CALLBACK_WITH_RESULT;
571 rendererCallbacks_.onWriteDataCallback = callback;
572 userData_ = userData;
573 return AUDIOSTREAM_SUCCESS;
574 }
575
SetRendererInterruptEventCallback(OH_AudioRenderer_OnInterruptCallback callback,void * userData)576 OH_AudioStream_Result OHAudioStreamBuilder::SetRendererInterruptEventCallback(
577 OH_AudioRenderer_OnInterruptCallback callback, void *userData)
578 {
579 CHECK_AND_RETURN_RET_LOG(streamType_ != CAPTURER_TYPE, AUDIOSTREAM_ERROR_INVALID_PARAM,
580 "Set renderer callback error, invalid type input.");
581 interruptCallbackType_ = INTERRUPT_EVENT_CALLBACK_WITH_RESULT;
582 rendererCallbacks_.onInterruptEventCallback = callback;
583 userData_ = userData;
584 return AUDIOSTREAM_SUCCESS;
585 }
586
SetRendererErrorCallback(OH_AudioRenderer_OnErrorCallback callback,void * userData)587 OH_AudioStream_Result OHAudioStreamBuilder::SetRendererErrorCallback(OH_AudioRenderer_OnErrorCallback callback,
588 void *userData)
589 {
590 CHECK_AND_RETURN_RET_LOG(streamType_ != CAPTURER_TYPE, AUDIOSTREAM_ERROR_INVALID_PARAM,
591 "Set renderer callback error, invalid type input.");
592 errorCallbackType_ = ERROR_CALLBACK_WITH_RESULT;
593 rendererCallbacks_.onErrorCallback = callback;
594 userData_ = userData;
595 return AUDIOSTREAM_SUCCESS;
596 return OH_AudioStream_Result();
597 }
598
SetCapturerInterruptCallback(OH_AudioCapturer_OnInterruptCallback callback,void * userData)599 OH_AudioStream_Result OHAudioStreamBuilder::SetCapturerInterruptCallback(
600 OH_AudioCapturer_OnInterruptCallback callback, void *userData)
601 {
602 CHECK_AND_RETURN_RET_LOG(streamType_ != RENDERER_TYPE, AUDIOSTREAM_ERROR_INVALID_PARAM,
603 "SetCapturerInterrupt error, invalid type input.");
604 interruptCallbackType_ = INTERRUPT_EVENT_CALLBACK_WITH_RESULT;
605 capturerCallbacks_.onInterruptEventCallback = callback;
606 userData_ = userData;
607 return AUDIOSTREAM_SUCCESS;
608 }
609
SetCapturerErrorCallback(OH_AudioCapturer_OnErrorCallback callback,void * userData)610 OH_AudioStream_Result OHAudioStreamBuilder::SetCapturerErrorCallback(
611 OH_AudioCapturer_OnErrorCallback callback, void *userData)
612 {
613 CHECK_AND_RETURN_RET_LOG(streamType_ != RENDERER_TYPE, AUDIOSTREAM_ERROR_INVALID_PARAM,
614 "SetCapturerInterrupt error, invalid type input.");
615 errorCallbackType_ = ERROR_CALLBACK_WITH_RESULT;
616 capturerCallbacks_.onErrorCallback = callback;
617 userData_ = userData;
618 return AUDIOSTREAM_SUCCESS;
619 }
620
SetCapturerReadDataCallback(OH_AudioCapturer_OnReadDataCallback callback,void * userData)621 OH_AudioStream_Result OHAudioStreamBuilder::SetCapturerReadDataCallback(
622 OH_AudioCapturer_OnReadDataCallback callback, void *userData)
623 {
624 CHECK_AND_RETURN_RET_LOG(streamType_ != RENDERER_TYPE, AUDIOSTREAM_ERROR_INVALID_PARAM,
625 "SetCapturerReadDataCallback error, invalid type input.");
626 readDataCallbackType_ = READ_DATA_CALLBACK_WITH_RESULT;
627 capturerCallbacks_.onReadDataCallback = callback;
628 userData_ = userData;
629 return AUDIOSTREAM_SUCCESS;
630 }
631
SetCapturerStreamEventCallback(OH_AudioCapturer_OnDeviceChangeCallback callback,void * userData)632 OH_AudioStream_Result OHAudioStreamBuilder::SetCapturerStreamEventCallback(
633 OH_AudioCapturer_OnDeviceChangeCallback callback, void *userData)
634 {
635 CHECK_AND_RETURN_RET_LOG(streamType_ != RENDERER_TYPE, AUDIOSTREAM_ERROR_INVALID_PARAM,
636 "SetCapturerStreamEventCallback error, invalid type input.");
637 streamEventCallbackType_ = STREAM_EVENT_CALLBACK_WITH_RESULT;
638 capturerCallbacks_.onDeviceChangeCallback = callback;
639 userData_ = userData;
640 return AUDIOSTREAM_SUCCESS;
641 }
642 } // namespace AudioStandard
643 } // namespace OHOS
644