• 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 #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