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 #include <memory>
16 #include <cstdint>
17 #ifndef LOG_TAG
18 #define LOG_TAG "OHAudioCapturer"
19 #endif
20
21 #include "OHAudioCapturer.h"
22 #include "audio_errors.h"
23 #include "audio_utils.h"
24 #include "OHAudioDeviceDescriptor.h"
25
26 using OHOS::AudioStandard::Timestamp;
27
28 static const int64_t SECOND_TO_NANOSECOND = 1000000000;
29
convertCapturer(OH_AudioCapturer * capturer)30 static OHOS::AudioStandard::OHAudioCapturer *convertCapturer(OH_AudioCapturer* capturer)
31 {
32 return (OHOS::AudioStandard::OHAudioCapturer*) capturer;
33 }
34
OH_AudioCapturer_Release(OH_AudioCapturer * capturer)35 OH_AudioStream_Result OH_AudioCapturer_Release(OH_AudioCapturer* capturer)
36 {
37 OHOS::AudioStandard::OHAudioCapturer *audioCapturer = convertCapturer(capturer);
38 CHECK_AND_RETURN_RET_LOG(audioCapturer != nullptr, AUDIOSTREAM_ERROR_INVALID_PARAM, "convert capturer failed");
39 if (audioCapturer->Release()) {
40 OHOS::AudioStandard::ObjectRefMap<OHOS::AudioStandard::OHAudioCapturer>::DecreaseRef(audioCapturer);
41 return AUDIOSTREAM_SUCCESS;
42 } else {
43 return AUDIOSTREAM_ERROR_ILLEGAL_STATE;
44 }
45 }
46
OH_AudioCapturer_Start(OH_AudioCapturer * capturer)47 OH_AudioStream_Result OH_AudioCapturer_Start(OH_AudioCapturer* capturer)
48 {
49 OHOS::AudioStandard::OHAudioCapturer *audioCapturer = convertCapturer(capturer);
50 CHECK_AND_RETURN_RET_LOG(audioCapturer != nullptr, AUDIOSTREAM_ERROR_INVALID_PARAM, "convert capturer failed");
51 if (audioCapturer->Start()) {
52 return AUDIOSTREAM_SUCCESS;
53 } else {
54 return AUDIOSTREAM_ERROR_ILLEGAL_STATE;
55 }
56 }
57
OH_AudioCapturer_Pause(OH_AudioCapturer * capturer)58 OH_AudioStream_Result OH_AudioCapturer_Pause(OH_AudioCapturer* capturer)
59 {
60 OHOS::AudioStandard::OHAudioCapturer *audioCapturer = convertCapturer(capturer);
61 CHECK_AND_RETURN_RET_LOG(audioCapturer != nullptr, AUDIOSTREAM_ERROR_INVALID_PARAM, "convert capturer failed");
62
63 if (audioCapturer->Pause()) {
64 return AUDIOSTREAM_SUCCESS;
65 } else {
66 return AUDIOSTREAM_ERROR_ILLEGAL_STATE;
67 }
68 }
69
OH_AudioCapturer_Stop(OH_AudioCapturer * capturer)70 OH_AudioStream_Result OH_AudioCapturer_Stop(OH_AudioCapturer* capturer)
71 {
72 OHOS::AudioStandard::OHAudioCapturer *audioCapturer = convertCapturer(capturer);
73 CHECK_AND_RETURN_RET_LOG(audioCapturer != nullptr, AUDIOSTREAM_ERROR_INVALID_PARAM, "convert capturer failed");
74
75 if (audioCapturer->Stop()) {
76 return AUDIOSTREAM_SUCCESS;
77 } else {
78 return AUDIOSTREAM_ERROR_ILLEGAL_STATE;
79 }
80 }
81
OH_AudioCapturer_Flush(OH_AudioCapturer * capturer)82 OH_AudioStream_Result OH_AudioCapturer_Flush(OH_AudioCapturer* capturer)
83 {
84 OHOS::AudioStandard::OHAudioCapturer *audioCapturer = convertCapturer(capturer);
85 CHECK_AND_RETURN_RET_LOG(audioCapturer != nullptr, AUDIOSTREAM_ERROR_INVALID_PARAM, "convert capturer failed");
86
87 if (audioCapturer->Flush()) {
88 return AUDIOSTREAM_SUCCESS;
89 } else {
90 return AUDIOSTREAM_ERROR_ILLEGAL_STATE;
91 }
92 }
93
94
OH_AudioCapturer_GetCurrentState(OH_AudioCapturer * capturer,OH_AudioStream_State * state)95 OH_AudioStream_Result OH_AudioCapturer_GetCurrentState(OH_AudioCapturer* capturer, OH_AudioStream_State* state)
96 {
97 OHOS::AudioStandard::OHAudioCapturer *audioCapturer = convertCapturer(capturer);
98 CHECK_AND_RETURN_RET_LOG(audioCapturer != nullptr, AUDIOSTREAM_ERROR_INVALID_PARAM, "convert capturer failed");
99
100 OHOS::AudioStandard::CapturerState capturerState = audioCapturer->GetCurrentState();
101 *state = (OH_AudioStream_State)capturerState;
102 return AUDIOSTREAM_SUCCESS;
103 }
104
OH_AudioCapturer_GetLatencyMode(OH_AudioCapturer * capturer,OH_AudioStream_LatencyMode * latencyMode)105 OH_AudioStream_Result OH_AudioCapturer_GetLatencyMode(OH_AudioCapturer* capturer,
106 OH_AudioStream_LatencyMode* latencyMode)
107 {
108 OHOS::AudioStandard::OHAudioCapturer *audioCapturer = convertCapturer(capturer);
109 CHECK_AND_RETURN_RET_LOG(audioCapturer != nullptr, AUDIOSTREAM_ERROR_INVALID_PARAM, "convert capturer failed");
110 OHOS::AudioStandard::AudioCapturerInfo capturerInfo;
111 audioCapturer->GetCapturerInfo(capturerInfo);
112 *latencyMode = (OH_AudioStream_LatencyMode)capturerInfo.capturerFlags;
113 return AUDIOSTREAM_SUCCESS;
114 }
115
OH_AudioCapturer_GetStreamId(OH_AudioCapturer * capturer,uint32_t * streamId)116 OH_AudioStream_Result OH_AudioCapturer_GetStreamId(OH_AudioCapturer* capturer, uint32_t* streamId)
117 {
118 OHOS::AudioStandard::OHAudioCapturer *audioCapturer = convertCapturer(capturer);
119 CHECK_AND_RETURN_RET_LOG(audioCapturer != nullptr, AUDIOSTREAM_ERROR_INVALID_PARAM, "convert capturer failed");
120 audioCapturer->GetStreamId(*streamId);
121 return AUDIOSTREAM_SUCCESS;
122 }
123
OH_AudioCapturer_GetChannelCount(OH_AudioCapturer * capturer,int32_t * channelCount)124 OH_AudioStream_Result OH_AudioCapturer_GetChannelCount(OH_AudioCapturer* capturer, int32_t* channelCount)
125 {
126 OHOS::AudioStandard::OHAudioCapturer *audioCapturer = convertCapturer(capturer);
127 CHECK_AND_RETURN_RET_LOG(audioCapturer != nullptr, AUDIOSTREAM_ERROR_INVALID_PARAM, "convert capturer failed");
128 *channelCount = audioCapturer->GetChannelCount();
129 return AUDIOSTREAM_SUCCESS;
130 }
131
OH_AudioCapturer_GetSamplingRate(OH_AudioCapturer * capturer,int32_t * rate)132 OH_AudioStream_Result OH_AudioCapturer_GetSamplingRate(OH_AudioCapturer* capturer, int32_t* rate)
133 {
134 OHOS::AudioStandard::OHAudioCapturer *audioCapturer = convertCapturer(capturer);
135 CHECK_AND_RETURN_RET_LOG(audioCapturer != nullptr, AUDIOSTREAM_ERROR_INVALID_PARAM, "convert capturer failed");
136
137 *rate = audioCapturer->GetSamplingRate();
138 return AUDIOSTREAM_SUCCESS;
139 }
140
OH_AudioCapturer_GetSampleFormat(OH_AudioCapturer * capturer,OH_AudioStream_SampleFormat * sampleFormat)141 OH_AudioStream_Result OH_AudioCapturer_GetSampleFormat(OH_AudioCapturer* capturer,
142 OH_AudioStream_SampleFormat* sampleFormat)
143 {
144 OHOS::AudioStandard::OHAudioCapturer *audioCapturer = convertCapturer(capturer);
145 CHECK_AND_RETURN_RET_LOG(audioCapturer != nullptr, AUDIOSTREAM_ERROR_INVALID_PARAM, "convert capturer failed");
146 *sampleFormat = (OH_AudioStream_SampleFormat)audioCapturer->GetSampleFormat();
147 return AUDIOSTREAM_SUCCESS;
148 }
149
OH_AudioCapturer_GetEncodingType(OH_AudioCapturer * capturer,OH_AudioStream_EncodingType * encodingType)150 OH_AudioStream_Result OH_AudioCapturer_GetEncodingType(OH_AudioCapturer* capturer,
151 OH_AudioStream_EncodingType* encodingType)
152 {
153 OHOS::AudioStandard::OHAudioCapturer *audioCapturer = convertCapturer(capturer);
154 CHECK_AND_RETURN_RET_LOG(audioCapturer != nullptr, AUDIOSTREAM_ERROR_INVALID_PARAM, "convert capturer failed");
155 *encodingType = (OH_AudioStream_EncodingType)audioCapturer->GetEncodingType();
156 return AUDIOSTREAM_SUCCESS;
157 }
158
OH_AudioCapturer_GetCapturerInfo(OH_AudioCapturer * capturer,OH_AudioStream_SourceType * sourceType)159 OH_AudioStream_Result OH_AudioCapturer_GetCapturerInfo(OH_AudioCapturer* capturer,
160 OH_AudioStream_SourceType* sourceType)
161 {
162 OHOS::AudioStandard::OHAudioCapturer *audioCapturer = convertCapturer(capturer);
163 CHECK_AND_RETURN_RET_LOG(audioCapturer != nullptr, AUDIOSTREAM_ERROR_INVALID_PARAM, "convert capturer failed");
164 OHOS::AudioStandard::AudioCapturerInfo capturerInfo;
165 audioCapturer->GetCapturerInfo(capturerInfo);
166 *sourceType = (OH_AudioStream_SourceType)capturerInfo.sourceType;
167 return AUDIOSTREAM_SUCCESS;
168 }
169
OH_AudioCapturer_GetFrameSizeInCallback(OH_AudioCapturer * capturer,int32_t * frameSize)170 OH_AudioStream_Result OH_AudioCapturer_GetFrameSizeInCallback(OH_AudioCapturer* capturer, int32_t* frameSize)
171 {
172 OHOS::AudioStandard::OHAudioCapturer *audioCapturer = convertCapturer(capturer);
173 CHECK_AND_RETURN_RET_LOG(audioCapturer != nullptr, AUDIOSTREAM_ERROR_INVALID_PARAM, "convert capturer failed");
174
175 *frameSize = audioCapturer->GetFrameSizeInCallback();
176 return AUDIOSTREAM_SUCCESS;
177 }
178
OH_AudioCapturer_GetTimestamp(OH_AudioCapturer * capturer,clockid_t clockId,int64_t * framePosition,int64_t * timestamp)179 OH_AudioStream_Result OH_AudioCapturer_GetTimestamp(OH_AudioCapturer* capturer,
180 clockid_t clockId, int64_t* framePosition, int64_t* timestamp)
181 {
182 OHOS::AudioStandard::OHAudioCapturer *audioCapturer = convertCapturer(capturer);
183 CHECK_AND_RETURN_RET_LOG(audioCapturer != nullptr, AUDIOSTREAM_ERROR_INVALID_PARAM, "convert capturer failed");
184 CHECK_AND_RETURN_RET_LOG(clockId == CLOCK_MONOTONIC, AUDIOSTREAM_ERROR_INVALID_PARAM, "error clockId value");
185
186 Timestamp stamp;
187 Timestamp::Timestampbase base = Timestamp::Timestampbase::MONOTONIC;
188 bool ret = audioCapturer->GetAudioTime(stamp, base);
189 if (!ret) {
190 AUDIO_ERR_LOG("GetAudioTime error!");
191 return AUDIOSTREAM_ERROR_ILLEGAL_STATE;
192 }
193 *framePosition = stamp.framePosition;
194 *timestamp = stamp.time.tv_sec * SECOND_TO_NANOSECOND + stamp.time.tv_nsec;
195 return AUDIOSTREAM_SUCCESS;
196 }
197
OH_AudioCapturer_GetFramesRead(OH_AudioCapturer * capturer,int64_t * frames)198 OH_AudioStream_Result OH_AudioCapturer_GetFramesRead(OH_AudioCapturer* capturer, int64_t* frames)
199 {
200 OHOS::AudioStandard::OHAudioCapturer *audioCapturer = convertCapturer(capturer);
201 CHECK_AND_RETURN_RET_LOG(audioCapturer != nullptr, AUDIOSTREAM_ERROR_INVALID_PARAM, "convert capturer failed");
202
203 *frames = audioCapturer->GetFramesRead();
204 return AUDIOSTREAM_SUCCESS;
205 }
206
OH_AudioCapturer_GetOverflowCount(OH_AudioCapturer * capturer,uint32_t * count)207 OH_AudioStream_Result OH_AudioCapturer_GetOverflowCount(OH_AudioCapturer* capturer, uint32_t* count)
208 {
209 OHOS::AudioStandard::OHAudioCapturer *audioCapturer = convertCapturer(capturer);
210 CHECK_AND_RETURN_RET_LOG(audioCapturer != nullptr, AUDIOSTREAM_ERROR_INVALID_PARAM, "convert capturer failed");
211
212 *count = audioCapturer->GetOverflowCount();
213 return AUDIOSTREAM_SUCCESS;
214 }
215
216 namespace OHOS {
217 namespace AudioStandard {
OHAudioCapturer()218 OHAudioCapturer::OHAudioCapturer()
219 {
220 AUDIO_INFO_LOG("OHAudioCapturer created!");
221 }
222
~OHAudioCapturer()223 OHAudioCapturer::~OHAudioCapturer()
224 {
225 AUDIO_INFO_LOG("OHAudioCapturer destroyed!");
226 }
227
Initialize(const AudioCapturerOptions & capturerOptions)228 bool OHAudioCapturer::Initialize(const AudioCapturerOptions& capturerOptions)
229 {
230 audioCapturer_ = AudioCapturer::CreateCapturer(capturerOptions);
231 return audioCapturer_ != nullptr;
232 }
233
Start()234 bool OHAudioCapturer::Start()
235 {
236 if (audioCapturer_ == nullptr) {
237 AUDIO_ERR_LOG("capturer client is nullptr");
238 return false;
239 }
240 return audioCapturer_->Start();
241 }
242
Pause()243 bool OHAudioCapturer::Pause()
244 {
245 if (audioCapturer_ == nullptr) {
246 AUDIO_ERR_LOG("capturer client is nullptr");
247 return false;
248 }
249 return audioCapturer_->Pause();
250 }
251
Stop()252 bool OHAudioCapturer::Stop()
253 {
254 if (audioCapturer_ == nullptr) {
255 AUDIO_ERR_LOG("capturer client is nullptr");
256 return false;
257 }
258 return audioCapturer_->Stop();
259 }
260
Flush()261 bool OHAudioCapturer::Flush()
262 {
263 if (audioCapturer_ == nullptr) {
264 AUDIO_ERR_LOG("capturer client is nullptr");
265 return false;
266 }
267 return audioCapturer_->Flush();
268 }
269
Release()270 bool OHAudioCapturer::Release()
271 {
272 if (audioCapturer_ == nullptr) {
273 AUDIO_ERR_LOG("capturer client is nullptr");
274 return false;
275 }
276
277 if (!audioCapturer_->Release()) {
278 return false;
279 }
280 audioCapturer_ = nullptr;
281 audioCapturerCallback_= nullptr;
282 return true;
283 }
284
GetCurrentState()285 CapturerState OHAudioCapturer::GetCurrentState()
286 {
287 CHECK_AND_RETURN_RET_LOG(audioCapturer_ != nullptr, CAPTURER_INVALID, "capturer client is nullptr");
288 return audioCapturer_->GetStatus();
289 }
290
GetStreamId(uint32_t & streamId)291 void OHAudioCapturer::GetStreamId(uint32_t &streamId)
292 {
293 CHECK_AND_RETURN_LOG(audioCapturer_ != nullptr, "capturer client is nullptr");
294 audioCapturer_->GetAudioStreamId(streamId);
295 }
296
GetChannelCount()297 AudioChannel OHAudioCapturer::GetChannelCount()
298 {
299 CHECK_AND_RETURN_RET_LOG(audioCapturer_ != nullptr, MONO, "capturer client is nullptr");
300 AudioCapturerParams params;
301 audioCapturer_->GetParams(params);
302 return params.audioChannel;
303 }
304
GetSamplingRate()305 int32_t OHAudioCapturer::GetSamplingRate()
306 {
307 CHECK_AND_RETURN_RET_LOG(audioCapturer_ != nullptr, MONO, "capturer client is nullptr");
308 AudioCapturerParams params;
309 audioCapturer_->GetParams(params);
310 return params.samplingRate;
311 }
312
GetEncodingType()313 AudioEncodingType OHAudioCapturer::GetEncodingType()
314 {
315 CHECK_AND_RETURN_RET_LOG(audioCapturer_ != nullptr, ENCODING_INVALID, "capturer client is nullptr");
316 AudioCapturerParams params;
317 audioCapturer_->GetParams(params);
318 return params.audioEncoding;
319 }
320
GetCapturerInfo(AudioCapturerInfo & capturerInfo)321 void OHAudioCapturer::GetCapturerInfo(AudioCapturerInfo& capturerInfo)
322 {
323 CHECK_AND_RETURN_LOG(audioCapturer_ != nullptr, "capturer client is nullptr");
324 audioCapturer_->GetCapturerInfo(capturerInfo);
325 }
326
GetSampleFormat()327 AudioSampleFormat OHAudioCapturer::GetSampleFormat()
328 {
329 CHECK_AND_RETURN_RET_LOG(audioCapturer_ != nullptr, INVALID_WIDTH, "capturer client is nullptr");
330 AudioCapturerParams params;
331 audioCapturer_->GetParams(params);
332 return params.audioSampleFormat;
333 }
334
SetCapturerCallback(CapturerCallback capturerCallbacks,void * userData)335 void OHAudioCapturer::SetCapturerCallback(CapturerCallback capturerCallbacks, void *userData)
336 {
337 CHECK_AND_RETURN_LOG(audioCapturer_ != nullptr, "capturer client is nullptr");
338 audioCapturer_->SetCaptureMode(CAPTURE_MODE_CALLBACK);
339
340 SetInterruptCallback(capturerCallbacks, userData);
341 SetErrorCallback(capturerCallbacks, userData);
342 SetReadDataCallback(capturerCallbacks, userData);
343 SetStreamEventCallback(capturerCallbacks, userData);
344 }
345
GetFramesRead()346 int64_t OHAudioCapturer::GetFramesRead()
347 {
348 CHECK_AND_RETURN_RET_LOG(audioCapturer_ != nullptr, ERROR, "capturer client is nullptr");
349 return audioCapturer_->GetFramesRead();
350 }
351
GetAudioTime(Timestamp & timestamp,Timestamp::Timestampbase base)352 bool OHAudioCapturer::GetAudioTime(Timestamp ×tamp, Timestamp::Timestampbase base)
353 {
354 CHECK_AND_RETURN_RET_LOG(audioCapturer_ != nullptr, false, "capturer client is nullptr");
355 return audioCapturer_->GetAudioTime(timestamp, base);
356 }
357
GetFrameSizeInCallback()358 int32_t OHAudioCapturer::GetFrameSizeInCallback()
359 {
360 CHECK_AND_RETURN_RET_LOG(audioCapturer_ != nullptr, ERROR, "capturer client is nullptr");
361 uint32_t frameSize;
362 audioCapturer_->GetFrameCount(frameSize);
363 return static_cast<int32_t>(frameSize);
364 }
365
GetBufferDesc(BufferDesc & bufDesc) const366 int32_t OHAudioCapturer::GetBufferDesc(BufferDesc &bufDesc) const
367 {
368 CHECK_AND_RETURN_RET_LOG(audioCapturer_ != nullptr, ERROR, "capturer client is nullptr");
369 return audioCapturer_->GetBufferDesc(bufDesc);
370 }
371
Enqueue(const BufferDesc & bufDesc) const372 int32_t OHAudioCapturer::Enqueue(const BufferDesc &bufDesc) const
373 {
374 CHECK_AND_RETURN_RET_LOG(audioCapturer_ != nullptr, ERROR, "capturer client is nullptr");
375 return audioCapturer_->Enqueue(bufDesc);
376 }
377
GetOverflowCount() const378 uint32_t OHAudioCapturer::GetOverflowCount() const
379 {
380 CHECK_AND_RETURN_RET_LOG(audioCapturer_ != nullptr, ERROR, "capturer client is nullptr");
381 return audioCapturer_->GetOverflowCount();
382 }
383
GetErrorResult(AudioErrors errorCode) const384 OH_AudioStream_Result OHAudioCapturerErrorCallback::GetErrorResult(AudioErrors errorCode) const
385 {
386 switch (errorCode) {
387 case ERROR_ILLEGAL_STATE:
388 return AUDIOSTREAM_ERROR_ILLEGAL_STATE;
389 case ERROR_INVALID_PARAM:
390 return AUDIOSTREAM_ERROR_INVALID_PARAM;
391 case ERROR_SYSTEM:
392 return AUDIOSTREAM_ERROR_SYSTEM;
393 default:
394 return AUDIOSTREAM_ERROR_SYSTEM;
395 }
396 }
397
OnError(AudioErrors errorCode)398 void OHAudioCapturerErrorCallback::OnError(AudioErrors errorCode)
399 {
400 OHAudioCapturer* audioCapturer = (OHAudioCapturer*)ohAudioCapturer_;
401 CHECK_AND_RETURN_LOG(audioCapturer != nullptr, "capturer client is nullptr");
402 if (audioCapturer->GetCapturerErrorCallbackType() == ERROR_CALLBACK_WITHOUT_RESULT &&
403 callbacks_.OH_AudioCapturer_OnError != nullptr) {
404 OH_AudioStream_Result error = GetErrorResult(errorCode);
405 callbacks_.OH_AudioCapturer_OnError(ohAudioCapturer_, userData_, error);
406 }
407
408 if (audioCapturer->GetCapturerErrorCallbackType() == ERROR_CALLBACK_WITH_RESULT &&
409 errorCallback_ != nullptr) {
410 OH_AudioStream_Result error = GetErrorResult(errorCode);
411 errorCallback_(ohAudioCapturer_, userData_, error);
412 }
413 }
414
OnAudioPolicyServiceDied()415 void OHCapturerServiceDiedCallback::OnAudioPolicyServiceDied()
416 {
417 CHECK_AND_RETURN_LOG(ohAudioCapturer_ != nullptr, "renderer client is nullptr");
418 OHAudioCapturer* audioCapturer = (OHAudioCapturer*)ohAudioCapturer_;
419 if (audioCapturer->GetCapturerErrorCallbackType() == ERROR_CALLBACK_WITH_RESULT &&
420 errorCallback_ != nullptr) {
421 OH_AudioStream_Result error = AUDIOSTREAM_ERROR_SYSTEM;
422 errorCallback_(ohAudioCapturer_, userData_, error);
423 }
424 }
425
OnReadData(size_t length)426 void OHAudioCapturerModeCallback::OnReadData(size_t length)
427 {
428 OHAudioCapturer* audioCapturer = (OHAudioCapturer*)ohAudioCapturer_;
429 CHECK_AND_RETURN_LOG(audioCapturer != nullptr, "capturer client is nullptr");
430 CHECK_AND_RETURN_LOG((callbacks_.OH_AudioCapturer_OnReadData != nullptr) || onReadDataCallback_ != nullptr,
431 "pointer to the fuction is nullptr");
432 BufferDesc bufDesc;
433 audioCapturer->GetBufferDesc(bufDesc);
434
435 if (audioCapturer->GetCapturerReadDataCallbackType() == READ_DATA_CALLBACK_WITHOUT_RESULT &&
436 callbacks_.OH_AudioCapturer_OnReadData != nullptr) {
437 callbacks_.OH_AudioCapturer_OnReadData(ohAudioCapturer_, userData_,
438 (void*)bufDesc.buffer, bufDesc.bufLength);
439 }
440 if (audioCapturer->GetCapturerReadDataCallbackType() == READ_DATA_CALLBACK_WITH_RESULT &&
441 onReadDataCallback_ != nullptr) {
442 onReadDataCallback_(ohAudioCapturer_, userData_, (void*)bufDesc.buffer, bufDesc.bufLength);
443 if (length > bufDesc.bufLength) {
444 bufDesc.dataLength = bufDesc.bufLength;
445 } else {
446 bufDesc.dataLength = length;
447 }
448 }
449 audioCapturer->Enqueue(bufDesc);
450 }
451
OnStateChange(const AudioDeviceDescriptor & deviceInfo)452 void OHAudioCapturerDeviceChangeCallback::OnStateChange(const AudioDeviceDescriptor &deviceInfo)
453 {
454 OHAudioCapturer* audioCapturer = (OHAudioCapturer*)ohAudioCapturer_;
455 CHECK_AND_RETURN_LOG(audioCapturer != nullptr, "capturer client is nullptr");
456 CHECK_AND_RETURN_LOG((callbacks_.OH_AudioCapturer_OnStreamEvent != nullptr) || onDeviceChangeCallback_ != nullptr,
457 "pointer to the fuction is nullptr");
458 OH_AudioStream_Event event = AUDIOSTREAM_EVENT_ROUTING_CHANGED;
459 if (audioCapturer->GetCapturerStreamEventCallbackType() == STREAM_EVENT_CALLBACK_WITHOUT_RESULT &&
460 callbacks_.OH_AudioCapturer_OnStreamEvent != nullptr) {
461 callbacks_.OH_AudioCapturer_OnStreamEvent(ohAudioCapturer_, userData_, event);
462 }
463 if (audioCapturer->GetCapturerStreamEventCallbackType() == STREAM_EVENT_CALLBACK_WITH_RESULT &&
464 onDeviceChangeCallback_ != nullptr) {
465 std::shared_ptr<AudioDeviceDescriptor> audioDeviceDescriptor =
466 std::make_shared<AudioDeviceDescriptor>(deviceInfo);
467 OH_AudioDeviceDescriptorArray *audioDeviceDescriptorArray =
468 (OH_AudioDeviceDescriptorArray *)malloc(sizeof(OH_AudioDeviceDescriptorArray));
469 int32_t arraySize = 1;
470 int32_t arrayIndex = 0;
471 audioDeviceDescriptorArray->size = arraySize;
472 audioDeviceDescriptorArray->descriptors =
473 (OH_AudioDeviceDescriptor **)malloc(sizeof(OH_AudioDeviceDescriptor *) * arraySize);
474 audioDeviceDescriptorArray->descriptors[arrayIndex] =
475 (OH_AudioDeviceDescriptor *)(new OHAudioDeviceDescriptor(audioDeviceDescriptor));
476 onDeviceChangeCallback_(ohAudioCapturer_, userData_, audioDeviceDescriptorArray);
477 }
478 }
479
OnInterrupt(const InterruptEvent & interruptEvent)480 void OHAudioCapturerCallback::OnInterrupt(const InterruptEvent &interruptEvent)
481 {
482 OHAudioCapturer *audioCapturer = (OHAudioCapturer*)ohAudioCapturer_;
483 CHECK_AND_RETURN_LOG(ohAudioCapturer_ != nullptr, "capturer client is nullptr");
484 if (audioCapturer->GetCapturerInterruptEventCallbackType() == INTERRUPT_EVENT_CALLBACK_WITHOUT_RESULT &&
485 callbacks_.OH_AudioCapturer_OnInterruptEvent != nullptr) {
486 OH_AudioInterrupt_ForceType type = (OH_AudioInterrupt_ForceType)(interruptEvent.forceType);
487 OH_AudioInterrupt_Hint hint = OH_AudioInterrupt_Hint(interruptEvent.hintType);
488 callbacks_.OH_AudioCapturer_OnInterruptEvent(ohAudioCapturer_, userData_, type, hint);
489 } else if (audioCapturer->GetCapturerInterruptEventCallbackType() == INTERRUPT_EVENT_CALLBACK_WITH_RESULT &&
490 onInterruptEventCallback_ != nullptr) {
491 OH_AudioInterrupt_ForceType type = (OH_AudioInterrupt_ForceType)(interruptEvent.forceType);
492 OH_AudioInterrupt_Hint hint = OH_AudioInterrupt_Hint(interruptEvent.hintType);
493 onInterruptEventCallback_(ohAudioCapturer_, userData_, type, hint);
494 }
495 }
496
SetReadDataCallback(CapturerCallback capturerCallbacks,void * userData)497 void OHAudioCapturer::SetReadDataCallback(CapturerCallback capturerCallbacks, void* userData)
498 {
499 if (readDataCallbackType_ == READ_DATA_CALLBACK_WITH_RESULT &&
500 capturerCallbacks.onReadDataCallback != nullptr) {
501 std::shared_ptr<AudioCapturerReadCallback> callback = std::make_shared<OHAudioCapturerModeCallback>(
502 capturerCallbacks.onReadDataCallback, (OH_AudioCapturer*)this, userData);
503 audioCapturer_->SetCapturerReadCallback(callback);
504 AUDIO_INFO_LOG("The read callback function with result");
505 } else if (readDataCallbackType_ == READ_DATA_CALLBACK_WITHOUT_RESULT &&
506 capturerCallbacks.callbacks.OH_AudioCapturer_OnReadData != nullptr) {
507 std::shared_ptr<AudioCapturerReadCallback> callback = std::make_shared<OHAudioCapturerModeCallback>(
508 capturerCallbacks.callbacks, (OH_AudioCapturer*)this, userData);
509 audioCapturer_->SetCapturerReadCallback(callback);
510 AUDIO_INFO_LOG("The read callback function without result");
511 } else {
512 AUDIO_WARNING_LOG("The read callback function is not set");
513 }
514 }
515
SetStreamEventCallback(CapturerCallback capturerCallbacks,void * userData)516 void OHAudioCapturer::SetStreamEventCallback(CapturerCallback capturerCallbacks, void* userData)
517 {
518 if (streamEventCallbackType_ == STREAM_EVENT_CALLBACK_WITH_RESULT &&
519 capturerCallbacks.onDeviceChangeCallback != nullptr) {
520 std::shared_ptr<AudioCapturerDeviceChangeCallback> callback =
521 std::make_shared<OHAudioCapturerDeviceChangeCallback>(capturerCallbacks.onDeviceChangeCallback,
522 (OH_AudioCapturer*)this, userData);
523 audioCapturer_->SetAudioCapturerDeviceChangeCallback(callback);
524 AUDIO_INFO_LOG("The stream event callback function with result");
525 } else if (streamEventCallbackType_ == STREAM_EVENT_CALLBACK_WITHOUT_RESULT &&
526 capturerCallbacks.callbacks.OH_AudioCapturer_OnStreamEvent != nullptr) {
527 std::shared_ptr<AudioCapturerDeviceChangeCallback> callback =
528 std::make_shared<OHAudioCapturerDeviceChangeCallback>(capturerCallbacks.callbacks,
529 (OH_AudioCapturer*)this, userData);
530 audioCapturer_->SetAudioCapturerDeviceChangeCallback(callback);
531 AUDIO_INFO_LOG("The stream event callback function without result");
532 } else {
533 AUDIO_WARNING_LOG("The stream event callback function is not set");
534 }
535 }
536
SetInterruptCallback(CapturerCallback capturerCallbacks,void * userData)537 void OHAudioCapturer::SetInterruptCallback(CapturerCallback capturerCallbacks, void *userData)
538 {
539 if (interruptCallbackType_ == INTERRUPT_EVENT_CALLBACK_WITH_RESULT &&
540 capturerCallbacks.onInterruptEventCallback != nullptr) {
541 std::shared_ptr<AudioCapturerCallback> callback = std::make_shared<OHAudioCapturerCallback>(
542 capturerCallbacks.onInterruptEventCallback, (OH_AudioCapturer*)this, userData);
543 audioCapturer_->SetCapturerCallback(callback);
544 AUDIO_INFO_LOG("The Interrupt callback function is for PCM type with result");
545 } else if (interruptCallbackType_ == INTERRUPT_EVENT_CALLBACK_WITHOUT_RESULT &&
546 capturerCallbacks.callbacks.OH_AudioCapturer_OnInterruptEvent != nullptr) {
547 std::shared_ptr<AudioCapturerCallback> callback = std::make_shared<OHAudioCapturerCallback>(
548 capturerCallbacks.callbacks, (OH_AudioCapturer*)this, userData);
549 audioCapturer_->SetCapturerCallback(callback);
550 AUDIO_INFO_LOG("The Interrupt callback function is for PCM type without result");
551 } else {
552 AUDIO_WARNING_LOG("The Interrupt callback function is not set");
553 }
554 }
555
SetErrorCallback(CapturerCallback capturerCallbacks,void * userData)556 void OHAudioCapturer::SetErrorCallback(CapturerCallback capturerCallbacks, void *userData)
557 {
558 if (errorCallbackType_ == ERROR_CALLBACK_WITH_RESULT &&
559 capturerCallbacks.onErrorCallback != nullptr) {
560 std::shared_ptr<AudioCapturerPolicyServiceDiedCallback> callback =
561 std::make_shared<OHCapturerServiceDiedCallback>(capturerCallbacks.onErrorCallback,
562 (OH_AudioCapturer*)this, userData);
563 int32_t clientPid = getpid();
564 audioCapturer_->RegisterAudioPolicyServerDiedCb(clientPid, callback);
565
566 std::shared_ptr<AudioCapturerErrorCallback> errorCallback = std::make_shared<OHAudioCapturerErrorCallback>(
567 capturerCallbacks.onErrorCallback, (OH_AudioCapturer*)this, userData);
568 audioCapturer_->SetAudioCapturerErrorCallback(errorCallback);
569 } else if (errorCallbackType_ == ERROR_CALLBACK_WITHOUT_RESULT &&
570 capturerCallbacks.callbacks.OH_AudioCapturer_OnError != nullptr) {
571 std::shared_ptr<AudioCapturerErrorCallback> errorCallback = std::make_shared<OHAudioCapturerErrorCallback>(
572 capturerCallbacks.callbacks, (OH_AudioCapturer*)this, userData);
573 audioCapturer_->SetAudioCapturerErrorCallback(errorCallback);
574 } else {
575 AUDIO_WARNING_LOG("The audio capturer error callback function is not set");
576 }
577 }
578
SetCapturerReadDataCallbackType(ReadDataCallbackType readDataCallbackType)579 void OHAudioCapturer::SetCapturerReadDataCallbackType(ReadDataCallbackType readDataCallbackType)
580 {
581 readDataCallbackType_ = readDataCallbackType;
582 }
583
SetCapturerStreamEventCallbackType(StreamEventCallbackType streamEventCallbackType)584 void OHAudioCapturer::SetCapturerStreamEventCallbackType(StreamEventCallbackType streamEventCallbackType)
585 {
586 streamEventCallbackType_ = streamEventCallbackType;
587 }
588
GetCapturerReadDataCallbackType()589 ReadDataCallbackType OHAudioCapturer::GetCapturerReadDataCallbackType()
590 {
591 return readDataCallbackType_;
592 }
593
GetCapturerStreamEventCallbackType()594 StreamEventCallbackType OHAudioCapturer::GetCapturerStreamEventCallbackType()
595 {
596 return streamEventCallbackType_;
597 }
598
SetCapturerInterruptEventCallbackType(InterruptEventCallbackType interruptCallbackType)599 void OHAudioCapturer::SetCapturerInterruptEventCallbackType(InterruptEventCallbackType interruptCallbackType)
600 {
601 interruptCallbackType_ = interruptCallbackType;
602 }
603
GetCapturerInterruptEventCallbackType()604 InterruptEventCallbackType OHAudioCapturer::GetCapturerInterruptEventCallbackType()
605 {
606 return interruptCallbackType_;
607 }
608
SetCapturerErrorCallbackType(ErrorCallbackType errorCallbackType)609 void OHAudioCapturer::SetCapturerErrorCallbackType(ErrorCallbackType errorCallbackType)
610 {
611 errorCallbackType_ = errorCallbackType;
612 }
613
GetCapturerErrorCallbackType()614 ErrorCallbackType OHAudioCapturer::GetCapturerErrorCallbackType()
615 {
616 return errorCallbackType_;
617 }
618 } // namespace AudioStandard
619 } // namespace OHOS
620