• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 &params) 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 &timestamp, 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 &timestamp, 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 &timestamp, 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