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