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