1 /* 2 * Copyright (c) 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 #ifndef NAPI_AUDIO_CAPTURER_H 16 #define NAPI_AUDIO_CAPTURER_H 17 18 #include <iostream> 19 #include <map> 20 21 #include "napi/native_api.h" 22 #include "napi/native_node_api.h" 23 #include "audio_capturer.h" 24 #include "napi_async_work.h" 25 #include "napi_audio_capturer_device_change_callback.h" 26 #include "napi_audio_capturer_info_change_callback.h" 27 28 namespace OHOS { 29 namespace AudioStandard { 30 using namespace std; 31 32 const std::string NAPI_AUDIO_CAPTURER_CLASS_NAME = "AudioCapturer"; 33 34 class NapiAudioCapturer { 35 public: 36 NapiAudioCapturer(); 37 ~NapiAudioCapturer(); 38 39 static napi_value Init(napi_env env, napi_value exports); 40 41 std::unique_ptr<AudioCapturer> audioCapturer_; 42 std::mutex readCallbackMutex_; 43 std::condition_variable readCallbackCv_; 44 45 private: 46 struct AudioCapturerAsyncContext : public ContextBase { ~AudioCapturerAsyncContextAudioCapturerAsyncContext47 virtual ~AudioCapturerAsyncContext() 48 { 49 AUDIO_DEBUG_LOG("~AudioCapturerAsyncContext enter"); 50 } 51 uint64_t time; 52 int32_t intValue; 53 uint32_t userSize; 54 uint8_t *buffer = nullptr; 55 size_t bytesRead; 56 size_t bufferSize; 57 uint32_t audioStreamId; 58 bool isBlocking; 59 bool isTrue; 60 SourceType sourceType; 61 AudioCapturerOptions capturerOptions; 62 AudioCapturerInfo capturerInfo; 63 AudioStreamInfo streamInfo; 64 uint32_t overflowCount; 65 }; 66 67 static napi_status InitAudioCapturer(napi_env env, napi_value &constructor); 68 static void Destructor(napi_env env, void *nativeObject, void *finalizeHint); 69 static napi_value Construct(napi_env env, napi_callback_info info); 70 static napi_value CreateAudioCapturerWrapper(napi_env env, const AudioCapturerOptions capturerOptions); 71 static napi_value CreateAudioCapturer(napi_env env, napi_callback_info info); 72 static napi_value CreateAudioCapturerSync(napi_env env, napi_callback_info info); 73 static napi_value GetCapturerInfo(napi_env env, napi_callback_info info); 74 static napi_value GetCapturerInfoSync(napi_env env, napi_callback_info info); 75 static napi_value GetStreamInfo(napi_env env, napi_callback_info info); 76 static napi_value GetStreamInfoSync(napi_env env, napi_callback_info info); 77 static napi_value Start(napi_env env, napi_callback_info info); 78 static napi_value Read(napi_env env, napi_callback_info info); 79 static napi_value GetAudioTime(napi_env env, napi_callback_info info); 80 static napi_value GetAudioTimeSync(napi_env env, napi_callback_info info); 81 static napi_value Stop(napi_env env, napi_callback_info info); 82 static napi_value Release(napi_env env, napi_callback_info info); 83 static napi_value GetBufferSize(napi_env env, napi_callback_info info); 84 static napi_value GetBufferSizeSync(napi_env env, napi_callback_info info); 85 static napi_value GetAudioStreamId(napi_env env, napi_callback_info info); 86 static napi_value GetAudioStreamIdSync(napi_env env, napi_callback_info info); 87 static napi_value On(napi_env env, napi_callback_info info); 88 static napi_value Off(napi_env env, napi_callback_info info); 89 static napi_value GetCurrentInputDevices(napi_env env, napi_callback_info info); 90 static napi_value GetCurrentAudioCapturerChangeInfo(napi_env env, napi_callback_info info); 91 static napi_value GetCurrentMicrophones(napi_env env, napi_callback_info info); 92 static napi_value GetState(napi_env env, napi_callback_info info); 93 static napi_value GetOverflowCount(napi_env env, napi_callback_info info); 94 static napi_value GetOverflowCountSync(napi_env env, napi_callback_info info); 95 static napi_value RegisterCallback(napi_env env, napi_value jsThis, 96 napi_value *argv, const std::string &cbName); 97 static napi_value RegisterCapturerCallback(napi_env env, napi_value *argv, 98 const std::string &cbName, NapiAudioCapturer *napiCapturer); 99 static napi_value RegisterPositionCallback(napi_env env, napi_value *argv, 100 const std::string &cbName, NapiAudioCapturer *napiCapturer); 101 static napi_value RegisterPeriodPositionCallback(napi_env env, napi_value *argv, const std::string &cbName, 102 NapiAudioCapturer *napiCapturer); 103 static void RegisterAudioCapturerDeviceChangeCallback(napi_env env, napi_value *argv, 104 NapiAudioCapturer *napiCapturer); 105 static void RegisterAudioCapturerInfoChangeCallback(napi_env env, napi_value *argv, 106 NapiAudioCapturer *napiCapturer); 107 static void RegisterCapturerReadDataCallback(napi_env env, napi_value *argv, 108 const std::string &cbName, NapiAudioCapturer *napiCapturer); 109 static napi_value UnregisterCallback(napi_env env, napi_value jsThis, size_t argc, napi_value *argv, 110 const std::string &cbName); 111 static void UnregisterCapturerCallback(napi_env env, const std::string &cbName, 112 NapiAudioCapturer *napiCapturer); 113 static void UnregisterAudioCapturerDeviceChangeCallback(napi_env env, size_t argc, 114 napi_value *argv, NapiAudioCapturer *napiCapturer); 115 static void UnregisterAudioCapturerInfoChangeCallback(napi_env env, size_t argc, 116 napi_value *argv, NapiAudioCapturer *napiCapturer); 117 static void UnregisterCapturerReadDataCallback(napi_env env, size_t argc, napi_value *argv, 118 NapiAudioCapturer *napiCapturer); 119 120 /* common interface in NapiAudioCapturer */ 121 static bool CheckContextStatus(std::shared_ptr<AudioCapturerAsyncContext> context); 122 static bool CheckAudioCapturerStatus(NapiAudioCapturer *napi, std::shared_ptr<AudioCapturerAsyncContext> context); 123 static NapiAudioCapturer* GetParamWithSync(const napi_env &env, napi_callback_info info, 124 size_t &argc, napi_value *args); 125 static unique_ptr<NapiAudioCapturer> CreateAudioCapturerNativeObject(napi_env env); 126 static napi_status ReadFromNative(shared_ptr<AudioCapturerAsyncContext> context); 127 static std::shared_ptr<NapiAudioCapturerDeviceChangeCallback> GetDeviceChangeNapiCallback(napi_value argv, 128 NapiAudioCapturer *napiCapturer); 129 static std::shared_ptr<NapiAudioCapturerInfoChangeCallback> GetCapturerInfoChangeNapiCallback( 130 napi_value argv, NapiAudioCapturer *napiCapturer); 131 132 static std::unique_ptr<AudioCapturerOptions> sCapturerOptions_; 133 static std::mutex createMutex_; 134 static int32_t isConstructSuccess_; 135 136 std::shared_ptr<AudioCapturerCallback> callbackNapi_ = nullptr; 137 std::shared_ptr<CapturerPositionCallback> positionCbNapi_ = nullptr; 138 std::shared_ptr<CapturerPeriodPositionCallback> periodPositionCbNapi_ = nullptr; 139 std::list<std::shared_ptr<NapiAudioCapturerDeviceChangeCallback>> deviceChangeCallbacks_; 140 std::list<std::shared_ptr<NapiAudioCapturerInfoChangeCallback>> capturerInfoChangeCallbacks_; 141 std::shared_ptr<AudioCapturerReadCallback> capturerReadDataCallbackNapi_ = nullptr; 142 143 SourceType sourceType_; 144 napi_env env_; 145 }; 146 } // namespace AudioStandard 147 } // namespace OHOS 148 #endif /* NAPI_AUDIO_CAPTURER_H */ 149