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