1 /*
2 * Copyright (c) 2021-2024 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 #ifndef LOG_TAG
16 #define LOG_TAG "AudioCapturer"
17 #endif
18
19 #include "audio_capturer.h"
20
21 #include <cinttypes>
22
23 #include "audio_capturer_private.h"
24 #include "audio_errors.h"
25 #include "audio_utils.h"
26 #include "audio_capturer_log.h"
27 #include "audio_policy_manager.h"
28
29 #include "media_monitor_manager.h"
30
31 namespace OHOS {
32 namespace AudioStandard {
33 static constexpr uid_t UID_MSDP_SA = 6699;
34 static constexpr int32_t WRITE_OVERFLOW_NUM = 100;
35 static constexpr int32_t AUDIO_SOURCE_TYPE_INVALID_5 = 5;
36
37 std::map<AudioStreamType, SourceType> AudioCapturerPrivate::streamToSource_ = {
38 {AudioStreamType::STREAM_MUSIC, SourceType::SOURCE_TYPE_MIC},
39 {AudioStreamType::STREAM_MEDIA, SourceType::SOURCE_TYPE_MIC},
40 {AudioStreamType::STREAM_CAMCORDER, SourceType::SOURCE_TYPE_CAMCORDER},
41 {AudioStreamType::STREAM_VOICE_CALL, SourceType::SOURCE_TYPE_VOICE_COMMUNICATION},
42 {AudioStreamType::STREAM_ULTRASONIC, SourceType::SOURCE_TYPE_ULTRASONIC},
43 {AudioStreamType::STREAM_WAKEUP, SourceType::SOURCE_TYPE_WAKEUP},
44 {AudioStreamType::STREAM_SOURCE_VOICE_CALL, SourceType::SOURCE_TYPE_VOICE_CALL},
45 };
46
47 AudioCapturer::~AudioCapturer() = default;
48
~AudioCapturerPrivate()49 AudioCapturerPrivate::~AudioCapturerPrivate()
50 {
51 AUDIO_INFO_LOG("~AudioCapturerPrivate");
52 std::shared_ptr<InputDeviceChangeWithInfoCallbackImpl> inputDeviceChangeCallback = inputDeviceChangeCallback_;
53 if (inputDeviceChangeCallback != nullptr) {
54 inputDeviceChangeCallback->UnsetAudioCapturerObj();
55 }
56 AudioPolicyManager::GetInstance().UnregisterDeviceChangeWithInfoCallback(sessionID_);
57 if (audioStream_ != nullptr) {
58 audioStream_->ReleaseAudioStream(true);
59 audioStream_ = nullptr;
60 }
61 if (audioStateChangeCallback_ != nullptr) {
62 audioStateChangeCallback_->HandleCapturerDestructor();
63 }
64 DumpFileUtil::CloseDumpFile(&dumpFile_);
65 }
66
Create(AudioStreamType audioStreamType)67 std::unique_ptr<AudioCapturer> AudioCapturer::Create(AudioStreamType audioStreamType)
68 {
69 AppInfo appInfo = {};
70 return Create(audioStreamType, appInfo);
71 }
72
Create(AudioStreamType audioStreamType, const AppInfo &appInfo)73 std::unique_ptr<AudioCapturer> AudioCapturer::Create(AudioStreamType audioStreamType, const AppInfo &appInfo)
74 {
75 return std::make_unique<AudioCapturerPrivate>(audioStreamType, appInfo, true);
76 }
77
Create(const AudioCapturerOptions &options)78 std::unique_ptr<AudioCapturer> AudioCapturer::Create(const AudioCapturerOptions &options)
79 {
80 AppInfo appInfo = {};
81 return Create(options, "", appInfo);
82 }
83
Create(const AudioCapturerOptions &options, const AppInfo &appInfo)84 std::unique_ptr<AudioCapturer> AudioCapturer::Create(const AudioCapturerOptions &options, const AppInfo &appInfo)
85 {
86 return Create(options, "", appInfo);
87 }
88
Create(const AudioCapturerOptions &options, const std::string cachePath)89 std::unique_ptr<AudioCapturer> AudioCapturer::Create(const AudioCapturerOptions &options, const std::string cachePath)
90 {
91 AppInfo appInfo = {};
92 return Create(options, cachePath, appInfo);
93 }
94
CreateCapturer(const AudioCapturerOptions &options, const AppInfo &appInfo)95 std::shared_ptr<AudioCapturer> AudioCapturer::CreateCapturer(const AudioCapturerOptions &options,
96 const AppInfo &appInfo)
97 {
98 auto tempUniquePtr = Create(options, "", appInfo);
99 std::shared_ptr<AudioCapturer> sharedPtr(tempUniquePtr.release());
100 return sharedPtr;
101 }
102
Create(const AudioCapturerOptions &capturerOptions, const std::string cachePath, const AppInfo &appInfo)103 std::unique_ptr<AudioCapturer> AudioCapturer::Create(const AudioCapturerOptions &capturerOptions,
104 const std::string cachePath, const AppInfo &appInfo)
105 {
106 Trace trace("AudioCapturer::Create");
107 auto sourceType = capturerOptions.capturerInfo.sourceType;
108 if (sourceType < SOURCE_TYPE_MIC || sourceType > SOURCE_TYPE_MAX || sourceType == AUDIO_SOURCE_TYPE_INVALID_5) {
109 AudioCapturer::SendCapturerCreateError(sourceType, ERR_INVALID_PARAM);
110 AUDIO_ERR_LOG("Invalid source type %{public}d!", sourceType);
111 return nullptr;
112 }
113 if (sourceType == SOURCE_TYPE_ULTRASONIC && getuid() != UID_MSDP_SA) {
114 AudioCapturer::SendCapturerCreateError(sourceType, ERR_INVALID_PARAM);
115 }
116 CHECK_AND_RETURN_RET_LOG(sourceType != SOURCE_TYPE_ULTRASONIC || getuid() == UID_MSDP_SA, nullptr,
117 "Create failed: SOURCE_TYPE_ULTRASONIC can only be used by MSDP");
118 AudioStreamType audioStreamType = FindStreamTypeBySourceType(sourceType);
119 AudioCapturerParams params;
120 params.audioSampleFormat = capturerOptions.streamInfo.format;
121 params.samplingRate = capturerOptions.streamInfo.samplingRate;
122 bool isChange = false;
123 if (AudioChannel::CHANNEL_3 == capturerOptions.streamInfo.channels) {
124 params.audioChannel = AudioChannel::STEREO;
125 isChange = true;
126 } else {
127 params.audioChannel = capturerOptions.streamInfo.channels;
128 }
129 params.audioEncoding = capturerOptions.streamInfo.encoding;
130 params.channelLayout = capturerOptions.streamInfo.channelLayout;
131 auto capturer = std::make_unique<AudioCapturerPrivate>(audioStreamType, appInfo, false);
132 if (capturer == nullptr) {
133 AudioCapturer::SendCapturerCreateError(sourceType, ERR_OPERATION_FAILED);
134 AUDIO_ERR_LOG("Failed to create capturer object");
135 return capturer;
136 }
137 AUDIO_INFO_LOG("Capturer sourceType: %{public}d, uid: %{public}d", sourceType, appInfo.appUid);
138 // InitPlaybackCapturer will be replaced by UpdatePlaybackCaptureConfig.
139 capturer->capturerInfo_.sourceType = sourceType;
140 capturer->capturerInfo_.capturerFlags = capturerOptions.capturerInfo.capturerFlags;
141 capturer->capturerInfo_.originalFlag = capturerOptions.capturerInfo.capturerFlags;
142 capturer->filterConfig_ = capturerOptions.playbackCaptureConfig;
143 if (capturer->SetParams(params) != SUCCESS) {
144 AudioCapturer::SendCapturerCreateError(sourceType, ERR_OPERATION_FAILED);
145 capturer = nullptr;
146 }
147 if (capturer != nullptr && isChange) {
148 capturer->isChannelChange_ = true;
149 }
150 return capturer;
151 }
152
153 // This will be called in Create and after Create.
UpdatePlaybackCaptureConfig(const AudioPlaybackCaptureConfig &config)154 int32_t AudioCapturerPrivate::UpdatePlaybackCaptureConfig(const AudioPlaybackCaptureConfig &config)
155 {
156 // UpdatePlaybackCaptureConfig will only work for InnerCap streams.
157 if (capturerInfo_.sourceType != SOURCE_TYPE_PLAYBACK_CAPTURE) {
158 AUDIO_WARNING_LOG("This is not a PLAYBACK_CAPTURE stream.");
159 return ERR_INVALID_OPERATION;
160 }
161
162 if (config.filterOptions.usages.size() == 0 && config.filterOptions.pids.size() == 0) {
163 AUDIO_WARNING_LOG("Both usages and pids are empty!");
164 }
165
166 CHECK_AND_RETURN_RET_LOG(audioStream_ != nullptr, ERR_OPERATION_FAILED, "Failed with null audioStream_");
167
168 return audioStream_->UpdatePlaybackCaptureConfig(config);
169 }
170
SendCapturerCreateError(const SourceType &sourceType, const int32_t &errorCode)171 void AudioCapturer::SendCapturerCreateError(const SourceType &sourceType,
172 const int32_t &errorCode)
173 {
174 std::shared_ptr<Media::MediaMonitor::EventBean> bean = std::make_shared<Media::MediaMonitor::EventBean>(
175 Media::MediaMonitor::ModuleId::AUDIO, Media::MediaMonitor::EventId::AUDIO_STREAM_CREATE_ERROR_STATS,
176 Media::MediaMonitor::EventType::FREQUENCY_AGGREGATION_EVENT);
177 bean->Add("IS_PLAYBACK", 0);
178 bean->Add("CLIENT_UID", static_cast<int32_t>(getuid()));
179 bean->Add("STREAM_TYPE", sourceType);
180 bean->Add("ERROR_CODE", errorCode);
181 Media::MediaMonitor::MediaMonitorManager::GetInstance().WriteLogMsg(bean);
182 }
183
AudioCapturerPrivate(AudioStreamType audioStreamType, const AppInfo &appInfo, bool createStream)184 AudioCapturerPrivate::AudioCapturerPrivate(AudioStreamType audioStreamType, const AppInfo &appInfo, bool createStream)
185 {
186 if (audioStreamType < STREAM_VOICE_CALL || audioStreamType > STREAM_ALL) {
187 AUDIO_WARNING_LOG("audioStreamType is invalid!");
188 }
189 audioStreamType_ = audioStreamType;
190 auto iter = streamToSource_.find(audioStreamType);
191 if (iter != streamToSource_.end()) {
192 capturerInfo_.sourceType = iter->second;
193 }
194 appInfo_ = appInfo;
195 if (!(appInfo_.appPid)) {
196 appInfo_.appPid = getpid();
197 }
198
199 if (appInfo_.appUid < 0) {
200 appInfo_.appUid = static_cast<int32_t>(getuid());
201 }
202 if (createStream) {
203 AudioStreamParams tempParams = {};
204 audioStream_ = IAudioStream::GetRecordStream(IAudioStream::PA_STREAM, tempParams, audioStreamType_,
205 appInfo_.appUid);
206 AUDIO_INFO_LOG("create normal stream for old mode.");
207 }
208
209 capturerProxyObj_ = std::make_shared<AudioCapturerProxyObj>();
210 if (!capturerProxyObj_) {
211 AUDIO_WARNING_LOG("AudioCapturerProxyObj Memory Allocation Failed !!");
212 }
213 }
214
InitPlaybackCapturer(int32_t type, const AudioPlaybackCaptureConfig &config)215 int32_t AudioCapturerPrivate::InitPlaybackCapturer(int32_t type, const AudioPlaybackCaptureConfig &config)
216 {
217 if (type != SOURCE_TYPE_PLAYBACK_CAPTURE) {
218 return SUCCESS;
219 }
220 return AudioPolicyManager::GetInstance().SetPlaybackCapturerFilterInfos(config, appInfo_.appTokenId);
221 }
222
SetCaptureSilentState(bool state)223 int32_t AudioCapturerPrivate::SetCaptureSilentState(bool state)
224 {
225 return AudioPolicyManager::GetInstance().SetCaptureSilentState(state);
226 }
227
GetFrameCount(uint32_t &frameCount) const228 int32_t AudioCapturerPrivate::GetFrameCount(uint32_t &frameCount) const
229 {
230 return audioStream_->GetFrameCount(frameCount);
231 }
232
GetPreferredStreamClass(AudioStreamParams audioStreamParams)233 IAudioStream::StreamClass AudioCapturerPrivate::GetPreferredStreamClass(AudioStreamParams audioStreamParams)
234 {
235 int32_t flag = AudioPolicyManager::GetInstance().GetPreferredInputStreamType(capturerInfo_);
236 AUDIO_INFO_LOG("Preferred capturer flag: %{public}d", flag);
237 if (flag == AUDIO_FLAG_MMAP && IAudioStream::IsStreamSupported(capturerInfo_.originalFlag, audioStreamParams)) {
238 capturerInfo_.capturerFlags = AUDIO_FLAG_MMAP;
239 return IAudioStream::FAST_STREAM;
240 }
241 if (flag == AUDIO_FLAG_VOIP_FAST) {
242 // It is not possible to directly create a fast VoIP stream
243 isFastVoipSupported_ = true;
244 }
245
246 capturerInfo_.capturerFlags = AUDIO_FLAG_NORMAL;
247 return IAudioStream::PA_STREAM;
248 }
249
SetParams(const AudioCapturerParams params)250 int32_t AudioCapturerPrivate::SetParams(const AudioCapturerParams params)
251 {
252 Trace trace("AudioCapturer::SetParams");
253 AUDIO_INFO_LOG("StreamClientState for Capturer::SetParams.");
254
255 std::shared_lock<std::shared_mutex> lockShared(switchStreamMutex_);
256 std::lock_guard<std::mutex> lock(setParamsMutex_);
257
258 AudioStreamParams audioStreamParams = ConvertToAudioStreamParams(params);
259
260 IAudioStream::StreamClass streamClass = IAudioStream::PA_STREAM;
261 if (capturerInfo_.sourceType != SOURCE_TYPE_PLAYBACK_CAPTURE) {
262 streamClass = GetPreferredStreamClass(audioStreamParams);
263 }
264 ActivateAudioConcurrency(streamClass);
265
266 // check AudioStreamParams for fast stream
267 if (audioStream_ == nullptr) {
268 audioStream_ = IAudioStream::GetRecordStream(streamClass, audioStreamParams, audioStreamType_,
269 appInfo_.appUid);
270 CHECK_AND_RETURN_RET_LOG(audioStream_ != nullptr, ERR_INVALID_PARAM, "SetParams GetRecordStream faied.");
271 AUDIO_INFO_LOG("IAudioStream::GetStream success");
272 }
273 int32_t ret = InitAudioStream(audioStreamParams);
274 // When the fast stream creation fails, a normal stream is created
275 if (ret != SUCCESS && streamClass == IAudioStream::FAST_STREAM) {
276 AUDIO_INFO_LOG("Create fast Stream fail, record by normal stream");
277 streamClass = IAudioStream::PA_STREAM;
278 audioStream_ = IAudioStream::GetRecordStream(streamClass, audioStreamParams, audioStreamType_, appInfo_.appUid);
279 CHECK_AND_RETURN_RET_LOG(audioStream_ != nullptr, ERR_INVALID_PARAM, "Get normal record stream failed");
280 ret = InitAudioStream(audioStreamParams);
281 CHECK_AND_RETURN_RET_LOG(ret == SUCCESS, ret, "Init normal audio stream failed");
282 audioStream_->SetCaptureMode(CAPTURE_MODE_CALLBACK);
283 }
284 CHECK_AND_RETURN_RET_LOG(ret == SUCCESS, ret, "InitAudioStream failed");
285
286 RegisterCapturerPolicyServiceDiedCallback();
287
288 if (audioStream_->GetAudioSessionID(sessionID_) != 0) {
289 AUDIO_ERR_LOG("GetAudioSessionID failed!");
290 return ERR_INVALID_INDEX;
291 }
292 // eg: 100009_44100_2_1_cap_client_out.pcm
293 std::string dumpFileName = std::to_string(sessionID_) + "_" + std::to_string(params.samplingRate) + "_" +
294 std::to_string(params.audioChannel) + "_" + std::to_string(params.audioSampleFormat) + "_cap_client_out.pcm";
295 DumpFileUtil::OpenDumpFile(DUMP_CLIENT_PARA, dumpFileName, &dumpFile_);
296
297 ret = InitInputDeviceChangeCallback();
298 CHECK_AND_RETURN_RET_LOG(ret == SUCCESS, ret, "Init input device change callback failed");
299
300 return InitAudioInterruptCallback();
301 }
302
InitInputDeviceChangeCallback()303 int32_t AudioCapturerPrivate::InitInputDeviceChangeCallback()
304 {
305 CHECK_AND_RETURN_RET_LOG(GetCurrentInputDevices(currentDeviceInfo_) == SUCCESS, ERROR,
306 "Get current device info failed");
307
308 if (!inputDeviceChangeCallback_) {
309 inputDeviceChangeCallback_ = std::make_shared<InputDeviceChangeWithInfoCallbackImpl>();
310 CHECK_AND_RETURN_RET_LOG(inputDeviceChangeCallback_ != nullptr, ERROR, "Memory allocation failed");
311 }
312
313 inputDeviceChangeCallback_->SetAudioCapturerObj(this);
314
315 uint32_t sessionId;
316 int32_t ret = GetAudioStreamId(sessionId);
317 CHECK_AND_RETURN_RET_LOG(ret == SUCCESS, ret, "Get sessionId failed");
318
319 ret = AudioPolicyManager::GetInstance().RegisterDeviceChangeWithInfoCallback(sessionId,
320 inputDeviceChangeCallback_);
321 CHECK_AND_RETURN_RET_LOG(ret == SUCCESS, ret, "Register failed");
322
323 return SUCCESS;
324 }
325
InitAudioStream(const AudioStreamParams &audioStreamParams)326 int32_t AudioCapturerPrivate::InitAudioStream(const AudioStreamParams &audioStreamParams)
327 {
328 Trace trace("AudioCapturer::InitAudioStream");
329 const AudioCapturer *capturer = this;
330 capturerProxyObj_->SaveCapturerObj(capturer);
331
332 audioStream_->SetCapturerInfo(capturerInfo_);
333
334 audioStream_->SetClientID(appInfo_.appPid, appInfo_.appUid, appInfo_.appTokenId, appInfo_.appFullTokenId);
335
336 if (capturerInfo_.sourceType == SOURCE_TYPE_PLAYBACK_CAPTURE) {
337 audioStream_->SetInnerCapturerState(true);
338 } else if (capturerInfo_.sourceType == SourceType::SOURCE_TYPE_WAKEUP) {
339 audioStream_->SetWakeupCapturerState(true);
340 }
341
342 audioStream_->SetCapturerSource(capturerInfo_.sourceType);
343
344 int32_t ret = audioStream_->SetAudioStreamInfo(audioStreamParams, capturerProxyObj_);
345 CHECK_AND_RETURN_RET_LOG(ret == SUCCESS, ret, "SetAudioStreamInfo failed");
346 // for inner-capturer
347 if (capturerInfo_.sourceType == SOURCE_TYPE_PLAYBACK_CAPTURE) {
348 ret = UpdatePlaybackCaptureConfig(filterConfig_);
349 CHECK_AND_RETURN_RET_LOG(ret == SUCCESS, ret, "UpdatePlaybackCaptureConfig Failed");
350 }
351 InitLatencyMeasurement(audioStreamParams);
352 InitAudioConcurrencyCallback();
353 return ret;
354 }
355
CheckSignalData(uint8_t *buffer, size_t bufferSize) const356 void AudioCapturerPrivate::CheckSignalData(uint8_t *buffer, size_t bufferSize) const
357 {
358 std::lock_guard lock(signalDetectAgentMutex_);
359 if (!latencyMeasEnabled_) {
360 return;
361 }
362 CHECK_AND_RETURN_LOG(signalDetectAgent_ != nullptr, "LatencyMeas signalDetectAgent_ is nullptr");
363 bool detected = signalDetectAgent_->CheckAudioData(buffer, bufferSize);
364 if (detected) {
365 if (capturerInfo_.capturerFlags == IAudioStream::FAST_STREAM) {
366 AUDIO_INFO_LOG("LatencyMeas fast capturer signal detected");
367 } else {
368 AUDIO_INFO_LOG("LatencyMeas normal capturer signal detected");
369 }
370 audioStream_->UpdateLatencyTimestamp(signalDetectAgent_->lastPeakBufferTime_, false);
371 }
372 }
373
InitLatencyMeasurement(const AudioStreamParams &audioStreamParams)374 void AudioCapturerPrivate::InitLatencyMeasurement(const AudioStreamParams &audioStreamParams)
375 {
376 std::lock_guard lock(signalDetectAgentMutex_);
377 latencyMeasEnabled_ = AudioLatencyMeasurement::CheckIfEnabled();
378 AUDIO_INFO_LOG("LatencyMeas enabled in capturer:%{public}d", latencyMeasEnabled_);
379 if (!latencyMeasEnabled_) {
380 return;
381 }
382 signalDetectAgent_ = std::make_shared<SignalDetectAgent>();
383 CHECK_AND_RETURN_LOG(signalDetectAgent_ != nullptr, "LatencyMeas signalDetectAgent_ is nullptr");
384 signalDetectAgent_->sampleFormat_ = audioStreamParams.format;
385 signalDetectAgent_->formatByteSize_ = GetFormatByteSize(audioStreamParams.format);
386 }
387
InitAudioInterruptCallback()388 int32_t AudioCapturerPrivate::InitAudioInterruptCallback()
389 {
390 if (audioInterrupt_.sessionId != 0) {
391 AUDIO_INFO_LOG("old session already has interrupt, need to reset");
392 (void)AudioPolicyManager::GetInstance().DeactivateAudioInterrupt(audioInterrupt_);
393 (void)AudioPolicyManager::GetInstance().UnsetAudioInterruptCallback(audioInterrupt_.sessionId);
394 }
395
396 if (audioStream_->GetAudioSessionID(sessionID_) != 0) {
397 AUDIO_ERR_LOG("GetAudioSessionID failed for INDEPENDENT_MODE");
398 return ERR_INVALID_INDEX;
399 }
400 audioInterrupt_.sessionId = sessionID_;
401 audioInterrupt_.pid = appInfo_.appPid;
402 audioInterrupt_.audioFocusType.sourceType = capturerInfo_.sourceType;
403 if (audioInterrupt_.audioFocusType.sourceType == SOURCE_TYPE_VIRTUAL_CAPTURE) {
404 isVoiceCallCapturer_ = true;
405 audioInterrupt_.audioFocusType.sourceType = SOURCE_TYPE_VOICE_COMMUNICATION;
406 }
407 if (audioInterruptCallback_ == nullptr) {
408 audioInterruptCallback_ = std::make_shared<AudioCapturerInterruptCallbackImpl>(audioStream_);
409 CHECK_AND_RETURN_RET_LOG(audioInterruptCallback_ != nullptr, ERROR,
410 "Failed to allocate memory for audioInterruptCallback_");
411 }
412 return AudioPolicyManager::GetInstance().SetAudioInterruptCallback(sessionID_, audioInterruptCallback_,
413 appInfo_.appUid);
414 }
415
SetCapturerCallback(const std::shared_ptr<AudioCapturerCallback> &callback)416 int32_t AudioCapturerPrivate::SetCapturerCallback(const std::shared_ptr<AudioCapturerCallback> &callback)
417 {
418 std::lock_guard<std::mutex> lock(setCapturerCbMutex_);
419 // If the client is using the deprecated SetParams API. SetCapturerCallback must be invoked, after SetParams.
420 // In general, callbacks can only be set after the capturer state is PREPARED.
421 CapturerState state = GetStatus();
422 CHECK_AND_RETURN_RET_LOG(state != CAPTURER_NEW && state != CAPTURER_RELEASED, ERR_ILLEGAL_STATE,
423 "SetCapturerCallback ncorrect state:%{public}d to register cb", state);
424 CHECK_AND_RETURN_RET_LOG(callback != nullptr, ERR_INVALID_PARAM,
425 "SetCapturerCallback callback param is null");
426
427 // Save reference for interrupt callback
428 CHECK_AND_RETURN_RET_LOG(audioInterruptCallback_ != nullptr, ERROR,
429 "SetCapturerCallback audioInterruptCallback_ == nullptr");
430 std::shared_ptr<AudioCapturerInterruptCallbackImpl> cbInterrupt =
431 std::static_pointer_cast<AudioCapturerInterruptCallbackImpl>(audioInterruptCallback_);
432 cbInterrupt->SaveCallback(callback);
433
434 // Save and Set reference for stream callback. Order is important here.
435 if (audioStreamCallback_ == nullptr) {
436 audioStreamCallback_ = std::make_shared<AudioStreamCallbackCapturer>();
437 CHECK_AND_RETURN_RET_LOG(audioStreamCallback_ != nullptr, ERROR,
438 "Failed to allocate memory for audioStreamCallback_");
439 }
440 std::shared_ptr<AudioStreamCallbackCapturer> cbStream =
441 std::static_pointer_cast<AudioStreamCallbackCapturer>(audioStreamCallback_);
442 cbStream->SaveCallback(callback);
443 (void)audioStream_->SetStreamCallback(audioStreamCallback_);
444
445 return SUCCESS;
446 }
447
GetParams(AudioCapturerParams ¶ms) const448 int32_t AudioCapturerPrivate::GetParams(AudioCapturerParams ¶ms) const
449 {
450 AudioStreamParams audioStreamParams;
451 int32_t result = audioStream_->GetAudioStreamInfo(audioStreamParams);
452 if (SUCCESS == result) {
453 params.audioSampleFormat = static_cast<AudioSampleFormat>(audioStreamParams.format);
454 params.samplingRate = static_cast<AudioSamplingRate>(audioStreamParams.samplingRate);
455 params.audioChannel = static_cast<AudioChannel>(audioStreamParams.channels);
456 params.audioEncoding = static_cast<AudioEncodingType>(audioStreamParams.encoding);
457 }
458
459 return result;
460 }
461
GetCapturerInfo(AudioCapturerInfo &capturerInfo) const462 int32_t AudioCapturerPrivate::GetCapturerInfo(AudioCapturerInfo &capturerInfo) const
463 {
464 capturerInfo = capturerInfo_;
465
466 return SUCCESS;
467 }
468
GetStreamInfo(AudioStreamInfo &streamInfo) const469 int32_t AudioCapturerPrivate::GetStreamInfo(AudioStreamInfo &streamInfo) const
470 {
471 AudioStreamParams audioStreamParams;
472 int32_t result = audioStream_->GetAudioStreamInfo(audioStreamParams);
473 if (SUCCESS == result) {
474 streamInfo.format = static_cast<AudioSampleFormat>(audioStreamParams.format);
475 streamInfo.samplingRate = static_cast<AudioSamplingRate>(audioStreamParams.samplingRate);
476 if (this->isChannelChange_) {
477 streamInfo.channels = AudioChannel::CHANNEL_3;
478 } else {
479 streamInfo.channels = static_cast<AudioChannel>(audioStreamParams.channels);
480 }
481 streamInfo.encoding = static_cast<AudioEncodingType>(audioStreamParams.encoding);
482 }
483
484 return result;
485 }
486
SetCapturerPositionCallback(int64_t markPosition, const std::shared_ptr<CapturerPositionCallback> &callback)487 int32_t AudioCapturerPrivate::SetCapturerPositionCallback(int64_t markPosition,
488 const std::shared_ptr<CapturerPositionCallback> &callback)
489 {
490 CHECK_AND_RETURN_RET_LOG((callback != nullptr) && (markPosition > 0), ERR_INVALID_PARAM,
491 "input param is invalid");
492
493 audioStream_->SetCapturerPositionCallback(markPosition, callback);
494
495 return SUCCESS;
496 }
497
UnsetCapturerPositionCallback()498 void AudioCapturerPrivate::UnsetCapturerPositionCallback()
499 {
500 audioStream_->UnsetCapturerPositionCallback();
501 }
502
SetCapturerPeriodPositionCallback(int64_t frameNumber, const std::shared_ptr<CapturerPeriodPositionCallback> &callback)503 int32_t AudioCapturerPrivate::SetCapturerPeriodPositionCallback(int64_t frameNumber,
504 const std::shared_ptr<CapturerPeriodPositionCallback> &callback)
505 {
506 CHECK_AND_RETURN_RET_LOG((callback != nullptr) && (frameNumber > 0), ERR_INVALID_PARAM,
507 "input param is invalid");
508
509 audioStream_->SetCapturerPeriodPositionCallback(frameNumber, callback);
510
511 return SUCCESS;
512 }
513
UnsetCapturerPeriodPositionCallback()514 void AudioCapturerPrivate::UnsetCapturerPeriodPositionCallback()
515 {
516 audioStream_->UnsetCapturerPeriodPositionCallback();
517 }
518
Start() const519 bool AudioCapturerPrivate::Start() const
520 {
521 std::lock_guard lock(switchStreamMutex_);
522 Trace trace("AudioCapturer::Start");
523 AUDIO_INFO_LOG("StreamClientState for Capturer::Start. id %{public}u, sourceType: %{public}d",
524 sessionID_, audioInterrupt_.audioFocusType.sourceType);
525
526 CapturerState state = GetStatus();
527 CHECK_AND_RETURN_RET_LOG((state == CAPTURER_PREPARED) || (state == CAPTURER_STOPPED) || (state == CAPTURER_PAUSED),
528 false, "Start failed. Illegal state %{public}u.", state);
529
530 CHECK_AND_RETURN_RET_LOG(!isSwitching_, false, "Operation failed, in switching");
531
532 CHECK_AND_RETURN_RET(audioInterrupt_.audioFocusType.sourceType != SOURCE_TYPE_INVALID &&
533 audioInterrupt_.sessionId != INVALID_SESSION_ID, false);
534
535 int32_t ret = AudioPolicyManager::GetInstance().ActivateAudioInterrupt(audioInterrupt_);
536 CHECK_AND_RETURN_RET_LOG(ret == 0, false, "ActivateAudioInterrupt Failed");
537
538 // When the cellular call stream is starting, only need to activate audio interrupt.
539 CHECK_AND_RETURN_RET(!isVoiceCallCapturer_, true);
540
541 bool result = audioStream_->StartAudioStream();
542 if (!result) {
543 AUDIO_ERR_LOG("Start audio stream failed");
544 ret = AudioPolicyManager::GetInstance().DeactivateAudioInterrupt(audioInterrupt_);
545 if (ret != 0) {
546 AUDIO_WARNING_LOG("DeactivateAudioInterrupt Failed");
547 }
548 }
549
550 return result;
551 }
552
Read(uint8_t &buffer, size_t userSize, bool isBlockingRead) const553 int32_t AudioCapturerPrivate::Read(uint8_t &buffer, size_t userSize, bool isBlockingRead) const
554 {
555 Trace trace("AudioCapturer::Read");
556 CheckSignalData(&buffer, userSize);
557 int size = audioStream_->Read(buffer, userSize, isBlockingRead);
558 if (size > 0) {
559 DumpFileUtil::WriteDumpFile(dumpFile_, static_cast<void *>(&buffer), size);
560 }
561 return size;
562 }
563
GetStatus() const564 CapturerState AudioCapturerPrivate::GetStatus() const
565 {
566 return (CapturerState)audioStream_->GetState();
567 }
568
GetAudioTime(Timestamp ×tamp, Timestamp::Timestampbase base) const569 bool AudioCapturerPrivate::GetAudioTime(Timestamp ×tamp, Timestamp::Timestampbase base) const
570 {
571 return audioStream_->GetAudioTime(timestamp, base);
572 }
573
Pause() const574 bool AudioCapturerPrivate::Pause() const
575 {
576 std::lock_guard lock(switchStreamMutex_);
577 Trace trace("AudioCapturer::Pause");
578 AUDIO_INFO_LOG("StreamClientState for Capturer::Pause. id %{public}u", sessionID_);
579 CHECK_AND_RETURN_RET_LOG(!isSwitching_, false, "Operation failed, in switching");
580
581 // When user is intentionally pausing , Deactivate to remove from audio focus info list
582 int32_t ret = AudioPolicyManager::GetInstance().DeactivateAudioInterrupt(audioInterrupt_);
583 if (ret != 0) {
584 AUDIO_WARNING_LOG("AudioRenderer: DeactivateAudioInterrupt Failed");
585 }
586
587 // When the cellular call stream is pausing, only need to deactivate audio interrupt.
588 CHECK_AND_RETURN_RET(!isVoiceCallCapturer_, true);
589 return audioStream_->PauseAudioStream();
590 }
591
Stop() const592 bool AudioCapturerPrivate::Stop() const
593 {
594 std::lock_guard lock(switchStreamMutex_);
595 Trace trace("AudioCapturer::Stop");
596 AUDIO_INFO_LOG("StreamClientState for Capturer::Stop. id %{public}u", sessionID_);
597 CHECK_AND_RETURN_RET_LOG(!isSwitching_, false, "Operation failed, in switching");
598
599 WriteOverflowEvent();
600 int32_t ret = AudioPolicyManager::GetInstance().DeactivateAudioInterrupt(audioInterrupt_);
601 if (ret != 0) {
602 AUDIO_WARNING_LOG("AudioCapturer: DeactivateAudioInterrupt Failed");
603 }
604
605 CHECK_AND_RETURN_RET(isVoiceCallCapturer_ != true, true);
606
607 return audioStream_->StopAudioStream();
608 }
609
Flush() const610 bool AudioCapturerPrivate::Flush() const
611 {
612 Trace trace("AudioCapturer::Flush");
613 AUDIO_INFO_LOG("StreamClientState for Capturer::Flush. id %{public}u", sessionID_);
614 return audioStream_->FlushAudioStream();
615 }
616
Release()617 bool AudioCapturerPrivate::Release()
618 {
619 AUDIO_INFO_LOG("StreamClientState for Capturer::Release. id %{public}u", sessionID_);
620 std::lock_guard<std::mutex> lockCapture(captureMutex_);
621
622 abortRestore_ = true;
623 std::lock_guard<std::mutex> lock(lock_);
624 CHECK_AND_RETURN_RET_LOG(isValid_, false, "Release when capturer invalid");
625
626 (void)AudioPolicyManager::GetInstance().DeactivateAudioInterrupt(audioInterrupt_);
627
628 // Unregister the callaback in policy server
629 (void)AudioPolicyManager::GetInstance().UnsetAudioInterruptCallback(sessionID_);
630
631 std::shared_ptr<AudioCapturerConcurrencyCallbackImpl> cb = audioConcurrencyCallback_;
632 if (cb != nullptr) {
633 cb->UnsetAudioCapturerObj();
634 AudioPolicyManager::GetInstance().UnsetAudioConcurrencyCallback(sessionID_);
635 }
636
637 RemoveCapturerPolicyServiceDiedCallback();
638
639 return audioStream_->ReleaseAudioStream();
640 }
641
GetBufferSize(size_t &bufferSize) const642 int32_t AudioCapturerPrivate::GetBufferSize(size_t &bufferSize) const
643 {
644 Trace trace("AudioCapturer::GetBufferSize");
645 return audioStream_->GetBufferSize(bufferSize);
646 }
647
GetAudioStreamId(uint32_t &sessionID) const648 int32_t AudioCapturerPrivate::GetAudioStreamId(uint32_t &sessionID) const
649 {
650 return audioStream_->GetAudioSessionID(sessionID);
651 }
652
SetBufferDuration(uint64_t bufferDuration) const653 int32_t AudioCapturerPrivate::SetBufferDuration(uint64_t bufferDuration) const
654 {
655 CHECK_AND_RETURN_RET_LOG(bufferDuration >= MINIMUM_BUFFER_SIZE_MSEC && bufferDuration <= MAXIMUM_BUFFER_SIZE_MSEC,
656 ERR_INVALID_PARAM, "Error: Please set the buffer duration between 5ms ~ 20ms");
657 return audioStream_->SetBufferSizeInMsec(bufferDuration);
658 }
659
AudioCapturerInterruptCallbackImpl(const std::shared_ptr<IAudioStream> &audioStream)660 AudioCapturerInterruptCallbackImpl::AudioCapturerInterruptCallbackImpl(const std::shared_ptr<IAudioStream> &audioStream)
661 : audioStream_(audioStream)
662 {
663 AUDIO_DEBUG_LOG("AudioCapturerInterruptCallbackImpl constructor");
664 }
665
~AudioCapturerInterruptCallbackImpl()666 AudioCapturerInterruptCallbackImpl::~AudioCapturerInterruptCallbackImpl()
667 {
668 AUDIO_DEBUG_LOG("AudioCapturerInterruptCallbackImpl: instance destroy");
669 }
670
SaveCallback(const std::weak_ptr<AudioCapturerCallback> &callback)671 void AudioCapturerInterruptCallbackImpl::SaveCallback(const std::weak_ptr<AudioCapturerCallback> &callback)
672 {
673 callback_ = callback;
674 }
675
UpdateAudioStream(const std::shared_ptr<IAudioStream> &audioStream)676 void AudioCapturerInterruptCallbackImpl::UpdateAudioStream(const std::shared_ptr<IAudioStream> &audioStream)
677 {
678 std::lock_guard<std::mutex> lock(mutex_);
679 audioStream_ = audioStream;
680 }
681
NotifyEvent(const InterruptEvent &interruptEvent)682 void AudioCapturerInterruptCallbackImpl::NotifyEvent(const InterruptEvent &interruptEvent)
683 {
684 AUDIO_INFO_LOG("NotifyEvent: Hint: %{public}d, eventType: %{public}d",
685 interruptEvent.hintType, interruptEvent.eventType);
686
687 if (cb_ != nullptr) {
688 cb_->OnInterrupt(interruptEvent);
689 AUDIO_DEBUG_LOG("OnInterrupt : NotifyEvent to app complete");
690 } else {
691 AUDIO_DEBUG_LOG("cb_ == nullptr cannont NotifyEvent to app");
692 }
693 }
694
NotifyForcePausedToResume(const InterruptEventInternal &interruptEvent)695 void AudioCapturerInterruptCallbackImpl::NotifyForcePausedToResume(const InterruptEventInternal &interruptEvent)
696 {
697 // Change InterruptForceType to Share, Since app will take care of resuming
698 InterruptEvent interruptEventResume {interruptEvent.eventType, INTERRUPT_SHARE,
699 interruptEvent.hintType};
700 NotifyEvent(interruptEventResume);
701 }
702
HandleAndNotifyForcedEvent(const InterruptEventInternal &interruptEvent)703 void AudioCapturerInterruptCallbackImpl::HandleAndNotifyForcedEvent(const InterruptEventInternal &interruptEvent)
704 {
705 State currentState = audioStream_->GetState();
706 switch (interruptEvent.hintType) {
707 case INTERRUPT_HINT_RESUME:
708 CHECK_AND_RETURN_LOG((currentState == PAUSED || currentState == PREPARED) && isForcePaused_ == true,
709 "OnInterrupt state %{public}d or not forced pause %{public}d before", currentState, isForcePaused_);
710 AUDIO_INFO_LOG("set force pause false");
711 isForcePaused_ = false;
712 NotifyForcePausedToResume(interruptEvent);
713 return;
714 case INTERRUPT_HINT_PAUSE:
715 CHECK_AND_RETURN_LOG(currentState == RUNNING || currentState == PREPARED,
716 "OnInterrupt state %{public}d, no need to pause", currentState);
717 (void)audioStream_->PauseAudioStream(); // Just Pause, do not deactivate here
718 AUDIO_INFO_LOG("set force pause true");
719 isForcePaused_ = true;
720 break;
721 case INTERRUPT_HINT_STOP:
722 (void)audioStream_->StopAudioStream();
723 break;
724 default:
725 break;
726 }
727 // Notify valid forced event callbacks to app
728 InterruptEvent interruptEventForced {interruptEvent.eventType, interruptEvent.forceType, interruptEvent.hintType};
729 NotifyEvent(interruptEventForced);
730 }
731
OnInterrupt(const InterruptEventInternal &interruptEvent)732 void AudioCapturerInterruptCallbackImpl::OnInterrupt(const InterruptEventInternal &interruptEvent)
733 {
734 std::lock_guard<std::mutex> lock(mutex_);
735
736 cb_ = callback_.lock();
737 InterruptForceType forceType = interruptEvent.forceType;
738 AUDIO_INFO_LOG("InterruptForceType: %{public}d", forceType);
739
740 if (forceType != INTERRUPT_FORCE) { // INTERRUPT_SHARE
741 AUDIO_DEBUG_LOG("AudioCapturerPrivate ForceType: INTERRUPT_SHARE. Let app handle the event");
742 InterruptEvent interruptEventShared {interruptEvent.eventType, interruptEvent.forceType,
743 interruptEvent.hintType};
744 NotifyEvent(interruptEventShared);
745 return;
746 }
747
748 CHECK_AND_RETURN_LOG(audioStream_ != nullptr,
749 "Stream is not alive. No need to take forced action");
750
751 HandleAndNotifyForcedEvent(interruptEvent);
752 }
753
SaveCallback(const std::weak_ptr<AudioCapturerCallback> &callback)754 void AudioStreamCallbackCapturer::SaveCallback(const std::weak_ptr<AudioCapturerCallback> &callback)
755 {
756 callback_ = callback;
757 }
758
OnStateChange(const State state, const StateChangeCmdType __attribute__((unused)) cmdType)759 void AudioStreamCallbackCapturer::OnStateChange(const State state,
760 const StateChangeCmdType __attribute__((unused)) cmdType)
761 {
762 std::shared_ptr<AudioCapturerCallback> cb = callback_.lock();
763
764 CHECK_AND_RETURN_LOG(cb != nullptr, "AudioStreamCallbackCapturer::OnStateChange cb == nullptr.");
765
766 cb->OnStateChange(static_cast<CapturerState>(state));
767 }
768
GetSupportedFormats()769 std::vector<AudioSampleFormat> AudioCapturer::GetSupportedFormats()
770 {
771 return AUDIO_SUPPORTED_FORMATS;
772 }
773
GetSupportedChannels()774 std::vector<AudioChannel> AudioCapturer::GetSupportedChannels()
775 {
776 return CAPTURER_SUPPORTED_CHANNELS;
777 }
778
GetSupportedEncodingTypes()779 std::vector<AudioEncodingType> AudioCapturer::GetSupportedEncodingTypes()
780 {
781 return AUDIO_SUPPORTED_ENCODING_TYPES;
782 }
783
GetSupportedSamplingRates()784 std::vector<AudioSamplingRate> AudioCapturer::GetSupportedSamplingRates()
785 {
786 return AUDIO_SUPPORTED_SAMPLING_RATES;
787 }
788
FindStreamTypeBySourceType(SourceType sourceType)789 AudioStreamType AudioCapturer::FindStreamTypeBySourceType(SourceType sourceType)
790 {
791 switch (sourceType) {
792 case SOURCE_TYPE_VOICE_COMMUNICATION:
793 case SOURCE_TYPE_VIRTUAL_CAPTURE:
794 return STREAM_VOICE_CALL;
795 case SOURCE_TYPE_WAKEUP:
796 return STREAM_WAKEUP;
797 case SOURCE_TYPE_VOICE_CALL:
798 return STREAM_SOURCE_VOICE_CALL;
799 case SOURCE_TYPE_CAMCORDER:
800 return STREAM_CAMCORDER;
801 default:
802 return STREAM_MUSIC;
803 }
804 }
805
SetAudioSourceConcurrency(const std::vector<SourceType> &targetSources)806 int32_t AudioCapturerPrivate::SetAudioSourceConcurrency(const std::vector<SourceType> &targetSources)
807 {
808 if (targetSources.size() <= 0) {
809 AUDIO_ERR_LOG("TargetSources size is 0, set audio source concurrency failed.");
810 return ERR_INVALID_PARAM;
811 }
812 AUDIO_INFO_LOG("Set audio source concurrency success.");
813 audioInterrupt_.currencySources.sourcesTypes = targetSources;
814 return SUCCESS;
815 }
816
SetCaptureMode(AudioCaptureMode captureMode)817 int32_t AudioCapturerPrivate::SetCaptureMode(AudioCaptureMode captureMode)
818 {
819 AUDIO_INFO_LOG("Capture mode: %{public}d", captureMode);
820 audioCaptureMode_ = captureMode;
821
822 if (capturerInfo_.sourceType == SOURCE_TYPE_VOICE_COMMUNICATION && captureMode == CAPTURE_MODE_CALLBACK &&
823 AudioPolicyManager::GetInstance().GetPreferredInputStreamType(capturerInfo_) == AUDIO_FLAG_VOIP_FAST) {
824 AUDIO_INFO_LOG("Switch to fast voip stream");
825 uint32_t sessionId = 0;
826 int32_t ret = audioStream_->GetAudioSessionID(sessionId);
827 CHECK_AND_RETURN_RET_LOG(ret == SUCCESS, ret, "Get audio session Id failed");
828 uint32_t newSessionId = 0;
829 if (!SwitchToTargetStream(IAudioStream::VOIP_STREAM, newSessionId)) {
830 AUDIO_ERR_LOG("Switch to target stream failed");
831 return ERROR;
832 }
833 ret = AudioPolicyManager::GetInstance().RegisterDeviceChangeWithInfoCallback(newSessionId,
834 inputDeviceChangeCallback_);
835 CHECK_AND_RETURN_RET_LOG(ret == SUCCESS, ret, "Register device change callback for new session failed");
836 ret = AudioPolicyManager::GetInstance().UnregisterDeviceChangeWithInfoCallback(sessionId);
837 CHECK_AND_RETURN_RET_LOG(ret == SUCCESS, ret, "Unregister device change callback for old session failed");
838 }
839
840 return audioStream_->SetCaptureMode(captureMode);
841 }
842
GetCaptureMode() const843 AudioCaptureMode AudioCapturerPrivate::GetCaptureMode() const
844 {
845 return audioStream_->GetCaptureMode();
846 }
847
SetCapturerReadCallback(const std::shared_ptr<AudioCapturerReadCallback> &callback)848 int32_t AudioCapturerPrivate::SetCapturerReadCallback(const std::shared_ptr<AudioCapturerReadCallback> &callback)
849 {
850 return audioStream_->SetCapturerReadCallback(callback);
851 }
852
GetBufferDesc(BufferDesc &bufDesc) const853 int32_t AudioCapturerPrivate::GetBufferDesc(BufferDesc &bufDesc) const
854 {
855 int32_t ret = audioStream_->GetBufferDesc(bufDesc);
856 DumpFileUtil::WriteDumpFile(dumpFile_, static_cast<void *>(bufDesc.buffer), bufDesc.bufLength);
857 return ret;
858 }
859
Enqueue(const BufferDesc &bufDesc) const860 int32_t AudioCapturerPrivate::Enqueue(const BufferDesc &bufDesc) const
861 {
862 CheckSignalData(bufDesc.buffer, bufDesc.bufLength);
863 return audioStream_->Enqueue(bufDesc);
864 }
865
Clear() const866 int32_t AudioCapturerPrivate::Clear() const
867 {
868 return audioStream_->Clear();
869 }
870
GetBufQueueState(BufferQueueState &bufState) const871 int32_t AudioCapturerPrivate::GetBufQueueState(BufferQueueState &bufState) const
872 {
873 return audioStream_->GetBufQueueState(bufState);
874 }
875
SetValid(bool valid)876 void AudioCapturerPrivate::SetValid(bool valid)
877 {
878 std::lock_guard<std::mutex> lock(lock_);
879 isValid_ = valid;
880 }
881
GetFramesRead() const882 int64_t AudioCapturerPrivate::GetFramesRead() const
883 {
884 return audioStream_->GetFramesRead();
885 }
886
GetCurrentInputDevices(DeviceInfo &deviceInfo) const887 int32_t AudioCapturerPrivate::GetCurrentInputDevices(DeviceInfo &deviceInfo) const
888 {
889 std::vector<std::shared_ptr<AudioCapturerChangeInfo>> audioCapturerChangeInfos;
890 uint32_t sessionId = static_cast<uint32_t>(-1);
891 int32_t ret = GetAudioStreamId(sessionId);
892 CHECK_AND_RETURN_RET_LOG(!ret, ret, "Get sessionId failed");
893
894 ret = AudioPolicyManager::GetInstance().GetCurrentCapturerChangeInfos(audioCapturerChangeInfos);
895 CHECK_AND_RETURN_RET_LOG(!ret, ret, "Get current capturer devices failed");
896
897 for (auto it = audioCapturerChangeInfos.begin(); it != audioCapturerChangeInfos.end(); it++) {
898 if ((*it)->sessionId == static_cast<int32_t>(sessionId)) {
899 deviceInfo = (*it)->inputDeviceInfo;
900 }
901 }
902 return SUCCESS;
903 }
904
GetCurrentCapturerChangeInfo(AudioCapturerChangeInfo &changeInfo) const905 int32_t AudioCapturerPrivate::GetCurrentCapturerChangeInfo(AudioCapturerChangeInfo &changeInfo) const
906 {
907 std::vector<std::shared_ptr<AudioCapturerChangeInfo>> audioCapturerChangeInfos;
908 uint32_t sessionId = static_cast<uint32_t>(-1);
909 int32_t ret = GetAudioStreamId(sessionId);
910 CHECK_AND_RETURN_RET_LOG(!ret, ret, "Get sessionId failed");
911
912 ret = AudioPolicyManager::GetInstance().GetCurrentCapturerChangeInfos(audioCapturerChangeInfos);
913 CHECK_AND_RETURN_RET_LOG(!ret, ret, "Get current capturer devices failed");
914
915 for (auto it = audioCapturerChangeInfos.begin(); it != audioCapturerChangeInfos.end(); it++) {
916 if ((*it)->sessionId == static_cast<int32_t>(sessionId)) {
917 changeInfo = *(*it);
918 }
919 }
920 return SUCCESS;
921 }
922
GetCurrentMicrophones() const923 std::vector<sptr<MicrophoneDescriptor>> AudioCapturerPrivate::GetCurrentMicrophones() const
924 {
925 uint32_t sessionId = static_cast<uint32_t>(-1);
926 GetAudioStreamId(sessionId);
927 return AudioPolicyManager::GetInstance().GetAudioCapturerMicrophoneDescriptors(sessionId);
928 }
929
SetAudioCapturerDeviceChangeCallback( const std::shared_ptr<AudioCapturerDeviceChangeCallback> &callback)930 int32_t AudioCapturerPrivate::SetAudioCapturerDeviceChangeCallback(
931 const std::shared_ptr<AudioCapturerDeviceChangeCallback> &callback)
932 {
933 CHECK_AND_RETURN_RET_LOG(callback != nullptr, ERROR, "Callback is null");
934
935 if (RegisterAudioCapturerEventListener() != SUCCESS) {
936 return ERROR;
937 }
938
939 CHECK_AND_RETURN_RET_LOG(audioStateChangeCallback_ != nullptr, ERROR, "audioStateChangeCallback_ is null");
940 audioStateChangeCallback_->SaveDeviceChangeCallback(callback);
941 return SUCCESS;
942 }
943
RemoveAudioCapturerDeviceChangeCallback( const std::shared_ptr<AudioCapturerDeviceChangeCallback> &callback)944 int32_t AudioCapturerPrivate::RemoveAudioCapturerDeviceChangeCallback(
945 const std::shared_ptr<AudioCapturerDeviceChangeCallback> &callback)
946 {
947 CHECK_AND_RETURN_RET_LOG(audioStateChangeCallback_ != nullptr, ERROR, "audioStateChangeCallback_ is null");
948
949 audioStateChangeCallback_->RemoveDeviceChangeCallback(callback);
950 if (UnregisterAudioCapturerEventListener() != SUCCESS) {
951 return ERROR;
952 }
953 return SUCCESS;
954 }
955
IsDeviceChanged(DeviceInfo &newDeviceInfo)956 bool AudioCapturerPrivate::IsDeviceChanged(DeviceInfo &newDeviceInfo)
957 {
958 bool deviceUpdated = false;
959 DeviceInfo deviceInfo = {};
960
961 CHECK_AND_RETURN_RET_LOG(GetCurrentInputDevices(deviceInfo) == SUCCESS, deviceUpdated,
962 "GetCurrentInputDevices failed");
963
964 if (currentDeviceInfo_.deviceType != deviceInfo.deviceType) {
965 currentDeviceInfo_ = deviceInfo;
966 newDeviceInfo = currentDeviceInfo_;
967 deviceUpdated = true;
968 }
969 return deviceUpdated;
970 }
971
GetAudioInterrupt(AudioInterrupt &audioInterrupt)972 void AudioCapturerPrivate::GetAudioInterrupt(AudioInterrupt &audioInterrupt)
973 {
974 audioInterrupt = audioInterrupt_;
975 }
976
WriteOverflowEvent() const977 void AudioCapturerPrivate::WriteOverflowEvent() const
978 {
979 AUDIO_INFO_LOG("Write overflowEvent to media monitor");
980 if (GetOverflowCount() < WRITE_OVERFLOW_NUM) {
981 return;
982 }
983 AudioPipeType pipeType = PIPE_TYPE_NORMAL_IN;
984 IAudioStream::StreamClass streamClass = audioStream_->GetStreamClass();
985 if (streamClass == IAudioStream::FAST_STREAM) {
986 pipeType = PIPE_TYPE_LOWLATENCY_IN;
987 }
988 std::shared_ptr<Media::MediaMonitor::EventBean> bean = std::make_shared<Media::MediaMonitor::EventBean>(
989 Media::MediaMonitor::ModuleId::AUDIO, Media::MediaMonitor::EventId::PERFORMANCE_UNDER_OVERRUN_STATS,
990 Media::MediaMonitor::EventType::FREQUENCY_AGGREGATION_EVENT);
991 bean->Add("IS_PLAYBACK", 0);
992 bean->Add("CLIENT_UID", appInfo_.appUid);
993 bean->Add("PIPE_TYPE", pipeType);
994 bean->Add("STREAM_TYPE", capturerInfo_.sourceType);
995 Media::MediaMonitor::MediaMonitorManager::GetInstance().WriteLogMsg(bean);
996 }
997
RegisterAudioCapturerEventListener()998 int32_t AudioCapturerPrivate::RegisterAudioCapturerEventListener()
999 {
1000 if (!audioStateChangeCallback_) {
1001 audioStateChangeCallback_ = std::make_shared<AudioCapturerStateChangeCallbackImpl>();
1002 CHECK_AND_RETURN_RET_LOG(audioStateChangeCallback_, ERROR, "Memory allocation failed!!");
1003
1004 int32_t ret =
1005 AudioPolicyManager::GetInstance().RegisterAudioCapturerEventListener(getpid(), audioStateChangeCallback_);
1006 CHECK_AND_RETURN_RET_LOG(ret == 0, ERROR, "RegisterAudioCapturerEventListener failed");
1007 audioStateChangeCallback_->setAudioCapturerObj(this);
1008 }
1009 return SUCCESS;
1010 }
1011
UnregisterAudioCapturerEventListener()1012 int32_t AudioCapturerPrivate::UnregisterAudioCapturerEventListener()
1013 {
1014 CHECK_AND_RETURN_RET_LOG(audioStateChangeCallback_ != nullptr, ERROR, "audioStateChangeCallback_ is null");
1015 if (audioStateChangeCallback_->DeviceChangeCallbackArraySize() == 0 &&
1016 audioStateChangeCallback_->GetCapturerInfoChangeCallbackArraySize() == 0) {
1017 int32_t ret =
1018 AudioPolicyManager::GetInstance().UnregisterAudioCapturerEventListener(getpid());
1019 CHECK_AND_RETURN_RET_LOG(ret == 0, ERROR, "failed");
1020 audioStateChangeCallback_->HandleCapturerDestructor();
1021 audioStateChangeCallback_ = nullptr;
1022 }
1023 return SUCCESS;
1024 }
1025
SetAudioCapturerInfoChangeCallback( const std::shared_ptr<AudioCapturerInfoChangeCallback> &callback)1026 int32_t AudioCapturerPrivate::SetAudioCapturerInfoChangeCallback(
1027 const std::shared_ptr<AudioCapturerInfoChangeCallback> &callback)
1028 {
1029 CHECK_AND_RETURN_RET_LOG(callback != nullptr, ERR_INVALID_PARAM, "Callback is null");
1030
1031 CHECK_AND_RETURN_RET(RegisterAudioCapturerEventListener() == SUCCESS, ERROR);
1032
1033 CHECK_AND_RETURN_RET_LOG(audioStateChangeCallback_ != nullptr, ERROR, "audioStateChangeCallback_ is null");
1034 audioStateChangeCallback_->SaveCapturerInfoChangeCallback(callback);
1035 return SUCCESS;
1036 }
1037
RemoveAudioCapturerInfoChangeCallback( const std::shared_ptr<AudioCapturerInfoChangeCallback> &callback)1038 int32_t AudioCapturerPrivate::RemoveAudioCapturerInfoChangeCallback(
1039 const std::shared_ptr<AudioCapturerInfoChangeCallback> &callback)
1040 {
1041 CHECK_AND_RETURN_RET_LOG(audioStateChangeCallback_ != nullptr, ERROR, "audioStateChangeCallback_ is null");
1042 audioStateChangeCallback_->RemoveCapturerInfoChangeCallback(callback);
1043 CHECK_AND_RETURN_RET(UnregisterAudioCapturerEventListener() == SUCCESS, ERROR);
1044 return SUCCESS;
1045 }
1046
RegisterCapturerPolicyServiceDiedCallback()1047 int32_t AudioCapturerPrivate::RegisterCapturerPolicyServiceDiedCallback()
1048 {
1049 AUDIO_DEBUG_LOG("AudioCapturerPrivate::SetCapturerPolicyServiceDiedCallback");
1050 if (!audioPolicyServiceDiedCallback_) {
1051 audioPolicyServiceDiedCallback_ = std::make_shared<CapturerPolicyServiceDiedCallback>();
1052 if (!audioPolicyServiceDiedCallback_) {
1053 AUDIO_ERR_LOG("Memory allocation failed!!");
1054 return ERROR;
1055 }
1056 AudioPolicyManager::GetInstance().RegisterAudioStreamPolicyServerDiedCb(audioPolicyServiceDiedCallback_);
1057 audioPolicyServiceDiedCallback_->SetAudioCapturerObj(this);
1058 audioPolicyServiceDiedCallback_->SetAudioInterrupt(audioInterrupt_);
1059 }
1060 return SUCCESS;
1061 }
1062
RemoveCapturerPolicyServiceDiedCallback()1063 int32_t AudioCapturerPrivate::RemoveCapturerPolicyServiceDiedCallback()
1064 {
1065 AUDIO_DEBUG_LOG("AudioCapturerPrivate::RemoveCapturerPolicyServiceDiedCallback");
1066 if (audioPolicyServiceDiedCallback_) {
1067 int32_t ret = AudioPolicyManager::GetInstance().UnregisterAudioStreamPolicyServerDiedCb(
1068 audioPolicyServiceDiedCallback_);
1069 if (ret != 0) {
1070 AUDIO_ERR_LOG("RemoveCapturerPolicyServiceDiedCallback failed");
1071 audioPolicyServiceDiedCallback_ = nullptr;
1072 return ERROR;
1073 }
1074 }
1075 audioPolicyServiceDiedCallback_ = nullptr;
1076 return SUCCESS;
1077 }
1078
GetOverflowCount() const1079 uint32_t AudioCapturerPrivate::GetOverflowCount() const
1080 {
1081 return audioStream_->GetOverflowCount();
1082 }
1083
SetSwitchInfo(IAudioStream::SwitchInfo info, std::shared_ptr<IAudioStream> audioStream)1084 void AudioCapturerPrivate::SetSwitchInfo(IAudioStream::SwitchInfo info, std::shared_ptr<IAudioStream> audioStream)
1085 {
1086 CHECK_AND_RETURN_LOG(audioStream, "stream is nullptr");
1087
1088 audioStream->SetStreamTrackerState(false);
1089 audioStream->SetClientID(info.clientPid, info.clientUid, appInfo_.appTokenId, appInfo_.appFullTokenId);
1090 audioStream->SetCapturerInfo(info.capturerInfo);
1091 audioStream->SetAudioStreamInfo(info.params, capturerProxyObj_);
1092 audioStream->SetCaptureMode(info.captureMode);
1093
1094 // set callback
1095 if ((info.renderPositionCb != nullptr) && (info.frameMarkPosition > 0)) {
1096 audioStream->SetRendererPositionCallback(info.frameMarkPosition, info.renderPositionCb);
1097 }
1098
1099 if ((info.capturePositionCb != nullptr) && (info.frameMarkPosition > 0)) {
1100 audioStream->SetCapturerPositionCallback(info.frameMarkPosition, info.capturePositionCb);
1101 }
1102
1103 if ((info.renderPeriodPositionCb != nullptr) && (info.framePeriodNumber > 0)) {
1104 audioStream->SetRendererPeriodPositionCallback(info.framePeriodNumber, info.renderPeriodPositionCb);
1105 }
1106
1107 if ((info.capturePeriodPositionCb != nullptr) && (info.framePeriodNumber > 0)) {
1108 audioStream->SetCapturerPeriodPositionCallback(info.framePeriodNumber, info.capturePeriodPositionCb);
1109 }
1110
1111 audioStream->SetCapturerReadCallback(info.capturerReadCallback);
1112
1113 audioStream->SetStreamCallback(info.audioStreamCallback);
1114 }
1115
SwitchToTargetStream(IAudioStream::StreamClass targetClass, uint32_t &newSessionId)1116 bool AudioCapturerPrivate::SwitchToTargetStream(IAudioStream::StreamClass targetClass, uint32_t &newSessionId)
1117 {
1118 bool switchResult = false;
1119 if (audioStream_) {
1120 Trace trace("SwitchToTargetStream");
1121 std::lock_guard<std::mutex> lockCapture(captureMutex_);
1122 isSwitching_ = true;
1123 CapturerState previousState = GetStatus();
1124 AUDIO_INFO_LOG("Previous stream state: %{public}d, original sessionId: %{public}u", previousState, sessionID_);
1125 if (previousState == CAPTURER_RUNNING) {
1126 // stop old stream
1127 switchResult = audioStream_->StopAudioStream();
1128 CHECK_AND_RETURN_RET_LOG(switchResult, false, "StopAudioStream failed.");
1129 }
1130 std::lock_guard lock(switchStreamMutex_);
1131 // switch new stream
1132 IAudioStream::SwitchInfo info;
1133 audioStream_->GetSwitchInfo(info);
1134 info.params.originalSessionId = sessionID_;
1135
1136 // release old stream and restart audio stream
1137 switchResult = audioStream_->ReleaseAudioStream();
1138 CHECK_AND_RETURN_RET_LOG(switchResult, false, "release old stream failed.");
1139
1140 if (targetClass == IAudioStream::VOIP_STREAM) {
1141 info.capturerInfo.originalFlag = AUDIO_FLAG_VOIP_FAST;
1142 }
1143 std::shared_ptr<IAudioStream> newAudioStream = IAudioStream::GetRecordStream(targetClass, info.params,
1144 info.eStreamType, appInfo_.appPid);
1145 CHECK_AND_RETURN_RET_LOG(newAudioStream != nullptr, false, "GetRecordStream failed.");
1146 AUDIO_INFO_LOG("Get new stream success!");
1147
1148 // set new stream info
1149 SetSwitchInfo(info, newAudioStream);
1150
1151 if (previousState == CAPTURER_RUNNING) {
1152 // restart audio stream
1153 switchResult = newAudioStream->StartAudioStream();
1154 CHECK_AND_RETURN_RET_LOG(switchResult, false, "start new stream failed.");
1155 }
1156 audioStream_ = newAudioStream;
1157 if (audioInterruptCallback_ != nullptr) {
1158 std::shared_ptr<AudioCapturerInterruptCallbackImpl> interruptCbImpl =
1159 std::static_pointer_cast<AudioCapturerInterruptCallbackImpl>(audioInterruptCallback_);
1160 interruptCbImpl->UpdateAudioStream(audioStream_);
1161 }
1162 isSwitching_ = false;
1163 audioStream_->GetAudioSessionID(newSessionId);
1164 switchResult = true;
1165 }
1166 return switchResult;
1167 }
1168
SwitchStream(const uint32_t sessionId, const int32_t streamFlag, const AudioStreamDeviceChangeReasonExt reason)1169 void AudioCapturerPrivate::SwitchStream(const uint32_t sessionId, const int32_t streamFlag,
1170 const AudioStreamDeviceChangeReasonExt reason)
1171 {
1172 IAudioStream::StreamClass targetClass = IAudioStream::PA_STREAM;
1173 switch (streamFlag) {
1174 case AUDIO_FLAG_NORMAL:
1175 capturerInfo_.capturerFlags = AUDIO_FLAG_NORMAL;
1176 targetClass = IAudioStream::PA_STREAM;
1177 break;
1178 case AUDIO_FLAG_MMAP:
1179 capturerInfo_.capturerFlags = AUDIO_FLAG_MMAP;
1180 targetClass = IAudioStream::FAST_STREAM;
1181 break;
1182 case AUDIO_FLAG_VOIP_FAST:
1183 capturerInfo_.capturerFlags = AUDIO_FLAG_VOIP_FAST;
1184 targetClass = IAudioStream::VOIP_STREAM;
1185 break;
1186 }
1187
1188 uint32_t newSessionId = 0;
1189 if (!SwitchToTargetStream(targetClass, newSessionId)) {
1190 AUDIO_ERR_LOG("Switch to target stream failed");
1191 }
1192 int32_t ret = AudioPolicyManager::GetInstance().RegisterDeviceChangeWithInfoCallback(newSessionId,
1193 inputDeviceChangeCallback_);
1194 CHECK_AND_RETURN_LOG(ret == SUCCESS, "Register device change callback for new session failed");
1195 ret = AudioPolicyManager::GetInstance().UnregisterDeviceChangeWithInfoCallback(sessionId);
1196 CHECK_AND_RETURN_LOG(ret == SUCCESS, "Unregister device change callback for old session failed");
1197 }
1198
ActivateAudioConcurrency(IAudioStream::StreamClass &streamClass)1199 void AudioCapturerPrivate::ActivateAudioConcurrency(IAudioStream::StreamClass &streamClass)
1200 {
1201 if (capturerInfo_.sourceType == SOURCE_TYPE_VOICE_COMMUNICATION) {
1202 capturerInfo_.pipeType = PIPE_TYPE_CALL_IN;
1203 } else if (streamClass == IAudioStream::FAST_STREAM) {
1204 capturerInfo_.pipeType = PIPE_TYPE_LOWLATENCY_IN;
1205 }
1206 int32_t ret = AudioPolicyManager::GetInstance().ActivateAudioConcurrency(capturerInfo_.pipeType);
1207 if (ret != SUCCESS && streamClass == IAudioStream::FAST_STREAM) {
1208 streamClass = IAudioStream::PA_STREAM;
1209 capturerInfo_.pipeType = PIPE_TYPE_NORMAL_IN;
1210 }
1211 return;
1212 }
1213
InitAudioConcurrencyCallback()1214 int32_t AudioCapturerPrivate::InitAudioConcurrencyCallback()
1215 {
1216 if (audioConcurrencyCallback_ == nullptr) {
1217 audioConcurrencyCallback_ = std::make_shared<AudioCapturerConcurrencyCallbackImpl>();
1218 CHECK_AND_RETURN_RET_LOG(audioConcurrencyCallback_ != nullptr, ERROR, "Memory Allocation Failed !!");
1219 }
1220 CHECK_AND_RETURN_RET_LOG(audioStream_->GetAudioSessionID(sessionID_) == SUCCESS, ERR_INVALID_INDEX,
1221 "Get session id failed!");
1222 audioConcurrencyCallback_->SetAudioCapturerObj(this);
1223 return AudioPolicyManager::GetInstance().SetAudioConcurrencyCallback(sessionID_, audioConcurrencyCallback_);
1224 }
1225
ConcedeStream()1226 void AudioCapturerPrivate::ConcedeStream()
1227 {
1228 AUDIO_INFO_LOG("session %{public}u concede from pipeType %{public}d", sessionID_, capturerInfo_.pipeType);
1229 AudioPipeType pipeType = PIPE_TYPE_NORMAL_IN;
1230 audioStream_->GetAudioPipeType(pipeType);
1231 if (pipeType == PIPE_TYPE_LOWLATENCY_IN) {
1232 SwitchStream(sessionID_, IAudioStream::PA_STREAM, AudioStreamDeviceChangeReasonExt::ExtEnum::UNKNOWN);
1233 }
1234 }
1235
AudioCapturerConcurrencyCallbackImpl()1236 AudioCapturerConcurrencyCallbackImpl::AudioCapturerConcurrencyCallbackImpl()
1237 {
1238 AUDIO_INFO_LOG("AudioCapturerConcurrencyCallbackImpl ctor");
1239 }
1240
~AudioCapturerConcurrencyCallbackImpl()1241 AudioCapturerConcurrencyCallbackImpl::~AudioCapturerConcurrencyCallbackImpl()
1242 {
1243 AUDIO_INFO_LOG("AudioCapturerConcurrencyCallbackImpl dtor");
1244 }
1245
OnConcedeStream()1246 void AudioCapturerConcurrencyCallbackImpl::OnConcedeStream()
1247 {
1248 std::lock_guard<std::mutex> lock(mutex_);
1249 CHECK_AND_RETURN_LOG(capturer_ != nullptr, "capturer is nullptr");
1250 capturer_->ConcedeStream();
1251 }
1252
AudioCapturerStateChangeCallbackImpl()1253 AudioCapturerStateChangeCallbackImpl::AudioCapturerStateChangeCallbackImpl()
1254 {
1255 AUDIO_DEBUG_LOG("AudioCapturerStateChangeCallbackImpl instance create");
1256 }
1257
~AudioCapturerStateChangeCallbackImpl()1258 AudioCapturerStateChangeCallbackImpl::~AudioCapturerStateChangeCallbackImpl()
1259 {
1260 AUDIO_DEBUG_LOG("AudioCapturerStateChangeCallbackImpl instance destory");
1261 }
1262
SaveCapturerInfoChangeCallback( const std::shared_ptr<AudioCapturerInfoChangeCallback> &callback)1263 void AudioCapturerStateChangeCallbackImpl::SaveCapturerInfoChangeCallback(
1264 const std::shared_ptr<AudioCapturerInfoChangeCallback> &callback)
1265 {
1266 std::lock_guard<std::mutex> lock(capturerMutex_);
1267 auto iter = find(capturerInfoChangeCallbacklist_.begin(), capturerInfoChangeCallbacklist_.end(), callback);
1268 if (iter == capturerInfoChangeCallbacklist_.end()) {
1269 capturerInfoChangeCallbacklist_.emplace_back(callback);
1270 }
1271 }
1272
RemoveCapturerInfoChangeCallback( const std::shared_ptr<AudioCapturerInfoChangeCallback> &callback)1273 void AudioCapturerStateChangeCallbackImpl::RemoveCapturerInfoChangeCallback(
1274 const std::shared_ptr<AudioCapturerInfoChangeCallback> &callback)
1275 {
1276 std::lock_guard<std::mutex> lock(capturerMutex_);
1277 if (callback == nullptr) {
1278 capturerInfoChangeCallbacklist_.clear();
1279 return;
1280 }
1281
1282 auto iter = find(capturerInfoChangeCallbacklist_.begin(), capturerInfoChangeCallbacklist_.end(), callback);
1283 if (iter != capturerInfoChangeCallbacklist_.end()) {
1284 capturerInfoChangeCallbacklist_.erase(iter);
1285 }
1286 }
1287
GetCapturerInfoChangeCallbackArraySize()1288 int32_t AudioCapturerStateChangeCallbackImpl::GetCapturerInfoChangeCallbackArraySize()
1289 {
1290 std::lock_guard<std::mutex> lock(capturerMutex_);
1291 return capturerInfoChangeCallbacklist_.size();
1292 }
1293
SaveDeviceChangeCallback( const std::shared_ptr<AudioCapturerDeviceChangeCallback> &callback)1294 void AudioCapturerStateChangeCallbackImpl::SaveDeviceChangeCallback(
1295 const std::shared_ptr<AudioCapturerDeviceChangeCallback> &callback)
1296 {
1297 auto iter = find(deviceChangeCallbacklist_.begin(), deviceChangeCallbacklist_.end(), callback);
1298 if (iter == deviceChangeCallbacklist_.end()) {
1299 deviceChangeCallbacklist_.emplace_back(callback);
1300 }
1301 }
1302
RemoveDeviceChangeCallback( const std::shared_ptr<AudioCapturerDeviceChangeCallback> &callback)1303 void AudioCapturerStateChangeCallbackImpl::RemoveDeviceChangeCallback(
1304 const std::shared_ptr<AudioCapturerDeviceChangeCallback> &callback)
1305 {
1306 if (callback == nullptr) {
1307 deviceChangeCallbacklist_.clear();
1308 return;
1309 }
1310
1311 auto iter = find(deviceChangeCallbacklist_.begin(), deviceChangeCallbacklist_.end(), callback);
1312 if (iter != deviceChangeCallbacklist_.end()) {
1313 deviceChangeCallbacklist_.erase(iter);
1314 }
1315 }
1316
DeviceChangeCallbackArraySize()1317 int32_t AudioCapturerStateChangeCallbackImpl::DeviceChangeCallbackArraySize()
1318 {
1319 return deviceChangeCallbacklist_.size();
1320 }
1321
setAudioCapturerObj(AudioCapturerPrivate *capturerObj)1322 void AudioCapturerStateChangeCallbackImpl::setAudioCapturerObj(AudioCapturerPrivate *capturerObj)
1323 {
1324 std::lock_guard<std::mutex> lock(capturerMutex_);
1325 capturer_ = capturerObj;
1326 }
1327
NotifyAudioCapturerInfoChange( const std::vector<std::shared_ptr<AudioCapturerChangeInfo>> &audioCapturerChangeInfos)1328 void AudioCapturerStateChangeCallbackImpl::NotifyAudioCapturerInfoChange(
1329 const std::vector<std::shared_ptr<AudioCapturerChangeInfo>> &audioCapturerChangeInfos)
1330 {
1331 uint32_t sessionId = static_cast<uint32_t>(-1);
1332 bool found = false;
1333 AudioCapturerChangeInfo capturerChangeInfo;
1334 std::vector<std::shared_ptr<AudioCapturerInfoChangeCallback>> capturerInfoChangeCallbacklist;
1335
1336 {
1337 std::lock_guard<std::mutex> lock(capturerMutex_);
1338 CHECK_AND_RETURN_LOG(capturer_ != nullptr, "Bare pointer capturer_ is nullptr");
1339 int32_t ret = capturer_->GetAudioStreamId(sessionId);
1340 CHECK_AND_RETURN_LOG(!ret, "Get sessionId failed");
1341 }
1342
1343 for (auto it = audioCapturerChangeInfos.begin(); it != audioCapturerChangeInfos.end(); it++) {
1344 if ((*it)->sessionId == static_cast<int32_t>(sessionId)) {
1345 capturerChangeInfo = *(*it);
1346 found = true;
1347 }
1348 }
1349
1350 {
1351 std::lock_guard<std::mutex> lock(capturerMutex_);
1352 capturerInfoChangeCallbacklist = capturerInfoChangeCallbacklist_;
1353 }
1354 if (found) {
1355 for (auto it = capturerInfoChangeCallbacklist.begin(); it != capturerInfoChangeCallbacklist.end(); ++it) {
1356 if (*it != nullptr) {
1357 (*it)->OnStateChange(capturerChangeInfo);
1358 }
1359 }
1360 }
1361 }
1362
NotifyAudioCapturerDeviceChange( const std::vector<std::shared_ptr<AudioCapturerChangeInfo>> &audioCapturerChangeInfos)1363 void AudioCapturerStateChangeCallbackImpl::NotifyAudioCapturerDeviceChange(
1364 const std::vector<std::shared_ptr<AudioCapturerChangeInfo>> &audioCapturerChangeInfos)
1365 {
1366 DeviceInfo deviceInfo = {};
1367 {
1368 std::lock_guard<std::mutex> lock(capturerMutex_);
1369 CHECK_AND_RETURN_LOG(capturer_ != nullptr, "Bare pointer capturer_ is nullptr");
1370 CHECK_AND_RETURN_LOG(capturer_->IsDeviceChanged(deviceInfo), "Device not change, no need callback.");
1371 }
1372
1373 for (auto it = deviceChangeCallbacklist_.begin(); it != deviceChangeCallbacklist_.end(); ++it) {
1374 if (*it != nullptr) {
1375 (*it)->OnStateChange(deviceInfo);
1376 }
1377 }
1378 }
1379
OnCapturerStateChange( const std::vector<std::shared_ptr<AudioCapturerChangeInfo>> &audioCapturerChangeInfos)1380 void AudioCapturerStateChangeCallbackImpl::OnCapturerStateChange(
1381 const std::vector<std::shared_ptr<AudioCapturerChangeInfo>> &audioCapturerChangeInfos)
1382 {
1383 if (deviceChangeCallbacklist_.size() != 0) {
1384 NotifyAudioCapturerDeviceChange(audioCapturerChangeInfos);
1385 }
1386
1387 if (capturerInfoChangeCallbacklist_.size() != 0) {
1388 NotifyAudioCapturerInfoChange(audioCapturerChangeInfos);
1389 }
1390 }
1391
HandleCapturerDestructor()1392 void AudioCapturerStateChangeCallbackImpl::HandleCapturerDestructor()
1393 {
1394 std::lock_guard<std::mutex> lock(capturerMutex_);
1395 capturer_ = nullptr;
1396 }
1397
OnDeviceChangeWithInfo( const uint32_t sessionId, const DeviceInfo &deviceInfo, const AudioStreamDeviceChangeReasonExt reason)1398 void InputDeviceChangeWithInfoCallbackImpl::OnDeviceChangeWithInfo(
1399 const uint32_t sessionId, const DeviceInfo &deviceInfo, const AudioStreamDeviceChangeReasonExt reason)
1400 {
1401 AUDIO_INFO_LOG("For capturer, OnDeviceChangeWithInfo callback is not support");
1402 }
1403
OnRecreateStreamEvent(const uint32_t sessionId, const int32_t streamFlag, const AudioStreamDeviceChangeReasonExt reason)1404 void InputDeviceChangeWithInfoCallbackImpl::OnRecreateStreamEvent(const uint32_t sessionId, const int32_t streamFlag,
1405 const AudioStreamDeviceChangeReasonExt reason)
1406 {
1407 AUDIO_INFO_LOG("Enter");
1408 capturer_->SwitchStream(sessionId, streamFlag, reason);
1409 }
1410
CapturerPolicyServiceDiedCallback()1411 CapturerPolicyServiceDiedCallback::CapturerPolicyServiceDiedCallback()
1412 {
1413 AUDIO_DEBUG_LOG("CapturerPolicyServiceDiedCallback create");
1414 }
1415
~CapturerPolicyServiceDiedCallback()1416 CapturerPolicyServiceDiedCallback::~CapturerPolicyServiceDiedCallback()
1417 {
1418 AUDIO_DEBUG_LOG("CapturerPolicyServiceDiedCallback destroy");
1419 if (restoreThread_ != nullptr && restoreThread_->joinable()) {
1420 restoreThread_->join();
1421 restoreThread_.reset();
1422 restoreThread_ = nullptr;
1423 }
1424 }
1425
SetAudioCapturerObj(AudioCapturerPrivate *capturerObj)1426 void CapturerPolicyServiceDiedCallback::SetAudioCapturerObj(AudioCapturerPrivate *capturerObj)
1427 {
1428 capturer_ = capturerObj;
1429 }
1430
SetAudioInterrupt(AudioInterrupt &audioInterrupt)1431 void CapturerPolicyServiceDiedCallback::SetAudioInterrupt(AudioInterrupt &audioInterrupt)
1432 {
1433 audioInterrupt_ = audioInterrupt;
1434 }
1435
OnAudioPolicyServiceDied()1436 void CapturerPolicyServiceDiedCallback::OnAudioPolicyServiceDied()
1437 {
1438 AUDIO_INFO_LOG("CapturerPolicyServiceDiedCallback OnAudioPolicyServiceDied");
1439 if (restoreThread_ != nullptr) {
1440 restoreThread_->detach();
1441 }
1442 restoreThread_ = std::make_unique<std::thread>([this] { this->RestoreTheadLoop(); });
1443 pthread_setname_np(restoreThread_->native_handle(), "OS_ACPSRestore");
1444 }
1445
RestoreTheadLoop()1446 void CapturerPolicyServiceDiedCallback::RestoreTheadLoop()
1447 {
1448 int32_t tryCounter = 5;
1449 uint32_t sleepTime = 500000;
1450 bool result = false;
1451 int32_t ret = -1;
1452 while (!result && tryCounter > 0) {
1453 tryCounter--;
1454 usleep(sleepTime);
1455 if (capturer_== nullptr || capturer_->audioStream_== nullptr ||
1456 capturer_->abortRestore_) {
1457 AUDIO_INFO_LOG("CapturerPolicyServiceDiedCallback RestoreTheadLoop abort restore");
1458 break;
1459 }
1460 result = capturer_->audioStream_->RestoreAudioStream();
1461 if (!result) {
1462 AUDIO_ERR_LOG("RestoreAudioStream Failed, %{public}d attempts remaining", tryCounter);
1463 continue;
1464 } else {
1465 capturer_->abortRestore_ = false;
1466 }
1467
1468 if (capturer_->GetStatus() == CAPTURER_RUNNING) {
1469 capturer_->GetAudioInterrupt(audioInterrupt_);
1470 ret = AudioPolicyManager::GetInstance().ActivateAudioInterrupt(audioInterrupt_);
1471 if (ret != SUCCESS) {
1472 AUDIO_ERR_LOG("RestoreTheadLoop ActivateAudioInterrupt Failed");
1473 }
1474 }
1475 }
1476 }
1477 } // namespace AudioStandard
1478 } // namespace OHOS
1479