1 /*
2  * Copyright (C) 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 
16 #ifndef SCREEN_CAPTURE_AUDIO_CAPTURER_WRAPPER_H
17 #define SCREEN_CAPTURE_AUDIO_CAPTURER_WRAPPER_H
18 
19 #include <mutex>
20 #include <cstdlib>
21 #include <thread>
22 #include <string>
23 #include <map>
24 #include <memory>
25 #include <atomic>
26 #include <queue>
27 
28 #include "audio_capturer.h"
29 #include "screen_capture.h"
30 #include "securec.h"
31 
32 #define AUDIO_NS_PER_SECOND (static_cast<uint64_t>(1000000000))
33 
34 namespace OHOS {
35 namespace Media {
36 using namespace AudioStandard;
37 
38 const int64_t AUDIO_CAPTURE_READ_FAILED_WAIT_TIME = 20000000; // 20000000 us 20ms
39 
40 class AudioCapturerCallbackImpl : public AudioCapturerCallback {
41 public:
42     void OnInterrupt(const InterruptEvent &interruptEvent) override;
43     void OnStateChange(const CapturerState state) override;
44 };
45 
46 enum AudioCapturerWrapperState : int32_t {
47     CAPTURER_UNKNOWN = -1,
48     CAPTURER_RECORDING = 0,
49     CAPTURER_PAUSED = 1,
50     CAPTURER_STOPED = 2,
51     CAPTURER_RELEASED = 3,
52 };
53 
54 class AudioCapturerWrapper {
55 public:
AudioCapturerWrapper(AudioCaptureInfo & audioInfo,std::shared_ptr<ScreenCaptureCallBack> & screenCaptureCb,std::string && name,ScreenCaptureContentFilter filter)56     explicit AudioCapturerWrapper(AudioCaptureInfo &audioInfo,
57         std::shared_ptr<ScreenCaptureCallBack> &screenCaptureCb, std::string &&name,
58         ScreenCaptureContentFilter filter)
59         : screenCaptureCb_(screenCaptureCb), audioInfo_(audioInfo), threadName_(std::move(name)),
60         contentFilter_(filter) {}
61     virtual ~AudioCapturerWrapper();
62     int32_t Start(const OHOS::AudioStandard::AppInfo &appInfo);
63     int32_t Pause();
64     int32_t Resume();
65     int32_t Stop();
66     int32_t UpdateAudioCapturerConfig(ScreenCaptureContentFilter &filter);
67     int32_t CaptureAudio();
68     int32_t AcquireAudioBuffer(std::shared_ptr<AudioBuffer> &audioBuffer);
69     int32_t GetBufferSize(size_t &size);
70     int32_t ReleaseAudioBuffer();
71     void SetIsInVoIPCall(bool isInVoIPCall);
72     AudioCapturerWrapperState GetAudioCapturerState();
73 
74 protected:
75     virtual void OnStartFailed(ScreenCaptureErrorType errorType, int32_t errorCode);
76 
77 private:
78     std::shared_ptr<OHOS::AudioStandard::AudioCapturer> CreateAudioCapturer(
79         const OHOS::AudioStandard::AppInfo &appInfo);
80     void SetInnerStreamUsage(std::vector<OHOS::AudioStandard::StreamUsage> &usages);
81     void PartiallyPrintLog(int32_t lineNumber, std::string str);
82     int32_t RelativeSleep(int64_t nanoTime);
83 
84 protected:
85     std::shared_ptr<ScreenCaptureCallBack> screenCaptureCb_;
86 
87 private:
88     std::mutex mutex_;
89     std::atomic<bool> isRunning_ = false;
90     AudioCaptureInfo audioInfo_;
91     std::string threadName_;
92     std::unique_ptr<std::thread> readAudioLoop_ = nullptr;
93     std::shared_ptr<OHOS::AudioStandard::AudioCapturer> audioCapturer_ = nullptr;
94     std::shared_ptr<OHOS::Media::AudioCapturerCallbackImpl> audioCaptureCallback_ = nullptr;
95     ScreenCaptureContentFilter contentFilter_;
96     OHOS::AudioStandard::AppInfo appInfo_;
97 
98     std::mutex bufferMutex_;
99     std::condition_variable bufferCond_;
100     std::queue<std::shared_ptr<AudioBuffer>> availBuffers_;
101     std::string bundleName_;
102     std::atomic<bool> isInVoIPCall_ = false;
103     std::atomic<AudioCapturerWrapperState> captureState_ {CAPTURER_UNKNOWN};
104 
105     /* used for hilog output */
106     std::map<int32_t, int32_t> captureAudioLogCountMap_;
107 
108     static constexpr uint32_t MAX_THREAD_NAME_LENGTH = 15;
109     static constexpr uint32_t MAX_AUDIO_BUFFER_SIZE = 128;
110     static constexpr uint32_t SEC_TO_NANOSECOND = 1000000000; // 10^9ns
111     static constexpr uint32_t OPERATION_TIMEOUT_IN_MS = 200; // 200ms
112     static constexpr int32_t AC_LOG_SKIP_NUM = 1000;
113 };
114 
115 class MicAudioCapturerWrapper : public AudioCapturerWrapper {
116 public:
MicAudioCapturerWrapper(AudioCaptureInfo & audioInfo,std::shared_ptr<ScreenCaptureCallBack> & screenCaptureCb,std::string && name,ScreenCaptureContentFilter filter)117     explicit MicAudioCapturerWrapper(AudioCaptureInfo &audioInfo,
118         std::shared_ptr<ScreenCaptureCallBack> &screenCaptureCb, std::string &&name,
119         ScreenCaptureContentFilter filter)
120         : AudioCapturerWrapper(audioInfo, screenCaptureCb, std::move(name),
121         filter) {}
~MicAudioCapturerWrapper()122     ~MicAudioCapturerWrapper() override {}
123 
124 protected:
125     void OnStartFailed(ScreenCaptureErrorType errorType, int32_t errorCode) override;
126 };
127 } // namespace Media
128 } // namespace OHOS
129 #endif // SCREEN_CAPTURE_AUDIO_CAPTURER_WRAPPER_H
130