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_PARAM_UTILS_H
16 #define NAPI_PARAM_UTILS_H
17 
18 #include <cstdint>
19 #include <map>
20 #include <list>
21 #if defined(ANDROID_PLATFORM) || defined(IOS_PLATFORM)
22 #include <securec.h>
23 #else
24 #include "ability.h"
25 #endif
26 #include "napi/native_api.h"
27 #include "napi/native_common.h"
28 #include "napi/native_node_api.h"
29 #include "napi_base_context.h"
30 #include "audio_common_log.h"
31 #include "audio_info.h"
32 #include "audio_capturer.h"
33 #include "audio_system_manager.h"
34 #include "audio_stream_manager.h"
35 
36 namespace OHOS {
37 namespace AudioStandard {
38 const int ARGS_ONE = 1;
39 const int ARGS_TWO = 2;
40 const int ARGS_THREE = 3;
41 
42 const int PARAM0 = 0;
43 const int PARAM1 = 1;
44 const int PARAM2 = 2;
45 
46 const std::vector<DeviceRole> DEVICE_ROLE_SET = {
47     DEVICE_ROLE_NONE,
48     INPUT_DEVICE,
49     OUTPUT_DEVICE
50 };
51 
52 const std::vector<DeviceType> DEVICE_TYPE_SET = {
53     DEVICE_TYPE_NONE,
54     DEVICE_TYPE_INVALID,
55     DEVICE_TYPE_EARPIECE,
56     DEVICE_TYPE_SPEAKER,
57     DEVICE_TYPE_WIRED_HEADSET,
58     DEVICE_TYPE_WIRED_HEADPHONES,
59     DEVICE_TYPE_BLUETOOTH_SCO,
60     DEVICE_TYPE_BLUETOOTH_A2DP,
61     DEVICE_TYPE_MIC,
62     DEVICE_TYPE_WAKEUP,
63     DEVICE_TYPE_USB_HEADSET,
64     DEVICE_TYPE_DP,
65     DEVICE_TYPE_REMOTE_CAST,
66     DEVICE_TYPE_USB_ARM_HEADSET,
67     DEVICE_TYPE_FILE_SINK,
68     DEVICE_TYPE_FILE_SOURCE,
69     DEVICE_TYPE_EXTERN_CABLE,
70     DEVICE_TYPE_DEFAULT
71 };
72 
73 /* check condition related to argc/argv, return and logging. */
74 #define NAPI_CHECK_ARGS_RETURN_VOID(context, condition, message, code)               \
75     do {                                                               \
76         if (!(condition)) {                                            \
77             (context)->status = napi_invalid_arg;                         \
78             (context)->errMessage = std::string(message);                      \
79             (context)->errCode = code;                      \
80             AUDIO_ERR_LOG("test (" #condition ") failed: " message);           \
81             return;                                                    \
82         }                                                              \
83     } while (0)
84 
85 #define NAPI_CHECK_STATUS_RETURN_VOID(context, message, code)                        \
86     do {                                                               \
87         if ((context)->status != napi_ok) {                               \
88             (context)->errMessage = std::string(message);                      \
89             (context)->errCode = code;                      \
90             AUDIO_ERR_LOG("test (context->status == napi_ok) failed: " message);  \
91             return;                                                    \
92         }                                                              \
93     } while (0)
94 
95 class NapiParamUtils {
96 public:
97     static napi_status GetParam(const napi_env &env, napi_callback_info info, size_t &argc, napi_value *args);
98     static napi_status GetValueInt32(const napi_env &env, int32_t &value, napi_value in);
99     static napi_status SetValueInt32(const napi_env &env, const int32_t &value, napi_value &result);
100     static napi_status GetValueInt32(const napi_env &env, const std::string &fieldStr, int32_t &value, napi_value in);
101     static napi_status SetValueInt32(const napi_env &env, const std::string &fieldStr,
102         const int32_t value, napi_value &result);
103 
104     static napi_status GetValueUInt32(const napi_env &env, uint32_t &value, napi_value in);
105     static napi_status SetValueUInt32(const napi_env &env, const uint32_t &value, napi_value &result);
106 
107     static napi_status GetValueDouble(const napi_env &env, double &value, napi_value in);
108     static napi_status SetValueDouble(const napi_env &env, const double &value, napi_value &result);
109     static napi_status GetValueDouble(const napi_env &env, const std::string &fieldStr, double &value, napi_value in);
110     static napi_status SetValueDouble(const napi_env &env, const std::string &fieldStr,
111         const double value, napi_value &result);
112 
113     static std::string GetStringArgument(napi_env env, napi_value value);
114     static std::string GetPropertyString(napi_env env, napi_value value, const std::string &fieldStr);
115     static napi_status SetValueString(const napi_env &env, const std::string &stringValue, napi_value &result);
116     static napi_status SetValueString(const napi_env &env, const std::string &fieldStr, const std::string &stringValue,
117         napi_value &result);
118 
119     static napi_status GetValueBoolean(const napi_env &env, bool &boolValue, napi_value in);
120     static napi_status SetValueBoolean(const napi_env &env, const bool boolValue, napi_value &result);
121     static napi_status GetValueBoolean(const napi_env &env, const std::string &fieldStr,
122         bool &boolValue, napi_value in);
123     static napi_status SetValueBoolean(const napi_env &env, const std::string &fieldStr,
124         const bool boolValue, napi_value &result);
125 
126     static napi_status GetValueInt64(const napi_env &env, int64_t &value, napi_value in);
127     static napi_status SetValueInt64(const napi_env &env, const int64_t &value, napi_value &result);
128     static napi_status GetValueInt64(const napi_env &env, const std::string &fieldStr, int64_t &value, napi_value in);
129     static napi_status SetValueInt64(const napi_env &env, const std::string &fieldStr,
130         const int64_t value, napi_value &result);
131     static napi_status GetArrayBuffer(const napi_env &env, void* &data, size_t &length, napi_value in);
132     static napi_status CreateArrayBuffer(const napi_env &env, const std::string &fieldStr, size_t bufferLen,
133         uint8_t *bufferData, napi_value &result);
134     static napi_status CreateArrayBuffer(const napi_env &env, const size_t bufferLen,
135         const uint8_t *bufferData, napi_value &result);
136 
137     static napi_value GetUndefinedValue(napi_env env);
138 
139     /* NapiAudioRenderer Get&&Set object */
140     static void ConvertDeviceInfoToAudioDeviceDescriptor(sptr<AudioDeviceDescriptor> audioDeviceDescriptor,
141         const DeviceInfo &deviceInfo);
142     static napi_status GetRendererOptions(const napi_env &env, AudioRendererOptions *opts, napi_value in);
143     static napi_status GetRendererInfo(const napi_env &env, AudioRendererInfo *rendererInfo, napi_value in);
144     static napi_status SetRendererInfo(const napi_env &env, const AudioRendererInfo &rendererInfo, napi_value &result);
145     static napi_status GetStreamInfo(const napi_env &env, AudioStreamInfo *streamInfo, napi_value in);
146     static napi_status SetStreamInfo(const napi_env &env, const AudioStreamInfo &streamInfo, napi_value &result);
147     static napi_status SetValueInt32Element(const napi_env &env, const std::string &fieldStr,
148         const std::vector<int32_t> &values, napi_value &result);
149     static napi_status SetDeviceDescriptor(const napi_env &env, const AudioDeviceDescriptor &deviceInfo,
150         napi_value &result);
151     static napi_status SetDeviceDescriptors(const napi_env &env,
152         const std::vector<sptr<AudioDeviceDescriptor>> &deviceDescriptors, napi_value &result);
153     static napi_status SetAudioSpatialEnabledStateForDevice(const napi_env &env,
154     const AudioSpatialEnabledStateForDevice audioSpatialEnabledStateForDevice, napi_value &result);
155     static napi_status SetValueDeviceInfo(const napi_env &env, const DeviceInfo &deviceInfo, napi_value &result);
156     static napi_status SetInterruptEvent(const napi_env &env, const InterruptEvent &interruptEvent,
157         napi_value &result);
158     static napi_status SetNativeAudioRendererDataInfo(const napi_env &env,
159         const AudioRendererDataInfo &audioRendererDataInfo, napi_value &result);
160 
161     /* NapiAudioCapturer Get&&Set object */
162     static napi_status GetCapturerInfo(const napi_env &env, AudioCapturerInfo *capturerInfo, napi_value in);
163     static napi_status SetCapturerInfo(const napi_env &env, const AudioCapturerInfo &capturerInfo, napi_value &result);
164     static napi_status GetCaptureFilterOptionsVector(const napi_env &env,
165         CaptureFilterOptions *filterOptions, napi_value in);
166     static napi_status GetPlaybackCaptureConfig(const napi_env &env,
167         AudioPlaybackCaptureConfig* captureConfig, napi_value in);
168     static napi_status GetCapturerOptions(const napi_env &env, AudioCapturerOptions *opts, napi_value in);
169     static napi_status SetAudioCapturerChangeInfoDescriptors(const napi_env &env,
170         const AudioCapturerChangeInfo &changeInfo, napi_value &result);
171     static napi_status SetMicrophoneDescriptor(const napi_env &env, const sptr<MicrophoneDescriptor> &micDesc,
172         napi_value &result);
173     static napi_status SetMicrophoneDescriptors(const napi_env &env,
174         const std::vector<sptr<MicrophoneDescriptor>> &micDescs, napi_value &result);
175 
176     /* NapiAudioManager Get&&Set object */
177     static napi_status SetValueMicStateChange(const napi_env &env, const MicStateChangeEvent &micStateChangeEvent,
178         napi_value &result);
179     static napi_status SetVolumeGroupInfos(const napi_env &env,
180         const std::vector<sptr<VolumeGroupInfo>> &volumeGroupInfos, napi_value &result);
181     static napi_status SetValueVolumeEvent(const napi_env& env, const VolumeEvent &volumeEvent,
182         napi_value &result);
183     static napi_status GetAudioDeviceDescriptor(const napi_env &env, sptr<AudioDeviceDescriptor> &selectedAudioDevice,
184         bool &argTransFlag, napi_value in);
185     static napi_status GetAudioDeviceDescriptorVector(const napi_env &env,
186         std::vector<sptr<AudioDeviceDescriptor>> &deviceDescriptorsVector, bool &argTransFlag, napi_value in);
187     static napi_status GetAudioCapturerFilter(const napi_env &env, sptr<AudioCapturerFilter> &audioCapturerFilter,
188         napi_value in);
189     static napi_status GetAudioCapturerInfo(const napi_env &env, AudioCapturerInfo *capturerInfo, napi_value in);
190     static napi_status GetAudioRendererFilter(const napi_env &env, sptr<AudioRendererFilter> &audioRendererFilter,
191         bool &argTransFlag, napi_value in);
192     static napi_status SetValueDeviceChangeAction(const napi_env& env, const DeviceChangeAction &action,
193         napi_value &result);
194     static napi_status SetValueBlockedDeviceAction(const napi_env& env, const MicrophoneBlockedInfo &action,
195         napi_value &result);
196     static napi_status SetRendererChangeInfos(const napi_env &env,
197         const std::vector<std::unique_ptr<AudioRendererChangeInfo>> &changeInfos, napi_value &result);
198     static napi_status SetCapturerChangeInfos(const napi_env &env,
199         const std::vector<std::unique_ptr<AudioCapturerChangeInfo>> &changeInfos, napi_value &result);
200     static napi_status SetEffectInfo(const napi_env &env,
201         const AudioSceneEffectInfo &audioSceneEffectInfo, napi_value &result);
202     static napi_status GetAudioInterrupt(const napi_env &env, AudioInterrupt &audioInterrupt, napi_value in);
203     static napi_status SetValueInterruptAction(const napi_env &env, const InterruptAction &interruptAction,
204         napi_value &result);
205     static napi_status GetSpatialDeviceState(napi_env env, AudioSpatialDeviceState *spatialDeviceState,
206         napi_value in);
207     static napi_status GetExtraParametersSubKV(napi_env env, std::vector<std::pair<std::string, std::string>> &subKV,
208         napi_value in);
209     static napi_status GetExtraParametersVector(const napi_env &env, std::vector<std::string> &subKeys, napi_value in);
210     static napi_status SetExtraAudioParametersInfo(const napi_env &env,
211         const std::vector<std::pair<std::string, std::string>> &extraParameters, napi_value &result);
212     static napi_status GetAudioSessionStrategy(const napi_env &env,
213         AudioSessionStrategy &audioSessionStrategy, napi_value in);
214     static napi_status SetAudioSessionDeactiveEvent(const napi_env &env,
215         const AudioSessionDeactiveEvent &deactiveEvent, napi_value &result);
216 };
217 } // namespace AudioStandard
218 } // namespace OHOS
219 #endif // NAPI_PARAM_UTILS_H
220