1 /*
2 * Copyright (c) 2022-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
16 #include "napi_avsession.h"
17 #include "avsession_controller.h"
18 #include "napi_async_work.h"
19 #include "napi_utils.h"
20 #include "napi_meta_data.h"
21 #include "napi_playback_state.h"
22 #include "napi_media_description.h"
23 #include "napi_queue_item.h"
24 #include "want_params.h"
25 #include "want_agent.h"
26 #include "avsession_trace.h"
27 #include "napi_avsession_controller.h"
28 #include "napi_avsession_manager.h"
29
30 #ifdef CASTPLUS_CAST_ENGINE_ENABLE
31 #include "avcast_controller.h"
32 #include "napi_avcast_controller.h"
33 #endif
34 namespace OHOS::AVSession {
35 static __thread napi_ref AVSessionConstructorRef = nullptr;
36 std::map<std::string, NapiAVSession::OnEventHandlerType> NapiAVSession::onEventHandlers_ = {
37 { "play", OnPlay },
38 { "pause", OnPause },
39 { "stop", OnStop },
40 { "playNext", OnPlayNext },
41 { "playPrevious", OnPlayPrevious },
42 { "fastForward", OnFastForward },
43 { "rewind", OnRewind },
44 { "seek", OnSeek },
45 { "setSpeed", OnSetSpeed },
46 { "setLoopMode", OnSetLoopMode },
47 { "toggleFavorite", OnToggleFavorite },
48 { "handleKeyEvent", OnMediaKeyEvent },
49 { "outputDeviceChange", OnOutputDeviceChange },
50 { "commonCommand", OnCommonCommand },
51 { "skipToQueueItem", OnSkipToQueueItem },
52 };
53 std::map<std::string, NapiAVSession::OffEventHandlerType> NapiAVSession::offEventHandlers_ = {
54 { "play", OffPlay },
55 { "pause", OffPause },
56 { "stop", OffStop },
57 { "playNext", OffPlayNext },
58 { "playPrevious", OffPlayPrevious },
59 { "fastForward", OffFastForward },
60 { "rewind", OffRewind },
61 { "seek", OffSeek },
62 { "setSpeed", OffSetSpeed },
63 { "setLoopMode", OffSetLoopMode },
64 { "toggleFavorite", OffToggleFavorite },
65 { "handleKeyEvent", OffMediaKeyEvent },
66 { "outputDeviceChange", OffOutputDeviceChange },
67 { "commonCommand", OffCommonCommand },
68 { "skipToQueueItem", OffSkipToQueueItem },
69 };
70
NapiAVSession()71 NapiAVSession::NapiAVSession()
72 {
73 SLOGI("construct");
74 }
75
~NapiAVSession()76 NapiAVSession::~NapiAVSession()
77 {
78 SLOGI("destroy");
79 }
80
Init(napi_env env,napi_value exports)81 napi_value NapiAVSession::Init(napi_env env, napi_value exports)
82 {
83 napi_property_descriptor descriptors[] = {
84 DECLARE_NAPI_FUNCTION("setAVMetadata", SetAVMetaData),
85 DECLARE_NAPI_FUNCTION("setAVPlaybackState", SetAVPlaybackState),
86 DECLARE_NAPI_FUNCTION("setLaunchAbility", SetLaunchAbility),
87 DECLARE_NAPI_FUNCTION("setExtras", SetExtras),
88 DECLARE_NAPI_FUNCTION("setAudioStreamId", SetAudioStreamId),
89 DECLARE_NAPI_FUNCTION("getController", GetController),
90 DECLARE_NAPI_FUNCTION("activate", Activate),
91 DECLARE_NAPI_FUNCTION("deactivate", Deactivate),
92 DECLARE_NAPI_FUNCTION("destroy", Destroy),
93 DECLARE_NAPI_FUNCTION("on", OnEvent),
94 DECLARE_NAPI_FUNCTION("off", OffEvent),
95 DECLARE_NAPI_FUNCTION("getOutputDevice", GetOutputDevice),
96 DECLARE_NAPI_FUNCTION("getOutputDeviceSync", GetOutputDeviceSync),
97 DECLARE_NAPI_FUNCTION("dispatchSessionEvent", SetSessionEvent),
98 DECLARE_NAPI_FUNCTION("setAVQueueItems", SetAVQueueItems),
99 DECLARE_NAPI_FUNCTION("setAVQueueTitle", SetAVQueueTitle),
100 DECLARE_NAPI_FUNCTION("getAVCastController", GetAVCastController),
101 DECLARE_NAPI_FUNCTION("stopCasting", ReleaseCast),
102 };
103 auto propertyCount = sizeof(descriptors) / sizeof(napi_property_descriptor);
104 napi_value constructor {};
105 auto status = napi_define_class(env, "AVSession", NAPI_AUTO_LENGTH, ConstructorCallback, nullptr,
106 propertyCount, descriptors, &constructor);
107 if (status != napi_ok) {
108 SLOGE("define class failed");
109 return NapiUtils::GetUndefinedValue(env);
110 }
111 napi_create_reference(env, constructor, 1, &AVSessionConstructorRef);
112 return exports;
113 }
114
ConstructorCallback(napi_env env,napi_callback_info info)115 napi_value NapiAVSession::ConstructorCallback(napi_env env, napi_callback_info info)
116 {
117 napi_value self;
118 NAPI_CALL_BASE(env, napi_get_cb_info(env, info, nullptr, nullptr, &self, nullptr), nullptr);
119 auto finalize = [](napi_env env, void* data, void* hint) {
120 auto* napiSession = reinterpret_cast<NapiAVSession*>(data);
121 napi_delete_reference(env, napiSession->wrapperRef_);
122 delete napiSession;
123 napiSession = nullptr;
124 };
125 auto* napiSession = new(std::nothrow) NapiAVSession();
126 if (napiSession == nullptr) {
127 SLOGE("no memory");
128 return nullptr;
129 }
130 if (napi_wrap(env, self, static_cast<void*>(napiSession), finalize, nullptr, nullptr) != napi_ok) {
131 SLOGE("wrap failed");
132 return nullptr;
133 }
134 return self;
135 }
136
NewInstance(napi_env env,std::shared_ptr<AVSession> & nativeSession,napi_value & out)137 napi_status NapiAVSession::NewInstance(napi_env env, std::shared_ptr<AVSession>& nativeSession, napi_value& out)
138 {
139 napi_value constructor {};
140 NAPI_CALL_BASE(env, napi_get_reference_value(env, AVSessionConstructorRef, &constructor), napi_generic_failure);
141 napi_value instance{};
142 NAPI_CALL_BASE(env, napi_new_instance(env, constructor, 0, nullptr, &instance), napi_generic_failure);
143 NapiAVSession* napiAvSession{};
144 NAPI_CALL_BASE(env, napi_unwrap(env, instance, reinterpret_cast<void**>(&napiAvSession)), napi_generic_failure);
145 napiAvSession->session_ = std::move(nativeSession);
146 napiAvSession->sessionId_ = napiAvSession->session_->GetSessionId();
147 napiAvSession->sessionType_ = napiAvSession->session_->GetSessionType();
148 SLOGI("sessionId=%{public}s", napiAvSession->sessionId_.c_str());
149
150 napi_value property {};
151 auto status = NapiUtils::SetValue(env, napiAvSession->sessionId_, property);
152 CHECK_RETURN(status == napi_ok, "create object failed", napi_generic_failure);
153 NAPI_CALL_BASE(env, napi_set_named_property(env, instance, "sessionId", property), napi_generic_failure);
154
155 status = NapiUtils::SetValue(env, napiAvSession->sessionType_, property);
156 CHECK_RETURN(status == napi_ok, "create object failed", napi_generic_failure);
157 NAPI_CALL_BASE(env, napi_set_named_property(env, instance, "sessionType", property), napi_generic_failure);
158 out = instance;
159 return napi_ok;
160 }
161
OnEvent(napi_env env,napi_callback_info info)162 napi_value NapiAVSession::OnEvent(napi_env env, napi_callback_info info)
163 {
164 auto context = std::make_shared<ContextBase>();
165 if (context == nullptr) {
166 SLOGE("OnEvent failed : no memory");
167 NapiUtils::ThrowError(env, "OnEvent failed : no memory", NapiAVSessionManager::errcode_[ERR_NO_MEMORY]);
168 return NapiUtils::GetUndefinedValue(env);
169 }
170 std::string eventName;
171 napi_value callback {};
172 auto input = [&eventName, &callback, env, &context](size_t argc, napi_value* argv) {
173 /* require 2 arguments <event, callback> */
174 CHECK_ARGS_RETURN_VOID(context, argc == ARGC_TWO, "invalid argument number",
175 NapiAVSessionManager::errcode_[ERR_INVALID_PARAM]);
176 context->status = NapiUtils::GetValue(env, argv[ARGV_FIRST], eventName);
177 CHECK_STATUS_RETURN_VOID(context, "get event name failed", NapiAVSessionManager::errcode_[ERR_INVALID_PARAM]);
178 napi_valuetype type = napi_undefined;
179 context->status = napi_typeof(env, argv[ARGV_SECOND], &type);
180 CHECK_ARGS_RETURN_VOID(context, (context->status == napi_ok) && (type == napi_function),
181 "callback type invalid", NapiAVSessionManager::errcode_[ERR_INVALID_PARAM]);
182 callback = argv[ARGV_SECOND];
183 };
184 context->GetCbInfo(env, info, input, true);
185 if (context->status != napi_ok) {
186 NapiUtils::ThrowError(env, context->errMessage.c_str(), context->errCode);
187 return NapiUtils::GetUndefinedValue(env);
188 }
189 auto it = onEventHandlers_.find(eventName);
190 if (it == onEventHandlers_.end()) {
191 SLOGE("event name invalid");
192 NapiUtils::ThrowError(env, "event name invalid", NapiAVSessionManager::errcode_[ERR_INVALID_PARAM]);
193 return NapiUtils::GetUndefinedValue(env);
194 }
195 auto* napiSession = reinterpret_cast<NapiAVSession*>(context->native);
196 if (napiSession->session_ == nullptr) {
197 SLOGE("OnEvent failed : session is nullptr");
198 NapiUtils::ThrowError(env, "OnEvent failed : session is nullptr",
199 NapiAVSessionManager::errcode_[ERR_SESSION_NOT_EXIST]);
200 return NapiUtils::GetUndefinedValue(env);
201 }
202 if (napiSession->callback_ == nullptr) {
203 napiSession->callback_ = std::make_shared<NapiAVSessionCallback>();
204 if (napiSession->callback_ == nullptr) {
205 SLOGE("OnEvent failed : no memory");
206 NapiUtils::ThrowError(env, "OnEvent failed : no memory", NapiAVSessionManager::errcode_[ERR_NO_MEMORY]);
207 return NapiUtils::GetUndefinedValue(env);
208 }
209 int32_t ret = napiSession->session_->RegisterCallback(napiSession->callback_);
210 if (ret != AVSESSION_SUCCESS) {
211 if (ret == ERR_SESSION_NOT_EXIST) {
212 NapiUtils::ThrowError(env, "OnEvent failed : native session not exist",
213 NapiAVSessionManager::errcode_[ret]);
214 } else if (ret == ERR_INVALID_PARAM) {
215 NapiUtils::ThrowError(env, "OnEvent failed : native invalid parameters",
216 NapiAVSessionManager::errcode_[ret]);
217 } else if (ret == ERR_NO_PERMISSION) {
218 NapiUtils::ThrowError(env, "OnEvent failed : native no permission",
219 NapiAVSessionManager::errcode_[ret]);
220 } else {
221 NapiUtils::ThrowError(env, "OnEvent failed : native server exception",
222 NapiAVSessionManager::errcode_[ret]);
223 }
224 return NapiUtils::GetUndefinedValue(env);
225 }
226 }
227 if (it->second(env, napiSession, callback) != napi_ok) {
228 NapiUtils::ThrowError(env, "add event callback failed", NapiAVSessionManager::errcode_[AVSESSION_ERROR]);
229 }
230 return NapiUtils::GetUndefinedValue(env);
231 }
232
OffEvent(napi_env env,napi_callback_info info)233 napi_value NapiAVSession::OffEvent(napi_env env, napi_callback_info info)
234 {
235 auto context = std::make_shared<ContextBase>();
236 if (context == nullptr) {
237 SLOGE("OffEvent failed : no memory");
238 NapiUtils::ThrowError(env, "OffEvent failed : no memory", NapiAVSessionManager::errcode_[ERR_NO_MEMORY]);
239 return NapiUtils::GetUndefinedValue(env);
240 }
241 std::string eventName;
242 napi_value callback = nullptr;
243 auto input = [&eventName, env, &context, &callback](size_t argc, napi_value* argv) {
244 CHECK_ARGS_RETURN_VOID(context, argc == ARGC_ONE || argc == ARGC_TWO,
245 "invalid argument number", NapiAVSessionManager::errcode_[ERR_INVALID_PARAM]);
246 context->status = NapiUtils::GetValue(env, argv[ARGV_FIRST], eventName);
247 CHECK_STATUS_RETURN_VOID(context, "get event name failed", NapiAVSessionManager::errcode_[ERR_INVALID_PARAM]);
248 if (argc == ARGC_TWO) {
249 callback = argv[ARGV_SECOND];
250 }
251 };
252 context->GetCbInfo(env, info, input, true);
253 if (context->status != napi_ok) {
254 NapiUtils::ThrowError(env, context->errMessage.c_str(), context->errCode);
255 return NapiUtils::GetUndefinedValue(env);
256 }
257 auto it = offEventHandlers_.find(eventName);
258 if (it == offEventHandlers_.end()) {
259 SLOGE("event name invalid");
260 NapiUtils::ThrowError(env, "event name invalid", NapiAVSessionManager::errcode_[ERR_INVALID_PARAM]);
261 return NapiUtils::GetUndefinedValue(env);
262 }
263 auto* napiSession = reinterpret_cast<NapiAVSession*>(context->native);
264 if (napiSession->session_ == nullptr) {
265 SLOGE("OffEvent failed : session is nullptr");
266 NapiUtils::ThrowError(env, "OffEvent failed : session is nullptr",
267 NapiAVSessionManager::errcode_[ERR_SESSION_NOT_EXIST]);
268 return NapiUtils::GetUndefinedValue(env);
269 }
270 if (napiSession != nullptr && it->second(env, napiSession, callback) != napi_ok) {
271 NapiUtils::ThrowError(env, "remove event callback failed", NapiAVSessionManager::errcode_[AVSESSION_ERROR]);
272 }
273 return NapiUtils::GetUndefinedValue(env);
274 }
275
SetAVMetaData(napi_env env,napi_callback_info info)276 napi_value NapiAVSession::SetAVMetaData(napi_env env, napi_callback_info info)
277 {
278 AVSESSION_TRACE_SYNC_START("NapiAVSession::SetAVMetadata");
279 struct ConcreteContext : public ContextBase {
280 AVMetaData metaData_;
281 };
282 auto context = std::make_shared<ConcreteContext>();
283 if (context == nullptr) {
284 SLOGE("SetAVMetaData failed : no memory");
285 NapiUtils::ThrowError(env, "SetAVMetaData failed : no memory", NapiAVSessionManager::errcode_[ERR_NO_MEMORY]);
286 return NapiUtils::GetUndefinedValue(env);
287 }
288
289 auto inputParser = [env, context](size_t argc, napi_value* argv) {
290 CHECK_ARGS_RETURN_VOID(context, argc == ARGC_ONE, "invalid arguments",
291 NapiAVSessionManager::errcode_[ERR_INVALID_PARAM]);
292 context->status = NapiMetaData::GetValue(env, argv[ARGV_FIRST], context->metaData_);
293 CHECK_ARGS_RETURN_VOID(context, context->status == napi_ok, "get metaData failed",
294 NapiAVSessionManager::errcode_[ERR_INVALID_PARAM]);
295 };
296 context->GetCbInfo(env, info, inputParser);
297 context->taskId = NAPI_SET_AV_META_DATA_TASK_ID;
298
299 auto executor = [context]() {
300 auto* napiSession = reinterpret_cast<NapiAVSession*>(context->native);
301 if (napiSession->session_ == nullptr) {
302 context->status = napi_generic_failure;
303 context->errMessage = "SetAVMetaData failed : session is nullptr";
304 context->errCode = NapiAVSessionManager::errcode_[ERR_SESSION_NOT_EXIST];
305 return;
306 }
307 int32_t ret = napiSession->session_->SetAVMetaData(context->metaData_);
308 if (ret != AVSESSION_SUCCESS) {
309 if (ret == ERR_SESSION_NOT_EXIST) {
310 context->errMessage = "SetAVMetaData failed : native session not exist";
311 } else if (ret == ERR_INVALID_PARAM) {
312 context->errMessage = "SetAVMetaData failed : native invalid parameters";
313 } else if (ret == ERR_NO_PERMISSION) {
314 context->errMessage = "SetAVMetaData failed : native no permission";
315 } else {
316 context->errMessage = "SetAVMetaData failed : native server exception";
317 }
318 context->status = napi_generic_failure;
319 context->errCode = NapiAVSessionManager::errcode_[ret];
320 }
321 };
322 auto complete = [env](napi_value& output) {
323 output = NapiUtils::GetUndefinedValue(env);
324 };
325 return NapiAsyncWork::Enqueue(env, context, "SetAVMetaData", executor, complete);
326 }
327
SetAVPlaybackState(napi_env env,napi_callback_info info)328 napi_value NapiAVSession::SetAVPlaybackState(napi_env env, napi_callback_info info)
329 {
330 AVSESSION_TRACE_SYNC_START("NapiAVSession::SetAVPlaybackState");
331 struct ConcreteContext : public ContextBase {
332 AVPlaybackState playBackState_;
333 };
334 auto context = std::make_shared<ConcreteContext>();
335 if (context == nullptr) {
336 SLOGE("SetAVPlaybackState failed : no memory");
337 NapiUtils::ThrowError(env, "SetAVPlaybackState failed : no memory",
338 NapiAVSessionManager::errcode_[ERR_NO_MEMORY]);
339 return NapiUtils::GetUndefinedValue(env);
340 }
341
342 auto inputParser = [env, context](size_t argc, napi_value* argv) {
343 CHECK_ARGS_RETURN_VOID(context, argc == ARGC_ONE, "invalid arguments",
344 NapiAVSessionManager::errcode_[ERR_INVALID_PARAM]);
345 context->status = NapiPlaybackState::GetValue(env, argv[ARGV_FIRST], context->playBackState_);
346 CHECK_ARGS_RETURN_VOID(context, context->status == napi_ok, "get playBackState failed",
347 NapiAVSessionManager::errcode_[ERR_INVALID_PARAM]);
348 };
349 context->GetCbInfo(env, info, inputParser);
350 context->taskId = NAPI_SET_AV_PLAYBACK_STATE_TASK_ID;
351
352 auto executor = [context]() {
353 auto* napiSession = reinterpret_cast<NapiAVSession*>(context->native);
354 if (napiSession->session_ == nullptr) {
355 context->status = napi_generic_failure;
356 context->errMessage = "SetAVPlaybackState failed : session is nullptr";
357 context->errCode = NapiAVSessionManager::errcode_[ERR_SESSION_NOT_EXIST];
358 return;
359 }
360 int32_t ret = napiSession->session_->SetAVPlaybackState(context->playBackState_);
361 if (ret != AVSESSION_SUCCESS) {
362 if (ret == ERR_SESSION_NOT_EXIST) {
363 context->errMessage = "SetAVPlaybackState failed : native session not exist";
364 } else if (ret == ERR_INVALID_PARAM) {
365 context->errMessage = "SetAVPlaybackState failed : native invalid parameters";
366 } else if (ret == ERR_NO_PERMISSION) {
367 context->errMessage = "SetAVPlaybackState failed : native no permission";
368 } else {
369 context->errMessage = "SetAVPlaybackState failed : native server exception";
370 }
371 context->status = napi_generic_failure;
372 context->errCode = NapiAVSessionManager::errcode_[ret];
373 }
374 };
375 auto complete = [env](napi_value& output) {
376 output = NapiUtils::GetUndefinedValue(env);
377 };
378 return NapiAsyncWork::Enqueue(env, context, "SetAVPlaybackState", executor, complete);
379 }
380
SetAVQueueItems(napi_env env,napi_callback_info info)381 napi_value NapiAVSession::SetAVQueueItems(napi_env env, napi_callback_info info)
382 {
383 AVSESSION_TRACE_SYNC_START("NapiAVSession::SetAVQueueItems");
384 struct ConcreteContext : public ContextBase {
385 std::vector<AVQueueItem> items_;
386 };
387 auto context = std::make_shared<ConcreteContext>();
388 if (context == nullptr) {
389 NapiUtils::ThrowError(env, "SetAVQueueItems failed : no memory",
390 NapiAVSessionManager::errcode_[ERR_NO_MEMORY]);
391 return NapiUtils::GetUndefinedValue(env);
392 }
393 auto inputParser = [env, context](size_t argc, napi_value* argv) {
394 CHECK_ARGS_RETURN_VOID(context, argc == ARGC_ONE, "invalid arguments",
395 NapiAVSessionManager::errcode_[ERR_INVALID_PARAM]);
396 context->status = NapiUtils::GetValue(env, argv[ARGV_FIRST], context->items_);
397 CHECK_ARGS_RETURN_VOID(context, context->status == napi_ok, "get queueItems failed",
398 NapiAVSessionManager::errcode_[ERR_INVALID_PARAM]);
399 for (auto &item : context->items_) {
400 CHECK_ARGS_RETURN_VOID(context, item.IsValid(), "invalid queue item content",
401 NapiAVSessionManager::errcode_[ERR_INVALID_PARAM]);
402 }
403 };
404 context->GetCbInfo(env, info, inputParser);
405 context->taskId = NAPI_SET_AV_QUEUE_ITEMS_TASK_ID;
406 auto executor = [context]() {
407 auto* napiSession = reinterpret_cast<NapiAVSession*>(context->native);
408 if (napiSession->session_ == nullptr) {
409 context->status = napi_generic_failure;
410 context->errMessage = "SetAVQueueItems failed : session is nullptr";
411 context->errCode = NapiAVSessionManager::errcode_[ERR_SESSION_NOT_EXIST];
412 return;
413 }
414 int32_t ret = napiSession->session_->SetAVQueueItems(context->items_);
415 if (ret != AVSESSION_SUCCESS) {
416 if (ret == ERR_SESSION_NOT_EXIST) {
417 context->errMessage = "SetAVQueueItems failed : native session not exist";
418 } else if (ret == ERR_INVALID_PARAM) {
419 context->errMessage = "SetAVQueueItems failed : native invalid parameters";
420 } else if (ret == ERR_NO_PERMISSION) {
421 context->errMessage = "SetAVQueueItems failed : native no permission";
422 } else {
423 context->errMessage = "SetAVQueueItems failed : native server exception";
424 }
425 context->status = napi_generic_failure;
426 context->errCode = NapiAVSessionManager::errcode_[ret];
427 }
428 };
429 auto complete = [env](napi_value& output) {
430 output = NapiUtils::GetUndefinedValue(env);
431 };
432 return NapiAsyncWork::Enqueue(env, context, "SetAVQueueItems", executor, complete);
433 }
434
SetAVQueueTitle(napi_env env,napi_callback_info info)435 napi_value NapiAVSession::SetAVQueueTitle(napi_env env, napi_callback_info info)
436 {
437 AVSESSION_TRACE_SYNC_START("NapiAVSession::SetAVQueueTitle");
438 struct ConcreteContext : public ContextBase {
439 std::string title;
440 };
441 auto context = std::make_shared<ConcreteContext>();
442 if (context == nullptr) {
443 SLOGE("SetAVQueueTitle failed : no memory");
444 NapiUtils::ThrowError(env, "SetAVQueueTitle failed : no memory",
445 NapiAVSessionManager::errcode_[ERR_NO_MEMORY]);
446 return NapiUtils::GetUndefinedValue(env);
447 }
448
449 auto inputParser = [env, context](size_t argc, napi_value* argv) {
450 CHECK_ARGS_RETURN_VOID(context, argc == ARGC_ONE, "invalid arguments",
451 NapiAVSessionManager::errcode_[ERR_INVALID_PARAM]);
452 context->status = NapiUtils::GetValue(env, argv[ARGV_FIRST], context->title);
453 CHECK_ARGS_RETURN_VOID(context, context->status == napi_ok, "get queueItems failed",
454 NapiAVSessionManager::errcode_[ERR_INVALID_PARAM]);
455 };
456 context->GetCbInfo(env, info, inputParser);
457 context->taskId = NAPI_SET_AV_QUEUE_TITLE_TASK_ID;
458
459 auto executor = [context]() {
460 auto* napiSession = reinterpret_cast<NapiAVSession*>(context->native);
461 if (napiSession->session_ == nullptr) {
462 context->status = napi_generic_failure;
463 context->errMessage = "SetAVQueueTitle failed : session is nullptr";
464 context->errCode = NapiAVSessionManager::errcode_[ERR_SESSION_NOT_EXIST];
465 return;
466 }
467 int32_t ret = napiSession->session_->SetAVQueueTitle(context->title);
468 if (ret != AVSESSION_SUCCESS) {
469 if (ret == ERR_SESSION_NOT_EXIST) {
470 context->errMessage = "SetAVQueueTitle failed : native session not exist";
471 } else if (ret == ERR_INVALID_PARAM) {
472 context->errMessage = "SetAVQueueTitle failed : native invalid parameters";
473 } else if (ret == ERR_NO_PERMISSION) {
474 context->errMessage = "SetAVQueueTitle failed : native no permission";
475 } else {
476 context->errMessage = "SetAVQueueTitle failed : native server exception";
477 }
478 context->status = napi_generic_failure;
479 context->errCode = NapiAVSessionManager::errcode_[ret];
480 }
481 };
482 auto complete = [env](napi_value& output) {
483 output = NapiUtils::GetUndefinedValue(env);
484 };
485 return NapiAsyncWork::Enqueue(env, context, "SetAVQueueTitle", executor, complete);
486 }
487
SetLaunchAbility(napi_env env,napi_callback_info info)488 napi_value NapiAVSession::SetLaunchAbility(napi_env env, napi_callback_info info)
489 {
490 struct ConcreteContext : public ContextBase {
491 AbilityRuntime::WantAgent::WantAgent* wantAgent_;
492 };
493 auto context = std::make_shared<ConcreteContext>();
494 if (context == nullptr) {
495 SLOGE("SetLaunchAbility failed : no memory");
496 NapiUtils::ThrowError(env, "SetLaunchAbility failed : no memory",
497 NapiAVSessionManager::errcode_[ERR_NO_MEMORY]);
498 return NapiUtils::GetUndefinedValue(env);
499 }
500
501 auto inputParser = [env, context](size_t argc, napi_value* argv) {
502 CHECK_ARGS_RETURN_VOID(context, argc == ARGC_ONE, "invalid arguments",
503 NapiAVSessionManager::errcode_[ERR_INVALID_PARAM]);
504 context->status = NapiUtils::GetValue(env, argv[ARGV_FIRST], context->wantAgent_);
505 CHECK_ARGS_RETURN_VOID(context, context->status == napi_ok, "get wantAgent failed",
506 NapiAVSessionManager::errcode_[ERR_INVALID_PARAM]);
507 };
508 context->GetCbInfo(env, info, inputParser);
509
510 auto executor = [context]() {
511 auto* napiSession = reinterpret_cast<NapiAVSession*>(context->native);
512 if (napiSession->session_ == nullptr) {
513 context->status = napi_generic_failure;
514 context->errMessage = "SetLaunchAbility failed : session is nullptr";
515 context->errCode = NapiAVSessionManager::errcode_[ERR_SESSION_NOT_EXIST];
516 return;
517 }
518 int32_t ret = napiSession->session_->SetLaunchAbility(*context->wantAgent_);
519 if (ret != AVSESSION_SUCCESS) {
520 if (ret == ERR_SESSION_NOT_EXIST) {
521 context->errMessage = "SetLaunchAbility failed : native session not exist";
522 } else if (ret == ERR_NO_PERMISSION) {
523 context->errMessage = "SetLaunchAbility failed : native no permission";
524 } else {
525 context->errMessage = "SetLaunchAbility failed : native server exception";
526 }
527 context->status = napi_generic_failure;
528 context->errCode = NapiAVSessionManager::errcode_[ret];
529 }
530 };
531 auto complete = [env](napi_value& output) {
532 output = NapiUtils::GetUndefinedValue(env);
533 };
534 return NapiAsyncWork::Enqueue(env, context, "SetLaunchAbility", executor, complete);
535 }
536
SetExtras(napi_env env,napi_callback_info info)537 napi_value NapiAVSession::SetExtras(napi_env env, napi_callback_info info)
538 {
539 AVSESSION_TRACE_SYNC_START("NapiAVSession::SetExtras");
540 struct ConcreteContext : public ContextBase {
541 AAFwk::WantParams extras_;
542 };
543 auto context = std::make_shared<ConcreteContext>();
544 if (context == nullptr) {
545 SLOGE("SetExtras failed : no memory");
546 NapiUtils::ThrowError(env, "SetExtras failed : no memory", NapiAVSessionManager::errcode_[ERR_NO_MEMORY]);
547 return NapiUtils::GetUndefinedValue(env);
548 }
549
550 auto inputParser = [env, context](size_t argc, napi_value* argv) {
551 CHECK_ARGS_RETURN_VOID(context, argc == ARGC_ONE, "invalid arguments",
552 NapiAVSessionManager::errcode_[ERR_INVALID_PARAM]);
553 context->status = NapiUtils::GetValue(env, argv[ARGV_FIRST], context->extras_);
554 CHECK_ARGS_RETURN_VOID(context, context->status == napi_ok, "get extras failed",
555 NapiAVSessionManager::errcode_[ERR_INVALID_PARAM]);
556 };
557 context->GetCbInfo(env, info, inputParser);
558 context->taskId = NAPI_SET_EXTRAS_TASK_ID;
559
560 auto executor = [context]() {
561 auto* napiSession = reinterpret_cast<NapiAVSession*>(context->native);
562 if (napiSession->session_ == nullptr) {
563 context->status = napi_generic_failure;
564 context->errMessage = "SetExtras failed : session is nullptr";
565 context->errCode = NapiAVSessionManager::errcode_[ERR_SESSION_NOT_EXIST];
566 return;
567 }
568 int32_t ret = napiSession->session_->SetExtras(context->extras_);
569 if (ret != AVSESSION_SUCCESS) {
570 if (ret == ERR_SESSION_NOT_EXIST) {
571 context->errMessage = "SetExtras failed : native session not exist";
572 } else if (ret == ERR_INVALID_PARAM) {
573 context->errMessage = "SetExtras failed : native invalid parameters";
574 } else {
575 context->errMessage = "SetExtras failed : native server exception";
576 }
577 context->status = napi_generic_failure;
578 context->errCode = NapiAVSessionManager::errcode_[ret];
579 }
580 };
581 auto complete = [env](napi_value& output) {
582 output = NapiUtils::GetUndefinedValue(env);
583 };
584 return NapiAsyncWork::Enqueue(env, context, "SetExtras", executor, complete);
585 }
586
SetAudioStreamId(napi_env env,napi_callback_info info)587 napi_value NapiAVSession::SetAudioStreamId(napi_env env, napi_callback_info info)
588 {
589 struct ConcreteContext : public ContextBase {
590 std::vector<int32_t> streamIds_;
591 };
592 auto context = std::make_shared<ConcreteContext>();
593 if (context == nullptr) {
594 SLOGE("SetAudioStreamId failed : no memory");
595 NapiUtils::ThrowError(env, "SetAudioStreamId failed : no memory",
596 NapiAVSessionManager::errcode_[ERR_NO_MEMORY]);
597 return NapiUtils::GetUndefinedValue(env);
598 }
599
600 auto inputParser = [env, context](size_t argc, napi_value* argv) {
601 CHECK_ARGS_RETURN_VOID(context, argc == ARGC_ONE, "invalid arguments",
602 NapiAVSessionManager::errcode_[ERR_INVALID_PARAM]);
603 context->status = NapiUtils::GetValue(env, argv[ARGV_FIRST], context->streamIds_);
604 CHECK_ARGS_RETURN_VOID(context, context->status == napi_ok, "get streamIds_ failed",
605 NapiAVSessionManager::errcode_[ERR_INVALID_PARAM]);
606 };
607 context->GetCbInfo(env, info, inputParser);
608
609 auto executor = [context]() {
610 auto* napiSession = reinterpret_cast<NapiAVSession*>(context->native);
611 if (napiSession->session_ == nullptr) {
612 context->status = napi_generic_failure;
613 context->errMessage = "SetAudioStreamId failed : session is nullptr";
614 context->errCode = NapiAVSessionManager::errcode_[ERR_SESSION_NOT_EXIST];
615 return;
616 }
617 };
618 auto complete = [env](napi_value& output) {
619 output = NapiUtils::GetUndefinedValue(env);
620 };
621 return NapiAsyncWork::Enqueue(env, context, "SetAudioStreamId", executor, complete);
622 }
623
GetController(napi_env env,napi_callback_info info)624 napi_value NapiAVSession::GetController(napi_env env, napi_callback_info info)
625 {
626 struct ConcreteContext : public ContextBase {
627 std::shared_ptr<AVSessionController> controller_;
628 };
629 auto context = std::make_shared<ConcreteContext>();
630 if (context == nullptr) {
631 SLOGE("GetController failed : no memory");
632 NapiUtils::ThrowError(env, "GetController failed : no memory", NapiAVSessionManager::errcode_[ERR_NO_MEMORY]);
633 return NapiUtils::GetUndefinedValue(env);
634 }
635
636 context->GetCbInfo(env, info);
637
638 auto executor = [context]() {
639 auto* napiSession = reinterpret_cast<NapiAVSession*>(context->native);
640 if (napiSession->session_ == nullptr) {
641 context->status = napi_generic_failure;
642 context->errMessage = "GetController failed : session is nullptr";
643 context->errCode = NapiAVSessionManager::errcode_[ERR_SESSION_NOT_EXIST];
644 return;
645 }
646 context->controller_ = napiSession->session_->GetController();
647 if (context->controller_ == nullptr) {
648 context->status = napi_generic_failure;
649 context->errMessage = "GetController failed : native get controller failed";
650 context->errCode = NapiAVSessionManager::errcode_[AVSESSION_ERROR];
651 }
652 };
653 auto complete = [env, context](napi_value& output) {
654 CHECK_STATUS_RETURN_VOID(context, "get controller failed", NapiAVSessionManager::errcode_[AVSESSION_ERROR]);
655 CHECK_ARGS_RETURN_VOID(context, context->controller_ != nullptr, "controller is nullptr",
656 NapiAVSessionManager::errcode_[AVSESSION_ERROR]);
657 context->status = NapiAVSessionController::NewInstance(env, context->controller_, output);
658 CHECK_STATUS_RETURN_VOID(context, "convert native object to js object failed",
659 NapiAVSessionManager::errcode_[AVSESSION_ERROR]);
660 };
661 return NapiAsyncWork::Enqueue(env, context, "GetController", executor, complete);
662 }
663
GetAVCastController(napi_env env,napi_callback_info info)664 napi_value NapiAVSession::GetAVCastController(napi_env env, napi_callback_info info)
665 {
666 #ifdef CASTPLUS_CAST_ENGINE_ENABLE
667 struct ConcreteContext : public ContextBase {
668 std::shared_ptr<AVCastController> castController_;
669 };
670 auto context = std::make_shared<ConcreteContext>();
671 if (context == nullptr) {
672 SLOGE("GetAVCastController failed : no memory");
673 NapiUtils::ThrowError(env, "GetAVCastController failed : no memory",
674 NapiAVSessionManager::errcode_[ERR_NO_MEMORY]);
675 return NapiUtils::GetUndefinedValue(env);
676 }
677
678 context->GetCbInfo(env, info);
679
680 auto executor = [context]() {
681 auto* napiSession = reinterpret_cast<NapiAVSession*>(context->native);
682 if (napiSession->session_ == nullptr) {
683 context->status = napi_generic_failure;
684 context->errMessage = "GetAVCastController failed : session is nullptr";
685 context->errCode = NapiAVSessionManager::errcode_[ERR_SESSION_NOT_EXIST];
686 return;
687 }
688 context->castController_ = napiSession->session_->GetAVCastController();
689 if (context->castController_ == nullptr) {
690 context->status = napi_generic_failure;
691 context->errMessage = "GetAVCastController failed : native get controller failed";
692 context->errCode = NapiAVSessionManager::errcode_[AVSESSION_ERROR];
693 }
694 };
695 auto complete = [env, context](napi_value& output) {
696 CHECK_STATUS_RETURN_VOID(context, "get controller failed", NapiAVSessionManager::errcode_[AVSESSION_ERROR]);
697 CHECK_ARGS_RETURN_VOID(context, context->castController_ != nullptr, "controller is nullptr",
698 NapiAVSessionManager::errcode_[AVSESSION_ERROR]);
699 context->status = NapiAVCastController::NewInstance(env, context->castController_, output);
700 CHECK_STATUS_RETURN_VOID(context, "convert native object to js object failed",
701 NapiAVSessionManager::errcode_[AVSESSION_ERROR]);
702 };
703 return NapiAsyncWork::Enqueue(env, context, "GetAVCastController", executor, complete);
704 #else
705 return nullptr;
706 #endif
707 }
708
GetOutputDevice(napi_env env,napi_callback_info info)709 napi_value NapiAVSession::GetOutputDevice(napi_env env, napi_callback_info info)
710 {
711 struct ConcreteContext : public ContextBase {
712 OutputDeviceInfo outputDeviceInfo_;
713 };
714 auto context = std::make_shared<ConcreteContext>();
715 if (context == nullptr) {
716 SLOGE("GetOutputDevice failed : no memory");
717 NapiUtils::ThrowError(env, "GetOutputDevice failed : no memory",
718 NapiAVSessionManager::errcode_[ERR_NO_MEMORY]);
719 return NapiUtils::GetUndefinedValue(env);
720 }
721
722 context->GetCbInfo(env, info);
723
724 auto executor = [context]() {
725 auto* napiSession = reinterpret_cast<NapiAVSession*>(context->native);
726 if (napiSession->session_ == nullptr) {
727 context->status = napi_generic_failure;
728 context->errMessage = "GetOutputDevice failed : session is nullptr";
729 context->errCode = NapiAVSessionManager::errcode_[ERR_SESSION_NOT_EXIST];
730 return;
731 }
732 AVSessionDescriptor descriptor;
733 AVSessionManager::GetInstance().GetSessionDescriptorsBySessionId(napiSession->session_->GetSessionId(),
734 descriptor);
735 context->outputDeviceInfo_ = descriptor.outputDeviceInfo_;
736 };
737
738 auto complete = [env, context](napi_value& output) {
739 context->status = NapiUtils::SetValue(env, context->outputDeviceInfo_, output);
740 CHECK_STATUS_RETURN_VOID(context, "convert native object to javascript object failed",
741 NapiAVSessionManager::errcode_[AVSESSION_ERROR]);
742 };
743 return NapiAsyncWork::Enqueue(env, context, "GetOutputDevice", executor, complete);
744 }
745
GetOutputDeviceSync(napi_env env,napi_callback_info info)746 napi_value NapiAVSession::GetOutputDeviceSync(napi_env env, napi_callback_info info)
747 {
748 SLOGD("Start GetOutputDeviceSync");
749 auto context = std::make_shared<ContextBase>();
750 if (context == nullptr) {
751 SLOGE("GetOutputDeviceSync failed : no memory");
752 NapiUtils::ThrowError(env, "GetOutputDeviceSync failed : no memory",
753 NapiAVSessionManager::errcode_[ERR_NO_MEMORY]);
754 return NapiUtils::GetUndefinedValue(env);
755 }
756
757 context->GetCbInfo(env, info, NapiCbInfoParser(), true);
758
759 auto* napiSession = reinterpret_cast<NapiAVSession*>(context->native);
760 if (napiSession->session_ == nullptr) {
761 context->status = napi_generic_failure;
762 context->errMessage = "GetOutputDeviceSync failed : session is nullptr";
763 context->errCode = NapiAVSessionManager::errcode_[ERR_SESSION_NOT_EXIST];
764 return NapiUtils::GetUndefinedValue(env);
765 }
766
767 AVSessionDescriptor descriptor;
768 AVSessionManager::GetInstance().GetSessionDescriptorsBySessionId(napiSession->session_->GetSessionId(),
769 descriptor);
770 napi_value output {};
771 auto status = NapiUtils::SetValue(env, descriptor.outputDeviceInfo_, output);
772 if (status != napi_ok) {
773 SLOGE("convert native object to javascript object failed");
774 NapiUtils::ThrowError(env, "convert native object to javascript object failed",
775 NapiAVSessionManager::errcode_[AVSESSION_ERROR]);
776 return NapiUtils::GetUndefinedValue(env);
777 }
778 return output;
779 }
780
Activate(napi_env env,napi_callback_info info)781 napi_value NapiAVSession::Activate(napi_env env, napi_callback_info info)
782 {
783 auto context = std::make_shared<ContextBase>();
784 if (context == nullptr) {
785 SLOGE("Activate failed : no memory");
786 NapiUtils::ThrowError(env, "Activate failed : no memory", NapiAVSessionManager::errcode_[ERR_NO_MEMORY]);
787 return NapiUtils::GetUndefinedValue(env);
788 }
789
790 context->GetCbInfo(env, info);
791
792 auto executor = [context]() {
793 auto* napiSession = reinterpret_cast<NapiAVSession*>(context->native);
794 if (napiSession->session_ == nullptr) {
795 context->status = napi_generic_failure;
796 context->errMessage = "Activate session failed : session is nullptr";
797 context->errCode = NapiAVSessionManager::errcode_[ERR_SESSION_NOT_EXIST];
798 return;
799 }
800 int32_t ret = napiSession->session_->Activate();
801 if (ret != AVSESSION_SUCCESS) {
802 if (ret == ERR_SESSION_NOT_EXIST) {
803 context->errMessage = "Activate session failed : native session not exist";
804 } else if (ret == ERR_NO_PERMISSION) {
805 context->errMessage = "Activate failed : native no permission";
806 } else {
807 context->errMessage = "Activate session failed : native server exception";
808 }
809 context->status = napi_generic_failure;
810 context->errCode = NapiAVSessionManager::errcode_[ret];
811 }
812 };
813 auto complete = [env](napi_value& output) {
814 output = NapiUtils::GetUndefinedValue(env);
815 };
816 return NapiAsyncWork::Enqueue(env, context, "Activate", executor, complete);
817 }
818
Deactivate(napi_env env,napi_callback_info info)819 napi_value NapiAVSession::Deactivate(napi_env env, napi_callback_info info)
820 {
821 auto context = std::make_shared<ContextBase>();
822 if (context == nullptr) {
823 SLOGE("Deactivate failed : no memory");
824 NapiUtils::ThrowError(env, "Deactivate failed : no memory", NapiAVSessionManager::errcode_[ERR_NO_MEMORY]);
825 return NapiUtils::GetUndefinedValue(env);
826 }
827
828 context->GetCbInfo(env, info);
829
830 auto executor = [context]() {
831 auto* napiSession = reinterpret_cast<NapiAVSession*>(context->native);
832 if (napiSession->session_ == nullptr) {
833 context->status = napi_generic_failure;
834 context->errMessage = "Deactivate session failed : session is nullptr";
835 context->errCode = NapiAVSessionManager::errcode_[ERR_SESSION_NOT_EXIST];
836 return;
837 }
838 int32_t ret = napiSession->session_->Deactivate();
839 if (ret != AVSESSION_SUCCESS) {
840 if (ret == ERR_SESSION_NOT_EXIST) {
841 context->errMessage = "Deactivate session failed : native session not exist";
842 } else if (ret == ERR_NO_PERMISSION) {
843 context->errMessage = "Deactivate failed : native no permission";
844 } else {
845 context->errMessage = "Deactivate session failed : native server exception";
846 }
847 context->status = napi_generic_failure;
848 context->errCode = NapiAVSessionManager::errcode_[ret];
849 }
850 };
851 auto complete = [env](napi_value& output) {
852 output = NapiUtils::GetUndefinedValue(env);
853 };
854 return NapiAsyncWork::Enqueue(env, context, "Deactivate", executor, complete);
855 }
856
Destroy(napi_env env,napi_callback_info info)857 napi_value NapiAVSession::Destroy(napi_env env, napi_callback_info info)
858 {
859 auto context = std::make_shared<ContextBase>();
860 if (context == nullptr) {
861 SLOGE("Destroy failed : no memory");
862 NapiUtils::ThrowError(env, "Destroy failed : no memory", NapiAVSessionManager::errcode_[ERR_NO_MEMORY]);
863 return NapiUtils::GetUndefinedValue(env);
864 }
865
866 context->GetCbInfo(env, info);
867
868 auto executor = [context]() {
869 auto* napiSession = reinterpret_cast<NapiAVSession*>(context->native);
870 if (napiSession->session_ == nullptr) {
871 context->status = napi_generic_failure;
872 context->errMessage = "Destroy session failed : session is nullptr";
873 context->errCode = NapiAVSessionManager::errcode_[ERR_SESSION_NOT_EXIST];
874 return;
875 }
876 int32_t ret = napiSession->session_->Destroy();
877 if (ret == AVSESSION_SUCCESS) {
878 napiSession->session_ = nullptr;
879 napiSession->callback_ = nullptr;
880 } else if (ret == ERR_SESSION_NOT_EXIST) {
881 context->status = napi_generic_failure;
882 context->errMessage = "Destroy session failed : native session not exist";
883 context->errCode = NapiAVSessionManager::errcode_[ret];
884 } else if (ret == ERR_NO_PERMISSION) {
885 context->status = napi_generic_failure;
886 context->errMessage = "Destroy failed : native no permission";
887 context->errCode = NapiAVSessionManager::errcode_[ret];
888 } else {
889 context->status = napi_generic_failure;
890 context->errMessage = "Destroy session failed : native server exception";
891 context->errCode = NapiAVSessionManager::errcode_[ret];
892 }
893 };
894 auto complete = [env](napi_value& output) {
895 output = NapiUtils::GetUndefinedValue(env);
896 };
897 return NapiAsyncWork::Enqueue(env, context, "Destroy", executor, complete);
898 }
899
SetSessionEvent(napi_env env,napi_callback_info info)900 napi_value NapiAVSession::SetSessionEvent(napi_env env, napi_callback_info info)
901 {
902 AVSESSION_TRACE_SYNC_START("NapiAVSession::SetSessionEvent");
903 struct ConcreteContext : public ContextBase {
904 std::string event_;
905 AAFwk::WantParams args_;
906 };
907 auto context = std::make_shared<ConcreteContext>();
908 if (context == nullptr) {
909 SLOGE("SetSessionEvent failed : no memory");
910 NapiUtils::ThrowError(env, "SetSessionEvent failed : no memory", NapiAVSessionManager::errcode_[ERR_NO_MEMORY]);
911 return NapiUtils::GetUndefinedValue(env);
912 }
913
914 auto inputParser = [env, context](size_t argc, napi_value* argv) {
915 CHECK_ARGS_RETURN_VOID(context, argc == ARGC_TWO, "invalid arguments",
916 NapiAVSessionManager::errcode_[ERR_INVALID_PARAM]);
917 context->status = NapiUtils::GetValue(env, argv[ARGV_FIRST], context->event_);
918 CHECK_ARGS_RETURN_VOID(context, context->status == napi_ok, "get event failed",
919 NapiAVSessionManager::errcode_[ERR_INVALID_PARAM]);
920 context->status = NapiUtils::GetValue(env, argv[ARGV_SECOND], context->args_);
921 CHECK_ARGS_RETURN_VOID(context, context->status == napi_ok, "get args failed",
922 NapiAVSessionManager::errcode_[ERR_INVALID_PARAM]);
923 };
924 context->GetCbInfo(env, info, inputParser);
925 context->taskId = NAPI_SET_AV_META_DATA_TASK_ID;
926
927 auto executor = [context]() {
928 auto* napiSession = reinterpret_cast<NapiAVSession*>(context->native);
929 if (napiSession->session_ == nullptr) {
930 context->status = napi_generic_failure;
931 context->errMessage = "SetSessionEvent failed : session is nullptr";
932 context->errCode = NapiAVSessionManager::errcode_[ERR_SESSION_NOT_EXIST];
933 return;
934 }
935 int32_t ret = napiSession->session_->SetSessionEvent(context->event_, context->args_);
936 if (ret != AVSESSION_SUCCESS) {
937 ErrCodeToMessage(ret, context->errMessage);
938 context->status = napi_generic_failure;
939 context->errCode = NapiAVSessionManager::errcode_[ret];
940 }
941 };
942 auto complete = [env](napi_value& output) {
943 output = NapiUtils::GetUndefinedValue(env);
944 };
945 return NapiAsyncWork::Enqueue(env, context, "SetSessionEvent", executor, complete);
946 }
947
ReleaseCast(napi_env env,napi_callback_info info)948 napi_value NapiAVSession::ReleaseCast(napi_env env, napi_callback_info info)
949 {
950 #ifdef CASTPLUS_CAST_ENGINE_ENABLE
951 auto context = std::make_shared<ContextBase>();
952 if (context == nullptr) {
953 SLOGE("ReleaseCast failed : no memory");
954 NapiUtils::ThrowError(env, "ReleaseCast failed : no memory", NapiAVSessionManager::errcode_[ERR_NO_MEMORY]);
955 return NapiUtils::GetUndefinedValue(env);
956 }
957
958 context->GetCbInfo(env, info);
959
960 auto executor = [context]() {
961 auto* napiSession = reinterpret_cast<NapiAVSession*>(context->native);
962 if (napiSession->session_ == nullptr) {
963 context->status = napi_generic_failure;
964 context->errMessage = "ReleaseCast failed : session is nullptr";
965 context->errCode = NapiAVSessionManager::errcode_[ERR_SESSION_NOT_EXIST];
966 return;
967 }
968 int32_t ret = napiSession->session_->ReleaseCast();
969 if (ret != AVSESSION_SUCCESS) {
970 if (ret == ERR_SESSION_NOT_EXIST) {
971 context->errMessage = "ReleaseCast failed : native session not exist";
972 } else if (ret == ERR_NO_PERMISSION) {
973 context->errMessage = "ReleaseCast failed : native no permission";
974 } else {
975 context->errMessage = "ReleaseCast failed : native server exception";
976 }
977 context->status = napi_generic_failure;
978 context->errCode = NapiAVSessionManager::errcode_[ret];
979 }
980 };
981 auto complete = [env](napi_value& output) {
982 output = NapiUtils::GetUndefinedValue(env);
983 };
984 return NapiAsyncWork::Enqueue(env, context, "ReleaseCast", executor, complete);
985 #else
986 return nullptr;
987 #endif
988 }
989
ErrCodeToMessage(int32_t errCode,std::string & message)990 void NapiAVSession::ErrCodeToMessage(int32_t errCode, std::string& message)
991 {
992 switch (errCode) {
993 case ERR_SESSION_NOT_EXIST:
994 message = "SetSessionEvent failed : native session not exist";
995 break;
996 case ERR_INVALID_PARAM:
997 message = "SetSessionEvent failed : native invalid parameters";
998 break;
999 case ERR_NO_PERMISSION:
1000 message = "SetSessionEvent failed : native no permission";
1001 break;
1002 default:
1003 message = "SetSessionEvent failed : native server exception";
1004 break;
1005 }
1006 }
1007
OnPlay(napi_env env,NapiAVSession * napiSession,napi_value callback)1008 napi_status NapiAVSession::OnPlay(napi_env env, NapiAVSession* napiSession, napi_value callback)
1009 {
1010 int32_t ret = napiSession->session_->AddSupportCommand(AVControlCommand::SESSION_CMD_PLAY);
1011 CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, napi_generic_failure, "add command failed");
1012 CHECK_AND_RETURN_RET_LOG(napiSession->callback_ != nullptr, napi_generic_failure,
1013 "NapiAVSessionCallback object is nullptr");
1014 return napiSession->callback_->AddCallback(env, NapiAVSessionCallback::EVENT_PLAY, callback);
1015 }
1016
OnPause(napi_env env,NapiAVSession * napiSession,napi_value callback)1017 napi_status NapiAVSession::OnPause(napi_env env, NapiAVSession* napiSession, napi_value callback)
1018 {
1019 int32_t ret = napiSession->session_->AddSupportCommand(AVControlCommand::SESSION_CMD_PAUSE);
1020 CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, napi_generic_failure, "add command failed");
1021 CHECK_AND_RETURN_RET_LOG(napiSession->callback_ != nullptr, napi_generic_failure,
1022 "NapiAVSessionCallback object is nullptr");
1023 return napiSession->callback_->AddCallback(env, NapiAVSessionCallback::EVENT_PAUSE, callback);
1024 }
1025
OnStop(napi_env env,NapiAVSession * napiSession,napi_value callback)1026 napi_status NapiAVSession::OnStop(napi_env env, NapiAVSession* napiSession, napi_value callback)
1027 {
1028 int32_t ret = napiSession->session_->AddSupportCommand(AVControlCommand::SESSION_CMD_STOP);
1029 CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, napi_generic_failure, "add command failed");
1030 CHECK_AND_RETURN_RET_LOG(napiSession->callback_ != nullptr, napi_generic_failure,
1031 "NapiAVSessionCallback object is nullptr");
1032 return napiSession->callback_->AddCallback(env, NapiAVSessionCallback::EVENT_STOP, callback);
1033 }
1034
OnPlayNext(napi_env env,NapiAVSession * napiSession,napi_value callback)1035 napi_status NapiAVSession::OnPlayNext(napi_env env, NapiAVSession* napiSession, napi_value callback)
1036 {
1037 int32_t ret = napiSession->session_->AddSupportCommand(AVControlCommand::SESSION_CMD_PLAY_NEXT);
1038 CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, napi_generic_failure, "add command failed");
1039 CHECK_AND_RETURN_RET_LOG(napiSession->callback_ != nullptr, napi_generic_failure,
1040 "NapiAVSessionCallback object is nullptr");
1041 return napiSession->callback_->AddCallback(env, NapiAVSessionCallback::EVENT_PLAY_NEXT, callback);
1042 }
1043
OnPlayPrevious(napi_env env,NapiAVSession * napiSession,napi_value callback)1044 napi_status NapiAVSession::OnPlayPrevious(napi_env env, NapiAVSession* napiSession, napi_value callback)
1045 {
1046 int32_t ret = napiSession->session_->AddSupportCommand(AVControlCommand::SESSION_CMD_PLAY_PREVIOUS);
1047 CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, napi_generic_failure, "add command failed");
1048 CHECK_AND_RETURN_RET_LOG(napiSession->callback_ != nullptr, napi_generic_failure,
1049 "NapiAVSessionCallback object is nullptr");
1050 return napiSession->callback_->AddCallback(env, NapiAVSessionCallback::EVENT_PLAY_PREVIOUS, callback);
1051 }
1052
OnFastForward(napi_env env,NapiAVSession * napiSession,napi_value callback)1053 napi_status NapiAVSession::OnFastForward(napi_env env, NapiAVSession* napiSession, napi_value callback)
1054 {
1055 int32_t ret = napiSession->session_->AddSupportCommand(AVControlCommand::SESSION_CMD_FAST_FORWARD);
1056 CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, napi_generic_failure, "add command failed");
1057 CHECK_AND_RETURN_RET_LOG(napiSession->callback_ != nullptr, napi_generic_failure,
1058 "NapiAVSessionCallback object is nullptr");
1059 return napiSession->callback_->AddCallback(env, NapiAVSessionCallback::EVENT_FAST_FORWARD, callback);
1060 }
1061
OnRewind(napi_env env,NapiAVSession * napiSession,napi_value callback)1062 napi_status NapiAVSession::OnRewind(napi_env env, NapiAVSession* napiSession, napi_value callback)
1063 {
1064 int32_t ret = napiSession->session_->AddSupportCommand(AVControlCommand::SESSION_CMD_REWIND);
1065 CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, napi_generic_failure, "add command failed");
1066 CHECK_AND_RETURN_RET_LOG(napiSession->callback_ != nullptr, napi_generic_failure,
1067 "NapiAVSessionCallback object is nullptr");
1068 return napiSession->callback_->AddCallback(env, NapiAVSessionCallback::EVENT_REWIND, callback);
1069 }
1070
OnSeek(napi_env env,NapiAVSession * napiSession,napi_value callback)1071 napi_status NapiAVSession::OnSeek(napi_env env, NapiAVSession* napiSession, napi_value callback)
1072 {
1073 int32_t ret = napiSession->session_->AddSupportCommand(AVControlCommand::SESSION_CMD_SEEK);
1074 CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, napi_generic_failure, "add command failed");
1075 CHECK_AND_RETURN_RET_LOG(napiSession->callback_ != nullptr, napi_generic_failure,
1076 "NapiAVSessionCallback object is nullptr");
1077 return napiSession->callback_->AddCallback(env, NapiAVSessionCallback::EVENT_SEEK, callback);
1078 }
1079
OnSetSpeed(napi_env env,NapiAVSession * napiSession,napi_value callback)1080 napi_status NapiAVSession::OnSetSpeed(napi_env env, NapiAVSession* napiSession, napi_value callback)
1081 {
1082 int32_t ret = napiSession->session_->AddSupportCommand(AVControlCommand::SESSION_CMD_SET_SPEED);
1083 CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, napi_generic_failure, "add command failed");
1084 CHECK_AND_RETURN_RET_LOG(napiSession->callback_ != nullptr, napi_generic_failure,
1085 "NapiAVSessionCallback object is nullptr");
1086 return napiSession->callback_->AddCallback(env, NapiAVSessionCallback::EVENT_SET_SPEED, callback);
1087 }
1088
OnSetLoopMode(napi_env env,NapiAVSession * napiSession,napi_value callback)1089 napi_status NapiAVSession::OnSetLoopMode(napi_env env, NapiAVSession* napiSession, napi_value callback)
1090 {
1091 int32_t ret = napiSession->session_->AddSupportCommand(AVControlCommand::SESSION_CMD_SET_LOOP_MODE);
1092 CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, napi_generic_failure, "add command failed");
1093 CHECK_AND_RETURN_RET_LOG(napiSession->callback_ != nullptr, napi_generic_failure,
1094 "NapiAVSessionCallback object is nullptr");
1095 return napiSession->callback_->AddCallback(env, NapiAVSessionCallback::EVENT_SET_LOOP_MODE, callback);
1096 }
1097
OnToggleFavorite(napi_env env,NapiAVSession * napiSession,napi_value callback)1098 napi_status NapiAVSession::OnToggleFavorite(napi_env env, NapiAVSession* napiSession, napi_value callback)
1099 {
1100 int32_t ret = napiSession->session_->AddSupportCommand(AVControlCommand::SESSION_CMD_TOGGLE_FAVORITE);
1101 CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, napi_generic_failure, "add command failed");
1102 CHECK_AND_RETURN_RET_LOG(napiSession->callback_ != nullptr, napi_generic_failure,
1103 "NapiAVSessionCallback object is nullptr");
1104 return napiSession->callback_->AddCallback(env, NapiAVSessionCallback::EVENT_TOGGLE_FAVORITE, callback);
1105 }
1106
OnMediaKeyEvent(napi_env env,NapiAVSession * napiSession,napi_value callback)1107 napi_status NapiAVSession::OnMediaKeyEvent(napi_env env, NapiAVSession* napiSession, napi_value callback)
1108 {
1109 CHECK_AND_RETURN_RET_LOG(napiSession->callback_ != nullptr, napi_generic_failure,
1110 "NapiAVSessionCallback object is nullptr");
1111 return napiSession->callback_->AddCallback(env, NapiAVSessionCallback::EVENT_MEDIA_KEY_EVENT, callback);
1112 }
1113
OnOutputDeviceChange(napi_env env,NapiAVSession * napiSession,napi_value callback)1114 napi_status NapiAVSession::OnOutputDeviceChange(napi_env env, NapiAVSession* napiSession, napi_value callback)
1115 {
1116 CHECK_AND_RETURN_RET_LOG(napiSession->callback_ != nullptr, napi_generic_failure,
1117 "NapiAVSessionCallback object is nullptr");
1118 return napiSession->callback_->AddCallback(env, NapiAVSessionCallback::EVENT_OUTPUT_DEVICE_CHANGE, callback);
1119 }
1120
OnCommonCommand(napi_env env,NapiAVSession * napiSession,napi_value callback)1121 napi_status NapiAVSession::OnCommonCommand(napi_env env, NapiAVSession* napiSession, napi_value callback)
1122 {
1123 return napiSession->callback_->AddCallback(env, NapiAVSessionCallback::EVENT_SEND_COMMON_COMMAND, callback);
1124 }
1125
OnSkipToQueueItem(napi_env env,NapiAVSession * napiSession,napi_value callback)1126 napi_status NapiAVSession::OnSkipToQueueItem(napi_env env, NapiAVSession* napiSession, napi_value callback)
1127 {
1128 return napiSession->callback_->AddCallback(env, NapiAVSessionCallback::EVENT_SKIP_TO_QUEUE_ITEM, callback);
1129 }
1130
OffPlay(napi_env env,NapiAVSession * napiSession,napi_value callback)1131 napi_status NapiAVSession::OffPlay(napi_env env, NapiAVSession* napiSession, napi_value callback)
1132 {
1133 CHECK_AND_RETURN_RET_LOG(napiSession->callback_ != nullptr, napi_generic_failure,
1134 "NapiAVSessionCallback object is nullptr");
1135 auto status = napiSession->callback_->RemoveCallback(env, NapiAVSessionCallback::EVENT_PLAY, callback);
1136 CHECK_AND_RETURN_RET_LOG(status == napi_ok, status, "RemoveCallback failed");
1137 if (napiSession->callback_->IsCallbacksEmpty(NapiAVSessionCallback::EVENT_PLAY)) {
1138 int32_t ret = napiSession->session_->DeleteSupportCommand(AVControlCommand::SESSION_CMD_PLAY);
1139 CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, napi_generic_failure, "delete cmd failed");
1140 }
1141 return napi_ok;
1142 }
1143
OffPause(napi_env env,NapiAVSession * napiSession,napi_value callback)1144 napi_status NapiAVSession::OffPause(napi_env env, NapiAVSession* napiSession, napi_value callback)
1145 {
1146 CHECK_AND_RETURN_RET_LOG(napiSession->callback_ != nullptr, napi_generic_failure,
1147 "NapiAVSessionCallback object is nullptr");
1148 auto status = napiSession->callback_->RemoveCallback(env, NapiAVSessionCallback::EVENT_PAUSE, callback);
1149 CHECK_AND_RETURN_RET_LOG(status == napi_ok, status, "RemoveCallback failed");
1150 if (napiSession->callback_->IsCallbacksEmpty(NapiAVSessionCallback::EVENT_PAUSE)) {
1151 int32_t ret = napiSession->session_->DeleteSupportCommand(AVControlCommand::SESSION_CMD_PAUSE);
1152 CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, napi_generic_failure, "delete cmd failed");
1153 }
1154 return napi_ok;
1155 }
1156
OffStop(napi_env env,NapiAVSession * napiSession,napi_value callback)1157 napi_status NapiAVSession::OffStop(napi_env env, NapiAVSession* napiSession, napi_value callback)
1158 {
1159 CHECK_AND_RETURN_RET_LOG(napiSession->callback_ != nullptr, napi_generic_failure,
1160 "NapiAVSessionCallback object is nullptr");
1161 auto status = napiSession->callback_->RemoveCallback(env, NapiAVSessionCallback::EVENT_STOP, callback);
1162 CHECK_AND_RETURN_RET_LOG(status == napi_ok, status, "RemoveCallback failed");
1163 if (napiSession->callback_->IsCallbacksEmpty(NapiAVSessionCallback::EVENT_STOP)) {
1164 int32_t ret = napiSession->session_->DeleteSupportCommand(AVControlCommand::SESSION_CMD_STOP);
1165 CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, napi_generic_failure, "delete cmd failed");
1166 }
1167 return napi_ok;
1168 }
1169
OffPlayNext(napi_env env,NapiAVSession * napiSession,napi_value callback)1170 napi_status NapiAVSession::OffPlayNext(napi_env env, NapiAVSession* napiSession, napi_value callback)
1171 {
1172 CHECK_AND_RETURN_RET_LOG(napiSession->callback_ != nullptr, napi_generic_failure,
1173 "NapiAVSessionCallback object is nullptr");
1174 auto status = napiSession->callback_->RemoveCallback(env, NapiAVSessionCallback::EVENT_PLAY_NEXT, callback);
1175 CHECK_AND_RETURN_RET_LOG(status == napi_ok, status, "RemoveCallback failed");
1176 if (napiSession->callback_->IsCallbacksEmpty(NapiAVSessionCallback::EVENT_PLAY_NEXT)) {
1177 int32_t ret = napiSession->session_->DeleteSupportCommand(AVControlCommand::SESSION_CMD_PLAY_NEXT);
1178 CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, napi_generic_failure, "delete cmd failed");
1179 }
1180 return napi_ok;
1181 }
1182
OffPlayPrevious(napi_env env,NapiAVSession * napiSession,napi_value callback)1183 napi_status NapiAVSession::OffPlayPrevious(napi_env env, NapiAVSession* napiSession, napi_value callback)
1184 {
1185 CHECK_AND_RETURN_RET_LOG(napiSession->callback_ != nullptr, napi_generic_failure,
1186 "NapiAVSessionCallback object is nullptr");
1187 auto status = napiSession->callback_->RemoveCallback(env, NapiAVSessionCallback::EVENT_PLAY_PREVIOUS, callback);
1188 CHECK_AND_RETURN_RET_LOG(status == napi_ok, status, "RemoveCallback failed");
1189
1190 if (napiSession->callback_->IsCallbacksEmpty(NapiAVSessionCallback::EVENT_PLAY_PREVIOUS)) {
1191 int32_t ret = napiSession->session_->DeleteSupportCommand(AVControlCommand::SESSION_CMD_PLAY_PREVIOUS);
1192 CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, napi_generic_failure, "delete cmd failed");
1193 }
1194 return napi_ok;
1195 }
1196
OffFastForward(napi_env env,NapiAVSession * napiSession,napi_value callback)1197 napi_status NapiAVSession::OffFastForward(napi_env env, NapiAVSession* napiSession, napi_value callback)
1198 {
1199 CHECK_AND_RETURN_RET_LOG(napiSession->callback_ != nullptr, napi_generic_failure,
1200 "NapiAVSessionCallback object is nullptr");
1201 auto status = napiSession->callback_->RemoveCallback(env, NapiAVSessionCallback::EVENT_FAST_FORWARD, callback);
1202 CHECK_AND_RETURN_RET_LOG(status == napi_ok, status, "RemoveCallback failed");
1203 if (napiSession->callback_->IsCallbacksEmpty(NapiAVSessionCallback::EVENT_FAST_FORWARD)) {
1204 int32_t ret = napiSession->session_->DeleteSupportCommand(AVControlCommand::SESSION_CMD_FAST_FORWARD);
1205 CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, napi_generic_failure, "delete cmd failed");
1206 }
1207 return napi_ok;
1208 }
1209
OffRewind(napi_env env,NapiAVSession * napiSession,napi_value callback)1210 napi_status NapiAVSession::OffRewind(napi_env env, NapiAVSession* napiSession, napi_value callback)
1211 {
1212 CHECK_AND_RETURN_RET_LOG(napiSession->callback_ != nullptr, napi_generic_failure,
1213 "NapiAVSessionCallback object is nullptr");
1214 auto status = napiSession->callback_->RemoveCallback(env, NapiAVSessionCallback::EVENT_REWIND, callback);
1215 CHECK_AND_RETURN_RET_LOG(status == napi_ok, status, "RemoveCallback failed");
1216 if (napiSession->callback_->IsCallbacksEmpty(NapiAVSessionCallback::EVENT_REWIND)) {
1217 int32_t ret = napiSession->session_->DeleteSupportCommand(AVControlCommand::SESSION_CMD_REWIND);
1218 CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, napi_generic_failure, "delete cmd failed");
1219 }
1220 return napi_ok;
1221 }
1222
OffSeek(napi_env env,NapiAVSession * napiSession,napi_value callback)1223 napi_status NapiAVSession::OffSeek(napi_env env, NapiAVSession* napiSession, napi_value callback)
1224 {
1225 CHECK_AND_RETURN_RET_LOG(napiSession->callback_ != nullptr, napi_generic_failure,
1226 "NapiAVSessionCallback object is nullptr");
1227 auto status = napiSession->callback_->RemoveCallback(env, NapiAVSessionCallback::EVENT_SEEK, callback);
1228 CHECK_AND_RETURN_RET_LOG(status == napi_ok, status, "RemoveCallback failed");
1229 if (napiSession->callback_->IsCallbacksEmpty(NapiAVSessionCallback::EVENT_SEEK)) {
1230 int32_t ret = napiSession->session_->DeleteSupportCommand(AVControlCommand::SESSION_CMD_SEEK);
1231 CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, napi_generic_failure, "delete cmd failed");
1232 }
1233 return napi_ok;
1234 }
1235
OffSetSpeed(napi_env env,NapiAVSession * napiSession,napi_value callback)1236 napi_status NapiAVSession::OffSetSpeed(napi_env env, NapiAVSession* napiSession, napi_value callback)
1237 {
1238 CHECK_AND_RETURN_RET_LOG(napiSession->callback_ != nullptr, napi_generic_failure,
1239 "NapiAVSessionCallback object is nullptr");
1240 auto status = napiSession->callback_->RemoveCallback(env, NapiAVSessionCallback::EVENT_SET_SPEED, callback);
1241 CHECK_AND_RETURN_RET_LOG(status == napi_ok, status, "RemoveCallback failed");
1242 if (napiSession->callback_->IsCallbacksEmpty(NapiAVSessionCallback::EVENT_SET_SPEED)) {
1243 int32_t ret = napiSession->session_->DeleteSupportCommand(AVControlCommand::SESSION_CMD_SET_SPEED);
1244 CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, napi_generic_failure, "delete cmd failed");
1245 }
1246 return napi_ok;
1247 }
1248
OffSetLoopMode(napi_env env,NapiAVSession * napiSession,napi_value callback)1249 napi_status NapiAVSession::OffSetLoopMode(napi_env env, NapiAVSession* napiSession, napi_value callback)
1250 {
1251 CHECK_AND_RETURN_RET_LOG(napiSession->callback_ != nullptr, napi_generic_failure,
1252 "NapiAVSessionCallback object is nullptr");
1253 auto status = napiSession->callback_->RemoveCallback(env, NapiAVSessionCallback::EVENT_SET_LOOP_MODE, callback);
1254 CHECK_AND_RETURN_RET_LOG(status == napi_ok, status, "RemoveCallback failed");
1255 if (napiSession->callback_->IsCallbacksEmpty(NapiAVSessionCallback::EVENT_SET_LOOP_MODE)) {
1256 int32_t ret = napiSession->session_->DeleteSupportCommand(AVControlCommand::SESSION_CMD_SET_LOOP_MODE);
1257 CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, napi_generic_failure, "delete cmd failed");
1258 }
1259 return napi_ok;
1260 }
1261
OffToggleFavorite(napi_env env,NapiAVSession * napiSession,napi_value callback)1262 napi_status NapiAVSession::OffToggleFavorite(napi_env env, NapiAVSession* napiSession, napi_value callback)
1263 {
1264 CHECK_AND_RETURN_RET_LOG(napiSession->callback_ != nullptr, napi_generic_failure,
1265 "NapiAVSessionCallback object is nullptr");
1266 auto status = napiSession->callback_->RemoveCallback(env, NapiAVSessionCallback::EVENT_TOGGLE_FAVORITE, callback);
1267 CHECK_AND_RETURN_RET_LOG(status == napi_ok, status, "RemoveCallback failed");
1268 if (napiSession->callback_->IsCallbacksEmpty(NapiAVSessionCallback::EVENT_TOGGLE_FAVORITE)) {
1269 int32_t ret = napiSession->session_->DeleteSupportCommand(AVControlCommand::SESSION_CMD_TOGGLE_FAVORITE);
1270 CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, napi_generic_failure, "delete cmd failed");
1271 }
1272 return napi_ok;
1273 }
1274
OffMediaKeyEvent(napi_env env,NapiAVSession * napiSession,napi_value callback)1275 napi_status NapiAVSession::OffMediaKeyEvent(napi_env env, NapiAVSession* napiSession, napi_value callback)
1276 {
1277 CHECK_AND_RETURN_RET_LOG(napiSession->callback_ != nullptr, napi_generic_failure,
1278 "NapiAVSessionCallback object is nullptr");
1279 return napiSession->callback_->RemoveCallback(env, NapiAVSessionCallback::EVENT_MEDIA_KEY_EVENT, callback);
1280 }
1281
OffOutputDeviceChange(napi_env env,NapiAVSession * napiSession,napi_value callback)1282 napi_status NapiAVSession::OffOutputDeviceChange(napi_env env, NapiAVSession* napiSession, napi_value callback)
1283 {
1284 CHECK_AND_RETURN_RET_LOG(napiSession->callback_ != nullptr, napi_generic_failure,
1285 "NapiAVSessionCallback object is nullptr");
1286 return napiSession->callback_->RemoveCallback(env, NapiAVSessionCallback::EVENT_OUTPUT_DEVICE_CHANGE, callback);
1287 }
1288
OffCommonCommand(napi_env env,NapiAVSession * napiSession,napi_value callback)1289 napi_status NapiAVSession::OffCommonCommand(napi_env env, NapiAVSession* napiSession, napi_value callback)
1290 {
1291 return napiSession->callback_->RemoveCallback(env, NapiAVSessionCallback::EVENT_SEND_COMMON_COMMAND, callback);
1292 }
1293
OffSkipToQueueItem(napi_env env,NapiAVSession * napiSession,napi_value callback)1294 napi_status NapiAVSession::OffSkipToQueueItem(napi_env env, NapiAVSession* napiSession, napi_value callback)
1295 {
1296 CHECK_AND_RETURN_RET_LOG(napiSession->callback_ != nullptr, napi_generic_failure,
1297 "NapiAVSessionCallback object is nullptr");
1298 return napiSession->callback_->RemoveCallback(env, NapiAVSessionCallback::EVENT_SKIP_TO_QUEUE_ITEM, callback);
1299 }
1300 }
1301