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