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 #include "audio_renderer_info_napi.h"
17 #include "hilog/log.h"
18
19 using namespace std;
20 using OHOS::HiviewDFX::HiLog;
21 using OHOS::HiviewDFX::HiLogLabel;
22
23 namespace OHOS {
24 namespace AudioStandard {
25 napi_ref AudioRendererInfoNapi::sConstructor_ = nullptr;
26 unique_ptr<AudioRendererInfo> AudioRendererInfoNapi::sAudioRendererInfo_ = nullptr;
27
28 namespace {
29 constexpr HiLogLabel LABEL = {LOG_CORE, LOG_DOMAIN, "AudioRendererInfoNapi"};
30 }
31
AudioRendererInfoNapi()32 AudioRendererInfoNapi::AudioRendererInfoNapi()
33 : env_(nullptr) {
34 }
35
36 AudioRendererInfoNapi::~AudioRendererInfoNapi() = default;
37
Destructor(napi_env env,void * nativeObject,void * finalize_hint)38 void AudioRendererInfoNapi::Destructor(napi_env env, void *nativeObject, void *finalize_hint)
39 {
40 if (nativeObject != nullptr) {
41 auto obj = static_cast<AudioRendererInfoNapi *>(nativeObject);
42 delete obj;
43 obj = nullptr;
44 }
45 }
46
Init(napi_env env,napi_value exports)47 napi_value AudioRendererInfoNapi::Init(napi_env env, napi_value exports)
48 {
49 napi_status status;
50 napi_value constructor;
51 napi_value result = nullptr;
52 napi_get_undefined(env, &result);
53 int32_t refCount = 1;
54
55 napi_property_descriptor audio_renderer_info_properties[] = {
56 DECLARE_NAPI_GETTER_SETTER("content", GetContentType, SetContentType),
57 DECLARE_NAPI_GETTER_SETTER("usage", GetStreamUsage, SetStreamUsage),
58 DECLARE_NAPI_GETTER_SETTER("rendererFlags", GetRendererFlags, SetRendererFlags)
59 };
60
61 status = napi_define_class(env, AUDIO_RENDERER_INFO_NAPI_CLASS_NAME.c_str(), NAPI_AUTO_LENGTH, Construct,
62 nullptr, sizeof(audio_renderer_info_properties) / sizeof(audio_renderer_info_properties[0]),
63 audio_renderer_info_properties, &constructor);
64 if (status != napi_ok) {
65 return result;
66 }
67
68 status = napi_create_reference(env, constructor, refCount, &sConstructor_);
69 if (status == napi_ok) {
70 status = napi_set_named_property(env, exports, AUDIO_RENDERER_INFO_NAPI_CLASS_NAME.c_str(),
71 constructor);
72 if (status == napi_ok) {
73 return exports;
74 }
75 }
76 HiLog::Error(LABEL, "Failure in AudioRendererInfoNapi::Init()");
77
78 return result;
79 }
80
Construct(napi_env env,napi_callback_info info)81 napi_value AudioRendererInfoNapi::Construct(napi_env env, napi_callback_info info)
82 {
83 napi_status status;
84 napi_value jsThis = nullptr;
85 size_t argCount = 0;
86
87 status = napi_get_cb_info(env, info, &argCount, nullptr, &jsThis, nullptr);
88 if (status == napi_ok) {
89 unique_ptr<AudioRendererInfoNapi> obj = make_unique<AudioRendererInfoNapi>();
90 if (obj != nullptr) {
91 obj->env_ = env;
92 obj->audioRendererInfo_ = move(sAudioRendererInfo_);
93 status = napi_wrap(env, jsThis, static_cast<void *>(obj.get()),
94 AudioRendererInfoNapi::Destructor, nullptr, nullptr);
95 if (status == napi_ok) {
96 obj.release();
97 return jsThis;
98 }
99 }
100 }
101 HiLog::Error(LABEL, "Failed in AudioRendererInfoNapi::Construct()!");
102 napi_get_undefined(env, &jsThis);
103
104 return jsThis;
105 }
106
CreateAudioRendererInfoWrapper(napi_env env,unique_ptr<AudioRendererInfo> & audioRendererInfo)107 napi_value AudioRendererInfoNapi::CreateAudioRendererInfoWrapper(napi_env env,
108 unique_ptr<AudioRendererInfo> &audioRendererInfo)
109 {
110 napi_status status;
111 napi_value result = nullptr;
112 napi_value constructor;
113
114 status = napi_get_reference_value(env, sConstructor_, &constructor);
115 if (status == napi_ok) {
116 sAudioRendererInfo_ = move(audioRendererInfo);
117 status = napi_new_instance(env, constructor, 0, nullptr, &result);
118 sAudioRendererInfo_.release();
119 if (status == napi_ok) {
120 return result;
121 }
122 }
123 HiLog::Error(LABEL, "Failed in CreateAudioRendererInfoWrapper, %{public}d", status);
124
125 napi_get_undefined(env, &result);
126
127 return result;
128 }
129
GetContentType(napi_env env,napi_callback_info info)130 napi_value AudioRendererInfoNapi::GetContentType(napi_env env, napi_callback_info info)
131 {
132 napi_status status;
133 AudioRendererInfoNapi *audioRendererInfoNapi = nullptr;
134 size_t argc = 0;
135 napi_value jsThis = nullptr;
136 ContentType contentType;
137 napi_value jsResult = nullptr;
138 napi_get_undefined(env, &jsResult);
139
140 status = napi_get_cb_info(env, info, &argc, nullptr, &jsThis, nullptr);
141 if (status != napi_ok || jsThis == nullptr) {
142 HiLog::Error(LABEL, "Get content type fail to napi_get_cb_info");
143 return jsResult;
144 }
145
146 status = napi_unwrap(env, jsThis, (void **)&audioRendererInfoNapi);
147 if (status == napi_ok) {
148 contentType = audioRendererInfoNapi->audioRendererInfo_->contentType;
149 status = napi_create_int32(env, contentType, &jsResult);
150 if (status == napi_ok) {
151 return jsResult;
152 }
153 }
154
155 return jsResult;
156 }
157
SetContentType(napi_env env,napi_callback_info info)158 napi_value AudioRendererInfoNapi::SetContentType(napi_env env, napi_callback_info info)
159 {
160 napi_status status;
161 AudioRendererInfoNapi *audioRendererInfoNapi = nullptr;
162 size_t argc = 1;
163 napi_value args[1] = { nullptr };
164 napi_value jsThis = nullptr;
165 int32_t contentType;
166 napi_value jsResult = nullptr;
167 napi_get_undefined(env, &jsResult);
168
169 status = napi_get_cb_info(env, info, &argc, args, &jsThis, nullptr);
170 if (status != napi_ok || jsThis == nullptr || args[0] == nullptr) {
171 HiLog::Error(LABEL, "set content type fail to napi_get_cb_info");
172 return jsResult;
173 }
174
175 status = napi_unwrap(env, jsThis, (void **)&audioRendererInfoNapi);
176 if (status == napi_ok) {
177 napi_valuetype valueType = napi_undefined;
178 if (napi_typeof(env, args[0], &valueType) != napi_ok || valueType != napi_number) {
179 HiLog::Error(LABEL, "set content type fail: wrong data type");
180 return jsResult;
181 }
182 }
183
184 status = napi_get_value_int32(env, args[0], &contentType);
185 if (status == napi_ok) {
186 audioRendererInfoNapi->audioRendererInfo_->contentType
187 = static_cast<ContentType>(contentType);
188 }
189
190 return jsResult;
191 }
192
GetStreamUsage(napi_env env,napi_callback_info info)193 napi_value AudioRendererInfoNapi::GetStreamUsage(napi_env env, napi_callback_info info)
194 {
195 napi_status status;
196 AudioRendererInfoNapi *audioRendererInfoNapi = nullptr;
197 size_t argc = 0;
198 napi_value jsThis = nullptr;
199 StreamUsage usage;
200 napi_value jsResult = nullptr;
201 napi_get_undefined(env, &jsResult);
202
203 status = napi_get_cb_info(env, info, &argc, nullptr, &jsThis, nullptr);
204 if (status != napi_ok || jsThis == nullptr) {
205 HiLog::Error(LABEL, "Get stream usage fail to napi_get_cb_info");
206 return jsResult;
207 }
208
209 status = napi_unwrap(env, jsThis, (void **)&audioRendererInfoNapi);
210 if (status == napi_ok) {
211 usage = audioRendererInfoNapi->audioRendererInfo_->streamUsage;
212 status = napi_create_int32(env, usage, &jsResult);
213 if (status == napi_ok) {
214 return jsResult;
215 }
216 }
217
218 return jsResult;
219 }
220
SetStreamUsage(napi_env env,napi_callback_info info)221 napi_value AudioRendererInfoNapi::SetStreamUsage(napi_env env, napi_callback_info info)
222 {
223 napi_status status;
224 AudioRendererInfoNapi *audioRendererInfoNapi = nullptr;
225 size_t argc = 1;
226 napi_value args[1] = { nullptr };
227 napi_value jsThis = nullptr;
228 int32_t usage;
229 napi_value jsResult = nullptr;
230 napi_get_undefined(env, &jsResult);
231
232 status = napi_get_cb_info(env, info, &argc, args, &jsThis, nullptr);
233 if (status != napi_ok || jsThis == nullptr || args[0] == nullptr) {
234 HiLog::Error(LABEL, "set stream usage fail to napi_get_cb_info");
235 return jsResult;
236 }
237
238 status = napi_unwrap(env, jsThis, (void **)&audioRendererInfoNapi);
239 if (status != napi_ok) {
240 HiLog::Error(LABEL, "Napi unwrap failed");
241 return jsResult;
242 }
243
244 napi_valuetype valueType = napi_undefined;
245 if (napi_typeof(env, args[0], &valueType) != napi_ok || valueType != napi_number) {
246 HiLog::Error(LABEL, "set stream usage fail: wrong data type");
247 return jsResult;
248 }
249
250 status = napi_get_value_int32(env, args[0], &usage);
251 if (status == napi_ok) {
252 audioRendererInfoNapi->audioRendererInfo_->streamUsage = static_cast<StreamUsage>(usage);
253 }
254
255 return jsResult;
256 }
257
GetRendererFlags(napi_env env,napi_callback_info info)258 napi_value AudioRendererInfoNapi::GetRendererFlags(napi_env env, napi_callback_info info)
259 {
260 napi_status status;
261 AudioRendererInfoNapi *audioRendererInfoNapi = nullptr;
262 size_t argc = 0;
263 napi_value jsThis = nullptr;
264 napi_value jsResult = nullptr;
265 napi_get_undefined(env, &jsResult);
266
267 status = napi_get_cb_info(env, info, &argc, nullptr, &jsThis, nullptr);
268 if (status != napi_ok || jsThis == nullptr) {
269 HiLog::Error(LABEL, "Get renderer flag fail to napi_get_cb_info");
270 return jsResult;
271 }
272
273 status = napi_unwrap(env, jsThis, (void **)&audioRendererInfoNapi);
274 if (status == napi_ok) {
275 status = napi_create_int32(env, audioRendererInfoNapi->audioRendererInfo_->rendererFlags,
276 &jsResult);
277 if (status == napi_ok) {
278 return jsResult;
279 }
280 }
281
282 return jsResult;
283 }
284
SetRendererFlags(napi_env env,napi_callback_info info)285 napi_value AudioRendererInfoNapi::SetRendererFlags(napi_env env, napi_callback_info info)
286 {
287 napi_status status;
288 AudioRendererInfoNapi *audioRendererInfoNapi = nullptr;
289 size_t argc = 1;
290 napi_value args[1] = { nullptr };
291 napi_value jsThis = nullptr;
292 int32_t rendererFlags;
293 napi_value jsResult = nullptr;
294 napi_get_undefined(env, &jsResult);
295
296 status = napi_get_cb_info(env, info, &argc, args, &jsThis, nullptr);
297 if (status != napi_ok || jsThis == nullptr || args[0] == nullptr) {
298 HiLog::Error(LABEL, "get renderer flag fail to napi_get_cb_info");
299 return jsResult;
300 }
301
302 status = napi_unwrap(env, jsThis, (void **)&audioRendererInfoNapi);
303 if (status == napi_ok) {
304 napi_valuetype valueType = napi_undefined;
305 if (napi_typeof(env, args[0], &valueType) != napi_ok || valueType != napi_number) {
306 HiLog::Error(LABEL, "get renderer flag fail: wrong data type");
307 return jsResult;
308 }
309 }
310
311 status = napi_get_value_int32(env, args[0], &rendererFlags);
312 if (status == napi_ok) {
313 audioRendererInfoNapi->audioRendererInfo_->rendererFlags = rendererFlags;
314 }
315
316 return jsResult;
317 }
318 } // namespace AudioStandard
319 } // namespace OHOS
320