• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2023-2023 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 #include "audio_capture_module.h"
16 #include "common/log.h"
17 #include "osal/task/autolock.h"
18 #include "common/status.h"
19 #include "audio_type_translate.h"
20 #include "audio_capturer.h"
21 #include "avcodec_sysevent.h"
22 
23 namespace {
24 constexpr OHOS::HiviewDFX::HiLogLabel LABEL = { LOG_CORE, LOG_DOMAIN_RECORDER, "HiStreamer" };
25 static constexpr uint64_t AUDIO_NS_PER_SECOND = 1000000000;
26 static constexpr uint64_t AUDIO_CAPTURE_READ_FRAME_TIME = 20000000; // 20000000 ns 20ms
27 }
28 
29 namespace OHOS {
30 namespace Media {
31 namespace AudioCaptureModule {
32 using namespace OHOS::MediaAVCodec;
33 #define FAIL_LOG_RETURN(exec, msg) \
34 do { \
35     auto ret = (exec); \
36     if (ret != 0) { \
37         MEDIA_LOG_E(msg " failed return " PUBLIC_LOG_D32, ret); \
38         return Error2Status(ret); \
39     } \
40 } while (0)
41 
42 constexpr size_t MAX_CAPTURE_BUFFER_SIZE = 100000;
43 
44 class AudioCapturerCallbackImpl : public AudioStandard::AudioCapturerCallback {
45 public:
AudioCapturerCallbackImpl(std::shared_ptr<AudioCaptureModuleCallback> audioCaptureModuleCallback)46     explicit AudioCapturerCallbackImpl(std::shared_ptr<AudioCaptureModuleCallback> audioCaptureModuleCallback)
47         : audioCaptureModuleCallback_(audioCaptureModuleCallback)
48     {
49     }
50 
OnInterrupt(const AudioStandard::InterruptEvent & interruptEvent)51     void OnInterrupt(const AudioStandard::InterruptEvent &interruptEvent) override
52     {
53         MEDIA_LOG_E("AudioCapture OnInterrupt Hint: " PUBLIC_LOG_D32 ", EventType: " PUBLIC_LOG_D32 ", forceType: "
54             PUBLIC_LOG_D32, interruptEvent.hintType, interruptEvent.eventType, interruptEvent.forceType);
55 
56         if (interruptEvent.hintType == AudioStandard::InterruptHint::INTERRUPT_HINT_MUTE ||
57             interruptEvent.hintType == AudioStandard::InterruptHint::INTERRUPT_HINT_UNMUTE) {
58             MEDIA_LOG_I("AudioCapture OnInterrupt recv mute state change event, ignore...");
59             return;
60         }
61         if (audioCaptureModuleCallback_ != nullptr) {
62             MEDIA_LOG_I("audioCaptureModuleCallback_ send info to audioCaptureFilter");
63             audioCaptureModuleCallback_->OnInterrupt("AudioCapture OnInterrupt");
64         }
65     }
66 
OnStateChange(const AudioStandard::CapturerState state)67     void OnStateChange(const AudioStandard::CapturerState state) override
68     {
69     }
70 
71 private:
72     std::shared_ptr<AudioCaptureModuleCallback> audioCaptureModuleCallback_;
73 };
74 
AudioCaptureModule()75 AudioCaptureModule::AudioCaptureModule()
76 {
77 }
78 
~AudioCaptureModule()79 AudioCaptureModule::~AudioCaptureModule()
80 {
81     DoDeinit();
82 }
83 
Init()84 Status AudioCaptureModule::Init()
85 {
86     AutoLock lock(captureMutex_);
87     if (audioCapturer_ == nullptr) {
88         AudioStandard::AppInfo appInfo;
89         appInfo.appTokenId = static_cast<uint32_t>(appTokenId_);
90         appInfo.appUid = appUid_;
91         appInfo.appPid = appPid_;
92         appInfo.appFullTokenId = static_cast<uint64_t>(appFullTokenId_);
93         options_.capturerInfo.recorderType = AudioStandard::RecorderType::RECORDER_TYPE_AV_RECORDER;
94         audioCapturer_ = AudioStandard::AudioCapturer::Create(options_, appInfo);
95         if (audioCapturer_ == nullptr) {
96             MEDIA_LOG_E("Create audioCapturer fail");
97             SetFaultEvent("AudioCaptureModule::Init, create audioCapturer fail");
98             return Status::ERROR_UNKNOWN;
99         }
100         audioInterruptCallback_ = std::make_shared<AudioCapturerCallbackImpl>(audioCaptureModuleCallback_);
101         audioCapturer_->SetCapturerCallback(audioInterruptCallback_);
102     }
103     return Status::OK;
104 }
105 
DoDeinit()106 Status AudioCaptureModule::DoDeinit()
107 {
108     AutoLock lock(captureMutex_);
109     if (audioCapturer_) {
110         if (audioCapturer_->GetStatus() == AudioStandard::CapturerState::CAPTURER_RUNNING) {
111             FALSE_LOG_MSG(audioCapturer_->Stop(), "stop audioCapturer fail");
112         }
113         FALSE_LOG_MSG(audioCapturer_->Release(), "Release audioCapturer fail");
114         audioCapturer_->RemoveAudioCapturerInfoChangeCallback(audioCapturerInfoChangeCallback_);
115         audioCapturer_ = nullptr;
116     }
117     return Status::OK;
118 }
119 
Deinit()120 Status AudioCaptureModule::Deinit()
121 {
122     MEDIA_LOG_I("Deinit");
123     return DoDeinit();
124 }
125 
Prepare()126 Status AudioCaptureModule::Prepare()
127 {
128     MEDIA_LOG_I("Prepare enter.");
129     size_t size;
130     {
131         AutoLock lock (captureMutex_);
132         FALSE_RETURN_V_MSG_E(audioCapturer_ != nullptr, Status::ERROR_WRONG_STATE, "no available audio capture");
133         FAIL_LOG_RETURN(audioCapturer_->GetBufferSize(size), "audioCapturer GetBufferSize");
134     }
135     FALSE_RETURN_V_MSG_E(size < MAX_CAPTURE_BUFFER_SIZE, Status::ERROR_INVALID_PARAMETER,
136         "bufferSize is too big: " PUBLIC_LOG_ZU, size);
137     bufferSize_ = size;
138     MEDIA_LOG_E("bufferSize is: " PUBLIC_LOG_ZU, bufferSize_);
139     return Status::OK;
140 }
141 
Reset()142 Status AudioCaptureModule::Reset()
143 {
144     MEDIA_LOG_I("Reset enter.");
145     {
146         AutoLock lock (captureMutex_);
147         FALSE_RETURN_V_MSG_E(audioCapturer_ != nullptr, Status::ERROR_WRONG_STATE, "no available audio capture");
148         if (audioCapturer_->GetStatus() == AudioStandard::CapturerState::CAPTURER_RUNNING) {
149             FALSE_LOG_MSG(audioCapturer_->Stop(), "Stop audioCapturer fail");
150         }
151     }
152     bufferSize_ = 0;
153     bitRate_ = 0;
154     options_ = AudioStandard::AudioCapturerOptions();
155     return Status::OK;
156 }
157 
Start()158 Status AudioCaptureModule::Start()
159 {
160     MEDIA_LOG_I("start enter.");
161     AutoLock lock (captureMutex_);
162     FALSE_RETURN_V_MSG_E(audioCapturer_ != nullptr, Status::ERROR_WRONG_STATE, "no available audio capture");
163     if (audioCapturer_->GetStatus() != AudioStandard::CapturerState::CAPTURER_RUNNING) {
164         if (!audioCapturer_->Start()) {
165             MEDIA_LOG_E("audioCapturer start failed");
166             SetFaultEvent("AudioCaptureModule::Start error");
167             return Status::ERROR_UNKNOWN;
168         }
169     }
170     isTrackMaxAmplitude = false;
171     return Status::OK;
172 }
173 
Stop()174 Status AudioCaptureModule::Stop()
175 {
176     MEDIA_LOG_I("stop enter.");
177     AutoLock lock (captureMutex_);
178     if (audioCapturer_ && audioCapturer_->GetStatus() == AudioStandard::CAPTURER_RUNNING) {
179         if (!audioCapturer_->Stop()) {
180             MEDIA_LOG_E("Stop audioCapturer fail");
181             SetFaultEvent("AudioCaptureModule::Stop error");
182             return Status::ERROR_UNKNOWN;
183         }
184     }
185     return Status::OK;
186 }
187 
GetParameter(std::shared_ptr<Meta> & meta)188 Status AudioCaptureModule::GetParameter(std::shared_ptr<Meta> &meta)
189 {
190     MEDIA_LOG_I("GetParameter enter.");
191     AudioStandard::AudioCapturerParams params;
192     {
193         AutoLock lock (captureMutex_);
194         if (!audioCapturer_) {
195             return Status::ERROR_WRONG_STATE;
196         }
197         FAIL_LOG_RETURN(audioCapturer_->GetParams(params), "audioCapturer GetParams");
198     }
199 
200     if (params.samplingRate != options_.streamInfo.samplingRate) {
201         MEDIA_LOG_W("samplingRate has changed from " PUBLIC_LOG_U32 " to " PUBLIC_LOG_U32,
202             options_.streamInfo.samplingRate, params.samplingRate);
203     }
204     FALSE_RETURN_V_MSG_E(meta != nullptr, Status::ERROR_NULL_POINTER, "meta is null, set audio sample rate");
205     FALSE_LOG(meta->Set<Tag::AUDIO_SAMPLE_RATE>(params.samplingRate));
206 
207     if (params.audioChannel != options_.streamInfo.channels) {
208         MEDIA_LOG_W("audioChannel has changed from " PUBLIC_LOG_U32 " to " PUBLIC_LOG_U32,
209             options_.streamInfo.channels, params.audioChannel);
210     }
211     FALSE_RETURN_V_MSG_E(meta != nullptr, Status::ERROR_NULL_POINTER, "meta is null, set audio channel");
212     FALSE_LOG(meta->Set<Tag::AUDIO_CHANNEL_COUNT>(params.audioChannel));
213 
214     if (params.audioSampleFormat != options_.streamInfo.format) {
215         MEDIA_LOG_W("audioSampleFormat has changed from " PUBLIC_LOG_U32 " to " PUBLIC_LOG_U32,
216             options_.streamInfo.format, params.audioSampleFormat);
217     }
218     FALSE_RETURN_V_MSG_E(meta != nullptr, Status::ERROR_NULL_POINTER, "meta is null, set audio sample format");
219     FALSE_LOG(meta->Set<Tag::AUDIO_SAMPLE_FORMAT>(static_cast<Plugins::AudioSampleFormat>(params.audioSampleFormat)));
220 
221     FALSE_RETURN_V_MSG_E(meta != nullptr, Status::ERROR_NULL_POINTER, "meta is null, set audio bitrate");
222     meta->Set<Tag::MEDIA_BITRATE>(bitRate_);
223     return Status::OK;
224 }
225 
SetParameter(const std::shared_ptr<Meta> & meta)226 Status AudioCaptureModule::SetParameter(const std::shared_ptr<Meta> &meta)
227 {
228     FALSE_LOG_MSG(meta->Get<Tag::APP_TOKEN_ID>(appTokenId_), "Unknown APP_TOKEN_ID");
229     FALSE_LOG_MSG(meta->Get<Tag::APP_UID>(appUid_), "Unknown APP_UID");
230     FALSE_LOG_MSG(meta->Get<Tag::APP_PID>(appPid_), "Unknown APP_PID");
231     FALSE_LOG_MSG(meta->Get<Tag::APP_FULL_TOKEN_ID>(appFullTokenId_), "Unknown appFullTokenId_");
232     FALSE_LOG_MSG(meta->Get<Tag::MEDIA_BITRATE>(bitRate_), "Unknown MEDIA_BITRATE");
233 
234     int32_t sampleRate = 0;
235     if (meta->Get<Tag::AUDIO_SAMPLE_RATE>(sampleRate)) {
236         FALSE_RETURN_V_MSG_E(AssignSampleRateIfSupported(sampleRate), Status::ERROR_INVALID_PARAMETER,
237             "SampleRate is unsupported by audiocapturer");
238     }
239 
240     int32_t channelCount = 0;
241     if (meta->Get<Tag::AUDIO_CHANNEL_COUNT>(channelCount)) {
242         FALSE_RETURN_V_MSG_E(AssignChannelNumIfSupported(channelCount), Status::ERROR_INVALID_PARAMETER,
243             "ChannelNum is unsupported by audiocapturer");
244     }
245 
246     Plugins::AudioSampleFormat sampleFormat;
247     if (meta->Get<Tag::AUDIO_SAMPLE_FORMAT>(sampleFormat)) {
248         FALSE_RETURN_V_MSG_E(AssignSampleFmtIfSupported(static_cast<Plugins::AudioSampleFormat>(sampleFormat)),
249             Status::ERROR_INVALID_PARAMETER, "SampleFormat is unsupported by audiocapturer");
250     }
251 
252     AudioStandard::AudioEncodingType audioEncoding = AudioStandard::ENCODING_INVALID;
253     auto supportedEncodingTypes = OHOS::AudioStandard::AudioCapturer::GetSupportedEncodingTypes();
254     for (auto& supportedEncodingType : supportedEncodingTypes) {
255         if (supportedEncodingType == AudioStandard::ENCODING_PCM) {
256             audioEncoding = AudioStandard::ENCODING_PCM;
257             break;
258         }
259     }
260 
261     if (audioEncoding != AudioStandard::ENCODING_PCM) {
262         MEDIA_LOG_E("audioCapturer do not support pcm encoding");
263         SetFaultEvent("AudioCaptureModule::Prepare, audioCapturer do not support pcm encoding");
264         return Status::ERROR_UNKNOWN;
265     }
266     options_.streamInfo.encoding = AudioStandard::ENCODING_PCM;
267     return Status::OK;
268 }
269 
AssignSampleRateIfSupported(const int32_t value)270 bool AudioCaptureModule::AssignSampleRateIfSupported(const int32_t value)
271 {
272     uint32_t sampleRate = static_cast<uint32_t>(value);
273     AudioStandard::AudioSamplingRate aRate = AudioStandard::SAMPLE_RATE_8000;
274     FALSE_RETURN_V_MSG_E(SampleRateNum2Enum(sampleRate, aRate), false, "sample rate " PUBLIC_LOG_U32
275         "not supported", sampleRate);
276     for (const auto& rate : AudioStandard::AudioCapturer::GetSupportedSamplingRates()) {
277         if (rate == sampleRate) {
278             options_.streamInfo.samplingRate = rate;
279             return true;
280         }
281     }
282     return false;
283 }
284 
AssignChannelNumIfSupported(const int32_t value)285 bool AudioCaptureModule::AssignChannelNumIfSupported(const int32_t value)
286 {
287     uint32_t channelNum = static_cast<uint32_t>(value);
288     constexpr uint32_t maxSupportChannelNum = 2;
289     if (channelNum > maxSupportChannelNum) {
290         MEDIA_LOG_E("Unsupported channelNum: " PUBLIC_LOG_U32, channelNum);
291         return false;
292     }
293     AudioStandard::AudioChannel aChannel = AudioStandard::MONO;
294     FALSE_RETURN_V_MSG_E(ChannelNumNum2Enum(channelNum, aChannel), false, "Channel num "
295         PUBLIC_LOG_U32 "not supported", channelNum);
296     for (const auto& channel : AudioStandard::AudioCapturer::GetSupportedChannels()) {
297         if (channel == channelNum) {
298             options_.streamInfo.channels = channel;
299             return true;
300         }
301     }
302     return false;
303 }
304 
AssignSampleFmtIfSupported(const Plugins::AudioSampleFormat value)305 bool AudioCaptureModule::AssignSampleFmtIfSupported(const Plugins::AudioSampleFormat value)
306 {
307     Plugins::AudioSampleFormat sampleFormat = value;
308     AudioStandard::AudioSampleFormat aFmt = AudioStandard::AudioSampleFormat::INVALID_WIDTH;
309     FALSE_RETURN_V_MSG_E(ModuleFmt2SampleFmt(sampleFormat, aFmt), false,
310         "sample format " PUBLIC_LOG_U8 " not supported", static_cast<uint8_t>(sampleFormat));
311     for (const auto& fmt : AudioStandard::AudioCapturer::GetSupportedFormats()) {
312         if (fmt == aFmt) {
313             options_.streamInfo.format = fmt;
314             return true;
315         }
316     }
317     return false;
318 }
319 
Read(std::shared_ptr<AVBuffer> & buffer,size_t expectedLen)320 Status AudioCaptureModule::Read(std::shared_ptr<AVBuffer> &buffer, size_t expectedLen)
321 {
322     MEDIA_LOG_D("AudioCaptureModule Read");
323     auto bufferMeta = buffer->meta_;
324     if (!bufferMeta) {
325         return Status::ERROR_INVALID_PARAMETER;
326     }
327     std::shared_ptr<AVMemory> bufData = buffer->memory_;
328     if (bufData->GetCapacity() <= 0) {
329         return Status::ERROR_NO_MEMORY;
330     }
331     auto size = 0;
332     Status ret = Status::OK;
333     {
334         AutoLock lock(captureMutex_);
335         if (audioCapturer_ == nullptr) {
336             MEDIA_LOG_E("Audio capture is null");
337             return Status::ERROR_WRONG_STATE;
338         }
339         if (audioCapturer_->GetStatus() != AudioStandard::CAPTURER_RUNNING) {
340             return Status::ERROR_AGAIN;
341         }
342         FALSE_RETURN_V_MSG_E(bufData->GetAddr() != nullptr,
343             Status::ERROR_NULL_POINTER, "audioCapturer GetAddr() fail");
344         size = audioCapturer_->Read(*bufData->GetAddr(), expectedLen, true);
345     }
346     FALSE_RETURN_V_MSG_E(size >= 0, Status::ERROR_NOT_ENOUGH_DATA, "audioCapturer Read() fail");
347 
348     if (isTrackMaxAmplitude) {
349         TrackMaxAmplitude(reinterpret_cast<int16_t *>(bufData->GetAddr()),
350             static_cast<int32_t>(static_cast<uint32_t>(bufData->GetSize()) >> 1));
351     }
352     return ret;
353 }
354 
Read(uint8_t * cacheAudioData,size_t expectedLen)355 Status AudioCaptureModule::Read(uint8_t *cacheAudioData, size_t expectedLen)
356 {
357     MEDIA_LOG_D("AudioCaptureModule Read");
358     auto size = 0;
359     {
360         AutoLock lock(captureMutex_);
361         FALSE_RETURN_V_MSG_E(audioCapturer_ != nullptr, Status::ERROR_WRONG_STATE, "Audio capture is null");
362         FALSE_RETURN_V_MSG_E(audioCapturer_->GetStatus() == AudioStandard::CAPTURER_RUNNING,
363             Status::ERROR_AGAIN, "Audio capture Status error");
364         FALSE_RETURN_V_MSG_E(cacheAudioData != nullptr, Status::ERROR_UNKNOWN, "cacheAudioData is null");
365 
366         size = audioCapturer_->Read(*cacheAudioData, expectedLen, true);
367     }
368     FALSE_RETURN_V_MSG_E(size >= 0, Status::ERROR_NOT_ENOUGH_DATA, "audioCapturer Read() fail");
369 
370     if (isTrackMaxAmplitude) {
371         TrackMaxAmplitude(reinterpret_cast<int16_t *>(cacheAudioData),
372             static_cast<int32_t>(static_cast<uint32_t>(size) >> 1));
373     }
374     return Status::OK;
375 }
376 
GetAudioTime(int64_t & audioDataTime,bool isFirstFrame)377 void AudioCaptureModule::GetAudioTime(int64_t &audioDataTime, bool isFirstFrame)
378 {
379     MEDIA_LOG_D("AudioCaptureModule GetAudioTime");
380     bool ret = true;
381     {
382         AutoLock lock(captureMutex_);
383         FALSE_RETURN_MSG(audioCapturer_ != nullptr, "Audio capture is null");
384         FALSE_RETURN_MSG(audioCapturer_->GetStatus() == AudioStandard::CAPTURER_RUNNING,
385             "Audio capture Status error");
386         AudioStandard::Timestamp timestamp{};
387         ret = audioCapturer_->GetTimeStampInfo(timestamp, AudioStandard::Timestamp::Timestampbase::MONOTONIC);
388         FALSE_RETURN_MSG(ret, "audioCapturer GetAudioTime fail");
389 
390         audioDataTime = static_cast<int64_t>(timestamp.time.tv_sec) * AUDIO_NS_PER_SECOND
391             + static_cast<int64_t>(timestamp.time.tv_nsec);
392         MEDIA_LOG_D("GetTimeStampInfo audioDataTime: " PUBLIC_LOG_D64, audioDataTime);
393 
394         if (isFirstFrame) {
395             audioDataTime -= AUDIO_CAPTURE_READ_FRAME_TIME;
396         }
397     }
398 }
399 
GetSize(uint64_t & size)400 Status AudioCaptureModule::GetSize(uint64_t& size)
401 {
402     if (bufferSize_ == 0) {
403         return Status::ERROR_INVALID_PARAMETER;
404     }
405     size = bufferSize_;
406     return Status::OK;
407 }
408 
SetAudioInterruptListener(const std::shared_ptr<AudioCaptureModuleCallback> & callback)409 Status AudioCaptureModule::SetAudioInterruptListener(const std::shared_ptr<AudioCaptureModuleCallback> &callback)
410 {
411     if (callback == nullptr) {
412         MEDIA_LOG_E("SetAudioInterruptListener callback input param is nullptr");
413         return Status::ERROR_INVALID_PARAMETER;
414     }
415     audioCaptureModuleCallback_ = callback;
416     return Status::OK;
417 }
418 
SetAudioCapturerInfoChangeCallback(const std::shared_ptr<AudioStandard::AudioCapturerInfoChangeCallback> & callback)419 Status AudioCaptureModule::SetAudioCapturerInfoChangeCallback(
420     const std::shared_ptr<AudioStandard::AudioCapturerInfoChangeCallback> &callback)
421 {
422     if (audioCapturer_ == nullptr) {
423         return Status::ERROR_WRONG_STATE;
424     }
425     audioCapturerInfoChangeCallback_ = callback;
426     int32_t ret = audioCapturer_->SetAudioCapturerInfoChangeCallback(audioCapturerInfoChangeCallback_);
427     if (ret != (int32_t)Status::OK) {
428         MEDIA_LOG_E("SetAudioCapturerInfoChangeCallback fail error code: %{public}d", ret);
429         SetFaultEvent("SetAudioCapturerInfoChangeCallback error", ret);
430         return Status::ERROR_UNKNOWN;
431     }
432     return Status::OK;
433 }
434 
SetWillMuteWhenInterrupted(bool muteWhenInterrupted)435 Status AudioCaptureModule::SetWillMuteWhenInterrupted(bool muteWhenInterrupted)
436 {
437     FALSE_RETURN_V_MSG_E(audioCapturer_ != nullptr, Status::ERROR_INVALID_OPERATION,
438         "audioCapturer is nullptr, cannot SetWillMuteWhenInterrupted");
439     int32_t ret = audioCapturer_->SetInterruptStrategy(muteWhenInterrupted ?
440             AudioStandard::InterruptStrategy::MUTE : AudioStandard::InterruptStrategy::DEFAULT);
441     if (ret != static_cast<int32_t>(Status::OK)) {
442         MEDIA_LOG_E("fail error code: %{public}d", ret);
443         return Status::ERROR_UNKNOWN;
444     }
445     return Status::OK;
446 }
447 
GetCurrentCapturerChangeInfo(AudioStandard::AudioCapturerChangeInfo & changeInfo)448 Status AudioCaptureModule::GetCurrentCapturerChangeInfo(AudioStandard::AudioCapturerChangeInfo &changeInfo)
449 {
450     FALSE_RETURN_V_MSG_E(audioCapturer_ != nullptr, Status::ERROR_INVALID_OPERATION,
451         "audioCapturer is nullptr, cannot get audio capturer change info");
452     audioCapturer_->GetCurrentCapturerChangeInfo(changeInfo);
453     return Status::OK;
454 }
455 
GetMaxAmplitude()456 int32_t AudioCaptureModule::GetMaxAmplitude()
457 {
458     if (!isTrackMaxAmplitude) {
459         isTrackMaxAmplitude = true;
460     }
461     int16_t value = maxAmplitude_;
462     maxAmplitude_ = 0;
463     return value;
464 }
465 
SetAudioSource(AudioStandard::SourceType source)466 void AudioCaptureModule::SetAudioSource(AudioStandard::SourceType source)
467 {
468     options_.capturerInfo.sourceType = source;
469 }
470 
TrackMaxAmplitude(int16_t * data,int32_t size)471 void AudioCaptureModule::TrackMaxAmplitude(int16_t *data, int32_t size)
472 {
473     for (int32_t i = 0; i < size; i++) {
474         int16_t value = *data++;
475         if (value < 0) {
476             value = -value;
477         }
478         if (maxAmplitude_ < value) {
479             maxAmplitude_ = value;
480         }
481     }
482 }
483 
SetFaultEvent(const std::string & errMsg,int32_t ret)484 void AudioCaptureModule::SetFaultEvent(const std::string &errMsg, int32_t ret)
485 {
486     SetFaultEvent(errMsg + ", ret = " + std::to_string(ret));
487 }
488 
SetFaultEvent(const std::string & errMsg)489 void AudioCaptureModule::SetFaultEvent(const std::string &errMsg)
490 {
491     AudioSourceFaultInfo audioSourceFaultInfo;
492     audioSourceFaultInfo.appName = bundleName_;
493     audioSourceFaultInfo.instanceId = std::to_string(instanceId_);
494     audioSourceFaultInfo.audioSourceType = options_.capturerInfo.sourceType;
495     audioSourceFaultInfo.errMsg = errMsg;
496     FaultRecordAudioEventWrite(audioSourceFaultInfo);
497 }
498 
SetCallingInfo(int32_t appUid,int32_t appPid,const std::string & bundleName,uint64_t instanceId)499 void AudioCaptureModule::SetCallingInfo(int32_t appUid, int32_t appPid,
500     const std::string &bundleName, uint64_t instanceId)
501 {
502     appUid_ = appUid;
503     appPid_ = appPid;
504     bundleName_ = bundleName;
505     instanceId_ = instanceId;
506 }
507 } // namespace AudioCaptureModule
508 } // namespace Media
509 } // namespace OHOS
510