• 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), 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