1 /* 2 * Copyright (c) 2021-2022 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 AUDIO_CAPTURER_NAPI_H_ 17 #define AUDIO_CAPTURER_NAPI_H_ 18 19 #include <iostream> 20 #include <map> 21 22 #include "audio_capturer.h" 23 #include "napi/native_api.h" 24 #include "napi/native_node_api.h" 25 26 namespace OHOS { 27 namespace AudioStandard { 28 static const std::string AUDIO_CAPTURER_NAPI_CLASS_NAME = "AudioCapturer"; 29 30 class AudioCapturerNapi { 31 public: 32 AudioCapturerNapi(); 33 ~AudioCapturerNapi(); 34 35 enum AudioSampleFormat { 36 SAMPLE_FORMAT_INVALID = -1, 37 SAMPLE_FORMAT_U8 = 0, 38 SAMPLE_FORMAT_S16LE = 1, 39 SAMPLE_FORMAT_S24LE = 2, 40 SAMPLE_FORMAT_S32LE = 3, 41 SAMPLE_FORMAT_F32LE = 4 42 }; 43 44 static napi_value Init(napi_env env, napi_value exports); 45 46 void SetValid(bool valid); 47 48 private: 49 struct AudioCapturerAsyncContext { 50 napi_env env; 51 napi_async_work work; 52 napi_deferred deferred; 53 napi_ref callbackRef = nullptr; 54 uint64_t time; 55 int32_t status; 56 int32_t intValue; 57 uint32_t userSize; 58 uint8_t *buffer = nullptr; 59 size_t bytesRead; 60 size_t bufferSize; 61 uint32_t audioStreamId; 62 bool isBlocking; 63 bool isTrue; 64 AudioSampleFormat audioSampleFormat; 65 AudioSamplingRate samplingRate; 66 AudioChannel audioChannel; 67 AudioEncodingType audioEncoding; 68 ContentType contentType; 69 StreamUsage usage; 70 DeviceRole deviceRole; 71 DeviceType deviceType; 72 SourceType sourceType; 73 int32_t capturerFlags; 74 AudioCapturerNapi *objectInfo; 75 AudioCapturerOptions capturerOptions; 76 }; 77 78 static void Destructor(napi_env env, void *nativeObject, void *finalize_hint); 79 static napi_value Construct(napi_env env, napi_callback_info info); 80 static napi_value CreateAudioCapturer(napi_env env, napi_callback_info info); 81 static napi_value CreateAudioCapturerSync(napi_env env, napi_callback_info info); 82 static napi_value GetCapturerInfo(napi_env env, napi_callback_info info); 83 static napi_value GetCapturerInfoSync(napi_env env, napi_callback_info info); 84 static napi_value GetStreamInfo(napi_env env, napi_callback_info info); 85 static napi_value GetStreamInfoSync(napi_env env, napi_callback_info info); 86 static napi_value Start(napi_env env, napi_callback_info info); 87 static napi_value Read(napi_env env, napi_callback_info info); 88 static napi_value GetAudioTime(napi_env env, napi_callback_info info); 89 static napi_value GetAudioTimeSync(napi_env env, napi_callback_info info); 90 static napi_value Stop(napi_env env, napi_callback_info info); 91 static napi_value Release(napi_env env, napi_callback_info info); 92 static napi_value GetBufferSize(napi_env env, napi_callback_info info); 93 static napi_value GetBufferSizeSync(napi_env env, napi_callback_info info); 94 static napi_value GetAudioStreamId(napi_env env, napi_callback_info info); 95 static napi_value GetAudioStreamIdSync(napi_env env, napi_callback_info info); 96 static napi_value On(napi_env env, napi_callback_info info); 97 static napi_value Off(napi_env env, napi_callback_info info); 98 static napi_value GetState(napi_env env, napi_callback_info info); 99 static napi_value CreateAudioCapturerWrapper(napi_env env, std::unique_ptr<AudioCapturerOptions> &captureOptions); 100 101 static void CommonCallbackRoutine(napi_env env, AudioCapturerAsyncContext* &asyncContext, 102 const napi_value &valueParam); 103 static void SetFunctionAsyncCallbackComplete(napi_env env, napi_status status, void *data); 104 static void AudioParamsAsyncCallbackComplete(napi_env env, napi_status status, void *data); 105 static void AudioCapturerInfoAsyncCallbackComplete(napi_env env, napi_status status, void *data); 106 static void AudioStreamInfoAsyncCallbackComplete(napi_env env, napi_status status, void *data); 107 static void ReadAsyncCallbackComplete(napi_env env, napi_status status, void *data); 108 static void IsTrueAsyncCallbackComplete(napi_env env, napi_status status, void *data); 109 static void GetBufferSizeAsyncCallbackComplete(napi_env env, napi_status status, void *data); 110 static void GetAudioStreamIdCallbackComplete(napi_env env, napi_status status, void *data); 111 static void GetIntValueAsyncCallbackComplete(napi_env env, napi_status status, void *data); 112 static void GetInt64ValueAsyncCallbackComplete(napi_env env, napi_status status, void *data); 113 static void VoidAsyncCallbackComplete(napi_env env, napi_status status, void *data); 114 static void GetCapturerAsyncCallbackComplete(napi_env env, napi_status status, void *data); 115 static void CheckCapturerAsyncCallbackComplete(napi_env env, napi_status status, void *data); 116 static napi_status CreateReadAsyncWork(const AudioCapturerAsyncContext &asyncContext); 117 static napi_status AddNamedProperty(napi_env env, napi_value object, const std::string name, int32_t enumValue); 118 static bool ParseCaptureFilterOptionsVector(napi_env env, napi_value root, CaptureFilterOptions *filterOptions); 119 static bool ParsePlaybackCaptureConfig(napi_env env, napi_value root, AudioPlaybackCaptureConfig *captureConfig); 120 static bool ParseCapturerOptions(napi_env env, napi_value root, AudioCapturerOptions *opts); 121 static bool ParseCapturerInfo(napi_env env, napi_value root, AudioCapturerInfo *capturerInfo); 122 static bool ParseStreamInfo(napi_env env, napi_value root, AudioStreamInfo* streamInfo); 123 124 static napi_value RegisterCallback(napi_env env, napi_value jsThis, 125 napi_value* argv, const std::string& cbName); 126 static napi_value RegisterCapturerCallback(napi_env env, napi_value* argv, 127 const std::string& cbName, AudioCapturerNapi *capturerNapi); 128 static napi_value RegisterPositionCallback(napi_env env, napi_value* argv, 129 const std::string& cbName, AudioCapturerNapi *capturerNapi); 130 static napi_value RegisterPeriodPositionCallback(napi_env env, napi_value* argv, 131 const std::string& cbName, AudioCapturerNapi *capturerNapi); 132 static napi_value UnregisterCallback(napi_env env, napi_value jsThis, const std::string& cbName); 133 static void UnregisterCapturerCallback(napi_env env, const std::string& cbName, AudioCapturerNapi *capturerNapi); 134 135 static std::unique_ptr<AudioParameters> sAudioParameters_; 136 static std::unique_ptr<AudioCapturerOptions> sCapturerOptions_; 137 static std::mutex createMutex_; 138 static int32_t isConstructSuccess_; 139 140 std::unique_ptr<AudioCapturer> audioCapturer_; 141 ContentType contentType_; 142 StreamUsage streamUsage_; 143 DeviceRole deviceRole_; 144 DeviceType deviceType_; 145 SourceType sourceType_; 146 int32_t capturerFlags_ = 0; // default flag 0 147 napi_env env_; 148 std::shared_ptr<CapturerPositionCallback> positionCBNapi_ = nullptr; 149 std::shared_ptr<CapturerPeriodPositionCallback> periodPositionCBNapi_ = nullptr; 150 std::shared_ptr<AudioCapturerCallback> callbackNapi_ = nullptr; 151 }; 152 } // namespace AudioStandard 153 } // namespace OHOS 154 #endif /* AUDIO_CAPTURER_NAPI_H_ */ 155