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