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 ¶ms) 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 ×tamp, 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