// Copyright Epic Games, Inc. All Rights Reserved. #include "MediaAssetMultiUserManager.h" #if WITH_EDITOR #include "IMediaAssetsModule.h" #include "IConcertSession.h" #include "IConcertSyncClientModule.h" #include "IConcertClientModule.h" #include "IConcertSyncClient.h" FMediaAssetMultiUserManager::FMediaAssetMultiUserManager() { if (TSharedPtr ConcertSyncClient = IConcertSyncClientModule::Get().GetClient(TEXT("MultiUser"))) { IConcertClientRef ConcertClient = ConcertSyncClient->GetConcertClient(); ConcertClient->OnSessionStartup().AddRaw(this, &FMediaAssetMultiUserManager::Register); ConcertClient->OnSessionShutdown().AddRaw(this, &FMediaAssetMultiUserManager::Unregister); if (TSharedPtr ConcertClientSession = ConcertClient->GetCurrentSession()) { Register(ConcertClientSession.ToSharedRef()); } } IMediaAssetsModule& MediaAssetsModule = FModuleManager::Get().LoadModuleChecked("MediaAssets"); OnMediaPlateStateChangedHandle = MediaAssetsModule.RegisterOnMediaStateChangedEvent(IMediaAssetsModule::FMediaStateChangedDelegate::FDelegate::CreateRaw(this, &FMediaAssetMultiUserManager::OnMediaPlateStateChanged)); } FMediaAssetMultiUserManager::~FMediaAssetMultiUserManager() { IMediaAssetsModule& MediaAssetsModule = FModuleManager::Get().GetModuleChecked("MediaAssets"); MediaAssetsModule.UnregisterOnMediaStateChangedEvent(OnMediaPlateStateChangedHandle); } void FMediaAssetMultiUserManager::Register(TSharedRef InSession) { ConcertSession = InSession; InSession->RegisterCustomEventHandler(this, &FMediaAssetMultiUserManager::OnStateChangedEvent); } void FMediaAssetMultiUserManager::Unregister(TSharedRef InSession) { if (TSharedPtr ConcertSessionPinned = ConcertSession.Pin()) { ConcertSessionPinned->UnregisterCustomEventHandler(this); } ConcertSession.Reset(); } void FMediaAssetMultiUserManager::OnStateChangedEvent(const FConcertSessionContext& InConcertSessionContext, const FConcertMediaStateChangedEvent& InEvent) { IMediaAssetsModule& MediaAssetsModule = FModuleManager::Get().LoadModuleChecked("MediaAssets"); MediaAssetsModule.BroadcastOnMediaStateChangedEvent(InEvent.ActorsPathNames, InEvent.State, true /* Broadcast came from a remote endpoint. */); } void FMediaAssetMultiUserManager::OnMediaPlateStateChanged(const TArray& InActorsPathNames, uint8 InEnumState, bool bRemoteBroadcast) { // We don't need to broadcast to other endpoints as this is already handled. if (bRemoteBroadcast) { return; } if (TSharedPtr ConcertSessionPinned = ConcertSession.Pin()) { TArray ClientIds = ConcertSessionPinned->GetSessionClientEndpointIds(); FConcertMediaStateChangedEvent EventData; EventData.ActorsPathNames = InActorsPathNames; EventData.State = InEnumState; ConcertSessionPinned->SendCustomEvent(EventData, ClientIds, EConcertMessageFlags::ReliableOrdered | EConcertMessageFlags::UniqueId); } } #endif