• 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 "media_channel.h"
17 #include <chrono>
18 #include "common/common_macro.h"
19 #include "common/const_def.h"
20 #include "common/event_comm.h"
21 #include "common/media_log.h"
22 #include "common/reflect_registration.h"
23 #include "configuration/include/config.h"
24 #include "magic_enum.hpp"
25 #include "mediachannel/channel_manager.h"
26 
27 using namespace std::chrono_literals;
28 
29 namespace OHOS {
30 namespace Sharing {
31 
MediaChannel()32 MediaChannel::MediaChannel()
33 {
34     SHARING_LOGD("mediachannelId: %{public}u.", GetId());
35     SharingValue::Ptr values = nullptr;
36     int32_t maxBufferCapacity = MAX_BUFFER_CAPACITY;
37     auto ret = Config::GetInstance().GetConfig("mediachannel", "bufferDispatcher", "maxBufferCapacity", values);
38     if (ret == CONFIGURE_ERROR_NONE) {
39         values->GetValue<int32_t>(maxBufferCapacity);
40     }
41 
42     int32_t bufferCapacityIncrement = BUFFER_CAPACITY_INCREMENT;
43     ret = Config::GetInstance().GetConfig("mediachannel", "bufferDispatcher", "bufferCapacityIncrement", values);
44     if (ret == CONFIGURE_ERROR_NONE) {
45         values->GetValue<int32_t>(bufferCapacityIncrement);
46     }
47 
48     dispatcher_ = std::make_shared<BufferDispatcher>(maxBufferCapacity, bufferCapacityIncrement);
49     playController_ = std::make_shared<MediaController>(GetId());
50 }
51 
~MediaChannel()52 MediaChannel::~MediaChannel()
53 {
54     SHARING_LOGD("mediachannelId: %{public}u.", GetId());
55     if (consumer_) {
56         consumer_.reset();
57     }
58 
59     if (dispatcher_ != nullptr) {
60         dispatcher_->StopDispatch();
61         dispatcher_->FlushBuffer();
62         dispatcher_->ReleaseAllReceiver();
63         dispatcher_.reset();
64     }
65 
66     SHARING_LOGD("leave, mediachannelId: %{public}u.", GetId());
67 }
68 
OnWriteTimeout()69 void MediaChannel::OnWriteTimeout()
70 {
71     SHARING_LOGD("trace.");
72     auto msg = std::make_shared<EventMsg>();
73     auto statusMsg = std::make_shared<ProsumerStatusMsg>();
74     statusMsg->eventMsg = msg;
75     statusMsg->errorCode = ERR_INTAKE_TIMEOUT;
76     statusMsg->agentId = GetSinkAgentId();
77     statusMsg->prosumerId = consumer_ ? consumer_->GetId() : INVALID_ID;
78 
79     SendAgentEvent(statusMsg, EVENT_AGENT_STATE_WRITE_WARNING);
80 }
81 
GetSinkAgentId()82 uint32_t MediaChannel::GetSinkAgentId()
83 {
84     SHARING_LOGD("trace.");
85     if (consumer_)
86         return consumer_->GetSinkAgentId();
87     else
88         return INVALID_ID;
89 }
90 
OnProducerNotify(ProsumerStatusMsg::Ptr & msg)91 void MediaChannel::OnProducerNotify(ProsumerStatusMsg::Ptr &msg)
92 {
93     SHARING_LOGD("trace.");
94     RETURN_IF_NULL(msg);
95     RETURN_IF_NULL(msg->eventMsg);
96     SHARING_LOGI("mediachannelId: %{public}u, producerId: %{public}u, status: %{public}s.", GetId(), msg->prosumerId,
97                  std::string(magic_enum::enum_name(static_cast<ProsumerNotifyStatus>(msg->status))).c_str());
98     switch (msg->status) {
99         case ProsumerNotifyStatus::PROSUMER_NOTIFY_INIT_SUCCESS:
100             SendAgentEvent(msg, EVENT_AGENT_STATE_PROSUMER_CREATE);
101             break;
102         case PROSUMER_NOTIFY_START_SUCCESS:
103             SendAgentEvent(msg, EVENT_AGENT_STATE_PROSUMER_START);
104             break;
105         case PROSUMER_NOTIFY_STOP_SUCCESS:
106             SendAgentEvent(msg, EVENT_AGENT_STATE_PROSUMER_STOP);
107             break;
108         case PROSUMER_NOTIFY_PAUSE_SUCCESS:
109             SendAgentEvent(msg, EVENT_AGENT_STATE_PROSUMER_PAUSE);
110             break;
111         case PROSUMER_NOTIFY_RESUME_SUCCESS:
112             SendAgentEvent(msg, EVENT_AGENT_STATE_PROSUMER_RESUME);
113             break;
114         case PROSUMER_NOTIFY_DESTROY_SUCCESS: {
115             SHARING_LOGD("destroy producer, mediachannelId: %{public}u.", GetId());
116             std::unique_lock<std::mutex> lock(mutex_);
117             auto iter = producers_.find(msg->prosumerId);
118             if (iter != producers_.end()) {
119                 producers_.erase(iter);
120             }
121             SHARING_LOGD("erase producer, mediachannelId: %{public}u.", GetId());
122             SendAgentEvent(msg, EVENT_AGENT_STATE_PROSUMER_DESTROY);
123             break;
124         }
125         case PROSUMER_NOTIFY_ERROR:
126             SendAgentEvent(msg, EVENT_AGENT_PROSUMER_ERROR);
127             break;
128         case PROSUMER_NOTIFY_PRIVATE_EVENT: {
129             SharingEvent agentEvent;
130             agentEvent.eventMsg = msg->eventMsg;
131             SendEvent(agentEvent);
132             return;
133         }
134         default:
135             break;
136     }
137 }
138 
OnConsumerNotify(ProsumerStatusMsg::Ptr & msg)139 void MediaChannel::OnConsumerNotify(ProsumerStatusMsg::Ptr &msg)
140 {
141     SHARING_LOGD("trace.");
142     RETURN_IF_NULL(msg);
143     RETURN_IF_NULL(msg->eventMsg);
144     SHARING_LOGI("mediachannelId: %{public}u, consumerId: %{public}u, status: %{public}s.", GetId(), msg->prosumerId,
145                  std::string(magic_enum::enum_name(static_cast<ProsumerNotifyStatus>(msg->status))).c_str());
146 
147     switch (msg->status) {
148         case ProsumerNotifyStatus::PROSUMER_NOTIFY_INIT_SUCCESS:
149             SendAgentEvent(msg, EVENT_AGENT_STATE_PROSUMER_CREATE);
150             break;
151         case PROSUMER_NOTIFY_START_SUCCESS: {
152             msg->errorCode = InitPlayController();
153             SendAgentEvent(msg, EVENT_AGENT_STATE_PROSUMER_START);
154             break;
155         }
156         case PROSUMER_NOTIFY_STOP_SUCCESS:
157             SendAgentEvent(msg, EVENT_AGENT_STATE_PROSUMER_STOP);
158             break;
159         case PROSUMER_NOTIFY_PAUSE_SUCCESS:
160             SendAgentEvent(msg, EVENT_AGENT_STATE_PROSUMER_PAUSE);
161             break;
162         case PROSUMER_NOTIFY_RESUME_SUCCESS:
163             SendAgentEvent(msg, EVENT_AGENT_STATE_PROSUMER_RESUME);
164             break;
165         case PROSUMER_NOTIFY_DESTROY_SUCCESS:
166             SendAgentEvent(msg, EVENT_AGENT_STATE_PROSUMER_DESTROY);
167             break;
168         case PROSUMER_NOTIFY_ERROR:
169             SendAgentEvent(msg, EVENT_AGENT_PROSUMER_ERROR);
170             break;
171         case PROSUMER_NOTIFY_PRIVATE_EVENT: {
172             SharingEvent agentEvent;
173             agentEvent.eventMsg = msg->eventMsg;
174             SendEvent(agentEvent);
175             return;
176         }
177         default:
178             break;
179     }
180 }
181 
OnMediaControllerNotify(ProsumerStatusMsg::Ptr & msg)182 void MediaChannel::OnMediaControllerNotify(ProsumerStatusMsg::Ptr &msg)
183 {
184     SHARING_LOGD("trace.");
185     RETURN_IF_NULL(msg);
186     RETURN_IF_NULL(msg->eventMsg);
187     SHARING_LOGI("mediachannelId: %{public}u, prosumerId: %{public}u, status: %{public}s.", GetId(), msg->prosumerId,
188                  std::string(magic_enum::enum_name(static_cast<PlayConntrollerNotifyStatus>(msg->status))).c_str());
189 
190     switch (msg->status) {
191         case CONNTROLLER_NOTIFY_ACCELERATION:
192             SendAgentEvent(msg, EVENT_AGEINT_ACCELERATION_DONE);
193             break;
194         case CONNTROLLER_NOTIFY_DECODER_DIED:
195             SendAgentEvent(msg, EVENT_AGENT_DECODER_DIED);
196             break;
197         case CONNTROLLER_NOTIFY_KEYMOD_START:
198             SendAgentEvent(msg, EVENT_AGENT_KEYMODE_START);
199             break;
200         case CONNTROLLER_NOTIFY_KEYMOD_STOP:
201             SendAgentEvent(msg, EVENT_AGENT_KEYMODE_STOP);
202             break;
203         default:
204             break;
205     }
206 }
207 
CreateProducer(std::string & className)208 uint32_t MediaChannel::CreateProducer(std::string &className)
209 {
210     SHARING_LOGD("trace.");
211     BaseProducer::Ptr producer = ClassReflector<BaseProducer>::Class2Instance(className);
212     if (producer) {
213         std::unique_lock<std::mutex> lock(mutex_);
214         producer->SetProducerListener(shared_from_this());
215         producers_[producer->GetId()] = producer;
216         SHARING_LOGD("create producer success, mediachannelId: %{public}u.", GetId());
217         return producer->GetId();
218     }
219 
220     return INVALID_ID;
221 }
222 
CreateConsumer(std::string & className)223 SharingErrorCode MediaChannel::CreateConsumer(std::string &className)
224 {
225     SHARING_LOGD("trace.");
226     if (consumer_) {
227         consumer_.reset();
228         SHARING_LOGW("create consumer. The consumer is reseted.");
229     }
230     consumer_ = ClassReflector<BaseConsumer>::Class2Instance(className);
231     if (consumer_) {
232         consumer_->SetConsumerListener(shared_from_this());
233         if (dispatcher_) {
234             dispatcher_->SetBufferDispatcherListener(shared_from_this());
235         }
236         SHARING_LOGD("create consumer success name: %{public}s, mediachannelId: %{public}u.", className.c_str(),
237                      GetId());
238         return SharingErrorCode::ERR_OK;
239     }
240 
241     SHARING_LOGD("create consumer error name: %{public}s.", className.c_str());
242     return SharingErrorCode::ERR_GENERAL_ERROR;
243 }
244 
HandleEvent(SharingEvent & event)245 int32_t MediaChannel::HandleEvent(SharingEvent &event)
246 {
247     SHARING_LOGD("trace.");
248     RETURN_INVALID_IF_NULL(event.eventMsg);
249     SHARING_LOGD(
250         "HandleEvent mediachannelId: %{public}u, fromMgr: %{public}u, srcId: %{public}u, handle event: %{public}s.",
251         event.eventMsg->dstId, event.eventMsg->fromMgr, event.eventMsg->srcId,
252         std::string(magic_enum::enum_name(event.eventMsg->type)).c_str());
253 
254     switch (event.eventMsg->type) {
255         case EventType::EVENT_MEDIA_CONSUMER_CREATE:
256             HandleCreateConsumer(event);
257             break;
258         case EventType::EVENT_MEDIA_CONSUMER_DESTROY:
259             HandleDestroyConsumer(event);
260             break;
261         case EventType::EVENT_MEDIA_CONSUMER_START:
262             HandleStartConsumer(event);
263             break;
264         case EventType::EVENT_MEDIA_CONSUMER_STOP:
265             HandleStopConsumer(event);
266             break;
267         case EventType::EVENT_MEDIA_CONSUMER_PAUSE:
268             HandlePauseConsumer(event);
269             break;
270         case EventType::EVENT_MEDIA_CONSUMER_RESUME:
271             HandleResumeConsumer(event);
272             break;
273         case EventType::EVENT_MEDIA_PRODUCER_CREATE:
274             HandleCreateProducer(event);
275             break;
276         case EventType::EVENT_MEDIA_PRODUCER_DESTROY:
277             HandleDestroyProducer(event);
278             break;
279         case EventType::EVENT_MEDIA_PRODUCER_START:
280             HandleStartProducer(event);
281             break;
282         case EventType::EVENT_MEDIA_PRODUCER_STOP:
283             HandleStopProducer(event);
284             break;
285         case EventType::EVENT_MEDIA_PRODUCER_PAUSE:
286             HandlePauseProducer(event);
287             break;
288         case EventType::EVENT_MEDIA_PRODUCER_RESUME:
289             HandleResumeProducer(event);
290             break;
291         case EventType::EVENT_MEDIA_CHANNEL_APPENDSURFACE:
292             HandleAppendSurface(event);
293             break;
294         case EventType::EVENT_MEDIA_CHANNEL_REMOVESURFACE:
295             HandleRemoveSurface(event);
296             break;
297         case EventType::EVENT_MEDIA_CHANNEL_SETSCENETYPE:
298             HandleSetSceneType(event);
299             break;
300         case EventType::EVENT_MEDIA_CHANNEL_SETVOLUME:
301             HandleSetVolume(event);
302             break;
303         case EventType::EVENT_MEDIA_PLAY_START:
304             HandleStartPlay(event);
305             break;
306         case EventType::EVENT_MEDIA_PLAY_STOP:
307             HandleStopPlay(event);
308             break;
309         case EventType::EVENT_MEDIA_CHANNEL_KEY_REDIRECT:
310             HandleSetKeyRedirect(event);
311             break;
312         default: {
313             auto channelMsg = ConvertEventMsg<ChannelEventMsg>(event);
314             if (channelMsg) {
315                 if (consumer_ && (consumer_->GetId() == channelMsg->prosumerId)) {
316                     SHARING_LOGD("send event to consumer.");
317                     consumer_->HandleEvent(event);
318                 } else if (producers_.find(channelMsg->prosumerId) != producers_.end()) {
319                     SHARING_LOGD("send event to producer.");
320                     producers_[channelMsg->prosumerId]->HandleEvent(event);
321                     return SharingErrorCode::ERR_OK;
322                 } else {
323                     SHARING_LOGW("unknow prosumerId: %{public}u.", channelMsg->prosumerId);
324                 }
325             } else {
326                 SHARING_LOGW("unknown event msg.");
327             }
328 
329             break;
330         }
331     }
332 
333     return SharingErrorCode::ERR_OK;
334 }
335 
Release()336 int32_t MediaChannel::Release()
337 {
338     SHARING_LOGD("trace, mediachannelId: %{public}u.", GetId());
339     if (nullptr != playController_) {
340         SHARING_LOGD("release playController, mediachannelId: %{public}u.", GetId());
341         playController_->Release();
342         playController_.reset();
343     } else {
344         SHARING_LOGD("playerController has been released, mediachannelId: %{public}u.", GetId());
345     }
346     if (nullptr != consumer_) {
347         SHARING_LOGD("release Consumer, mediachannelId: %{public}u.", GetId());
348         consumer_.reset();
349     }
350 
351     std::unique_lock<std::mutex> lock(mutex_);
352     producers_.clear();
353     SHARING_LOGD("end mediachannelId: %{public}u.", GetId());
354     return 0;
355 }
356 
SetMediaChannelListener(std::weak_ptr<IMediaChannelListener> listener)357 void MediaChannel::SetMediaChannelListener(std::weak_ptr<IMediaChannelListener> listener)
358 {
359     SHARING_LOGD("trace.");
360     listener_ = listener;
361 }
362 
HandleAppendSurface(SharingEvent & event)363 SharingErrorCode MediaChannel::HandleAppendSurface(SharingEvent &event)
364 {
365     SHARING_LOGD("trace.");
366     if (consumer_ == nullptr) {
367         SHARING_LOGE("consumer is not inited.");
368         return SharingErrorCode::ERR_GENERAL_ERROR;
369     }
370     auto channelMsg = ConvertEventMsg<ChannelAppendSurfaceEventMsg>(event);
371     if (channelMsg == nullptr) {
372         SHARING_LOGD("unknow msg.");
373         return SharingErrorCode::ERR_GENERAL_ERROR;
374     }
375 
376     auto statusMsg = std::make_shared<ProsumerStatusMsg>();
377     statusMsg->eventMsg = channelMsg;
378     if ((nullptr != channelMsg->surface) && playController_) {
379         if (playController_->AppendSurface(channelMsg->surface, channelMsg->sceneType)) {
380             statusMsg->errorCode = ERR_OK;
381             statusMsg->prosumerId = consumer_->GetId();
382             statusMsg->agentId = consumer_->GetSinkAgentId();
383             SendAgentEvent(statusMsg, EVENT_AGENT_STATE_CHANNEL_APPENDSURFACE);
384             return ERR_OK;
385         } else {
386             SHARING_LOGW("AppendSurface failed.");
387             statusMsg->errorCode = ERR_INVALID_SURFACE_ID;
388         }
389     } else {
390         SHARING_LOGW("playerController or surface is nullptr.");
391         statusMsg->errorCode = ERR_PLAY_START;
392     }
393 
394     statusMsg->prosumerId = channelMsg->prosumerId;
395     statusMsg->agentId = channelMsg->agentId;
396     SendAgentEvent(statusMsg, EVENT_AGENT_STATE_CHANNEL_APPENDSURFACE);
397     return ERR_GENERAL_ERROR;
398 }
399 
HandleRemoveSurface(SharingEvent & event)400 SharingErrorCode MediaChannel::HandleRemoveSurface(SharingEvent &event)
401 {
402     SHARING_LOGD("trace.");
403     if (consumer_ == nullptr) {
404         SHARING_LOGE("consumer is not inited.");
405         return SharingErrorCode::ERR_GENERAL_ERROR;
406     }
407 
408     auto channelMsg = ConvertEventMsg<ChannelRemoveSurfaceEventMsg>(event);
409     if (channelMsg == nullptr) {
410         SHARING_LOGE("unknow msg.");
411         return SharingErrorCode::ERR_GENERAL_ERROR;
412     }
413 
414     if (playController_) {
415         playController_->RemoveSurface(channelMsg->surfaceId);
416     } else {
417         SHARING_LOGW("remove surface error, mediachannelId: %{public}u.", GetId());
418     }
419 
420     auto statusMsg = std::make_shared<ProsumerStatusMsg>();
421     statusMsg->eventMsg = channelMsg;
422     statusMsg->errorCode = ERR_OK;
423     statusMsg->prosumerId = consumer_->GetId();
424     statusMsg->agentId = consumer_->GetSinkAgentId();
425     statusMsg->surfaceId = channelMsg->surfaceId;
426     SendAgentEvent(statusMsg, EVENT_AGENT_STATE_CHANNEL_REMOVESURFACE);
427 
428     return SharingErrorCode::ERR_OK;
429 }
430 
HandleSetSceneType(SharingEvent & event)431 SharingErrorCode MediaChannel::HandleSetSceneType(SharingEvent &event)
432 {
433     SHARING_LOGD("trace.");
434     auto channelMsg = ConvertEventMsg<ChannelSetSceneTypeEventMsg>(event);
435     if (channelMsg == nullptr) {
436         SHARING_LOGE("unknow msg.");
437         return SharingErrorCode::ERR_GENERAL_ERROR;
438     }
439 
440     if (playController_) {
441         if (channelMsg->sceneType == OHOS::Sharing::SceneType::FOREGROUND) {
442             playController_->SetKeyMode(channelMsg->surfaceId, false);
443         } else if (channelMsg->sceneType == OHOS::Sharing::SceneType::BACKGROUND) {
444             playController_->SetKeyMode(channelMsg->surfaceId, true);
445         }
446     }
447 
448     SHARING_LOGW("playerController is nullptr, mediaChannelId: %{public}u.", GetId());
449     return ERR_OK;
450 }
451 
HandleSetKeyRedirect(SharingEvent & event)452 SharingErrorCode MediaChannel::HandleSetKeyRedirect(SharingEvent &event)
453 {
454     SHARING_LOGD("trace.");
455     auto channelMsg = ConvertEventMsg<ChannelSetKeyRedirectEventMsg>(event);
456     if (channelMsg == nullptr) {
457         SHARING_LOGE("unknow msg.");
458         return SharingErrorCode::ERR_GENERAL_ERROR;
459     }
460 
461     if (playController_) {
462         playController_->SetKeyRedirect(channelMsg->surfaceId, channelMsg->keyRedirect);
463     } else {
464         SHARING_LOGW("playerController is nullptr, mediaChannelId: %{public}u.", GetId());
465     }
466 
467     return ERR_OK;
468 }
469 
HandleSetVolume(SharingEvent & event)470 SharingErrorCode MediaChannel::HandleSetVolume(SharingEvent &event)
471 {
472     SHARING_LOGD("trace.");
473     auto channelMsg = ConvertEventMsg<ChannelSetVolumeEventMsg>(event);
474     if (channelMsg == nullptr) {
475         SHARING_LOGE("unknow msg.");
476         return SharingErrorCode::ERR_GENERAL_ERROR;
477     }
478 
479     float volume = channelMsg->volume;
480     if (playController_) {
481         playController_->SetVolume(volume);
482     } else {
483         SHARING_LOGW("playerController is nullptr, mediaChannelId: %{public}u.", GetId());
484     }
485 
486     return ERR_OK;
487 }
488 
HandleStartPlay(SharingEvent & event)489 SharingErrorCode MediaChannel::HandleStartPlay(SharingEvent &event)
490 {
491     SHARING_LOGD("trace.");
492     auto channelMsg = ConvertEventMsg<ChannelEventMsg>(event);
493     if (channelMsg == nullptr) {
494         SHARING_LOGE("unknow msg.");
495         return SharingErrorCode::ERR_GENERAL_ERROR;
496     }
497 
498     auto statusMsg = std::make_shared<ProsumerStatusMsg>();
499     statusMsg->eventMsg = channelMsg;
500     statusMsg->prosumerId = consumer_ ? consumer_->GetId() : channelMsg->prosumerId;
501     statusMsg->agentId = channelMsg->agentId;
502 
503     if (playController_) {
504         playController_->Start();
505         statusMsg->errorCode = ERR_OK;
506     } else {
507         SHARING_LOGW("playerController is nullptr, mediaChannelId: %{public}u.", GetId());
508         statusMsg->errorCode = ERR_PLAY_START;
509     }
510 
511     SendAgentEvent(statusMsg, EVENT_AGENT_STATE_PLAY_START);
512     return ERR_OK;
513 }
514 
HandleStopPlay(SharingEvent & event)515 SharingErrorCode MediaChannel::HandleStopPlay(SharingEvent &event)
516 {
517     SHARING_LOGD("trace.");
518     auto channelMsg = ConvertEventMsg<ChannelEventMsg>(event);
519     if (channelMsg == nullptr) {
520         SHARING_LOGE("unknow msg.");
521         return SharingErrorCode::ERR_GENERAL_ERROR;
522     }
523 
524     auto statusMsg = std::make_shared<ProsumerStatusMsg>();
525     statusMsg->eventMsg = channelMsg;
526     statusMsg->prosumerId = consumer_ ? consumer_->GetId() : channelMsg->prosumerId;
527     statusMsg->agentId = channelMsg->agentId;
528 
529     if (playController_) {
530         playController_->Stop();
531         statusMsg->errorCode = ERR_OK;
532     } else {
533         SHARING_LOGW("playerController is nullptr, mediaChannelId: %{public}u.", GetId());
534         statusMsg->errorCode = ERR_PLAY_STOP;
535     }
536 
537     SendAgentEvent(statusMsg, EVENT_AGENT_STATE_PLAY_STOP);
538     return ERR_OK;
539 }
540 
HandleCreateConsumer(SharingEvent & event)541 SharingErrorCode MediaChannel::HandleCreateConsumer(SharingEvent &event)
542 {
543     SHARING_LOGD("trace.");
544     auto channelMsg = ConvertEventMsg<ChannelEventMsg>(event);
545     if (channelMsg == nullptr) {
546         SHARING_LOGE("unknow msg.");
547         return SharingErrorCode::ERR_GENERAL_ERROR;
548     }
549     auto statusMsg = std::make_shared<ProsumerStatusMsg>();
550     statusMsg->eventMsg = channelMsg;
551 
552     if (CreateConsumer(channelMsg->className) == ERR_OK) {
553         if (consumer_) {
554             SHARING_LOGD("create consumer success, consumerId: %{public}u, mediachannelId: %{public}u.",
555                          consumer_->GetId(), GetId());
556             statusMsg->status = PROSUMER_INIT;
557             consumer_->SetSinkAgentId(channelMsg->agentId);
558             consumer_->UpdateOperation(statusMsg);
559         }
560         return ERR_OK;
561     } else {
562         SHARING_LOGW("create consumer failed.");
563         statusMsg->errorCode = ERR_PROSUMER_CREATE;
564         statusMsg->prosumerId = INVALID_ID;
565         statusMsg->agentId = channelMsg->agentId;
566         SendAgentEvent(statusMsg, EVENT_AGENT_PROSUMER_ERROR);
567         return ERR_GENERAL_ERROR;
568     }
569 }
570 
HandleDestroyConsumer(SharingEvent & event)571 SharingErrorCode MediaChannel::HandleDestroyConsumer(SharingEvent &event)
572 {
573     SHARING_LOGD("trace.");
574     auto channelMsg = ConvertEventMsg<ChannelEventMsg>(event);
575     if (channelMsg == nullptr) {
576         SHARING_LOGE("unknow msg.");
577         return SharingErrorCode::ERR_GENERAL_ERROR;
578     }
579 
580     auto statusMsg = std::make_shared<ProsumerStatusMsg>();
581     statusMsg->eventMsg = channelMsg;
582 
583     if (consumer_ == nullptr) {
584         SHARING_LOGW("consumer is null, mediachannelId: %{public}u.", GetId());
585         statusMsg->errorCode = ERR_OK;
586         statusMsg->prosumerId = INVALID_ID;
587         statusMsg->agentId = channelMsg->agentId;
588         SendAgentEvent(statusMsg, EVENT_AGENT_STATE_PROSUMER_DESTROY);
589         return SharingErrorCode::ERR_OK;
590     }
591 
592     if (consumer_->IsRunning()) {
593         SHARING_LOGD("consumer is running, mediachannelId: %{public}u.", GetId());
594         statusMsg->errorCode = ERR_PROSUMER_DESTROY;
595         statusMsg->prosumerId = consumer_ ? consumer_->GetId() : INVALID_ID;
596         statusMsg->agentId = channelMsg->agentId;
597         SendAgentEvent(statusMsg, EVENT_AGENT_PROSUMER_ERROR);
598         return SharingErrorCode::ERR_GENERAL_ERROR;
599     } else {
600         statusMsg->status = PROSUMER_DESTROY;
601         consumer_->UpdateOperation(statusMsg);
602         SHARING_LOGD("ERR_OK.");
603         return SharingErrorCode::ERR_OK;
604     }
605 }
606 
HandleStartConsumer(SharingEvent & event)607 SharingErrorCode MediaChannel::HandleStartConsumer(SharingEvent &event)
608 {
609     SHARING_LOGD("trace.");
610     auto channelMsg = ConvertEventMsg<ChannelEventMsg>(event);
611     if (channelMsg == nullptr) {
612         SHARING_LOGE("unknow msg.");
613         return SharingErrorCode::ERR_GENERAL_ERROR;
614     }
615 
616     auto statusMsg = std::make_shared<ProsumerStatusMsg>();
617     statusMsg->eventMsg = channelMsg;
618 
619     if (consumer_) {
620         statusMsg->status = PROSUMER_START;
621         consumer_->UpdateOperation(statusMsg);
622         SHARING_LOGD("update consumer start success, mediaChannelId: %{public}u.", GetId());
623         return SharingErrorCode::ERR_OK;
624     } else {
625         SHARING_LOGE("consumer is null, mediachannelId: %{public}u.", GetId());
626         statusMsg->errorCode = ERR_PROSUMER_START;
627         statusMsg->prosumerId = INVALID_ID;
628         statusMsg->agentId = channelMsg->agentId;
629         SendAgentEvent(statusMsg, EVENT_AGENT_PROSUMER_ERROR);
630         return SharingErrorCode::ERR_GENERAL_ERROR;
631     }
632 }
633 
HandleStopConsumer(SharingEvent & event)634 SharingErrorCode MediaChannel::HandleStopConsumer(SharingEvent &event)
635 {
636     SHARING_LOGD("trace.");
637     auto channelMsg = ConvertEventMsg<ChannelEventMsg>(event);
638     if (channelMsg == nullptr) {
639         SHARING_LOGE("unknow msg.");
640         return SharingErrorCode::ERR_GENERAL_ERROR;
641     }
642 
643     auto statusMsg = std::make_shared<ProsumerStatusMsg>();
644     statusMsg->eventMsg = channelMsg;
645 
646     if (nullptr != playController_) {
647         playController_->Stop();
648         SHARING_LOGD("play controller stop success, mediaChannelId: %{public}u.", GetId());
649     } else {
650         SHARING_LOGW("playerController is nullptr, mediaChannelId: %{public}u.", GetId());
651     }
652 
653     if (consumer_) {
654         statusMsg->status = PROSUMER_STOP;
655         consumer_->UpdateOperation(statusMsg);
656         SHARING_LOGD("update consumer stop success, mediaChannelId: %{public}u.", GetId());
657     } else {
658         SHARING_LOGW("consumer null mediaChannelId: %{public}u.", GetId());
659         statusMsg->errorCode = ERR_OK;
660         statusMsg->prosumerId = INVALID_ID;
661         statusMsg->agentId = channelMsg->agentId;
662         SendAgentEvent(statusMsg, EVENT_AGENT_STATE_PROSUMER_STOP);
663     }
664 
665     return SharingErrorCode::ERR_OK;
666 }
667 
HandlePauseConsumer(SharingEvent & event)668 SharingErrorCode MediaChannel::HandlePauseConsumer(SharingEvent &event)
669 {
670     SHARING_LOGD("trace.");
671     auto channelMsg = ConvertEventMsg<ChannelEventMsg>(event);
672     if (channelMsg == nullptr) {
673         SHARING_LOGE("unknow msg.");
674         return SharingErrorCode::ERR_GENERAL_ERROR;
675     }
676 
677     auto statusMsg = std::make_shared<ProsumerStatusMsg>();
678     statusMsg->eventMsg = channelMsg;
679     statusMsg->mediaType = channelMsg->mediaType;
680 
681     if (consumer_) {
682         statusMsg->status = PROSUMER_PAUSE;
683         consumer_->UpdateOperation(statusMsg);
684         return SharingErrorCode::ERR_OK;
685     }
686 
687     SHARING_LOGD("pasue consumer error mediachannelId: %{public}u.", GetId());
688     return SharingErrorCode::ERR_GENERAL_ERROR;
689 }
690 
HandleResumeConsumer(SharingEvent & event)691 SharingErrorCode MediaChannel::HandleResumeConsumer(SharingEvent &event)
692 {
693     SHARING_LOGD("trace.");
694     auto channelMsg = ConvertEventMsg<ChannelEventMsg>(event);
695     if (channelMsg == nullptr) {
696         SHARING_LOGE("unknow msg.");
697         return SharingErrorCode::ERR_GENERAL_ERROR;
698     }
699 
700     auto statusMsg = std::make_shared<ProsumerStatusMsg>();
701     statusMsg->eventMsg = channelMsg;
702     statusMsg->mediaType = channelMsg->mediaType;
703 
704     if (consumer_) {
705         statusMsg->status = PROSUMER_RESUME;
706         consumer_->UpdateOperation(statusMsg);
707         return SharingErrorCode::ERR_OK;
708     }
709 
710     SHARING_LOGD("resume consumer error mediachannelId: %{public}u.", GetId());
711     return SharingErrorCode::ERR_GENERAL_ERROR;
712 }
713 
HandleCreateProducer(SharingEvent & event)714 SharingErrorCode MediaChannel::HandleCreateProducer(SharingEvent &event)
715 {
716     SHARING_LOGD("trace.");
717     auto channelMsg = ConvertEventMsg<ChannelEventMsg>(event);
718     if (channelMsg == nullptr) {
719         SHARING_LOGE("unknow msg.");
720         return SharingErrorCode::ERR_GENERAL_ERROR;
721     }
722 
723     auto statusMsg = std::make_shared<ProsumerStatusMsg>();
724     statusMsg->eventMsg = channelMsg;
725 
726     uint32_t retId = CreateProducer(channelMsg->className);
727     if (retId != INVALID_ID) {
728         SHARING_LOGD("create prosumer success.");
729         producers_[retId]->SetSrcAgentId(channelMsg->agentId);
730         statusMsg->status = PROSUMER_INIT;
731         producers_[retId]->UpdateOperation(statusMsg);
732         return SharingErrorCode::ERR_OK;
733     } else {
734         SHARING_LOGW("create prosumer failed.");
735         statusMsg->errorCode = ERR_PROSUMER_CREATE;
736         statusMsg->prosumerId = INVALID_ID;
737         statusMsg->agentId = channelMsg->agentId;
738         SendAgentEvent(statusMsg, EVENT_AGENT_PROSUMER_ERROR);
739         return SharingErrorCode::ERR_GENERAL_ERROR;
740     }
741 }
742 
HandleDestroyProducer(SharingEvent & event)743 SharingErrorCode MediaChannel::HandleDestroyProducer(SharingEvent &event)
744 {
745     SHARING_LOGD("trace.");
746     auto channelMsg = ConvertEventMsg<ChannelEventMsg>(event);
747     if (channelMsg == nullptr) {
748         SHARING_LOGE("unknow msg.");
749         return SharingErrorCode::ERR_GENERAL_ERROR;
750     }
751 
752     auto statusMsg = std::make_shared<ProsumerStatusMsg>();
753     statusMsg->eventMsg = channelMsg;
754 
755     uint32_t id = channelMsg->prosumerId;
756     BaseProducer::Ptr pProducer = nullptr;
757     {
758         std::unique_lock<std::mutex> lock(mutex_);
759         auto iter = producers_.find(id);
760         if (iter != producers_.end()) {
761             pProducer = iter->second;
762         } else {
763             SHARING_LOGE("cann't find producerId: %{public}u, channelId: %{public}u.", id, GetId());
764         }
765     }
766 
767     if (nullptr == pProducer) {
768         statusMsg->errorCode = ERR_OK;
769         statusMsg->prosumerId = id;
770         statusMsg->agentId = channelMsg->agentId;
771         SendAgentEvent(statusMsg, EVENT_AGENT_STATE_PROSUMER_DESTROY);
772         return SharingErrorCode::ERR_OK;
773     }
774 
775     if (pProducer->IsRunning()) {
776         SHARING_LOGD("producer is running, producerId: %{public}u, mediachannelId: %{public}u.", id, GetId());
777         statusMsg->errorCode = ERR_PROSUMER_DESTROY;
778         statusMsg->prosumerId = id;
779         statusMsg->agentId = channelMsg->agentId;
780         SendAgentEvent(statusMsg, EVENT_AGENT_PROSUMER_ERROR);
781     } else {
782         statusMsg->status = PROSUMER_DESTROY;
783         pProducer->UpdateOperation(statusMsg);
784     }
785 
786     SHARING_LOGD("producer destroy exit, mediachannelId: %{public}u.", GetId());
787     return SharingErrorCode::ERR_OK;
788 }
789 
HandleStartProducer(SharingEvent & event)790 SharingErrorCode MediaChannel::HandleStartProducer(SharingEvent &event)
791 {
792     SHARING_LOGD("trace.");
793     auto channelMsg = ConvertEventMsg<ChannelEventMsg>(event);
794     if (channelMsg == nullptr) {
795         SHARING_LOGE("unknow msg.");
796         return SharingErrorCode::ERR_GENERAL_ERROR;
797     }
798 
799     auto statusMsg = std::make_shared<ProsumerStatusMsg>();
800     statusMsg->eventMsg = channelMsg;
801 
802     {
803         std::unique_lock<std::mutex> lock(mutex_);
804         auto iter = producers_.find(channelMsg->prosumerId);
805         if (iter != producers_.end() && (iter->second)) {
806             auto producer = iter->second;
807             dispatcher_->AttachReceiver(producer);
808             statusMsg->status = PROSUMER_START;
809             producer->UpdateOperation(statusMsg);
810             producer->StartDispatchThread();
811             SHARING_LOGD("media start producer success, mediachannelId: %{public}u.", GetId());
812             return SharingErrorCode::ERR_OK;
813         } else {
814             SHARING_LOGW("cann't find producerId: %{public}u, mediachannelId: %{public}u, agentId: %{public}u.",
815                          channelMsg->prosumerId, GetId(), channelMsg->agentId);
816             statusMsg->errorCode = ERR_PROSUMER_START;
817             statusMsg->prosumerId = channelMsg->prosumerId;
818             statusMsg->agentId = channelMsg->agentId;
819             SendAgentEvent(statusMsg, EVENT_AGENT_PROSUMER_ERROR);
820         }
821     }
822 
823     SHARING_LOGD("media start producer end, mediachannelId: %{public}u.", GetId());
824     return SharingErrorCode::ERR_GENERAL_ERROR;
825 }
826 
HandleStopProducer(SharingEvent & event)827 SharingErrorCode MediaChannel::HandleStopProducer(SharingEvent &event)
828 {
829     SHARING_LOGD("trace.");
830     auto channelMsg = ConvertEventMsg<ChannelEventMsg>(event);
831     if (channelMsg == nullptr) {
832         SHARING_LOGE("unknow msg.");
833         return SharingErrorCode::ERR_GENERAL_ERROR;
834     }
835 
836     auto statusMsg = std::make_shared<ProsumerStatusMsg>();
837     statusMsg->eventMsg = channelMsg;
838     {
839         std::unique_lock<std::mutex> lock(mutex_);
840         auto iter = producers_.find(channelMsg->prosumerId);
841         if (iter != producers_.end() && (iter->second)) {
842             dispatcher_->DetachReceiver(iter->second);
843             statusMsg->status = PROSUMER_STOP;
844             iter->second->UpdateOperation(statusMsg);
845             SHARING_LOGD("media stop producer success, mediachannelId: %{public}u.", GetId());
846             return SharingErrorCode::ERR_OK;
847         } else {
848             SHARING_LOGW("cann't find producerId: %{public}u, mediachannelId: %{public}u, agentId: %{public}u.",
849                          channelMsg->prosumerId, GetId(), channelMsg->agentId);
850             statusMsg->errorCode = ERR_OK;
851             statusMsg->prosumerId = channelMsg->prosumerId;
852             statusMsg->agentId = channelMsg->agentId;
853             SendAgentEvent(statusMsg, EVENT_AGENT_STATE_PROSUMER_STOP);
854         }
855     }
856 
857     SHARING_LOGD("media stop producer end, mediachannelId: %{public}u.", GetId());
858     return SharingErrorCode::ERR_GENERAL_ERROR;
859 }
860 
HandlePauseProducer(SharingEvent & event)861 SharingErrorCode MediaChannel::HandlePauseProducer(SharingEvent &event)
862 {
863     SHARING_LOGD("trace.");
864     auto channelMsg = ConvertEventMsg<ChannelEventMsg>(event);
865     if (channelMsg == nullptr) {
866         SHARING_LOGE("unknow msg.");
867         return SharingErrorCode::ERR_GENERAL_ERROR;
868     }
869 
870     auto statusMsg = std::make_shared<ProsumerStatusMsg>();
871     statusMsg->eventMsg = channelMsg;
872     statusMsg->mediaType = channelMsg->mediaType;
873 
874     {
875         std::unique_lock<std::mutex> lock(mutex_);
876         auto iter = producers_.find(channelMsg->prosumerId);
877         if (iter != producers_.end() && (iter->second)) {
878             statusMsg->status = PROSUMER_PAUSE;
879             iter->second->UpdateOperation(statusMsg);
880             return SharingErrorCode::ERR_OK;
881         } else {
882             SHARING_LOGW("cann't find producerId: %{public}d, mediachannelId: %{public}d, agentId: %{public}d.",
883                          channelMsg->prosumerId, GetId(), channelMsg->agentId);
884         }
885     }
886 
887     SHARING_LOGD("media pause producer end, mediachannelId: %{public}u.", GetId());
888     return SharingErrorCode::ERR_GENERAL_ERROR;
889 }
890 
HandleResumeProducer(SharingEvent & event)891 SharingErrorCode MediaChannel::HandleResumeProducer(SharingEvent &event)
892 {
893     SHARING_LOGD("trace.");
894     auto channelMsg = ConvertEventMsg<ChannelEventMsg>(event);
895     if (channelMsg == nullptr) {
896         SHARING_LOGE("unknow msg.");
897         return SharingErrorCode::ERR_GENERAL_ERROR;
898     }
899 
900     auto statusMsg = std::make_shared<ProsumerStatusMsg>();
901     statusMsg->eventMsg = channelMsg;
902     statusMsg->mediaType = channelMsg->mediaType;
903 
904     {
905         std::unique_lock<std::mutex> lock(mutex_);
906         auto iter = producers_.find(channelMsg->prosumerId);
907         if (iter != producers_.end() && (iter->second)) {
908             statusMsg->status = PROSUMER_RESUME;
909             iter->second->UpdateOperation(statusMsg);
910             return SharingErrorCode::ERR_OK;
911         } else {
912             SHARING_LOGW("cann't find producerId: %{public}u, mediachannelId: %{public}u, agentId: %{public}u.",
913                          channelMsg->prosumerId, GetId(), channelMsg->agentId);
914         }
915     }
916 
917     SHARING_LOGD("media resume producer end, mediachannelId: %{public}u.", GetId());
918     return SharingErrorCode::ERR_GENERAL_ERROR;
919 }
920 
SendAgentEvent(ProsumerStatusMsg::Ptr & msg,EventType eventType)921 void MediaChannel::SendAgentEvent(ProsumerStatusMsg::Ptr &msg, EventType eventType)
922 {
923     SHARING_LOGD("trace.");
924     RETURN_IF_NULL(msg);
925     RETURN_IF_NULL(msg->eventMsg);
926     SHARING_LOGD("send event: %{public}s ,mediachannelId: %{public}u, contextId: %{public}u, agentId: %{public}u.",
927                  std::string(magic_enum::enum_name(eventType)).c_str(), GetId(), srcContextId_, msg->agentId);
928 
929     auto agentMsg = std::make_shared<AgentEventMsg>();
930     agentMsg->toMgr = ModuleType::MODULE_CONTEXT;
931     agentMsg->fromMgr = ModuleType::MODULE_MEDIACHANNEL;
932     agentMsg->srcId = GetId();
933     agentMsg->dstId = srcContextId_;
934     agentMsg->type = eventType;
935     agentMsg->requestId = msg->eventMsg->requestId;
936     agentMsg->agentId = msg->agentId;
937     agentMsg->prosumerId = msg->prosumerId;
938     agentMsg->errorCode = msg->errorCode;
939     agentMsg->surfaceId = msg->surfaceId;
940 
941     SharingEvent agentEvent;
942     agentEvent.eventMsg = std::move(agentMsg);
943     SendEvent(agentEvent);
944 }
945 
InitPlayController()946 SharingErrorCode MediaChannel::InitPlayController()
947 {
948     SHARING_LOGD("trace.");
949     if (playController_ != nullptr) {
950         playController_->SetMediaChannel(shared_from_this());
951         AudioTrack audioTrack;
952         if (!(consumer_->IsCapture())) {
953             audioTrack = consumer_->GetAudioTrack();
954         }
955         VideoTrack videoTrack = consumer_->GetVideoTrack();
956         if (!playController_->Init(audioTrack, videoTrack)) {
957             SHARING_LOGE("player controller Init error.");
958             playController_ = nullptr;
959             return SharingErrorCode::ERR_DECODE_FORMAT;
960         }
961     }
962 
963     SHARING_LOGD("create playcontroller end, mediachannelId: %{public}u.", GetId());
964     return SharingErrorCode::ERR_OK;
965 }
966 
967 } // namespace Sharing
968 } // namespace OHOS