1 /*
2 * Copyright (c) 2021-2025 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 #include "shared_audio_capturer_wrapper.h"
21
22 #include <cinttypes>
23
24 #include "audio_capturer_private.h"
25 #include "audio_errors.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 static constexpr uint32_t BLOCK_INTERRUPT_CALLBACK_IN_MS = 300; // 300ms
37 static constexpr int32_t MINIMUM_BUFFER_SIZE_MSEC = 5;
38 static constexpr int32_t MAXIMUM_BUFFER_SIZE_MSEC = 20;
39
40 std::map<AudioStreamType, SourceType> AudioCapturerPrivate::streamToSource_ = {
41 {AudioStreamType::STREAM_MUSIC, SourceType::SOURCE_TYPE_MIC},
42 {AudioStreamType::STREAM_MEDIA, SourceType::SOURCE_TYPE_MIC},
43 {AudioStreamType::STREAM_MUSIC, SourceType::SOURCE_TYPE_UNPROCESSED},
44 {AudioStreamType::STREAM_CAMCORDER, SourceType::SOURCE_TYPE_CAMCORDER},
45 {AudioStreamType::STREAM_VOICE_CALL, SourceType::SOURCE_TYPE_VOICE_COMMUNICATION},
46 {AudioStreamType::STREAM_ULTRASONIC, SourceType::SOURCE_TYPE_ULTRASONIC},
47 {AudioStreamType::STREAM_WAKEUP, SourceType::SOURCE_TYPE_WAKEUP},
48 {AudioStreamType::STREAM_SOURCE_VOICE_CALL, SourceType::SOURCE_TYPE_VOICE_CALL},
49 };
50
51 AudioCapturer::~AudioCapturer() = default;
52
~AudioCapturerPrivate()53 AudioCapturerPrivate::~AudioCapturerPrivate()
54 {
55 AUDIO_INFO_LOG("~AudioCapturerPrivate");
56 std::shared_ptr<InputDeviceChangeWithInfoCallbackImpl> inputDeviceChangeCallback = inputDeviceChangeCallback_;
57 if (inputDeviceChangeCallback != nullptr) {
58 inputDeviceChangeCallback->UnsetAudioCapturerObj();
59 }
60 AudioPolicyManager::GetInstance().UnregisterDeviceChangeWithInfoCallback(sessionID_);
61 CapturerState state = GetStatus();
62 if (state != CAPTURER_RELEASED && state != CAPTURER_NEW) {
63 Release();
64 }
65 AudioPolicyManager::GetInstance().RemoveClientTrackerStub(sessionID_);
66 if (audioStateChangeCallback_ != nullptr) {
67 audioStateChangeCallback_->HandleCapturerDestructor();
68 }
69 DumpFileUtil::CloseDumpFile(&dumpFile_);
70 }
71
Create(AudioStreamType audioStreamType)72 std::unique_ptr<AudioCapturer> AudioCapturer::Create(AudioStreamType audioStreamType)
73 {
74 AppInfo appInfo = {};
75 return Create(audioStreamType, appInfo);
76 }
77
Create(AudioStreamType audioStreamType,const AppInfo & appInfo)78 std::unique_ptr<AudioCapturer> AudioCapturer::Create(AudioStreamType audioStreamType, const AppInfo &appInfo)
79 {
80 std::shared_ptr<AudioCapturer> sharedCapturer = std::make_shared<AudioCapturerPrivate>(audioStreamType,
81 appInfo, true);
82 CHECK_AND_RETURN_RET_LOG(sharedCapturer != nullptr, nullptr, "capturer is nullptr");
83
84 return std::make_unique<SharedCapturerWrapper>(sharedCapturer);
85 }
86
Create(const AudioCapturerOptions & options)87 std::unique_ptr<AudioCapturer> AudioCapturer::Create(const AudioCapturerOptions &options)
88 {
89 AppInfo appInfo = {};
90 return Create(options, appInfo);
91 }
92
Create(const AudioCapturerOptions & options,const std::string cachePath)93 std::unique_ptr<AudioCapturer> AudioCapturer::Create(const AudioCapturerOptions &options, const std::string cachePath)
94 {
95 AppInfo appInfo = {};
96 return Create(options, appInfo);
97 }
98
Create(const AudioCapturerOptions & options,const std::string cachePath,const AppInfo & appInfo)99 std::unique_ptr<AudioCapturer> AudioCapturer::Create(const AudioCapturerOptions &options,
100 const std::string cachePath, const AppInfo &appInfo)
101 {
102 return Create(options, appInfo);
103 }
104
Create(const AudioCapturerOptions & options,const AppInfo & appInfo)105 std::unique_ptr<AudioCapturer> AudioCapturer::Create(const AudioCapturerOptions &options,
106 const AppInfo &appInfo)
107 {
108 auto tempSharedPtr = CreateCapturer(options, appInfo);
109 CHECK_AND_RETURN_RET_LOG(tempSharedPtr != nullptr, nullptr, "capturer is nullptr");
110
111 return std::make_unique<SharedCapturerWrapper>(tempSharedPtr);
112 }
113
CreateCapturer(const AudioCapturerOptions & capturerOptions,const AppInfo & appInfo)114 std::shared_ptr<AudioCapturer> AudioCapturer::CreateCapturer(const AudioCapturerOptions &capturerOptions,
115 const AppInfo &appInfo)
116 {
117 Trace trace("AudioCapturer::Create");
118 auto sourceType = capturerOptions.capturerInfo.sourceType;
119 if (sourceType < SOURCE_TYPE_MIC || sourceType > SOURCE_TYPE_MAX || sourceType == AUDIO_SOURCE_TYPE_INVALID_5) {
120 AudioCapturer::SendCapturerCreateError(sourceType, ERR_INVALID_PARAM);
121 AUDIO_ERR_LOG("Invalid source type %{public}d!", sourceType);
122 return nullptr;
123 }
124 if (sourceType == SOURCE_TYPE_ULTRASONIC && getuid() != UID_MSDP_SA) {
125 AudioCapturer::SendCapturerCreateError(sourceType, ERR_INVALID_PARAM);
126 }
127 CHECK_AND_RETURN_RET_LOG(sourceType != SOURCE_TYPE_ULTRASONIC || getuid() == UID_MSDP_SA, nullptr,
128 "Create failed: SOURCE_TYPE_ULTRASONIC can only be used by MSDP");
129 AudioStreamType audioStreamType = FindStreamTypeBySourceType(sourceType);
130 AudioCapturerParams params;
131 params.audioSampleFormat = capturerOptions.streamInfo.format;
132 params.samplingRate = capturerOptions.streamInfo.samplingRate;
133 bool isChange = false;
134 if (AudioChannel::CHANNEL_3 == capturerOptions.streamInfo.channels) {
135 params.audioChannel = AudioChannel::STEREO;
136 isChange = true;
137 } else {
138 params.audioChannel = capturerOptions.streamInfo.channels;
139 }
140 params.audioEncoding = capturerOptions.streamInfo.encoding;
141 params.channelLayout = capturerOptions.streamInfo.channelLayout;
142 auto capturer = std::make_shared<AudioCapturerPrivate>(audioStreamType, appInfo, false);
143 if (capturer == nullptr) {
144 AudioCapturer::SendCapturerCreateError(sourceType, ERR_OPERATION_FAILED);
145 AUDIO_ERR_LOG("Failed to create capturer object");
146 return capturer;
147 }
148 AUDIO_INFO_LOG("Capturer sourceType: %{public}d, uid: %{public}d", sourceType, appInfo.appUid);
149 // InitPlaybackCapturer will be replaced by UpdatePlaybackCaptureConfig.
150 capturer->capturerInfo_.sourceType = sourceType;
151 capturer->capturerInfo_.capturerFlags = capturerOptions.capturerInfo.capturerFlags;
152 capturer->capturerInfo_.originalFlag = ((sourceType == SOURCE_TYPE_VOICE_COMMUNICATION) &&
153 (capturerOptions.capturerInfo.capturerFlags == AUDIO_FLAG_MMAP)) ?
154 AUDIO_FLAG_NORMAL : capturerOptions.capturerInfo.capturerFlags;
155 capturer->capturerInfo_.samplingRate = capturerOptions.streamInfo.samplingRate;
156 capturer->filterConfig_ = capturerOptions.playbackCaptureConfig;
157 capturer->strategy_ = capturerOptions.strategy;
158 if (capturer->SetParams(params) != SUCCESS) {
159 AudioCapturer::SendCapturerCreateError(sourceType, ERR_OPERATION_FAILED);
160 capturer = nullptr;
161 }
162 if (capturer != nullptr && isChange) {
163 capturer->isChannelChange_ = true;
164 }
165 return capturer;
166 }
167
168 // This will be called in Create and after Create.
UpdatePlaybackCaptureConfig(const AudioPlaybackCaptureConfig & config)169 int32_t AudioCapturerPrivate::UpdatePlaybackCaptureConfig(const AudioPlaybackCaptureConfig &config)
170 {
171 // UpdatePlaybackCaptureConfig will only work for InnerCap streams.
172 if (capturerInfo_.sourceType != SOURCE_TYPE_PLAYBACK_CAPTURE) {
173 AUDIO_WARNING_LOG("This is not a PLAYBACK_CAPTURE stream.");
174 return ERR_INVALID_OPERATION;
175 }
176
177 #ifdef HAS_FEATURE_INNERCAPTURER
178 if (config.filterOptions.usages.size() == 0 && config.filterOptions.pids.size() == 0) {
179 AUDIO_WARNING_LOG("Both usages and pids are empty!");
180 }
181
182 CHECK_AND_RETURN_RET_LOG(audioStream_ != nullptr, ERR_OPERATION_FAILED, "Failed with null audioStream_");
183
184 return audioStream_->UpdatePlaybackCaptureConfig(config);
185 #else
186 AUDIO_WARNING_LOG("Inner capture is not supported.");
187 return ERR_NOT_SUPPORTED;
188 #endif
189 }
190
SendCapturerCreateError(const SourceType & sourceType,const int32_t & errorCode)191 void AudioCapturer::SendCapturerCreateError(const SourceType &sourceType,
192 const int32_t &errorCode)
193 {
194 std::shared_ptr<Media::MediaMonitor::EventBean> bean = std::make_shared<Media::MediaMonitor::EventBean>(
195 Media::MediaMonitor::ModuleId::AUDIO, Media::MediaMonitor::EventId::AUDIO_STREAM_CREATE_ERROR_STATS,
196 Media::MediaMonitor::EventType::FREQUENCY_AGGREGATION_EVENT);
197 bean->Add("IS_PLAYBACK", 0);
198 bean->Add("CLIENT_UID", static_cast<int32_t>(getuid()));
199 bean->Add("STREAM_TYPE", sourceType);
200 bean->Add("ERROR_CODE", errorCode);
201 Media::MediaMonitor::MediaMonitorManager::GetInstance().WriteLogMsg(bean);
202 }
203
AudioCapturerPrivate(AudioStreamType audioStreamType,const AppInfo & appInfo,bool createStream)204 AudioCapturerPrivate::AudioCapturerPrivate(AudioStreamType audioStreamType, const AppInfo &appInfo, bool createStream)
205 {
206 if (audioStreamType < STREAM_VOICE_CALL || audioStreamType > STREAM_ALL) {
207 AUDIO_WARNING_LOG("audioStreamType is invalid!");
208 }
209 audioStreamType_ = audioStreamType;
210 auto iter = streamToSource_.find(audioStreamType);
211 if (iter != streamToSource_.end()) {
212 capturerInfo_.sourceType = iter->second;
213 }
214 appInfo_ = appInfo;
215 if (!(appInfo_.appPid)) {
216 appInfo_.appPid = getpid();
217 }
218
219 if (appInfo_.appUid < 0) {
220 appInfo_.appUid = static_cast<int32_t>(getuid());
221 }
222 if (createStream) {
223 AudioStreamParams tempParams = {};
224 audioStream_ = IAudioStream::GetRecordStream(IAudioStream::PA_STREAM, tempParams, audioStreamType_,
225 appInfo_.appUid);
226 AUDIO_INFO_LOG("create normal stream for old mode.");
227 }
228
229 capturerProxyObj_ = std::make_shared<AudioCapturerProxyObj>();
230 if (!capturerProxyObj_) {
231 AUDIO_WARNING_LOG("AudioCapturerProxyObj Memory Allocation Failed !!");
232 }
233 }
234
GetFrameCount(uint32_t & frameCount) const235 int32_t AudioCapturerPrivate::GetFrameCount(uint32_t &frameCount) const
236 {
237 std::shared_ptr<IAudioStream> currentStream = GetInnerStream();
238 CHECK_AND_RETURN_RET_LOG(currentStream != nullptr, ERROR_ILLEGAL_STATE, "audioStream_ is nullptr");
239 return currentStream->GetFrameCount(frameCount);
240 }
241
GetPreferredStreamClass(AudioStreamParams audioStreamParams)242 IAudioStream::StreamClass AudioCapturerPrivate::GetPreferredStreamClass(AudioStreamParams audioStreamParams)
243 {
244 int32_t flag = AudioPolicyManager::GetInstance().GetPreferredInputStreamType(capturerInfo_);
245 AUDIO_INFO_LOG("Preferred capturer flag: %{public}d", flag);
246 if (flag == AUDIO_FLAG_MMAP && IAudioStream::IsStreamSupported(capturerInfo_.originalFlag, audioStreamParams)) {
247 capturerInfo_.capturerFlags = AUDIO_FLAG_MMAP;
248 return IAudioStream::FAST_STREAM;
249 }
250 if (flag == AUDIO_FLAG_VOIP_FAST) {
251 // It is not possible to directly create a fast VoIP stream
252 isFastVoipSupported_ = true;
253 }
254
255 capturerInfo_.capturerFlags = AUDIO_FLAG_NORMAL;
256 return IAudioStream::PA_STREAM;
257 }
258
SetParams(const AudioCapturerParams params)259 int32_t AudioCapturerPrivate::SetParams(const AudioCapturerParams params)
260 {
261 Trace trace("AudioCapturer::SetParams");
262 AUDIO_INFO_LOG("StreamClientState for Capturer::SetParams.");
263
264 std::shared_lock<std::shared_mutex> lockShared(capturerMutex_);
265
266 AudioStreamParams audioStreamParams = ConvertToAudioStreamParams(params);
267
268 IAudioStream::StreamClass streamClass = IAudioStream::PA_STREAM;
269 if (capturerInfo_.sourceType != SOURCE_TYPE_PLAYBACK_CAPTURE) {
270 #ifdef SUPPORT_LOW_LATENCY
271 streamClass = GetPreferredStreamClass(audioStreamParams);
272 #else
273 capturerInfo_.originalFlag = AUDIO_FLAG_FORCED_NORMAL;
274 capturerInfo_.capturerFlags = AUDIO_FLAG_NORMAL;
275 streamClass = IAudioStream::PA_STREAM;
276 #endif
277 }
278 ActivateAudioConcurrency(streamClass);
279
280 // check AudioStreamParams for fast stream
281 if (audioStream_ == nullptr) {
282 audioStream_ = IAudioStream::GetRecordStream(streamClass, audioStreamParams, audioStreamType_,
283 appInfo_.appUid);
284 CHECK_AND_RETURN_RET_LOG(audioStream_ != nullptr, ERR_INVALID_PARAM, "SetParams GetRecordStream faied.");
285 AUDIO_INFO_LOG("IAudioStream::GetStream success");
286 }
287 int32_t ret = InitAudioStream(audioStreamParams);
288 // When the fast stream creation fails, a normal stream is created
289 if (ret != SUCCESS && streamClass == IAudioStream::FAST_STREAM) {
290 AUDIO_INFO_LOG("Create fast Stream fail, record by normal stream");
291 streamClass = IAudioStream::PA_STREAM;
292 audioStream_ = IAudioStream::GetRecordStream(streamClass, audioStreamParams, audioStreamType_, appInfo_.appUid);
293 CHECK_AND_RETURN_RET_LOG(audioStream_ != nullptr, ERR_INVALID_PARAM, "Get normal record stream failed");
294 ret = InitAudioStream(audioStreamParams);
295 CHECK_AND_RETURN_RET_LOG(ret == SUCCESS, ret, "Init normal audio stream failed");
296 audioStream_->SetCaptureMode(CAPTURE_MODE_CALLBACK);
297 }
298 CHECK_AND_RETURN_RET_LOG(ret == SUCCESS, ret, "InitAudioStream failed");
299
300 RegisterCapturerPolicyServiceDiedCallback();
301
302 if (audioStream_->GetAudioSessionID(sessionID_) != 0) {
303 AUDIO_ERR_LOG("GetAudioSessionID failed!");
304 return ERR_INVALID_INDEX;
305 }
306 // eg: 100009_44100_2_1_cap_client_out.pcm
307 std::string dumpFileName = std::to_string(sessionID_) + "_" + std::to_string(params.samplingRate) + "_" +
308 std::to_string(params.audioChannel) + "_" + std::to_string(params.audioSampleFormat) + "_cap_client_out.pcm";
309 DumpFileUtil::OpenDumpFile(DumpFileUtil::DUMP_CLIENT_PARA, dumpFileName, &dumpFile_);
310
311 ret = InitInputDeviceChangeCallback();
312 CHECK_AND_RETURN_RET_LOG(ret == SUCCESS, ret, "Init input device change callback failed");
313
314 return InitAudioInterruptCallback();
315 }
316
InitInputDeviceChangeCallback()317 int32_t AudioCapturerPrivate::InitInputDeviceChangeCallback()
318 {
319 CHECK_AND_RETURN_RET_LOG(GetCurrentInputDevicesInner(currentDeviceInfo_) == SUCCESS, ERROR,
320 "Get current device info failed");
321
322 if (!inputDeviceChangeCallback_) {
323 inputDeviceChangeCallback_ = std::make_shared<InputDeviceChangeWithInfoCallbackImpl>();
324 CHECK_AND_RETURN_RET_LOG(inputDeviceChangeCallback_ != nullptr, ERROR, "Memory allocation failed");
325 }
326
327 inputDeviceChangeCallback_->SetAudioCapturerObj(this);
328
329 uint32_t sessionId;
330 int32_t ret = GetAudioStreamId(sessionId);
331 CHECK_AND_RETURN_RET_LOG(ret == SUCCESS, ret, "Get sessionId failed");
332
333 ret = AudioPolicyManager::GetInstance().RegisterDeviceChangeWithInfoCallback(sessionId,
334 inputDeviceChangeCallback_);
335 CHECK_AND_RETURN_RET_LOG(ret == SUCCESS, ret, "Register failed");
336
337 return SUCCESS;
338 }
339
InitAudioStream(const AudioStreamParams & audioStreamParams)340 int32_t AudioCapturerPrivate::InitAudioStream(const AudioStreamParams &audioStreamParams)
341 {
342 Trace trace("AudioCapturer::InitAudioStream");
343 const AudioCapturer *capturer = this;
344 capturerProxyObj_->SaveCapturerObj(capturer);
345
346 audioStream_->SetCapturerInfo(capturerInfo_);
347
348 audioStream_->SetClientID(appInfo_.appPid, appInfo_.appUid, appInfo_.appTokenId, appInfo_.appFullTokenId);
349
350 if (capturerInfo_.sourceType == SOURCE_TYPE_PLAYBACK_CAPTURE) {
351 audioStream_->SetInnerCapturerState(true);
352 } else if (capturerInfo_.sourceType == SourceType::SOURCE_TYPE_WAKEUP) {
353 audioStream_->SetWakeupCapturerState(true);
354 }
355
356 audioStream_->SetCapturerSource(capturerInfo_.sourceType);
357 int32_t ret = audioStream_->SetAudioStreamInfo(audioStreamParams, capturerProxyObj_, filterConfig_);
358 CHECK_AND_RETURN_RET_LOG(ret == SUCCESS, ret, "SetAudioStreamInfo failed");
359 // for inner-capturer
360 if (capturerInfo_.sourceType == SOURCE_TYPE_PLAYBACK_CAPTURE) {
361 ret = UpdatePlaybackCaptureConfig(filterConfig_);
362 CHECK_AND_RETURN_RET_LOG(ret == SUCCESS, ret, "UpdatePlaybackCaptureConfig Failed");
363 }
364 InitLatencyMeasurement(audioStreamParams);
365 InitAudioConcurrencyCallback();
366 return ret;
367 }
368
CheckSignalData(uint8_t * buffer,size_t bufferSize) const369 void AudioCapturerPrivate::CheckSignalData(uint8_t *buffer, size_t bufferSize) const
370 {
371 std::lock_guard lock(signalDetectAgentMutex_);
372 if (!latencyMeasEnabled_) {
373 return;
374 }
375 CHECK_AND_RETURN_LOG(signalDetectAgent_ != nullptr, "LatencyMeas signalDetectAgent_ is nullptr");
376 bool detected = signalDetectAgent_->CheckAudioData(buffer, bufferSize);
377 if (detected) {
378 std::shared_ptr<IAudioStream> currentStream = GetInnerStream();
379 CHECK_AND_RETURN_LOG(currentStream != nullptr, "audioStream_ is nullptr");
380 if (capturerInfo_.capturerFlags == IAudioStream::FAST_STREAM) {
381 AUDIO_INFO_LOG("LatencyMeas fast capturer signal detected");
382 } else {
383 AUDIO_INFO_LOG("LatencyMeas normal capturer signal detected");
384 }
385 currentStream->UpdateLatencyTimestamp(signalDetectAgent_->lastPeakBufferTime_, false);
386 }
387 }
388
InitLatencyMeasurement(const AudioStreamParams & audioStreamParams)389 void AudioCapturerPrivate::InitLatencyMeasurement(const AudioStreamParams &audioStreamParams)
390 {
391 std::lock_guard lock(signalDetectAgentMutex_);
392 latencyMeasEnabled_ = AudioLatencyMeasurement::CheckIfEnabled();
393 AUDIO_INFO_LOG("LatencyMeas enabled in capturer:%{public}d", latencyMeasEnabled_);
394 if (!latencyMeasEnabled_) {
395 return;
396 }
397 signalDetectAgent_ = std::make_shared<SignalDetectAgent>();
398 CHECK_AND_RETURN_LOG(signalDetectAgent_ != nullptr, "LatencyMeas signalDetectAgent_ is nullptr");
399 signalDetectAgent_->sampleFormat_ = audioStreamParams.format;
400 signalDetectAgent_->formatByteSize_ = GetFormatByteSize(audioStreamParams.format);
401 }
402
InitAudioInterruptCallback()403 int32_t AudioCapturerPrivate::InitAudioInterruptCallback()
404 {
405 if (audioInterrupt_.streamId != 0) {
406 AUDIO_INFO_LOG("old session already has interrupt, need to reset");
407 (void)AudioPolicyManager::GetInstance().DeactivateAudioInterrupt(audioInterrupt_);
408 (void)AudioPolicyManager::GetInstance().UnsetAudioInterruptCallback(audioInterrupt_.streamId);
409 }
410
411 if (audioStream_->GetAudioSessionID(sessionID_) != 0) {
412 AUDIO_ERR_LOG("GetAudioSessionID failed for INDEPENDENT_MODE");
413 return ERR_INVALID_INDEX;
414 }
415 audioInterrupt_.streamId = sessionID_;
416 audioInterrupt_.pid = appInfo_.appPid;
417 audioInterrupt_.audioFocusType.sourceType = capturerInfo_.sourceType;
418 audioInterrupt_.sessionStrategy = strategy_;
419 if (audioInterrupt_.audioFocusType.sourceType == SOURCE_TYPE_VIRTUAL_CAPTURE) {
420 isVoiceCallCapturer_ = true;
421 audioInterrupt_.audioFocusType.sourceType = SOURCE_TYPE_VOICE_COMMUNICATION;
422 }
423 if (audioInterruptCallback_ == nullptr) {
424 audioInterruptCallback_ = std::make_shared<AudioCapturerInterruptCallbackImpl>(audioStream_);
425 CHECK_AND_RETURN_RET_LOG(audioInterruptCallback_ != nullptr, ERROR,
426 "Failed to allocate memory for audioInterruptCallback_");
427 }
428 return AudioPolicyManager::GetInstance().SetAudioInterruptCallback(sessionID_, audioInterruptCallback_,
429 appInfo_.appUid);
430 }
431
SetCapturerCallback(const std::shared_ptr<AudioCapturerCallback> & callback)432 int32_t AudioCapturerPrivate::SetCapturerCallback(const std::shared_ptr<AudioCapturerCallback> &callback)
433 {
434 std::lock_guard<std::mutex> lock(setCapturerCbMutex_);
435 // If the client is using the deprecated SetParams API. SetCapturerCallback must be invoked, after SetParams.
436 // In general, callbacks can only be set after the capturer state is PREPARED.
437 CapturerState state = GetStatus();
438 CHECK_AND_RETURN_RET_LOG(state != CAPTURER_NEW && state != CAPTURER_RELEASED, ERR_ILLEGAL_STATE,
439 "SetCapturerCallback ncorrect state:%{public}d to register cb", state);
440 CHECK_AND_RETURN_RET_LOG(callback != nullptr, ERR_INVALID_PARAM,
441 "SetCapturerCallback callback param is null");
442
443 // Save reference for interrupt callback
444 CHECK_AND_RETURN_RET_LOG(audioInterruptCallback_ != nullptr, ERROR,
445 "SetCapturerCallback audioInterruptCallback_ == nullptr");
446 std::shared_ptr<AudioCapturerInterruptCallbackImpl> cbInterrupt =
447 std::static_pointer_cast<AudioCapturerInterruptCallbackImpl>(audioInterruptCallback_);
448 cbInterrupt->SaveCallback(callback);
449
450 // Save and Set reference for stream callback. Order is important here.
451 if (audioStreamCallback_ == nullptr) {
452 audioStreamCallback_ = std::make_shared<AudioStreamCallbackCapturer>(weak_from_this());
453 CHECK_AND_RETURN_RET_LOG(audioStreamCallback_ != nullptr, ERROR,
454 "Failed to allocate memory for audioStreamCallback_");
455 }
456 std::shared_ptr<AudioStreamCallbackCapturer> cbStream =
457 std::static_pointer_cast<AudioStreamCallbackCapturer>(audioStreamCallback_);
458 cbStream->SaveCallback(callback);
459 std::shared_ptr<IAudioStream> currentStream = GetInnerStream();
460 CHECK_AND_RETURN_RET_LOG(currentStream != nullptr, ERROR_ILLEGAL_STATE, "audioStream_ is nullptr");
461 (void)currentStream->SetStreamCallback(audioStreamCallback_);
462
463 return SUCCESS;
464 }
465
SetAudioCapturerErrorCallback(std::shared_ptr<AudioCapturerErrorCallback> errorCallback)466 void AudioCapturerPrivate::SetAudioCapturerErrorCallback(std::shared_ptr<AudioCapturerErrorCallback> errorCallback)
467 {
468 std::shared_lock sharedLock(capturerMutex_);
469 std::lock_guard lock(audioCapturerErrCallbackMutex_);
470 audioCapturerErrorCallback_ = errorCallback;
471 }
472
RegisterAudioPolicyServerDiedCb(const int32_t clientPid,const std::shared_ptr<AudioCapturerPolicyServiceDiedCallback> & callback)473 int32_t AudioCapturerPrivate::RegisterAudioPolicyServerDiedCb(const int32_t clientPid,
474 const std::shared_ptr<AudioCapturerPolicyServiceDiedCallback> &callback)
475 {
476 AUDIO_INFO_LOG("RegisterAudioPolicyServerDiedCb client id: %{public}d", clientPid);
477 CHECK_AND_RETURN_RET_LOG(callback != nullptr, ERR_INVALID_PARAM, "callback is null");
478
479 std::lock_guard<std::mutex> lock(policyServiceDiedCallbackMutex_);
480
481 policyServiceDiedCallback_ = callback;
482 return AudioPolicyManager::GetInstance().RegisterAudioPolicyServerDiedCb(clientPid, callback);
483 }
484
GetParams(AudioCapturerParams & params) const485 int32_t AudioCapturerPrivate::GetParams(AudioCapturerParams ¶ms) const
486 {
487 std::shared_ptr<IAudioStream> currentStream = GetInnerStream();
488 CHECK_AND_RETURN_RET_LOG(currentStream != nullptr, ERROR_ILLEGAL_STATE, "audioStream_ is nullptr");
489 AudioStreamParams audioStreamParams;
490 int32_t result = currentStream->GetAudioStreamInfo(audioStreamParams);
491 if (SUCCESS == result) {
492 params.audioSampleFormat = static_cast<AudioSampleFormat>(audioStreamParams.format);
493 params.samplingRate = static_cast<AudioSamplingRate>(audioStreamParams.samplingRate);
494 params.audioChannel = static_cast<AudioChannel>(audioStreamParams.channels);
495 params.audioEncoding = static_cast<AudioEncodingType>(audioStreamParams.encoding);
496 }
497
498 return result;
499 }
500
GetCapturerInfo(AudioCapturerInfo & capturerInfo) const501 int32_t AudioCapturerPrivate::GetCapturerInfo(AudioCapturerInfo &capturerInfo) const
502 {
503 capturerInfo = capturerInfo_;
504
505 return SUCCESS;
506 }
507
GetStreamInfo(AudioStreamInfo & streamInfo) const508 int32_t AudioCapturerPrivate::GetStreamInfo(AudioStreamInfo &streamInfo) const
509 {
510 std::shared_ptr<IAudioStream> currentStream = GetInnerStream();
511 CHECK_AND_RETURN_RET_LOG(currentStream != nullptr, ERROR_ILLEGAL_STATE, "audioStream_ is nullptr");
512 AudioStreamParams audioStreamParams;
513 int32_t result = currentStream->GetAudioStreamInfo(audioStreamParams);
514 if (SUCCESS == result) {
515 streamInfo.format = static_cast<AudioSampleFormat>(audioStreamParams.format);
516 streamInfo.samplingRate = static_cast<AudioSamplingRate>(audioStreamParams.samplingRate);
517 if (this->isChannelChange_) {
518 streamInfo.channels = AudioChannel::CHANNEL_3;
519 } else {
520 streamInfo.channels = static_cast<AudioChannel>(audioStreamParams.channels);
521 }
522 streamInfo.encoding = static_cast<AudioEncodingType>(audioStreamParams.encoding);
523 }
524
525 return result;
526 }
527
SetCapturerPositionCallback(int64_t markPosition,const std::shared_ptr<CapturerPositionCallback> & callback)528 int32_t AudioCapturerPrivate::SetCapturerPositionCallback(int64_t markPosition,
529 const std::shared_ptr<CapturerPositionCallback> &callback)
530 {
531 CHECK_AND_RETURN_RET_LOG((callback != nullptr) && (markPosition > 0), ERR_INVALID_PARAM,
532 "input param is invalid");
533 std::shared_ptr<IAudioStream> currentStream = GetInnerStream();
534 CHECK_AND_RETURN_RET_LOG(currentStream != nullptr, ERROR_ILLEGAL_STATE, "audioStream_ is nullptr");
535 currentStream->SetCapturerPositionCallback(markPosition, callback);
536
537 return SUCCESS;
538 }
539
UnsetCapturerPositionCallback()540 void AudioCapturerPrivate::UnsetCapturerPositionCallback()
541 {
542 std::shared_ptr<IAudioStream> currentStream = GetInnerStream();
543 CHECK_AND_RETURN_LOG(currentStream != nullptr, "audioStream_ is nullptr");
544 currentStream->UnsetCapturerPositionCallback();
545 }
546
SetCapturerPeriodPositionCallback(int64_t frameNumber,const std::shared_ptr<CapturerPeriodPositionCallback> & callback)547 int32_t AudioCapturerPrivate::SetCapturerPeriodPositionCallback(int64_t frameNumber,
548 const std::shared_ptr<CapturerPeriodPositionCallback> &callback)
549 {
550 CHECK_AND_RETURN_RET_LOG((callback != nullptr) && (frameNumber > 0), ERR_INVALID_PARAM,
551 "input param is invalid");
552 std::shared_ptr<IAudioStream> currentStream = GetInnerStream();
553 CHECK_AND_RETURN_RET_LOG(currentStream != nullptr, ERROR_ILLEGAL_STATE, "audioStream_ is nullptr");
554 currentStream->SetCapturerPeriodPositionCallback(frameNumber, callback);
555
556 return SUCCESS;
557 }
558
UnsetCapturerPeriodPositionCallback()559 void AudioCapturerPrivate::UnsetCapturerPeriodPositionCallback()
560 {
561 std::shared_ptr<IAudioStream> currentStream = GetInnerStream();
562 CHECK_AND_RETURN_LOG(currentStream != nullptr, "audioStream_ is nullptr");
563 currentStream->UnsetCapturerPeriodPositionCallback();
564 }
565
GetTargetStreamClass(int32_t streamFlag)566 IAudioStream::StreamClass AudioCapturerPrivate::GetTargetStreamClass(int32_t streamFlag)
567 {
568 IAudioStream::StreamClass targetClass = IAudioStream::PA_STREAM;
569 switch (streamFlag) {
570 case AUDIO_FLAG_NORMAL:
571 capturerInfo_.capturerFlags = AUDIO_FLAG_NORMAL;
572 targetClass = IAudioStream::PA_STREAM;
573 break;
574 case AUDIO_FLAG_MMAP:
575 capturerInfo_.capturerFlags = AUDIO_FLAG_MMAP;
576 targetClass = IAudioStream::FAST_STREAM;
577 break;
578 case AUDIO_FLAG_VOIP_FAST:
579 capturerInfo_.capturerFlags = AUDIO_FLAG_VOIP_FAST;
580 targetClass = IAudioStream::VOIP_STREAM;
581 break;
582 }
583 return targetClass;
584 }
585
CheckAndRestoreAudioCapturer(std::string callingFunc)586 int32_t AudioCapturerPrivate::CheckAndRestoreAudioCapturer(std::string callingFunc)
587 {
588 std::lock_guard<std::shared_mutex> lock(capturerMutex_);
589
590 // Return in advance if there's no need for restore.
591 CHECK_AND_RETURN_RET_LOG(audioStream_, ERR_ILLEGAL_STATE, "audioStream_ is nullptr");
592 RestoreStatus restoreStatus = audioStream_->CheckRestoreStatus();
593 if (restoreStatus == NO_NEED_FOR_RESTORE) {
594 return SUCCESS;
595 }
596 if (restoreStatus == RESTORING) {
597 AUDIO_WARNING_LOG("%{public}s when restoring, return", callingFunc.c_str());
598 return ERR_ILLEGAL_STATE;
599 }
600
601 // Get restore info and target stream class for switching.
602 RestoreInfo restoreInfo;
603 audioStream_->GetRestoreInfo(restoreInfo);
604 IAudioStream::StreamClass targetClass = GetTargetStreamClass(restoreInfo.targetStreamFlag);
605
606 // Block interrupt calback, avoid pausing wrong stream.
607 std::shared_ptr<AudioCapturerInterruptCallbackImpl> interruptCbImpl = nullptr;
608 if (audioInterruptCallback_ != nullptr) {
609 interruptCbImpl = std::static_pointer_cast<AudioCapturerInterruptCallbackImpl>(audioInterruptCallback_);
610 interruptCbImpl->StartSwitch();
611 }
612
613 // Switch to target audio stream. Deactivate audio interrupt if switch failed.
614 AUDIO_INFO_LOG("Before %{public}s, restore audio capturer %{public}u", callingFunc.c_str(), sessionID_);
615 if (!SwitchToTargetStream(targetClass, restoreInfo)) {
616 AudioInterrupt audioInterrupt = audioInterrupt_;
617 int32_t ret = AudioPolicyManager::GetInstance().DeactivateAudioInterrupt(audioInterrupt);
618 CHECK_AND_RETURN_RET_LOG(ret == SUCCESS, ERR_OPERATION_FAILED, "DeactivateAudioInterrupt Failed");
619 }
620
621 // Unblock interrupt callback.
622 if (interruptCbImpl) {
623 interruptCbImpl->FinishSwitch();
624 }
625 return SUCCESS;
626 }
627
Start()628 bool AudioCapturerPrivate::Start()
629 {
630 CheckAndRestoreAudioCapturer("Start");
631 std::lock_guard lock(capturerMutex_);
632 Trace trace("AudioCapturer::Start");
633 AUDIO_INFO_LOG("StreamClientState for Capturer::Start. id %{public}u, sourceType: %{public}d",
634 sessionID_, audioInterrupt_.audioFocusType.sourceType);
635
636 CapturerState state = GetStatusInner();
637 CHECK_AND_RETURN_RET_LOG((state == CAPTURER_PREPARED) || (state == CAPTURER_STOPPED) || (state == CAPTURER_PAUSED),
638 false, "Start failed. Illegal state %{public}u.", state);
639
640 CHECK_AND_RETURN_RET_LOG(!isSwitching_, false, "Operation failed, in switching");
641
642 CHECK_AND_RETURN_RET(audioInterrupt_.audioFocusType.sourceType != SOURCE_TYPE_INVALID &&
643 audioInterrupt_.streamId != INVALID_SESSION_ID, false);
644 AudioInterrupt audioInterrupt = audioInterrupt_;
645 int32_t ret = AudioPolicyManager::GetInstance().ActivateAudioInterrupt(audioInterrupt);
646 CHECK_AND_RETURN_RET_LOG(ret == 0, false, "ActivateAudioInterrupt Failed");
647
648 // When the cellular call stream is starting, only need to activate audio interrupt.
649 CHECK_AND_RETURN_RET(!isVoiceCallCapturer_, true);
650 CHECK_AND_RETURN_RET(audioStream_ != nullptr, false, "audioStream_ is null");
651 bool result = audioStream_->StartAudioStream();
652 if (!result) {
653 AUDIO_ERR_LOG("Start audio stream failed");
654 ret = AudioPolicyManager::GetInstance().DeactivateAudioInterrupt(audioInterrupt_);
655 if (ret != 0) {
656 AUDIO_WARNING_LOG("DeactivateAudioInterrupt Failed");
657 }
658 }
659
660 return result;
661 }
662
Read(uint8_t & buffer,size_t userSize,bool isBlockingRead)663 int32_t AudioCapturerPrivate::Read(uint8_t &buffer, size_t userSize, bool isBlockingRead)
664 {
665 Trace trace("AudioCapturer::Read");
666 CheckSignalData(&buffer, userSize);
667 CheckAndRestoreAudioCapturer("Read");
668 std::shared_ptr<IAudioStream> currentStream = GetInnerStream();
669 CHECK_AND_RETURN_RET_LOG(currentStream != nullptr, ERROR_ILLEGAL_STATE, "audioStream_ is nullptr");
670 int size = currentStream->Read(buffer, userSize, isBlockingRead);
671 if (size > 0) {
672 DumpFileUtil::WriteDumpFile(dumpFile_, static_cast<void *>(&buffer), size);
673 }
674 return size;
675 }
676
GetStatus() const677 CapturerState AudioCapturerPrivate::GetStatus() const
678 {
679 std::shared_ptr<IAudioStream> currentStream = GetInnerStream();
680 CHECK_AND_RETURN_RET_LOG(currentStream != nullptr, CAPTURER_INVALID, "audioStream_ is nullptr");
681 return static_cast<CapturerState>(currentStream->GetState());
682 }
683
GetAudioTime(Timestamp & timestamp,Timestamp::Timestampbase base) const684 bool AudioCapturerPrivate::GetAudioTime(Timestamp ×tamp, Timestamp::Timestampbase base) const
685 {
686 std::shared_ptr<IAudioStream> currentStream = GetInnerStream();
687 CHECK_AND_RETURN_RET_LOG(currentStream != nullptr, false, "audioStream_ is nullptr");
688 return currentStream->GetAudioTime(timestamp, base);
689 }
690
Pause() const691 bool AudioCapturerPrivate::Pause() const
692 {
693 std::lock_guard lock(capturerMutex_);
694 Trace trace("AudioCapturer::Pause");
695 AUDIO_INFO_LOG("StreamClientState for Capturer::Pause. id %{public}u", sessionID_);
696 CHECK_AND_RETURN_RET_LOG(!isSwitching_, false, "Operation failed, in switching");
697
698 // When user is intentionally pausing , Deactivate to remove from audio focus info list
699 int32_t ret = AudioPolicyManager::GetInstance().DeactivateAudioInterrupt(audioInterrupt_);
700 if (ret != 0) {
701 AUDIO_WARNING_LOG("AudioRenderer: DeactivateAudioInterrupt Failed");
702 }
703
704 // When the cellular call stream is pausing, only need to deactivate audio interrupt.
705 CHECK_AND_RETURN_RET(!isVoiceCallCapturer_, true);
706 return audioStream_->PauseAudioStream();
707 }
708
Stop() const709 bool AudioCapturerPrivate::Stop() const
710 {
711 std::lock_guard lock(capturerMutex_);
712 Trace trace("AudioCapturer::Stop");
713 AUDIO_INFO_LOG("StreamClientState for Capturer::Stop. id %{public}u", sessionID_);
714 CHECK_AND_RETURN_RET_LOG(!isSwitching_, false, "Operation failed, in switching");
715
716 WriteOverflowEvent();
717 int32_t ret = AudioPolicyManager::GetInstance().DeactivateAudioInterrupt(audioInterrupt_);
718 if (ret != 0) {
719 AUDIO_WARNING_LOG("AudioCapturer: DeactivateAudioInterrupt Failed");
720 }
721
722 CHECK_AND_RETURN_RET(isVoiceCallCapturer_ != true, true);
723
724 return audioStream_->StopAudioStream();
725 }
726
Flush() const727 bool AudioCapturerPrivate::Flush() const
728 {
729 Trace trace("AudioCapturer::Flush");
730 std::shared_ptr<IAudioStream> currentStream = GetInnerStream();
731 CHECK_AND_RETURN_RET_LOG(currentStream != nullptr, ERROR_ILLEGAL_STATE, "audioStream_ is nullptr");
732 AUDIO_INFO_LOG("StreamClientState for Capturer::Flush. id %{public}u", sessionID_);
733 return currentStream->FlushAudioStream();
734 }
735
Release()736 bool AudioCapturerPrivate::Release()
737 {
738 AUDIO_INFO_LOG("StreamClientState for Capturer::Release. id %{public}u", sessionID_);
739 std::lock_guard<std::shared_mutex> releaseLock(capturerMutex_);
740
741 abortRestore_ = true;
742 std::lock_guard<std::mutex> lock(lock_);
743 CHECK_AND_RETURN_RET_LOG(isValid_, false, "Release when capturer invalid");
744
745 (void)AudioPolicyManager::GetInstance().DeactivateAudioInterrupt(audioInterrupt_);
746
747 // Unregister the callaback in policy server
748 (void)AudioPolicyManager::GetInstance().UnsetAudioInterruptCallback(sessionID_);
749
750 std::shared_ptr<AudioCapturerConcurrencyCallbackImpl> cb = audioConcurrencyCallback_;
751 if (cb != nullptr) {
752 cb->UnsetAudioCapturerObj();
753 AudioPolicyManager::GetInstance().UnsetAudioConcurrencyCallback(sessionID_);
754 }
755
756 RemoveCapturerPolicyServiceDiedCallback();
757
758 return audioStream_->ReleaseAudioStream();
759 }
760
GetBufferSize(size_t & bufferSize) const761 int32_t AudioCapturerPrivate::GetBufferSize(size_t &bufferSize) const
762 {
763 Trace trace("AudioCapturer::GetBufferSize");
764 std::shared_ptr<IAudioStream> currentStream = GetInnerStream();
765 CHECK_AND_RETURN_RET_LOG(currentStream != nullptr, ERROR_ILLEGAL_STATE, "audioStream_ is nullptr");
766 return currentStream->GetBufferSize(bufferSize);
767 }
768
GetAudioStreamId(uint32_t & sessionID) const769 int32_t AudioCapturerPrivate::GetAudioStreamId(uint32_t &sessionID) const
770 {
771 std::shared_ptr<IAudioStream> currentStream = GetInnerStream();
772 CHECK_AND_RETURN_RET_LOG(currentStream != nullptr, ERR_INVALID_HANDLE, "GetAudioStreamId faied.");
773 return currentStream->GetAudioSessionID(sessionID);
774 }
775
SetBufferDuration(uint64_t bufferDuration) const776 int32_t AudioCapturerPrivate::SetBufferDuration(uint64_t bufferDuration) const
777 {
778 CHECK_AND_RETURN_RET_LOG(bufferDuration >= MINIMUM_BUFFER_SIZE_MSEC && bufferDuration <= MAXIMUM_BUFFER_SIZE_MSEC,
779 ERR_INVALID_PARAM, "Error: Please set the buffer duration between 5ms ~ 20ms");
780 std::shared_ptr<IAudioStream> currentStream = GetInnerStream();
781 CHECK_AND_RETURN_RET_LOG(currentStream != nullptr, ERROR_ILLEGAL_STATE, "audioStream_ is nullptr");
782 return currentStream->SetBufferSizeInMsec(bufferDuration);
783 }
784
785 // diffrence from GetAudioPosition only when set speed
GetAudioTimestampInfo(Timestamp & timestamp,Timestamp::Timestampbase base) const786 int32_t AudioCapturerPrivate::GetAudioTimestampInfo(Timestamp ×tamp, Timestamp::Timestampbase base) const
787 {
788 CHECK_AND_RETURN_RET_LOG(audioStream_ != nullptr, ERROR_ILLEGAL_STATE, "audioStream_ is nullptr");
789 return audioStream_->GetAudioTimestampInfo(timestamp, base);
790 }
791
AudioCapturerInterruptCallbackImpl(const std::shared_ptr<IAudioStream> & audioStream)792 AudioCapturerInterruptCallbackImpl::AudioCapturerInterruptCallbackImpl(const std::shared_ptr<IAudioStream> &audioStream)
793 : audioStream_(audioStream)
794 {
795 AUDIO_DEBUG_LOG("AudioCapturerInterruptCallbackImpl constructor");
796 }
797
~AudioCapturerInterruptCallbackImpl()798 AudioCapturerInterruptCallbackImpl::~AudioCapturerInterruptCallbackImpl()
799 {
800 AUDIO_DEBUG_LOG("AudioCapturerInterruptCallbackImpl: instance destroy");
801 }
802
SaveCallback(const std::weak_ptr<AudioCapturerCallback> & callback)803 void AudioCapturerInterruptCallbackImpl::SaveCallback(const std::weak_ptr<AudioCapturerCallback> &callback)
804 {
805 callback_ = callback;
806 }
807
UpdateAudioStream(const std::shared_ptr<IAudioStream> & audioStream)808 void AudioCapturerInterruptCallbackImpl::UpdateAudioStream(const std::shared_ptr<IAudioStream> &audioStream)
809 {
810 std::lock_guard<std::mutex> lock(mutex_);
811 audioStream_ = audioStream;
812 }
813
StartSwitch()814 void AudioCapturerInterruptCallbackImpl::StartSwitch()
815 {
816 std::lock_guard<std::mutex> lock(mutex_);
817 switching_ = true;
818 AUDIO_INFO_LOG("SwitchStream start, block interrupt callback");
819 }
820
FinishSwitch()821 void AudioCapturerInterruptCallbackImpl::FinishSwitch()
822 {
823 std::lock_guard<std::mutex> lock(mutex_);
824 switching_ = false;
825 switchStreamCv_.notify_all();
826 AUDIO_INFO_LOG("SwitchStream finish, notify interrupt callback");
827 }
828
NotifyEvent(const InterruptEvent & interruptEvent)829 void AudioCapturerInterruptCallbackImpl::NotifyEvent(const InterruptEvent &interruptEvent)
830 {
831 AUDIO_INFO_LOG("NotifyEvent: Hint: %{public}d, eventType: %{public}d",
832 interruptEvent.hintType, interruptEvent.eventType);
833
834 if (cb_ != nullptr) {
835 cb_->OnInterrupt(interruptEvent);
836 AUDIO_DEBUG_LOG("OnInterrupt : NotifyEvent to app complete");
837 } else {
838 AUDIO_DEBUG_LOG("cb_ == nullptr cannont NotifyEvent to app");
839 }
840 }
841
NotifyForcePausedToResume(const InterruptEventInternal & interruptEvent)842 void AudioCapturerInterruptCallbackImpl::NotifyForcePausedToResume(const InterruptEventInternal &interruptEvent)
843 {
844 // Change InterruptForceType to Share, Since app will take care of resuming
845 InterruptEvent interruptEventResume {interruptEvent.eventType, INTERRUPT_SHARE,
846 interruptEvent.hintType};
847 NotifyEvent(interruptEventResume);
848 }
849
HandleAndNotifyForcedEvent(const InterruptEventInternal & interruptEvent)850 void AudioCapturerInterruptCallbackImpl::HandleAndNotifyForcedEvent(const InterruptEventInternal &interruptEvent)
851 {
852 State currentState = audioStream_->GetState();
853 switch (interruptEvent.hintType) {
854 case INTERRUPT_HINT_RESUME:
855 CHECK_AND_RETURN_LOG((currentState == PAUSED || currentState == PREPARED) && isForcePaused_ == true,
856 "OnInterrupt state %{public}d or not forced pause %{public}d before", currentState, isForcePaused_);
857 AUDIO_INFO_LOG("set force pause false");
858 isForcePaused_ = false;
859 NotifyForcePausedToResume(interruptEvent);
860 return;
861 case INTERRUPT_HINT_PAUSE:
862 CHECK_AND_RETURN_LOG(currentState == RUNNING || currentState == PREPARED,
863 "OnInterrupt state %{public}d, no need to pause", currentState);
864 (void)audioStream_->PauseAudioStream(); // Just Pause, do not deactivate here
865 AUDIO_INFO_LOG("set force pause true");
866 isForcePaused_ = true;
867 break;
868 case INTERRUPT_HINT_STOP:
869 (void)audioStream_->StopAudioStream();
870 break;
871 default:
872 break;
873 }
874 // Notify valid forced event callbacks to app
875 InterruptEvent interruptEventForced {interruptEvent.eventType, interruptEvent.forceType, interruptEvent.hintType};
876 NotifyEvent(interruptEventForced);
877 }
878
OnInterrupt(const InterruptEventInternal & interruptEvent)879 void AudioCapturerInterruptCallbackImpl::OnInterrupt(const InterruptEventInternal &interruptEvent)
880 {
881 std::unique_lock<std::mutex> lock(mutex_);
882
883 if (switching_) {
884 AUDIO_INFO_LOG("Wait for SwitchStream");
885 bool ret = switchStreamCv_.wait_for(lock, std::chrono::milliseconds(BLOCK_INTERRUPT_CALLBACK_IN_MS),
886 [this] {return !switching_;});
887 if (!ret) {
888 switching_ = false;
889 AUDIO_WARNING_LOG("Wait for SwitchStream time out, could handle interrupt event with old stream");
890 }
891 }
892 cb_ = callback_.lock();
893 InterruptForceType forceType = interruptEvent.forceType;
894 AUDIO_INFO_LOG("InterruptForceType: %{public}d", forceType);
895
896 if (forceType != INTERRUPT_FORCE) { // INTERRUPT_SHARE
897 AUDIO_DEBUG_LOG("AudioCapturerPrivate ForceType: INTERRUPT_SHARE. Let app handle the event");
898 InterruptEvent interruptEventShared {interruptEvent.eventType, interruptEvent.forceType,
899 interruptEvent.hintType};
900 NotifyEvent(interruptEventShared);
901 return;
902 }
903
904 CHECK_AND_RETURN_LOG(audioStream_ != nullptr,
905 "Stream is not alive. No need to take forced action");
906
907 HandleAndNotifyForcedEvent(interruptEvent);
908 }
909
AudioStreamCallbackCapturer(std::weak_ptr<AudioCapturerPrivate> capturer)910 AudioStreamCallbackCapturer::AudioStreamCallbackCapturer(std::weak_ptr<AudioCapturerPrivate> capturer)
911 : capturer_(capturer)
912 {
913 }
914
SaveCallback(const std::weak_ptr<AudioCapturerCallback> & callback)915 void AudioStreamCallbackCapturer::SaveCallback(const std::weak_ptr<AudioCapturerCallback> &callback)
916 {
917 callback_ = callback;
918 }
919
OnStateChange(const State state,const StateChangeCmdType cmdType)920 void AudioStreamCallbackCapturer::OnStateChange(const State state,
921 const StateChangeCmdType __attribute__((unused)) cmdType)
922 {
923 std::shared_ptr<AudioCapturerPrivate> capturerObj = capturer_.lock();
924 CHECK_AND_RETURN_LOG(capturerObj != nullptr, "capturerObj is nullptr");
925 std::shared_ptr<AudioCapturerCallback> cb = callback_.lock();
926 CHECK_AND_RETURN_LOG(cb != nullptr, "AudioStreamCallbackCapturer::OnStateChange cb == nullptr.");
927
928 auto captureState = static_cast<CapturerState>(state);
929 cb->OnStateChange(captureState);
930
931 AudioInterrupt audioInterrupt;
932 capturerObj->GetAudioInterrupt(audioInterrupt);
933 audioInterrupt.state = state;
934 capturerObj->SetAudioInterrupt(audioInterrupt);
935 }
936
GetSupportedFormats()937 std::vector<AudioSampleFormat> AudioCapturer::GetSupportedFormats()
938 {
939 return AUDIO_SUPPORTED_FORMATS;
940 }
941
GetSupportedChannels()942 std::vector<AudioChannel> AudioCapturer::GetSupportedChannels()
943 {
944 return CAPTURER_SUPPORTED_CHANNELS;
945 }
946
GetSupportedEncodingTypes()947 std::vector<AudioEncodingType> AudioCapturer::GetSupportedEncodingTypes()
948 {
949 return AUDIO_SUPPORTED_ENCODING_TYPES;
950 }
951
GetSupportedSamplingRates()952 std::vector<AudioSamplingRate> AudioCapturer::GetSupportedSamplingRates()
953 {
954 return AUDIO_SUPPORTED_SAMPLING_RATES;
955 }
956
FindStreamTypeBySourceType(SourceType sourceType)957 AudioStreamType AudioCapturer::FindStreamTypeBySourceType(SourceType sourceType)
958 {
959 switch (sourceType) {
960 case SOURCE_TYPE_VOICE_COMMUNICATION:
961 case SOURCE_TYPE_VIRTUAL_CAPTURE:
962 return STREAM_VOICE_CALL;
963 case SOURCE_TYPE_WAKEUP:
964 return STREAM_WAKEUP;
965 case SOURCE_TYPE_VOICE_CALL:
966 return STREAM_SOURCE_VOICE_CALL;
967 case SOURCE_TYPE_CAMCORDER:
968 return STREAM_CAMCORDER;
969 default:
970 return STREAM_MUSIC;
971 }
972 }
973
SetAudioSourceConcurrency(const std::vector<SourceType> & targetSources)974 int32_t AudioCapturerPrivate::SetAudioSourceConcurrency(const std::vector<SourceType> &targetSources)
975 {
976 if (targetSources.size() <= 0) {
977 AUDIO_ERR_LOG("TargetSources size is 0, set audio source concurrency failed.");
978 return ERR_INVALID_PARAM;
979 }
980 AUDIO_INFO_LOG("Set audio source concurrency success.");
981 audioInterrupt_.currencySources.sourcesTypes = targetSources;
982 return SUCCESS;
983 }
984
SetCaptureMode(AudioCaptureMode captureMode)985 int32_t AudioCapturerPrivate::SetCaptureMode(AudioCaptureMode captureMode)
986 {
987 AUDIO_INFO_LOG("Capture mode: %{public}d", captureMode);
988 audioCaptureMode_ = captureMode;
989 std::shared_ptr<IAudioStream> currentStream = GetInnerStream();
990 CHECK_AND_RETURN_RET_LOG(currentStream != nullptr, ERROR_ILLEGAL_STATE, "audioStream_ is nullptr");
991 if (capturerInfo_.sourceType == SOURCE_TYPE_VOICE_COMMUNICATION && captureMode == CAPTURE_MODE_CALLBACK &&
992 AudioPolicyManager::GetInstance().GetPreferredInputStreamType(capturerInfo_) == AUDIO_FLAG_VOIP_FAST &&
993 firstConcurrencyResult_ == SUCCESS) {
994 AUDIO_INFO_LOG("Switch to fast voip stream");
995 uint32_t sessionId = 0;
996 int32_t ret = currentStream->GetAudioSessionID(sessionId);
997 CHECK_AND_RETURN_RET_LOG(ret == SUCCESS, ret, "Get audio session Id failed");
998 RestoreInfo restoreInfo;
999 if (!SwitchToTargetStream(IAudioStream::VOIP_STREAM, restoreInfo)) {
1000 AUDIO_ERR_LOG("Switch to target stream failed");
1001 return ERROR;
1002 }
1003 // audioStream_ has been updated by SwitchToTargetStream. Update currentStream before SetRenderMode.
1004 currentStream = GetInnerStream();
1005 }
1006
1007 return currentStream->SetCaptureMode(captureMode);
1008 }
1009
GetCaptureMode() const1010 AudioCaptureMode AudioCapturerPrivate::GetCaptureMode() const
1011 {
1012 std::shared_ptr<IAudioStream> currentStream = GetInnerStream();
1013 CHECK_AND_RETURN_RET_LOG(currentStream != nullptr, CAPTURE_MODE_NORMAL, "audioStream_ is nullptr");
1014 return currentStream->GetCaptureMode();
1015 }
1016
SetCapturerReadCallback(const std::shared_ptr<AudioCapturerReadCallback> & callback)1017 int32_t AudioCapturerPrivate::SetCapturerReadCallback(const std::shared_ptr<AudioCapturerReadCallback> &callback)
1018 {
1019 std::shared_ptr<IAudioStream> currentStream = GetInnerStream();
1020 CHECK_AND_RETURN_RET_LOG(currentStream != nullptr, ERROR_ILLEGAL_STATE, "audioStream_ is nullptr");
1021 return currentStream->SetCapturerReadCallback(callback);
1022 }
1023
GetBufferDesc(BufferDesc & bufDesc)1024 int32_t AudioCapturerPrivate::GetBufferDesc(BufferDesc &bufDesc)
1025 {
1026 CheckAndRestoreAudioCapturer("GetBufferDesc");
1027 std::shared_ptr<IAudioStream> currentStream = GetInnerStream();
1028 CHECK_AND_RETURN_RET_LOG(currentStream != nullptr, ERROR_ILLEGAL_STATE, "audioStream_ is nullptr");
1029 int32_t ret = currentStream->GetBufferDesc(bufDesc);
1030 DumpFileUtil::WriteDumpFile(dumpFile_, static_cast<void *>(bufDesc.buffer), bufDesc.bufLength);
1031 return ret;
1032 }
1033
Enqueue(const BufferDesc & bufDesc)1034 int32_t AudioCapturerPrivate::Enqueue(const BufferDesc &bufDesc)
1035 {
1036 CheckAndRestoreAudioCapturer("Enqueue");
1037 std::shared_ptr<IAudioStream> currentStream = GetInnerStream();
1038 CHECK_AND_RETURN_RET_LOG(currentStream != nullptr, ERROR_ILLEGAL_STATE, "audioStream_ is nullptr");
1039 CheckSignalData(bufDesc.buffer, bufDesc.bufLength);
1040 return currentStream->Enqueue(bufDesc);
1041 }
1042
Clear() const1043 int32_t AudioCapturerPrivate::Clear() const
1044 {
1045 std::shared_ptr<IAudioStream> currentStream = GetInnerStream();
1046 CHECK_AND_RETURN_RET_LOG(currentStream != nullptr, ERROR_ILLEGAL_STATE, "audioStream_ is nullptr");
1047 return currentStream->Clear();
1048 }
1049
GetBufQueueState(BufferQueueState & bufState) const1050 int32_t AudioCapturerPrivate::GetBufQueueState(BufferQueueState &bufState) const
1051 {
1052 std::shared_ptr<IAudioStream> currentStream = GetInnerStream();
1053 CHECK_AND_RETURN_RET_LOG(currentStream != nullptr, ERROR_ILLEGAL_STATE, "audioStream_ is nullptr");
1054 return currentStream->GetBufQueueState(bufState);
1055 }
1056
SetValid(bool valid)1057 void AudioCapturerPrivate::SetValid(bool valid)
1058 {
1059 std::lock_guard<std::mutex> lock(lock_);
1060 isValid_ = valid;
1061 }
1062
GetFramesRead() const1063 int64_t AudioCapturerPrivate::GetFramesRead() const
1064 {
1065 std::shared_ptr<IAudioStream> currentStream = GetInnerStream();
1066 CHECK_AND_RETURN_RET_LOG(currentStream != nullptr, ERROR_ILLEGAL_STATE, "audioStream_ is nullptr");
1067 return currentStream->GetFramesRead();
1068 }
1069
GetCurrentInputDevices(AudioDeviceDescriptor & deviceInfo) const1070 int32_t AudioCapturerPrivate::GetCurrentInputDevices(AudioDeviceDescriptor &deviceInfo) const
1071 {
1072 std::vector<std::shared_ptr<AudioCapturerChangeInfo>> audioCapturerChangeInfos;
1073 uint32_t sessionId = static_cast<uint32_t>(-1);
1074 int32_t ret = GetAudioStreamId(sessionId);
1075 CHECK_AND_RETURN_RET_LOG(!ret, ret, "Get sessionId failed");
1076
1077 ret = AudioPolicyManager::GetInstance().GetCurrentCapturerChangeInfos(audioCapturerChangeInfos);
1078 CHECK_AND_RETURN_RET_LOG(!ret, ret, "Get current capturer devices failed");
1079
1080 for (auto it = audioCapturerChangeInfos.begin(); it != audioCapturerChangeInfos.end(); it++) {
1081 if ((*it)->sessionId == static_cast<int32_t>(sessionId)) {
1082 deviceInfo = (*it)->inputDeviceInfo;
1083 }
1084 }
1085 return SUCCESS;
1086 }
1087
GetCurrentCapturerChangeInfo(AudioCapturerChangeInfo & changeInfo) const1088 int32_t AudioCapturerPrivate::GetCurrentCapturerChangeInfo(AudioCapturerChangeInfo &changeInfo) const
1089 {
1090 std::vector<std::shared_ptr<AudioCapturerChangeInfo>> audioCapturerChangeInfos;
1091 uint32_t sessionId = static_cast<uint32_t>(-1);
1092 int32_t ret = GetAudioStreamId(sessionId);
1093 CHECK_AND_RETURN_RET_LOG(!ret, ret, "Get sessionId failed");
1094
1095 ret = AudioPolicyManager::GetInstance().GetCurrentCapturerChangeInfos(audioCapturerChangeInfos);
1096 CHECK_AND_RETURN_RET_LOG(!ret, ret, "Get current capturer devices failed");
1097
1098 for (auto it = audioCapturerChangeInfos.begin(); it != audioCapturerChangeInfos.end(); it++) {
1099 if ((*it)->sessionId == static_cast<int32_t>(sessionId)) {
1100 changeInfo = *(*it);
1101 }
1102 }
1103 return SUCCESS;
1104 }
1105
GetCurrentMicrophones() const1106 std::vector<sptr<MicrophoneDescriptor>> AudioCapturerPrivate::GetCurrentMicrophones() const
1107 {
1108 uint32_t sessionId = static_cast<uint32_t>(-1);
1109 GetAudioStreamId(sessionId);
1110 return AudioPolicyManager::GetInstance().GetAudioCapturerMicrophoneDescriptors(static_cast<int32_t>(sessionId));
1111 }
1112
SetAudioCapturerDeviceChangeCallback(const std::shared_ptr<AudioCapturerDeviceChangeCallback> & callback)1113 int32_t AudioCapturerPrivate::SetAudioCapturerDeviceChangeCallback(
1114 const std::shared_ptr<AudioCapturerDeviceChangeCallback> &callback)
1115 {
1116 CHECK_AND_RETURN_RET_LOG(callback != nullptr, ERROR, "Callback is null");
1117
1118 if (RegisterAudioCapturerEventListener() != SUCCESS) {
1119 return ERROR;
1120 }
1121
1122 CHECK_AND_RETURN_RET_LOG(audioStateChangeCallback_ != nullptr, ERROR, "audioStateChangeCallback_ is null");
1123 audioStateChangeCallback_->SaveDeviceChangeCallback(callback);
1124 return SUCCESS;
1125 }
1126
RemoveAudioCapturerDeviceChangeCallback(const std::shared_ptr<AudioCapturerDeviceChangeCallback> & callback)1127 int32_t AudioCapturerPrivate::RemoveAudioCapturerDeviceChangeCallback(
1128 const std::shared_ptr<AudioCapturerDeviceChangeCallback> &callback)
1129 {
1130 CHECK_AND_RETURN_RET_LOG(audioStateChangeCallback_ != nullptr, ERROR, "audioStateChangeCallback_ is null");
1131
1132 audioStateChangeCallback_->RemoveDeviceChangeCallback(callback);
1133 if (UnregisterAudioCapturerEventListener() != SUCCESS) {
1134 return ERROR;
1135 }
1136 return SUCCESS;
1137 }
1138
IsDeviceChanged(AudioDeviceDescriptor & newDeviceInfo)1139 bool AudioCapturerPrivate::IsDeviceChanged(AudioDeviceDescriptor &newDeviceInfo)
1140 {
1141 bool deviceUpdated = false;
1142 AudioDeviceDescriptor deviceInfo(AudioDeviceDescriptor::DEVICE_INFO);
1143
1144 CHECK_AND_RETURN_RET_LOG(GetCurrentInputDevicesInner(deviceInfo) == SUCCESS, deviceUpdated,
1145 "GetCurrentInputDevices failed");
1146
1147 if (currentDeviceInfo_.deviceType_ != deviceInfo.deviceType_) {
1148 currentDeviceInfo_ = deviceInfo;
1149 newDeviceInfo = currentDeviceInfo_;
1150 deviceUpdated = true;
1151 }
1152 return deviceUpdated;
1153 }
1154
GetAudioInterrupt(AudioInterrupt & audioInterrupt)1155 void AudioCapturerPrivate::GetAudioInterrupt(AudioInterrupt &audioInterrupt)
1156 {
1157 audioInterrupt = audioInterrupt_;
1158 }
1159
SetAudioInterrupt(const AudioInterrupt & audioInterrupt)1160 void AudioCapturerPrivate::SetAudioInterrupt(const AudioInterrupt &audioInterrupt)
1161 {
1162 audioInterrupt_ = audioInterrupt;
1163 }
1164
1165 // Inner function. Must be called with AudioCapturerPrivate::capturerMutex_ held
WriteOverflowEvent() const1166 void AudioCapturerPrivate::WriteOverflowEvent() const
1167 {
1168 AUDIO_INFO_LOG("Write overflowEvent to media monitor");
1169 if (GetOverflowCountInner() < WRITE_OVERFLOW_NUM) {
1170 return;
1171 }
1172 AudioPipeType pipeType = PIPE_TYPE_NORMAL_IN;
1173 IAudioStream::StreamClass streamClass = audioStream_->GetStreamClass();
1174 if (streamClass == IAudioStream::FAST_STREAM) {
1175 pipeType = PIPE_TYPE_LOWLATENCY_IN;
1176 }
1177 std::shared_ptr<Media::MediaMonitor::EventBean> bean = std::make_shared<Media::MediaMonitor::EventBean>(
1178 Media::MediaMonitor::ModuleId::AUDIO, Media::MediaMonitor::EventId::PERFORMANCE_UNDER_OVERRUN_STATS,
1179 Media::MediaMonitor::EventType::FREQUENCY_AGGREGATION_EVENT);
1180 bean->Add("IS_PLAYBACK", 0);
1181 bean->Add("CLIENT_UID", appInfo_.appUid);
1182 bean->Add("PIPE_TYPE", pipeType);
1183 bean->Add("STREAM_TYPE", capturerInfo_.sourceType);
1184 Media::MediaMonitor::MediaMonitorManager::GetInstance().WriteLogMsg(bean);
1185 }
1186
RegisterAudioCapturerEventListener()1187 int32_t AudioCapturerPrivate::RegisterAudioCapturerEventListener()
1188 {
1189 if (!audioStateChangeCallback_) {
1190 audioStateChangeCallback_ = std::make_shared<AudioCapturerStateChangeCallbackImpl>();
1191 CHECK_AND_RETURN_RET_LOG(audioStateChangeCallback_, ERROR, "Memory allocation failed!!");
1192
1193 int32_t ret =
1194 AudioPolicyManager::GetInstance().RegisterAudioCapturerEventListener(getpid(), audioStateChangeCallback_);
1195 CHECK_AND_RETURN_RET_LOG(ret == 0, ERROR, "RegisterAudioCapturerEventListener failed");
1196 audioStateChangeCallback_->setAudioCapturerObj(this);
1197 }
1198 return SUCCESS;
1199 }
1200
UnregisterAudioCapturerEventListener()1201 int32_t AudioCapturerPrivate::UnregisterAudioCapturerEventListener()
1202 {
1203 CHECK_AND_RETURN_RET_LOG(audioStateChangeCallback_ != nullptr, ERROR, "audioStateChangeCallback_ is null");
1204 if (audioStateChangeCallback_->DeviceChangeCallbackArraySize() == 0 &&
1205 audioStateChangeCallback_->GetCapturerInfoChangeCallbackArraySize() == 0) {
1206 int32_t ret =
1207 AudioPolicyManager::GetInstance().UnregisterAudioCapturerEventListener(getpid());
1208 CHECK_AND_RETURN_RET_LOG(ret == 0, ERROR, "failed");
1209 audioStateChangeCallback_->HandleCapturerDestructor();
1210 audioStateChangeCallback_ = nullptr;
1211 }
1212 return SUCCESS;
1213 }
1214
SetAudioCapturerInfoChangeCallback(const std::shared_ptr<AudioCapturerInfoChangeCallback> & callback)1215 int32_t AudioCapturerPrivate::SetAudioCapturerInfoChangeCallback(
1216 const std::shared_ptr<AudioCapturerInfoChangeCallback> &callback)
1217 {
1218 CHECK_AND_RETURN_RET_LOG(callback != nullptr, ERR_INVALID_PARAM, "Callback is null");
1219
1220 CHECK_AND_RETURN_RET(RegisterAudioCapturerEventListener() == SUCCESS, ERROR);
1221
1222 CHECK_AND_RETURN_RET_LOG(audioStateChangeCallback_ != nullptr, ERROR, "audioStateChangeCallback_ is null");
1223 audioStateChangeCallback_->SaveCapturerInfoChangeCallback(callback);
1224 return SUCCESS;
1225 }
1226
RemoveAudioCapturerInfoChangeCallback(const std::shared_ptr<AudioCapturerInfoChangeCallback> & callback)1227 int32_t AudioCapturerPrivate::RemoveAudioCapturerInfoChangeCallback(
1228 const std::shared_ptr<AudioCapturerInfoChangeCallback> &callback)
1229 {
1230 CHECK_AND_RETURN_RET_LOG(audioStateChangeCallback_ != nullptr, ERROR, "audioStateChangeCallback_ is null");
1231 audioStateChangeCallback_->RemoveCapturerInfoChangeCallback(callback);
1232 CHECK_AND_RETURN_RET(UnregisterAudioCapturerEventListener() == SUCCESS, ERROR);
1233 return SUCCESS;
1234 }
1235
RegisterCapturerPolicyServiceDiedCallback()1236 int32_t AudioCapturerPrivate::RegisterCapturerPolicyServiceDiedCallback()
1237 {
1238 std::lock_guard<std::mutex> lock(capturerPolicyServiceDiedCbMutex_);
1239 AUDIO_DEBUG_LOG("AudioCapturerPrivate::SetCapturerPolicyServiceDiedCallback");
1240 if (!audioPolicyServiceDiedCallback_) {
1241 audioPolicyServiceDiedCallback_ = std::make_shared<CapturerPolicyServiceDiedCallback>();
1242 if (!audioPolicyServiceDiedCallback_) {
1243 AUDIO_ERR_LOG("Memory allocation failed!!");
1244 return ERROR;
1245 }
1246 AudioPolicyManager::GetInstance().RegisterAudioStreamPolicyServerDiedCb(audioPolicyServiceDiedCallback_);
1247 audioPolicyServiceDiedCallback_->SetAudioCapturerObj(this);
1248 audioPolicyServiceDiedCallback_->SetAudioInterrupt(audioInterrupt_);
1249 }
1250 return SUCCESS;
1251 }
1252
RemoveCapturerPolicyServiceDiedCallback()1253 int32_t AudioCapturerPrivate::RemoveCapturerPolicyServiceDiedCallback()
1254 {
1255 std::lock_guard<std::mutex> lock(capturerPolicyServiceDiedCbMutex_);
1256 AUDIO_DEBUG_LOG("AudioCapturerPrivate::RemoveCapturerPolicyServiceDiedCallback");
1257 if (audioPolicyServiceDiedCallback_) {
1258 int32_t ret = AudioPolicyManager::GetInstance().UnregisterAudioStreamPolicyServerDiedCb(
1259 audioPolicyServiceDiedCallback_);
1260 if (ret != 0) {
1261 AUDIO_ERR_LOG("RemoveCapturerPolicyServiceDiedCallback failed");
1262 audioPolicyServiceDiedCallback_ = nullptr;
1263 return ERROR;
1264 }
1265 }
1266 audioPolicyServiceDiedCallback_ = nullptr;
1267 return SUCCESS;
1268 }
1269
GetOverflowCount() const1270 uint32_t AudioCapturerPrivate::GetOverflowCount() const
1271 {
1272 std::shared_ptr<IAudioStream> currentStream = GetInnerStream();
1273 CHECK_AND_RETURN_RET_LOG(currentStream != nullptr, ERROR_ILLEGAL_STATE, "audioStream_ is nullptr");
1274 return currentStream->GetOverflowCount();
1275 }
1276
SetSwitchInfo(IAudioStream::SwitchInfo info,std::shared_ptr<IAudioStream> audioStream)1277 int32_t AudioCapturerPrivate::SetSwitchInfo(IAudioStream::SwitchInfo info, std::shared_ptr<IAudioStream> audioStream)
1278 {
1279 CHECK_AND_RETURN_RET_LOG(audioStream, ERROR, "stream is nullptr");
1280
1281 audioStream->SetStreamTrackerState(false);
1282 audioStream->SetClientID(info.clientPid, info.clientUid, appInfo_.appTokenId, appInfo_.appFullTokenId);
1283 audioStream->SetCapturerInfo(info.capturerInfo);
1284 int32_t res = audioStream->SetAudioStreamInfo(info.params, capturerProxyObj_);
1285 CHECK_AND_RETURN_RET_LOG(res == SUCCESS, ERROR, "SetAudioStreamInfo failed");
1286 audioStream->SetCaptureMode(info.captureMode);
1287
1288 // set callback
1289 if ((info.renderPositionCb != nullptr) && (info.frameMarkPosition > 0)) {
1290 audioStream->SetRendererPositionCallback(info.frameMarkPosition, info.renderPositionCb);
1291 }
1292
1293 if ((info.capturePositionCb != nullptr) && (info.frameMarkPosition > 0)) {
1294 audioStream->SetCapturerPositionCallback(info.frameMarkPosition, info.capturePositionCb);
1295 }
1296
1297 if ((info.renderPeriodPositionCb != nullptr) && (info.framePeriodNumber > 0)) {
1298 audioStream->SetRendererPeriodPositionCallback(info.framePeriodNumber, info.renderPeriodPositionCb);
1299 }
1300
1301 if ((info.capturePeriodPositionCb != nullptr) && (info.framePeriodNumber > 0)) {
1302 audioStream->SetCapturerPeriodPositionCallback(info.framePeriodNumber, info.capturePeriodPositionCb);
1303 }
1304
1305 audioStream->SetCapturerReadCallback(info.capturerReadCallback);
1306
1307 audioStream->SetStreamCallback(info.audioStreamCallback);
1308 return SUCCESS;
1309 }
1310
InitSwitchInfo(IAudioStream::StreamClass targetClass,IAudioStream::SwitchInfo & switchInfo)1311 void AudioCapturerPrivate::InitSwitchInfo(IAudioStream::StreamClass targetClass, IAudioStream::SwitchInfo &switchInfo)
1312 {
1313 audioStream_->GetSwitchInfo(switchInfo);
1314
1315 if (targetClass == IAudioStream::VOIP_STREAM) {
1316 switchInfo.capturerInfo.originalFlag = AUDIO_FLAG_VOIP_FAST;
1317 }
1318 switchInfo.captureMode = audioCaptureMode_;
1319 switchInfo.params.originalSessionId = sessionID_;
1320 return;
1321 }
1322
FinishOldStream(IAudioStream::StreamClass targetClass,RestoreInfo restoreInfo,CapturerState previousState,IAudioStream::SwitchInfo & switchInfo)1323 bool AudioCapturerPrivate::FinishOldStream(IAudioStream::StreamClass targetClass, RestoreInfo restoreInfo,
1324 CapturerState previousState, IAudioStream::SwitchInfo &switchInfo)
1325 {
1326 bool switchResult = false;
1327 if (previousState == CAPTURER_RUNNING) {
1328 // stop old stream
1329 switchResult = audioStream_->StopAudioStream();
1330 if (restoreInfo.restoreReason != SERVER_DIED) {
1331 CHECK_AND_RETURN_RET_LOG(switchResult, false, "StopAudioStream failed.");
1332 }
1333 }
1334 // switch new stream
1335 InitSwitchInfo(targetClass, switchInfo);
1336
1337 // release old stream and restart audio stream
1338 switchResult = audioStream_->ReleaseAudioStream(true, true);
1339 if (restoreInfo.restoreReason != SERVER_DIED) {
1340 CHECK_AND_RETURN_RET_LOG(switchResult, false, "release old stream failed.");
1341 }
1342 return true;
1343 }
1344
GenerateNewStream(IAudioStream::StreamClass targetClass,RestoreInfo restoreInfo,CapturerState previousState,IAudioStream::SwitchInfo & switchInfo)1345 bool AudioCapturerPrivate::GenerateNewStream(IAudioStream::StreamClass targetClass, RestoreInfo restoreInfo,
1346 CapturerState previousState, IAudioStream::SwitchInfo &switchInfo)
1347 {
1348 bool switchResult = false;
1349 std::shared_ptr<IAudioStream> newAudioStream = IAudioStream::GetRecordStream(targetClass, switchInfo.params,
1350 switchInfo.eStreamType, appInfo_.appPid);
1351 CHECK_AND_RETURN_RET_LOG(newAudioStream != nullptr, false, "GetRecordStream failed.");
1352 AUDIO_INFO_LOG("Get new stream success!");
1353
1354 // set new stream info
1355 int32_t initResult = SetSwitchInfo(switchInfo, newAudioStream);
1356 if (initResult != SUCCESS && switchInfo.capturerInfo.originalFlag != AUDIO_FLAG_NORMAL) {
1357 AUDIO_ERR_LOG("Re-create stream failed, crate normal ipc stream");
1358 newAudioStream = IAudioStream::GetRecordStream(IAudioStream::PA_STREAM, switchInfo.params,
1359 switchInfo.eStreamType, appInfo_.appPid);
1360 CHECK_AND_RETURN_RET_LOG(newAudioStream != nullptr, false, "Get ipc stream failed");
1361 initResult = SetSwitchInfo(switchInfo, newAudioStream);
1362 CHECK_AND_RETURN_RET_LOG(initResult == SUCCESS, false, "Init ipc strean failed");
1363 }
1364
1365 if (previousState == CAPTURER_RUNNING) {
1366 // restart audio stream
1367 switchResult = newAudioStream->StartAudioStream();
1368 CHECK_AND_RETURN_RET_LOG(switchResult, false, "start new stream failed.");
1369 }
1370 audioStream_ = newAudioStream;
1371 if (audioInterruptCallback_ != nullptr) {
1372 std::shared_ptr<AudioCapturerInterruptCallbackImpl> interruptCbImpl =
1373 std::static_pointer_cast<AudioCapturerInterruptCallbackImpl>(audioInterruptCallback_);
1374 interruptCbImpl->UpdateAudioStream(audioStream_);
1375 }
1376 return true;
1377 }
1378
ContinueAfterConcede(IAudioStream::StreamClass & targetClass,RestoreInfo restoreInfo)1379 bool AudioCapturerPrivate::ContinueAfterConcede(IAudioStream::StreamClass &targetClass, RestoreInfo restoreInfo)
1380 {
1381 CHECK_AND_RETURN_RET(restoreInfo.restoreReason == STREAM_CONCEDED, true);
1382 targetClass = IAudioStream::PA_STREAM;
1383 if (audioStream_->GetStreamClass() == IAudioStream::PA_STREAM) {
1384 AUDIO_WARNING_LOG("Already pa stream, no need for concede");
1385 audioStream_->SetRestoreStatus(NO_NEED_FOR_RESTORE);
1386 return false;
1387 }
1388 AudioPipeType pipeType = PIPE_TYPE_NORMAL_IN;
1389 audioStream_->GetAudioPipeType(pipeType);
1390 AUDIO_INFO_LOG("session %{public}u concede from pipeType %{public}d", sessionID_, capturerInfo_.pipeType);
1391 if (pipeType == PIPE_TYPE_LOWLATENCY_IN || pipeType == PIPE_TYPE_CALL_IN) {
1392 return true;
1393 }
1394 audioStream_->SetRestoreStatus(NO_NEED_FOR_RESTORE);
1395 return false;
1396 }
1397
ContinueAfterSplit(RestoreInfo restoreInfo)1398 bool AudioCapturerPrivate::ContinueAfterSplit(RestoreInfo restoreInfo)
1399 {
1400 CHECK_AND_RETURN_RET(restoreInfo.restoreReason == STREAM_SPLIT, true);
1401 audioStream_->FetchDeviceForSplitStream();
1402 return false;
1403 }
1404
SwitchToTargetStream(IAudioStream::StreamClass targetClass,RestoreInfo restoreInfo)1405 bool AudioCapturerPrivate::SwitchToTargetStream(IAudioStream::StreamClass targetClass, RestoreInfo restoreInfo)
1406 {
1407 bool switchResult = false;
1408
1409 Trace trace("SwitchToTargetStream");
1410 AUDIO_INFO_LOG("Restore AudioCapturer %{public}u, target class %{public}d, reason: %{public}d, "
1411 "device change reason %{public}d, target flag %{public}d", sessionID_, targetClass,
1412 restoreInfo.restoreReason, restoreInfo.deviceChangeReason, restoreInfo.targetStreamFlag);
1413
1414 // Check if continue to switch after some concede operation.
1415 CHECK_AND_RETURN_RET_LOG(ContinueAfterConcede(targetClass, restoreInfo),
1416 true, "No need for switch");
1417 CHECK_AND_RETURN_RET(ContinueAfterSplit(restoreInfo), true, "Stream split");
1418
1419 isSwitching_ = true;
1420 CapturerState previousState = GetStatusInner();
1421 IAudioStream::SwitchInfo switchInfo;
1422
1423 // Stop old stream, get stream info and frames written for new stream, and release old stream.
1424 switchResult = FinishOldStream(targetClass, restoreInfo, previousState, switchInfo);
1425 CHECK_AND_RETURN_RET_LOG(switchResult, false, "Finish old stream failed");
1426
1427 // Create and start new stream.
1428 switchResult = GenerateNewStream(targetClass, restoreInfo, previousState, switchInfo);
1429 CHECK_AND_RETURN_RET_LOG(switchResult, false, "Generate new stream failed");
1430
1431 // Activate audio interrupt again when restoring for audio server died.
1432 if (restoreInfo.restoreReason == SERVER_DIED) {
1433 HandleAudioInterruptWhenServerDied();
1434 }
1435
1436 isSwitching_ = false;
1437 switchResult = true;
1438
1439 return switchResult;
1440 }
1441
HandleAudioInterruptWhenServerDied()1442 void AudioCapturerPrivate::HandleAudioInterruptWhenServerDied()
1443 {
1444 if (GetStatusInner() == CAPTURER_RUNNING) {
1445 AudioInterrupt audioInterrupt = audioInterrupt_;
1446 int32_t ret = AudioPolicyManager::GetInstance().ActivateAudioInterrupt(audioInterrupt);
1447 if (ret != SUCCESS) {
1448 AUDIO_WARNING_LOG("Activate audio interrupt failed when restoring from server died");
1449 }
1450 }
1451 }
1452
ActivateAudioConcurrency(IAudioStream::StreamClass & streamClass)1453 void AudioCapturerPrivate::ActivateAudioConcurrency(IAudioStream::StreamClass &streamClass)
1454 {
1455 capturerInfo_.pipeType = PIPE_TYPE_NORMAL_IN;
1456 if (capturerInfo_.sourceType == SOURCE_TYPE_VOICE_COMMUNICATION) {
1457 capturerInfo_.pipeType = PIPE_TYPE_CALL_IN;
1458 } else if (streamClass == IAudioStream::FAST_STREAM) {
1459 capturerInfo_.pipeType = PIPE_TYPE_LOWLATENCY_IN;
1460 }
1461 int32_t ret = AudioPolicyManager::GetInstance().ActivateAudioConcurrency(capturerInfo_.pipeType);
1462 if (ret != SUCCESS && streamClass == IAudioStream::FAST_STREAM) {
1463 streamClass = IAudioStream::PA_STREAM;
1464 capturerInfo_.pipeType = PIPE_TYPE_NORMAL_IN;
1465 }
1466 firstConcurrencyResult_ = ret;
1467 return;
1468 }
1469
InitAudioConcurrencyCallback()1470 int32_t AudioCapturerPrivate::InitAudioConcurrencyCallback()
1471 {
1472 if (audioConcurrencyCallback_ == nullptr) {
1473 audioConcurrencyCallback_ = std::make_shared<AudioCapturerConcurrencyCallbackImpl>();
1474 CHECK_AND_RETURN_RET_LOG(audioConcurrencyCallback_ != nullptr, ERROR, "Memory Allocation Failed !!");
1475 }
1476 CHECK_AND_RETURN_RET_LOG(audioStream_->GetAudioSessionID(sessionID_) == SUCCESS, ERR_INVALID_INDEX,
1477 "Get session id failed!");
1478 audioConcurrencyCallback_->SetAudioCapturerObj(this);
1479 return AudioPolicyManager::GetInstance().SetAudioConcurrencyCallback(sessionID_, audioConcurrencyCallback_);
1480 }
1481
ConcedeStream()1482 void AudioCapturerPrivate::ConcedeStream()
1483 {
1484 AUDIO_INFO_LOG("session %{public}u concede from pipeType %{public}d", sessionID_, capturerInfo_.pipeType);
1485 CHECK_AND_RETURN_LOG(audioStream_->GetStreamClass() != IAudioStream::PA_STREAM,
1486 "Session %{public}u is pa stream, no need for concede", sessionID_);
1487 AudioPipeType pipeType = PIPE_TYPE_NORMAL_IN;
1488 audioStream_->GetAudioPipeType(pipeType);
1489 if (pipeType == PIPE_TYPE_LOWLATENCY_IN || pipeType == PIPE_TYPE_CALL_IN) {
1490 AUDIO_INFO_LOG("Concede stream");
1491 }
1492 }
1493
AudioCapturerConcurrencyCallbackImpl()1494 AudioCapturerConcurrencyCallbackImpl::AudioCapturerConcurrencyCallbackImpl()
1495 {
1496 AUDIO_INFO_LOG("AudioCapturerConcurrencyCallbackImpl ctor");
1497 }
1498
~AudioCapturerConcurrencyCallbackImpl()1499 AudioCapturerConcurrencyCallbackImpl::~AudioCapturerConcurrencyCallbackImpl()
1500 {
1501 AUDIO_INFO_LOG("AudioCapturerConcurrencyCallbackImpl dtor");
1502 }
1503
OnConcedeStream()1504 void AudioCapturerConcurrencyCallbackImpl::OnConcedeStream()
1505 {
1506 std::lock_guard<std::mutex> lock(mutex_);
1507 CHECK_AND_RETURN_LOG(capturer_ != nullptr, "capturer is nullptr");
1508 capturer_->ConcedeStream();
1509 }
1510
AudioCapturerStateChangeCallbackImpl()1511 AudioCapturerStateChangeCallbackImpl::AudioCapturerStateChangeCallbackImpl()
1512 {
1513 AUDIO_DEBUG_LOG("AudioCapturerStateChangeCallbackImpl instance create");
1514 }
1515
~AudioCapturerStateChangeCallbackImpl()1516 AudioCapturerStateChangeCallbackImpl::~AudioCapturerStateChangeCallbackImpl()
1517 {
1518 AUDIO_DEBUG_LOG("AudioCapturerStateChangeCallbackImpl instance destory");
1519 }
1520
SaveCapturerInfoChangeCallback(const std::shared_ptr<AudioCapturerInfoChangeCallback> & callback)1521 void AudioCapturerStateChangeCallbackImpl::SaveCapturerInfoChangeCallback(
1522 const std::shared_ptr<AudioCapturerInfoChangeCallback> &callback)
1523 {
1524 std::lock_guard<std::mutex> lock(capturerMutex_);
1525 auto iter = find(capturerInfoChangeCallbacklist_.begin(), capturerInfoChangeCallbacklist_.end(), callback);
1526 if (iter == capturerInfoChangeCallbacklist_.end()) {
1527 capturerInfoChangeCallbacklist_.emplace_back(callback);
1528 }
1529 }
1530
RemoveCapturerInfoChangeCallback(const std::shared_ptr<AudioCapturerInfoChangeCallback> & callback)1531 void AudioCapturerStateChangeCallbackImpl::RemoveCapturerInfoChangeCallback(
1532 const std::shared_ptr<AudioCapturerInfoChangeCallback> &callback)
1533 {
1534 std::lock_guard<std::mutex> lock(capturerMutex_);
1535 if (callback == nullptr) {
1536 capturerInfoChangeCallbacklist_.clear();
1537 return;
1538 }
1539
1540 auto iter = find(capturerInfoChangeCallbacklist_.begin(), capturerInfoChangeCallbacklist_.end(), callback);
1541 if (iter != capturerInfoChangeCallbacklist_.end()) {
1542 capturerInfoChangeCallbacklist_.erase(iter);
1543 }
1544 }
1545
GetCapturerInfoChangeCallbackArraySize()1546 int32_t AudioCapturerStateChangeCallbackImpl::GetCapturerInfoChangeCallbackArraySize()
1547 {
1548 std::lock_guard<std::mutex> lock(capturerMutex_);
1549 return capturerInfoChangeCallbacklist_.size();
1550 }
1551
SaveDeviceChangeCallback(const std::shared_ptr<AudioCapturerDeviceChangeCallback> & callback)1552 void AudioCapturerStateChangeCallbackImpl::SaveDeviceChangeCallback(
1553 const std::shared_ptr<AudioCapturerDeviceChangeCallback> &callback)
1554 {
1555 auto iter = find(deviceChangeCallbacklist_.begin(), deviceChangeCallbacklist_.end(), callback);
1556 if (iter == deviceChangeCallbacklist_.end()) {
1557 deviceChangeCallbacklist_.emplace_back(callback);
1558 }
1559 }
1560
RemoveDeviceChangeCallback(const std::shared_ptr<AudioCapturerDeviceChangeCallback> & callback)1561 void AudioCapturerStateChangeCallbackImpl::RemoveDeviceChangeCallback(
1562 const std::shared_ptr<AudioCapturerDeviceChangeCallback> &callback)
1563 {
1564 if (callback == nullptr) {
1565 deviceChangeCallbacklist_.clear();
1566 return;
1567 }
1568
1569 auto iter = find(deviceChangeCallbacklist_.begin(), deviceChangeCallbacklist_.end(), callback);
1570 if (iter != deviceChangeCallbacklist_.end()) {
1571 deviceChangeCallbacklist_.erase(iter);
1572 }
1573 }
1574
DeviceChangeCallbackArraySize()1575 int32_t AudioCapturerStateChangeCallbackImpl::DeviceChangeCallbackArraySize()
1576 {
1577 return deviceChangeCallbacklist_.size();
1578 }
1579
setAudioCapturerObj(AudioCapturerPrivate * capturerObj)1580 void AudioCapturerStateChangeCallbackImpl::setAudioCapturerObj(AudioCapturerPrivate *capturerObj)
1581 {
1582 std::lock_guard<std::mutex> lock(capturerMutex_);
1583 capturer_ = capturerObj;
1584 }
1585
NotifyAudioCapturerInfoChange(const std::vector<std::shared_ptr<AudioCapturerChangeInfo>> & audioCapturerChangeInfos)1586 void AudioCapturerStateChangeCallbackImpl::NotifyAudioCapturerInfoChange(
1587 const std::vector<std::shared_ptr<AudioCapturerChangeInfo>> &audioCapturerChangeInfos)
1588 {
1589 uint32_t sessionId = static_cast<uint32_t>(-1);
1590 bool found = false;
1591 AudioCapturerChangeInfo capturerChangeInfo;
1592 std::vector<std::shared_ptr<AudioCapturerInfoChangeCallback>> capturerInfoChangeCallbacklist;
1593
1594 {
1595 std::lock_guard<std::mutex> lock(capturerMutex_);
1596 CHECK_AND_RETURN_LOG(capturer_ != nullptr, "Bare pointer capturer_ is nullptr");
1597 int32_t ret = capturer_->GetAudioStreamId(sessionId);
1598 CHECK_AND_RETURN_LOG(!ret, "Get sessionId failed");
1599 }
1600
1601 for (auto it = audioCapturerChangeInfos.begin(); it != audioCapturerChangeInfos.end(); it++) {
1602 if ((*it)->sessionId == static_cast<int32_t>(sessionId)) {
1603 capturerChangeInfo = *(*it);
1604 found = true;
1605 }
1606 }
1607
1608 {
1609 std::lock_guard<std::mutex> lock(capturerMutex_);
1610 capturerInfoChangeCallbacklist = capturerInfoChangeCallbacklist_;
1611 }
1612 if (found) {
1613 for (auto it = capturerInfoChangeCallbacklist.begin(); it != capturerInfoChangeCallbacklist.end(); ++it) {
1614 if (*it != nullptr) {
1615 (*it)->OnStateChange(capturerChangeInfo);
1616 }
1617 }
1618 }
1619 }
1620
NotifyAudioCapturerDeviceChange(const std::vector<std::shared_ptr<AudioCapturerChangeInfo>> & audioCapturerChangeInfos)1621 void AudioCapturerStateChangeCallbackImpl::NotifyAudioCapturerDeviceChange(
1622 const std::vector<std::shared_ptr<AudioCapturerChangeInfo>> &audioCapturerChangeInfos)
1623 {
1624 AudioDeviceDescriptor deviceInfo(AudioDeviceDescriptor::DEVICE_INFO);
1625 {
1626 std::lock_guard<std::mutex> lock(capturerMutex_);
1627 CHECK_AND_RETURN_LOG(capturer_ != nullptr, "Bare pointer capturer_ is nullptr");
1628 CHECK_AND_RETURN_LOG(capturer_->IsDeviceChanged(deviceInfo), "Device not change, no need callback.");
1629 }
1630
1631 for (auto it = deviceChangeCallbacklist_.begin(); it != deviceChangeCallbacklist_.end(); ++it) {
1632 if (*it != nullptr) {
1633 (*it)->OnStateChange(deviceInfo);
1634 }
1635 }
1636 }
1637
OnCapturerStateChange(const std::vector<std::shared_ptr<AudioCapturerChangeInfo>> & audioCapturerChangeInfos)1638 void AudioCapturerStateChangeCallbackImpl::OnCapturerStateChange(
1639 const std::vector<std::shared_ptr<AudioCapturerChangeInfo>> &audioCapturerChangeInfos)
1640 {
1641 if (deviceChangeCallbacklist_.size() != 0) {
1642 NotifyAudioCapturerDeviceChange(audioCapturerChangeInfos);
1643 }
1644
1645 if (capturerInfoChangeCallbacklist_.size() != 0) {
1646 NotifyAudioCapturerInfoChange(audioCapturerChangeInfos);
1647 }
1648 }
1649
HandleCapturerDestructor()1650 void AudioCapturerStateChangeCallbackImpl::HandleCapturerDestructor()
1651 {
1652 std::lock_guard<std::mutex> lock(capturerMutex_);
1653 capturer_ = nullptr;
1654 }
1655
OnDeviceChangeWithInfo(const uint32_t sessionId,const AudioDeviceDescriptor & deviceInfo,const AudioStreamDeviceChangeReasonExt reason)1656 void InputDeviceChangeWithInfoCallbackImpl::OnDeviceChangeWithInfo(
1657 const uint32_t sessionId, const AudioDeviceDescriptor &deviceInfo, const AudioStreamDeviceChangeReasonExt reason)
1658 {
1659 AUDIO_INFO_LOG("For capturer, OnDeviceChangeWithInfo callback is not support");
1660 }
1661
OnRecreateStreamEvent(const uint32_t sessionId,const int32_t streamFlag,const AudioStreamDeviceChangeReasonExt reason)1662 void InputDeviceChangeWithInfoCallbackImpl::OnRecreateStreamEvent(const uint32_t sessionId, const int32_t streamFlag,
1663 const AudioStreamDeviceChangeReasonExt reason)
1664 {
1665 AUDIO_INFO_LOG("Enter");
1666 }
1667
CapturerPolicyServiceDiedCallback()1668 CapturerPolicyServiceDiedCallback::CapturerPolicyServiceDiedCallback()
1669 {
1670 AUDIO_DEBUG_LOG("CapturerPolicyServiceDiedCallback create");
1671 }
1672
~CapturerPolicyServiceDiedCallback()1673 CapturerPolicyServiceDiedCallback::~CapturerPolicyServiceDiedCallback()
1674 {
1675 AUDIO_DEBUG_LOG("CapturerPolicyServiceDiedCallback destroy");
1676 if (restoreThread_ != nullptr && restoreThread_->joinable()) {
1677 restoreThread_->join();
1678 restoreThread_.reset();
1679 restoreThread_ = nullptr;
1680 }
1681 }
1682
SetAudioCapturerObj(AudioCapturerPrivate * capturerObj)1683 void CapturerPolicyServiceDiedCallback::SetAudioCapturerObj(AudioCapturerPrivate *capturerObj)
1684 {
1685 capturer_ = capturerObj;
1686 }
1687
SetAudioInterrupt(AudioInterrupt & audioInterrupt)1688 void CapturerPolicyServiceDiedCallback::SetAudioInterrupt(AudioInterrupt &audioInterrupt)
1689 {
1690 audioInterrupt_ = audioInterrupt;
1691 }
1692
OnAudioPolicyServiceDied()1693 void CapturerPolicyServiceDiedCallback::OnAudioPolicyServiceDied()
1694 {
1695 AUDIO_INFO_LOG("CapturerPolicyServiceDiedCallback OnAudioPolicyServiceDied");
1696 if (restoreThread_ != nullptr) {
1697 restoreThread_->detach();
1698 }
1699 restoreThread_ = std::make_unique<std::thread>([this] { this->RestoreTheadLoop(); });
1700 pthread_setname_np(restoreThread_->native_handle(), "OS_ACPSRestore");
1701 }
1702
RestoreTheadLoop()1703 void CapturerPolicyServiceDiedCallback::RestoreTheadLoop()
1704 {
1705 int32_t tryCounter = 10;
1706 uint32_t sleepTime = 300000;
1707 bool restoreResult = false;
1708 while (!restoreResult && tryCounter > 0) {
1709 tryCounter--;
1710 usleep(sleepTime);
1711 if (capturer_ == nullptr || capturer_->audioStream_ == nullptr || capturer_->abortRestore_) {
1712 AUDIO_INFO_LOG("abort restore");
1713 break;
1714 }
1715 capturer_->RestoreAudioInLoop(restoreResult, tryCounter);
1716 }
1717 }
1718
RestoreAudioInLoop(bool & restoreResult,int32_t & tryCounter)1719 void AudioCapturerPrivate::RestoreAudioInLoop(bool &restoreResult, int32_t &tryCounter)
1720 {
1721 std::lock_guard lock(capturerMutex_);
1722 CHECK_AND_RETURN_LOG(audioStream_, "audioStream_ is nullptr, no need for restore");
1723 AUDIO_INFO_LOG("Restore AudioCapturer %{public}u when server died", sessionID_);
1724 RestoreInfo restoreInfo;
1725 restoreInfo.restoreReason = SERVER_DIED;
1726 audioStream_->SetRestoreInfo(restoreInfo);
1727 audioStream_->GetRestoreInfo(restoreInfo);
1728 restoreResult = SwitchToTargetStream(audioStream_->GetStreamClass(), restoreInfo);
1729 AUDIO_INFO_LOG("Set restore status when server died, restore result %{public}d", restoreResult);
1730 return;
1731 }
1732
1733 // Inner function. Must be called with AudioCapturerPrivate::capturerMutex_ held
GetCurrentInputDevicesInner(AudioDeviceDescriptor & deviceInfo) const1734 int32_t AudioCapturerPrivate::GetCurrentInputDevicesInner(AudioDeviceDescriptor &deviceInfo) const
1735 {
1736 std::vector<std::shared_ptr<AudioCapturerChangeInfo>> audioCapturerChangeInfos;
1737 uint32_t sessionId = static_cast<uint32_t>(-1);
1738 int32_t ret = GetAudioStreamIdInner(sessionId);
1739 CHECK_AND_RETURN_RET_LOG(!ret, ret, "Get sessionId failed");
1740
1741 ret = AudioPolicyManager::GetInstance().GetCurrentCapturerChangeInfos(audioCapturerChangeInfos);
1742 CHECK_AND_RETURN_RET_LOG(!ret, ret, "Get current capturer devices failed");
1743
1744 for (auto it = audioCapturerChangeInfos.begin(); it != audioCapturerChangeInfos.end(); it++) {
1745 if ((*it)->sessionId == static_cast<int32_t>(sessionId)) {
1746 deviceInfo = (*it)->inputDeviceInfo;
1747 }
1748 }
1749 return SUCCESS;
1750 }
1751
1752 // Inner function. Must be called with AudioCapturerPrivate::capturerMutex_ held
GetAudioStreamIdInner(uint32_t & sessionID) const1753 int32_t AudioCapturerPrivate::GetAudioStreamIdInner(uint32_t &sessionID) const
1754 {
1755 CHECK_AND_RETURN_RET_LOG(audioStream_ != nullptr, ERR_INVALID_HANDLE, "GetAudioStreamId faied.");
1756 return audioStream_->GetAudioSessionID(sessionID);
1757 }
1758
1759 // Inner function. Must be called with AudioCapturerPrivate::capturerMutex_ held
GetOverflowCountInner() const1760 uint32_t AudioCapturerPrivate::GetOverflowCountInner() const
1761 {
1762 return audioStream_->GetOverflowCount();
1763 }
1764
1765 // Inner function. Must be called with AudioCapturerPrivate::capturerMutex_ held
GetStatusInner() const1766 CapturerState AudioCapturerPrivate::GetStatusInner() const
1767 {
1768 return static_cast<CapturerState>(audioStream_->GetState());
1769 }
1770
GetInnerStream() const1771 std::shared_ptr<IAudioStream> AudioCapturerPrivate::GetInnerStream() const
1772 {
1773 std::shared_lock<std::shared_mutex> lock(capturerMutex_);
1774 return audioStream_;
1775 }
1776 } // namespace AudioStandard
1777 } // namespace OHOS
1778