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