• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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