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