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