• 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 }
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