• 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 #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 &timestamp, 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