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