• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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