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