• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2023 Shenzhen Kaihong Digital Industry Development 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 "sink_agent.h"
17 #include "common/common_macro.h"
18 #include "common/event_channel.h"
19 #include "common/sharing_log.h"
20 #include "magic_enum.hpp"
21 
22 namespace OHOS {
23 namespace Sharing {
24 
SinkAgent()25 SinkAgent::SinkAgent() : Agent(AgentType::SINK_AGENT)
26 {
27     SHARING_LOGD("agentId: %{public}u.", GetId());
28 }
29 
~SinkAgent()30 SinkAgent::~SinkAgent()
31 {
32     SHARING_LOGD("agentId: %{public}u.", GetId());
33 }
34 
OnSessionNotify(SessionStatusMsg::Ptr & statusMsg)35 void SinkAgent::OnSessionNotify(SessionStatusMsg::Ptr &statusMsg)
36 {
37     SHARING_LOGD("trace.");
38     RETURN_IF_NULL(statusMsg);
39     SHARING_LOGI("session notify status: %{public}s, agentId: %{pubilc}u.",
40                  std::string(magic_enum::enum_name((SessionNotifyStatus)statusMsg->status)).c_str(), GetId());
41     statusMsg->prosumerId = prosumerId_;
42     switch (statusMsg->status) {
43         case SessionNotifyStatus::NOTIFY_PROSUMER_CREATE:
44             NotifyConsumer(statusMsg, EventType::EVENT_MEDIA_CONSUMER_CREATE);
45             break;
46         case SessionNotifyStatus::STATE_SESSION_STARTED:
47             NotifyConsumer(statusMsg, EventType::EVENT_MEDIA_CONSUMER_START);
48             break;
49         case SessionNotifyStatus::STATE_SESSION_STOPED:
50             NotifyConsumer(statusMsg, EventType::EVENT_MEDIA_CONSUMER_STOP);
51             break;
52         case SessionNotifyStatus::STATE_SESSION_PAUSED:
53             NotifyConsumer(statusMsg, EventType::EVENT_MEDIA_CONSUMER_PAUSE);
54             break;
55         case SessionNotifyStatus::STATE_SESSION_RESUMED:
56             NotifyConsumer(statusMsg, EventType::EVENT_MEDIA_CONSUMER_RESUME);
57             break;
58         case SessionNotifyStatus::STATE_SESSION_DESTROYED:
59             NotifyConsumer(statusMsg, EventType::EVENT_MEDIA_CONSUMER_DESTROY);
60             break;
61         case SessionNotifyStatus::STATE_SESSION_INTERRUPTED:
62             PopNextStep(runStep_, AGENT_STATUS_DONE);
63             break;
64         default:
65             Agent::OnSessionNotify(statusMsg);
66             break;
67     }
68 }
69 
NotifyConsumer(SessionStatusMsg::Ptr & statusMsg,EventType type)70 void SinkAgent::NotifyConsumer(SessionStatusMsg::Ptr &statusMsg, EventType type)
71 {
72     SHARING_LOGD("trace.");
73     RETURN_IF_NULL(statusMsg);
74     RETURN_IF_NULL(statusMsg->msg);
75     SHARING_LOGI("agentId: %{public}u, notify status, type: %{public}s.", GetId(),
76                  std::string(magic_enum::enum_name(type)).c_str());
77 
78     auto listener = agentListener_.lock();
79     if (listener) {
80         auto channelMsg = std::make_shared<ChannelEventMsg>();
81         RETURN_IF_NULL(channelMsg);
82         channelMsg->agentId = GetId();
83         channelMsg->toMgr = ModuleType::MODULE_MEDIACHANNEL;
84         channelMsg->dstId = mediaChannelId_;
85         channelMsg->prosumerId = statusMsg->prosumerId;
86         channelMsg->type = type;
87         channelMsg->className = statusMsg->className;
88         channelMsg->errorCode = statusMsg->msg->errorCode;
89         channelMsg->requestId = statusMsg->msg->requestId;
90         channelMsg->mediaType = statusMsg->mediaType;
91         statusMsg->msg = std::move(channelMsg);
92 
93         auto agentMsg = std::static_pointer_cast<AgentStatusMsg>(statusMsg);
94         agentMsg->agentId = GetId();
95         SHARING_LOGI("id: %{public}u, and notify to send event: %{public}s, mediaChannelId: %{public}u.", GetId(),
96                      std::string(magic_enum::enum_name(type)).c_str(), mediaChannelId_);
97         listener->OnAgentNotify(agentMsg);
98     }
99 }
100 
101 } // namespace Sharing
102 } // namespace OHOS