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