• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021-2022 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 
16 #include "audio_capturer.h"
17 
18 #include "audio_capturer_private.h"
19 #include "audio_errors.h"
20 #ifdef OHCORE
21 #include "audio_capturer_gateway.h"
22 #endif
23 #include "audio_log.h"
24 #include "audio_policy_manager.h"
25 
26 namespace OHOS {
27 namespace AudioStandard {
28 AudioCapturer::~AudioCapturer() = default;
29 AudioCapturerPrivate::~AudioCapturerPrivate() = default;
30 
Create(AudioStreamType audioStreamType)31 std::unique_ptr<AudioCapturer> AudioCapturer::Create(AudioStreamType audioStreamType)
32 {
33     AppInfo appInfo = {};
34     return Create(audioStreamType, appInfo);
35 }
36 
Create(AudioStreamType audioStreamType,const AppInfo & appInfo)37 std::unique_ptr<AudioCapturer> AudioCapturer::Create(AudioStreamType audioStreamType, const AppInfo &appInfo)
38 {
39 #ifdef OHCORE
40     return std::make_unique<AudioCapturerGateway>(audioStreamType);
41 #else
42     return std::make_unique<AudioCapturerPrivate>(audioStreamType, appInfo, true);
43 #endif
44 }
45 
Create(const AudioCapturerOptions & options)46 std::unique_ptr<AudioCapturer> AudioCapturer::Create(const AudioCapturerOptions &options)
47 {
48     AppInfo appInfo = {};
49     return Create(options, "", appInfo);
50 }
51 
Create(const AudioCapturerOptions & options,const AppInfo & appInfo)52 std::unique_ptr<AudioCapturer> AudioCapturer::Create(const AudioCapturerOptions &options, const AppInfo &appInfo)
53 {
54     return Create(options, "", appInfo);
55 }
56 
Create(const AudioCapturerOptions & options,const std::string cachePath)57 std::unique_ptr<AudioCapturer> AudioCapturer::Create(const AudioCapturerOptions &options, const std::string cachePath)
58 {
59     AppInfo appInfo = {};
60     return Create(options, cachePath, appInfo);
61 }
62 
Create(const AudioCapturerOptions & capturerOptions,const std::string cachePath,const AppInfo & appInfo)63 std::unique_ptr<AudioCapturer> AudioCapturer::Create(const AudioCapturerOptions &capturerOptions,
64     const std::string cachePath, const AppInfo &appInfo)
65 {
66     auto sourceType = capturerOptions.capturerInfo.sourceType;
67     if (sourceType < SOURCE_TYPE_MIC || sourceType > SOURCE_TYPE_MAX) {
68         AUDIO_ERR_LOG("AudioCapturer::Create: Invalid source type %{public}d!", sourceType);
69         return nullptr;
70     }
71 
72     AudioStreamType audioStreamType = FindStreamTypeBySourceType(sourceType);
73 
74     AudioCapturerParams params;
75     params.audioSampleFormat = capturerOptions.streamInfo.format;
76     params.samplingRate = capturerOptions.streamInfo.samplingRate;
77     bool isChange = false;
78     if (AudioChannel::CHANNEL_3 == capturerOptions.streamInfo.channels) {
79         params.audioChannel = AudioChannel::STEREO;
80         isChange = true;
81     } else {
82         params.audioChannel = capturerOptions.streamInfo.channels;
83     }
84     params.audioEncoding = capturerOptions.streamInfo.encoding;
85 #ifdef OHCORE
86     auto capturer = std::make_unique<AudioCapturerGateway>(audioStreamType);
87 #else
88     auto capturer = std::make_unique<AudioCapturerPrivate>(audioStreamType, appInfo, false);
89 #endif
90     if (capturer == nullptr) {
91         return capturer;
92     }
93 
94     if (!cachePath.empty()) {
95         AUDIO_DEBUG_LOG("Set application cache path");
96         capturer->cachePath_ = cachePath;
97     }
98 
99     if (capturer->InitPlaybackCapturer(sourceType, capturerOptions.playbackCaptureConfig) != SUCCESS) {
100         return nullptr;
101     }
102 
103     capturer->capturerInfo_.sourceType = sourceType;
104     capturer->capturerInfo_.capturerFlags = capturerOptions.capturerInfo.capturerFlags;
105     if (capturer->SetParams(params) != SUCCESS) {
106         capturer = nullptr;
107     }
108 
109     if (capturer != nullptr && isChange) {
110         capturer->isChannelChange_ = true;
111     }
112 
113     return capturer;
114 }
115 
AudioCapturerPrivate(AudioStreamType audioStreamType,const AppInfo & appInfo,bool createStream)116 AudioCapturerPrivate::AudioCapturerPrivate(AudioStreamType audioStreamType, const AppInfo &appInfo, bool createStream)
117 {
118     if (audioStreamType < STREAM_VOICE_CALL || audioStreamType > STREAM_ALL) {
119         AUDIO_ERR_LOG("AudioCapturerPrivate audioStreamType is invalid!");
120     }
121     audioStreamType_ = audioStreamType;
122     auto iter = streamToSource_.find(audioStreamType);
123     if (iter != streamToSource_.end()) {
124         capturerInfo_.sourceType = iter->second;
125     }
126     appInfo_ = appInfo;
127     if (!(appInfo_.appPid)) {
128         appInfo_.appPid = getpid();
129     }
130 
131     if (appInfo_.appUid < 0) {
132         appInfo_.appUid = static_cast<int32_t>(getuid());
133     }
134     if (createStream) {
135         AudioStreamParams tempParams = {};
136         audioStream_ = IAudioStream::GetRecordStream(IAudioStream::PA_STREAM, tempParams, audioStreamType_,
137             appInfo_.appUid);
138         AUDIO_INFO_LOG("AudioCapturerPrivate create normal stream for old mode.");
139     }
140 
141     capturerProxyObj_ = std::make_shared<AudioCapturerProxyObj>();
142     if (!capturerProxyObj_) {
143         AUDIO_ERR_LOG("AudioCapturerProxyObj Memory Allocation Failed !!");
144     }
145 }
146 
InitPlaybackCapturer(int32_t type,const AudioPlaybackCaptureConfig & config)147 int32_t AudioCapturerPrivate::InitPlaybackCapturer(int32_t type, const AudioPlaybackCaptureConfig &config)
148 {
149     if (type != SOURCE_TYPE_PLAYBACK_CAPTURE) {
150         return SUCCESS;
151     }
152     return AudioPolicyManager::GetInstance().SetPlaybackCapturerFilterInfos(config, appInfo_.appTokenId);
153 }
154 
GetFrameCount(uint32_t & frameCount) const155 int32_t AudioCapturerPrivate::GetFrameCount(uint32_t &frameCount) const
156 {
157     return audioStream_->GetFrameCount(frameCount);
158 }
159 
SetParams(const AudioCapturerParams params)160 int32_t AudioCapturerPrivate::SetParams(const AudioCapturerParams params)
161 {
162     AUDIO_INFO_LOG("AudioCapturer::SetParams");
163     AudioStreamParams audioStreamParams = ConvertToAudioStreamParams(params);
164 
165     IAudioStream::StreamClass streamClass = IAudioStream::PA_STREAM;
166     if (capturerInfo_.capturerFlags == STREAM_FLAG_FAST) {
167         streamClass = IAudioStream::FAST_STREAM;
168     }
169 
170     // check AudioStreamParams for fast stream
171     if (audioStream_ == nullptr) {
172         audioStream_ = IAudioStream::GetRecordStream(streamClass, audioStreamParams, audioStreamType_,
173             appInfo_.appUid);
174         CHECK_AND_RETURN_RET_LOG(audioStream_ != nullptr, ERR_INVALID_PARAM, "SetParams GetRecordStream faied.");
175         AUDIO_INFO_LOG("IAudioStream::GetStream success");
176         audioStream_->SetApplicationCachePath(cachePath_);
177     }
178 
179     if (!audioStream_->CheckRecordingCreate(appInfo_.appTokenId, appInfo_.appFullTokenId, appInfo_.appUid)) {
180         AUDIO_ERR_LOG("recording create check failed");
181         return ERR_PERMISSION_DENIED;
182     }
183 
184     const AudioCapturer *capturer = this;
185     capturerProxyObj_->SaveCapturerObj(capturer);
186 
187     audioStream_->SetCapturerInfo(capturerInfo_);
188 
189     audioStream_->SetClientID(appInfo_.appPid, appInfo_.appUid);
190 
191     if (capturerInfo_.sourceType == SOURCE_TYPE_PLAYBACK_CAPTURE) {
192         audioStream_->SetInnerCapturerState(true);
193     } else if (capturerInfo_.sourceType == SourceType::SOURCE_TYPE_WAKEUP) {
194         audioStream_->SetWakeupCapturerState(true);
195     }
196 
197     int32_t ret = audioStream_->SetAudioStreamInfo(audioStreamParams, capturerProxyObj_);
198     CHECK_AND_RETURN_RET_LOG(ret == SUCCESS, ret, "AudioCapturerPrivate::SetParams SetAudioStreamInfo Failed");
199 
200     if (audioStream_->GetAudioSessionID(sessionID_) != 0) {
201         AUDIO_ERR_LOG("InitAudioInterruptCallback::GetAudioSessionID failed for INDEPENDENT_MODE");
202         return ERR_INVALID_INDEX;
203     }
204     audioInterrupt_.sessionID = sessionID_;
205     audioInterrupt_.audioFocusType.sourceType = capturerInfo_.sourceType;
206     if (audioInterrupt_.audioFocusType.sourceType == SOURCE_TYPE_VOICE_MODEM_COMMUNICATION) {
207         isVoiceCallCapturer_ = true;
208         audioInterrupt_.audioFocusType.sourceType = SOURCE_TYPE_VOICE_COMMUNICATION;
209     }
210     if (audioInterruptCallback_ == nullptr) {
211         audioInterruptCallback_ = std::make_shared<AudioCapturerInterruptCallbackImpl>(audioStream_);
212         if (audioInterruptCallback_ == nullptr) {
213             AUDIO_ERR_LOG("AudioCapturerPrivate::Failed to allocate memory for audioInterruptCallback_");
214             return ERROR;
215         }
216     }
217     return AudioPolicyManager::GetInstance().SetAudioInterruptCallback(sessionID_, audioInterruptCallback_);
218 }
219 
SetCapturerCallback(const std::shared_ptr<AudioCapturerCallback> & callback)220 int32_t AudioCapturerPrivate::SetCapturerCallback(const std::shared_ptr<AudioCapturerCallback> &callback)
221 {
222     // If the client is using the deprecated SetParams API. SetCapturerCallback must be invoked, after SetParams.
223     // In general, callbacks can only be set after the capturer state is  PREPARED.
224     CapturerState state = GetStatus();
225     if (state == CAPTURER_NEW || state == CAPTURER_RELEASED) {
226         AUDIO_DEBUG_LOG("AudioCapturerPrivate::SetCapturerCallback ncorrect state:%{public}d to register cb", state);
227         return ERR_ILLEGAL_STATE;
228     }
229     if (callback == nullptr) {
230         AUDIO_ERR_LOG("AudioCapturerPrivate::SetCapturerCallback callback param is null");
231         return ERR_INVALID_PARAM;
232     }
233 
234     // Save reference for interrupt callback
235     if (audioInterruptCallback_ == nullptr) {
236         AUDIO_ERR_LOG("AudioCapturerPrivate::SetCapturerCallback audioInterruptCallback_ == nullptr");
237         return ERROR;
238     }
239     std::shared_ptr<AudioCapturerInterruptCallbackImpl> cbInterrupt =
240         std::static_pointer_cast<AudioCapturerInterruptCallbackImpl>(audioInterruptCallback_);
241     cbInterrupt->SaveCallback(callback);
242 
243     // Save and Set reference for stream callback. Order is important here.
244     if (audioStreamCallback_ == nullptr) {
245         audioStreamCallback_ = std::make_shared<AudioStreamCallbackCapturer>();
246         if (audioStreamCallback_ == nullptr) {
247             AUDIO_ERR_LOG("AudioCapturerPrivate::Failed to allocate memory for audioStreamCallback_");
248             return ERROR;
249         }
250     }
251     std::shared_ptr<AudioStreamCallbackCapturer> cbStream =
252         std::static_pointer_cast<AudioStreamCallbackCapturer>(audioStreamCallback_);
253     cbStream->SaveCallback(callback);
254     (void)audioStream_->SetStreamCallback(audioStreamCallback_);
255 
256     return SUCCESS;
257 }
258 
GetParams(AudioCapturerParams & params) const259 int32_t AudioCapturerPrivate::GetParams(AudioCapturerParams &params) const
260 {
261     AudioStreamParams audioStreamParams;
262     int32_t result = audioStream_->GetAudioStreamInfo(audioStreamParams);
263     if (SUCCESS == result) {
264         params.audioSampleFormat = static_cast<AudioSampleFormat>(audioStreamParams.format);
265         params.samplingRate = static_cast<AudioSamplingRate>(audioStreamParams.samplingRate);
266         params.audioChannel = static_cast<AudioChannel>(audioStreamParams.channels);
267         params.audioEncoding = static_cast<AudioEncodingType>(audioStreamParams.encoding);
268     }
269 
270     return result;
271 }
272 
GetCapturerInfo(AudioCapturerInfo & capturerInfo) const273 int32_t AudioCapturerPrivate::GetCapturerInfo(AudioCapturerInfo &capturerInfo) const
274 {
275     capturerInfo = capturerInfo_;
276 
277     return SUCCESS;
278 }
279 
GetStreamInfo(AudioStreamInfo & streamInfo) const280 int32_t AudioCapturerPrivate::GetStreamInfo(AudioStreamInfo &streamInfo) const
281 {
282     AudioStreamParams audioStreamParams;
283     int32_t result = audioStream_->GetAudioStreamInfo(audioStreamParams);
284     if (SUCCESS == result) {
285         streamInfo.format = static_cast<AudioSampleFormat>(audioStreamParams.format);
286         streamInfo.samplingRate = static_cast<AudioSamplingRate>(audioStreamParams.samplingRate);
287         if (this->isChannelChange_) {
288             streamInfo.channels = AudioChannel::CHANNEL_3;
289         } else {
290             streamInfo.channels = static_cast<AudioChannel>(audioStreamParams.channels);
291         }
292         streamInfo.encoding = static_cast<AudioEncodingType>(audioStreamParams.encoding);
293     }
294 
295     return result;
296 }
297 
SetCapturerPositionCallback(int64_t markPosition,const std::shared_ptr<CapturerPositionCallback> & callback)298 int32_t AudioCapturerPrivate::SetCapturerPositionCallback(int64_t markPosition,
299     const std::shared_ptr<CapturerPositionCallback> &callback)
300 {
301     if ((callback == nullptr) || (markPosition <= 0)) {
302         AUDIO_ERR_LOG("AudioCapturerPrivate::SetCapturerPositionCallback input param is invalid");
303         return ERR_INVALID_PARAM;
304     }
305 
306     audioStream_->SetCapturerPositionCallback(markPosition, callback);
307 
308     return SUCCESS;
309 }
310 
UnsetCapturerPositionCallback()311 void AudioCapturerPrivate::UnsetCapturerPositionCallback()
312 {
313     audioStream_->UnsetCapturerPositionCallback();
314 }
315 
SetCapturerPeriodPositionCallback(int64_t frameNumber,const std::shared_ptr<CapturerPeriodPositionCallback> & callback)316 int32_t AudioCapturerPrivate::SetCapturerPeriodPositionCallback(int64_t frameNumber,
317     const std::shared_ptr<CapturerPeriodPositionCallback> &callback)
318 {
319     if ((callback == nullptr) || (frameNumber <= 0)) {
320         AUDIO_ERR_LOG("AudioCapturerPrivate::SetCapturerPeriodPositionCallback input param is invalid");
321         return ERR_INVALID_PARAM;
322     }
323 
324     audioStream_->SetCapturerPeriodPositionCallback(frameNumber, callback);
325 
326     return SUCCESS;
327 }
328 
UnsetCapturerPeriodPositionCallback()329 void AudioCapturerPrivate::UnsetCapturerPeriodPositionCallback()
330 {
331     audioStream_->UnsetCapturerPeriodPositionCallback();
332 }
333 
Start() const334 bool AudioCapturerPrivate::Start() const
335 {
336     AUDIO_INFO_LOG("AudioCapturer::Start");
337     if (!audioStream_->CheckRecordingStateChange(appInfo_.appTokenId, appInfo_.appFullTokenId,
338         appInfo_.appUid, AUDIO_PERMISSION_START)) {
339         AUDIO_ERR_LOG("recording start check failed");
340         return false;
341     }
342 
343     if (audioInterrupt_.audioFocusType.sourceType == SOURCE_TYPE_INVALID ||
344         audioInterrupt_.sessionID == INVALID_SESSION_ID) {
345         return false;
346     }
347 
348     int32_t ret = AudioPolicyManager::GetInstance().ActivateAudioInterrupt(audioInterrupt_);
349     if (ret != 0) {
350         AUDIO_ERR_LOG("AudioCapturerPrivate::ActivateAudioInterrupt Failed");
351         return false;
352     }
353 
354     if (isVoiceCallCapturer_) {
355         // When the cellular call stream is starting, only need to activate audio interrupt.
356         return true;
357     }
358 
359     return audioStream_->StartAudioStream();
360 }
361 
Read(uint8_t & buffer,size_t userSize,bool isBlockingRead) const362 int32_t AudioCapturerPrivate::Read(uint8_t &buffer, size_t userSize, bool isBlockingRead) const
363 {
364     return audioStream_->Read(buffer, userSize, isBlockingRead);
365 }
366 
GetStatus() const367 CapturerState AudioCapturerPrivate::GetStatus() const
368 {
369     return (CapturerState)audioStream_->GetState();
370 }
371 
GetAudioTime(Timestamp & timestamp,Timestamp::Timestampbase base) const372 bool AudioCapturerPrivate::GetAudioTime(Timestamp &timestamp, Timestamp::Timestampbase base) const
373 {
374     return audioStream_->GetAudioTime(timestamp, base);
375 }
376 
Pause() const377 bool AudioCapturerPrivate::Pause() const
378 {
379     AUDIO_INFO_LOG("AudioCapturer::Pause");
380     if (!audioStream_->CheckRecordingStateChange(appInfo_.appTokenId, appInfo_.appFullTokenId,
381         appInfo_.appUid, AUDIO_PERMISSION_STOP)) {
382         AUDIO_ERR_LOG("Pause monitor permission failed");
383     }
384 
385     // When user is intentionally pausing , Deactivate to remove from audio focus info list
386     int32_t ret = AudioPolicyManager::GetInstance().DeactivateAudioInterrupt(audioInterrupt_);
387     if (ret != 0) {
388         AUDIO_ERR_LOG("AudioRenderer: DeactivateAudioInterrupt Failed");
389     }
390 
391     if (isVoiceCallCapturer_) {
392         // When the cellular call stream is pausing, only need to deactivate audio interrupt.
393         return true;
394     }
395 
396     return audioStream_->PauseAudioStream();
397 }
398 
Stop() const399 bool AudioCapturerPrivate::Stop() const
400 {
401     AUDIO_INFO_LOG("AudioCapturer::Stop");
402     if (!audioStream_->CheckRecordingStateChange(appInfo_.appTokenId, appInfo_.appFullTokenId,
403         appInfo_.appUid, AUDIO_PERMISSION_STOP)) {
404         AUDIO_ERR_LOG("Stop monitor permission failed");
405     }
406 
407     int32_t ret = AudioPolicyManager::GetInstance().DeactivateAudioInterrupt(audioInterrupt_);
408     if (ret != 0) {
409         AUDIO_ERR_LOG("AudioCapturer: DeactivateAudioInterrupt Failed");
410     }
411 
412     if (isVoiceCallCapturer_) {
413         // When the cellular call stream is stopping, only need to deactivate audio interrupt.
414         return true;
415     }
416 
417     return audioStream_->StopAudioStream();
418 }
419 
Flush() const420 bool AudioCapturerPrivate::Flush() const
421 {
422     AUDIO_INFO_LOG("AudioCapturer::Flush");
423     return audioStream_->FlushAudioStream();
424 }
425 
Release()426 bool AudioCapturerPrivate::Release()
427 {
428     AUDIO_INFO_LOG("AudioCapturer::Release");
429 
430     std::lock_guard<std::mutex> lock(lock_);
431     if (!isValid_) {
432         AUDIO_ERR_LOG("Release when capturer invalid");
433         return false;
434     }
435 
436     if (!audioStream_->CheckRecordingStateChange(appInfo_.appTokenId, appInfo_.appFullTokenId,
437         appInfo_.appUid, AUDIO_PERMISSION_STOP)) {
438         AUDIO_ERR_LOG("Release monitor permission failed");
439     }
440 
441     (void)AudioPolicyManager::GetInstance().DeactivateAudioInterrupt(audioInterrupt_);
442 
443     // Unregister the callaback in policy server
444     (void)AudioPolicyManager::GetInstance().UnsetAudioInterruptCallback(sessionID_);
445 
446     return audioStream_->ReleaseAudioStream();
447 }
448 
GetBufferSize(size_t & bufferSize) const449 int32_t AudioCapturerPrivate::GetBufferSize(size_t &bufferSize) const
450 {
451     return audioStream_->GetBufferSize(bufferSize);
452 }
453 
GetAudioStreamId(uint32_t & sessionID) const454 int32_t AudioCapturerPrivate::GetAudioStreamId(uint32_t &sessionID) const
455 {
456     return audioStream_->GetAudioSessionID(sessionID);
457 }
458 
SetBufferDuration(uint64_t bufferDuration) const459 int32_t AudioCapturerPrivate::SetBufferDuration(uint64_t bufferDuration) const
460 {
461     if (bufferDuration < MINIMUM_BUFFER_SIZE_MSEC || bufferDuration > MAXIMUM_BUFFER_SIZE_MSEC) {
462         AUDIO_ERR_LOG("Error: Please set the buffer duration between 5ms ~ 20ms");
463         return ERR_INVALID_PARAM;
464     }
465     return audioStream_->SetBufferSizeInMsec(bufferDuration);
466 }
467 
SetApplicationCachePath(const std::string cachePath)468 void AudioCapturerPrivate::SetApplicationCachePath(const std::string cachePath)
469 {
470     cachePath_ = cachePath;
471     if (audioStream_ != nullptr) {
472         audioStream_->SetApplicationCachePath(cachePath_);
473     } else {
474         AUDIO_WARNING_LOG("AudioCapturer SetApplicationCachePath while stream is null");
475     }
476 }
477 
AudioCapturerInterruptCallbackImpl(const std::shared_ptr<IAudioStream> & audioStream)478 AudioCapturerInterruptCallbackImpl::AudioCapturerInterruptCallbackImpl(const std::shared_ptr<IAudioStream> &audioStream)
479     : audioStream_(audioStream)
480 {
481     AUDIO_INFO_LOG("AudioCapturerInterruptCallbackImpl constructor");
482 }
483 
~AudioCapturerInterruptCallbackImpl()484 AudioCapturerInterruptCallbackImpl::~AudioCapturerInterruptCallbackImpl()
485 {
486     AUDIO_DEBUG_LOG("AudioCapturerInterruptCallbackImpl: instance destroy");
487 }
488 
SaveCallback(const std::weak_ptr<AudioCapturerCallback> & callback)489 void AudioCapturerInterruptCallbackImpl::SaveCallback(const std::weak_ptr<AudioCapturerCallback> &callback)
490 {
491     callback_ = callback;
492 }
493 
NotifyEvent(const InterruptEvent & interruptEvent)494 void AudioCapturerInterruptCallbackImpl::NotifyEvent(const InterruptEvent &interruptEvent)
495 {
496     AUDIO_INFO_LOG("AudioCapturerInterruptCallbackImpl: NotifyEvent: Hint: %{public}d, eventType: %{public}d",
497         interruptEvent.hintType, interruptEvent.eventType);
498 
499     if (cb_ != nullptr) {
500         cb_->OnInterrupt(interruptEvent);
501         AUDIO_DEBUG_LOG("AudioCapturerInterruptCallbackImpl: OnInterrupt : NotifyEvent to app complete");
502     } else {
503         AUDIO_DEBUG_LOG("AudioCapturerInterruptCallbackImpl: cb_ == nullptr cannont NotifyEvent to app");
504     }
505 }
506 
NotifyForcePausedToResume(const InterruptEventInternal & interruptEvent)507 void AudioCapturerInterruptCallbackImpl::NotifyForcePausedToResume(const InterruptEventInternal &interruptEvent)
508 {
509     // Change InterruptForceType to Share, Since app will take care of resuming
510     InterruptEvent interruptEventResume {interruptEvent.eventType, INTERRUPT_SHARE,
511                                          interruptEvent.hintType};
512     NotifyEvent(interruptEventResume);
513 }
514 
HandleAndNotifyForcedEvent(const InterruptEventInternal & interruptEvent)515 void AudioCapturerInterruptCallbackImpl::HandleAndNotifyForcedEvent(const InterruptEventInternal &interruptEvent)
516 {
517     InterruptHint hintType = interruptEvent.hintType;
518     AUDIO_DEBUG_LOG("AudioCapturerPrivate HandleAndNotifyForcedEvent: Force handle the event and notify the app,\
519         Hint: %{public}d eventType: %{public}d", interruptEvent.hintType, interruptEvent.eventType);
520 
521     switch (hintType) {
522         case INTERRUPT_HINT_RESUME:
523             if (audioStream_->GetState() != PAUSED || !isForcePaused_) {
524                 AUDIO_DEBUG_LOG("AudioRendererPrivate::OnInterrupt state is not paused or not forced paused");
525                 return;
526             }
527             isForcePaused_ = false;
528             NotifyForcePausedToResume(interruptEvent);
529             return;
530         case INTERRUPT_HINT_PAUSE:
531             if (audioStream_->GetState() != RUNNING) {
532                 AUDIO_DEBUG_LOG("AudioCapturerPrivate::OnInterrupt state is not running no need to pause");
533                 return;
534             }
535             (void)audioStream_->PauseAudioStream(); // Just Pause, do not deactivate here
536             isForcePaused_ = true;
537             break;
538         case INTERRUPT_HINT_STOP:
539             (void)audioStream_->StopAudioStream();
540             break;
541         default:
542             break;
543     }
544     // Notify valid forced event callbacks to app
545     InterruptEvent interruptEventForced {interruptEvent.eventType, interruptEvent.forceType, interruptEvent.hintType};
546     NotifyEvent(interruptEventForced);
547 }
548 
OnInterrupt(const InterruptEventInternal & interruptEvent)549 void AudioCapturerInterruptCallbackImpl::OnInterrupt(const InterruptEventInternal &interruptEvent)
550 {
551     cb_ = callback_.lock();
552     InterruptForceType forceType = interruptEvent.forceType;
553     AUDIO_DEBUG_LOG("AudioCapturerInterruptCallbackImpl::OnInterrupt InterruptForceType: %{public}d", forceType);
554 
555     if (forceType != INTERRUPT_FORCE) { // INTERRUPT_SHARE
556         AUDIO_DEBUG_LOG("AudioCapturerPrivate ForceType: INTERRUPT_SHARE. Let app handle the event");
557         InterruptEvent interruptEventShared {interruptEvent.eventType, interruptEvent.forceType,
558                                              interruptEvent.hintType};
559         NotifyEvent(interruptEventShared);
560         return;
561     }
562 
563     if (audioStream_ == nullptr) {
564         AUDIO_DEBUG_LOG("AudioCapturerInterruptCallbackImpl::Stream is not alive. No need to take forced action");
565         return;
566     }
567 
568     HandleAndNotifyForcedEvent(interruptEvent);
569 }
570 
SaveCallback(const std::weak_ptr<AudioCapturerCallback> & callback)571 void AudioStreamCallbackCapturer::SaveCallback(const std::weak_ptr<AudioCapturerCallback> &callback)
572 {
573     callback_ = callback;
574 }
575 
OnStateChange(const State state,const StateChangeCmdType cmdType)576 void AudioStreamCallbackCapturer::OnStateChange(const State state,
577     const StateChangeCmdType __attribute__((unused)) cmdType)
578 {
579     std::shared_ptr<AudioCapturerCallback> cb = callback_.lock();
580     if (cb == nullptr) {
581         AUDIO_ERR_LOG("AudioStreamCallbackCapturer::OnStateChange cb == nullptr.");
582         return;
583     }
584 
585     cb->OnStateChange(static_cast<CapturerState>(state));
586 }
587 
GetSupportedFormats()588 std::vector<AudioSampleFormat> AudioCapturer::GetSupportedFormats()
589 {
590     return AUDIO_SUPPORTED_FORMATS;
591 }
592 
GetSupportedChannels()593 std::vector<AudioChannel> AudioCapturer::GetSupportedChannels()
594 {
595     return CAPTURER_SUPPORTED_CHANNELS;
596 }
597 
GetSupportedEncodingTypes()598 std::vector<AudioEncodingType> AudioCapturer::GetSupportedEncodingTypes()
599 {
600     return AUDIO_SUPPORTED_ENCODING_TYPES;
601 }
602 
GetSupportedSamplingRates()603 std::vector<AudioSamplingRate> AudioCapturer::GetSupportedSamplingRates()
604 {
605     return AUDIO_SUPPORTED_SAMPLING_RATES;
606 }
607 
FindStreamTypeBySourceType(SourceType sourceType)608 AudioStreamType AudioCapturer::FindStreamTypeBySourceType(SourceType sourceType)
609 {
610     switch (sourceType) {
611         case SOURCE_TYPE_VOICE_COMMUNICATION:
612         case SOURCE_TYPE_VOICE_MODEM_COMMUNICATION:
613             return STREAM_VOICE_CALL;
614         case SOURCE_TYPE_WAKEUP:
615             return STREAM_WAKEUP;
616         default:
617             return STREAM_MUSIC;
618     }
619 }
620 
SetCaptureMode(AudioCaptureMode captureMode) const621 int32_t AudioCapturerPrivate::SetCaptureMode(AudioCaptureMode captureMode) const
622 {
623     return audioStream_->SetCaptureMode(captureMode);
624 }
625 
GetCaptureMode() const626 AudioCaptureMode AudioCapturerPrivate::GetCaptureMode() const
627 {
628     return audioStream_->GetCaptureMode();
629 }
630 
SetCapturerReadCallback(const std::shared_ptr<AudioCapturerReadCallback> & callback)631 int32_t AudioCapturerPrivate::SetCapturerReadCallback(const std::shared_ptr<AudioCapturerReadCallback> &callback)
632 {
633     return audioStream_->SetCapturerReadCallback(callback);
634 }
635 
GetBufferDesc(BufferDesc & bufDesc) const636 int32_t AudioCapturerPrivate::GetBufferDesc(BufferDesc &bufDesc) const
637 {
638     return audioStream_->GetBufferDesc(bufDesc);
639 }
640 
Enqueue(const BufferDesc & bufDesc) const641 int32_t AudioCapturerPrivate::Enqueue(const BufferDesc &bufDesc) const
642 {
643     return audioStream_->Enqueue(bufDesc);
644 }
645 
Clear() const646 int32_t AudioCapturerPrivate::Clear() const
647 {
648     return audioStream_->Clear();
649 }
650 
GetBufQueueState(BufferQueueState & bufState) const651 int32_t AudioCapturerPrivate::GetBufQueueState(BufferQueueState &bufState) const
652 {
653     return audioStream_->GetBufQueueState(bufState);
654 }
655 
SetValid(bool valid)656 void AudioCapturerPrivate::SetValid(bool valid)
657 {
658     std::lock_guard<std::mutex> lock(lock_);
659     isValid_ = valid;
660 }
661 
GetFramesRead() const662 int64_t AudioCapturerPrivate::GetFramesRead() const
663 {
664     return audioStream_->GetFramesRead();
665 }
666 }  // namespace AudioStandard
667 }  // namespace OHOS
668