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