/** * @RDE_HEADER@ * AvsSessionContext * $Id$ * $HeadURL$ * $Author$ * Created by Christian Fröbel, SLSE, 2017-08-03 */ #include "avs_session_context.h" #include "avm_exercise_context.h" #include "operator_settings_observer.h" #include "rt_profile_observer.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace AudioVideoManagement { /// AvsSessionContext struct AvsSessionContext::Composite { Composite(int exerciseId_, int operatorId, const QString &langCode, AvaGuiStyle guiStyle, const AvmExerciseContextHandle &exerciseContextHandle) : exerciseId(exerciseId_) , operator_(exerciseContextHandle.opmDtc()->user(operatorId)) , audioPrioObserver(exerciseId_, operatorId, exerciseContextHandle.opmDtc(), exerciseContextHandle.exmDtc()) , avaComm(NGL::Connections::hostName(NGL::Connections::eConnection::AVS_WORKSTATION), NGL::Connections::port(NGL::Connections::eConnection::AVS_WORKSTATION)) , avaControl(&avaComm, exerciseContextHandle.streamNameMapping(), PluginSettings::instance()->avaTimeout()) , avaSession(&avaControl, exerciseId, QString::fromStdString(operator_.name()), langCode, operator_.audioChannelPriority(), audioPrioObserver.timezone(), guiStyle, PluginSettings::instance()->avaKeepAliveEnabled()) , avaState(&avaSession) , streamNameMappingToAva(&avaSession, exerciseContextHandle.streamNameMapping()) , avsMenus(&avaSession, exerciseContextHandle.dtc().get(), exerciseContextHandle.ismDtc(), avaState.rtState()) , rtProfileObserver(exerciseContextHandle.dtc().get(), &avaSession, avaState.rtState(), exerciseId_, operatorId) , vdComm(NGL::Connections::hostName(NGL::Connections::eConnection::AVS_WORKSTATION_VD), NGL::Connections::port(NGL::Connections::eConnection::AVS_WORKSTATION_VD)) , vdControl(&vdComm, PluginSettings::instance()->vdTimeout()) , vdSession(&vdControl, exerciseId, PluginSettings::instance()->vdKeepAliveEnabled()) , liveVideoApp(AvsDialog::VIDEO_1, &avaControl) , videoPlaybackApp(AvsDialog::VIDEO_PLAYBACK, &avaControl, PlaybackApp::AppType::Normal) , audioPlaybackApp(AvsDialog::AUDIO_PLAYBACK, &avaControl, PlaybackApp::AppType::AlwaysHidden) , videoPresentationApp(AvsDialog::VIDEO_PRESENTATION, &avaControl, PlaybackApp::AppType::AutoHide) , audioPresentationApp(AvsDialog::AUDIO_PRESENTATION, &avaControl, PlaybackApp::AppType::AlwaysHidden) { QObject::connect(&audioPrioObserver, &OperatorSettingsObserver::audioPrioChanged, &avaSession, &AvaSession::onAudioPrioChanged); QObject::connect(&audioPrioObserver, &OperatorSettingsObserver::timezoneChanged, &avaSession, &AvaSession::onTimezoneChanged); avaComm.start(); vdComm.start(); } int exerciseId; OperatorManagement::User operator_; OperatorSettingsObserver audioPrioObserver; AvaComm avaComm; AvaControl avaControl; AvaSession avaSession; AvaState avaState; StreamNameMappingToAva streamNameMappingToAva; AvsMenus avsMenus; RtProfileObserver rtProfileObserver; VdComm vdComm; VdControl vdControl; VdSession vdSession; AvsApp liveVideoApp; PlaybackApp videoPlaybackApp; PlaybackApp audioPlaybackApp; PlaybackApp videoPresentationApp; PlaybackApp audioPresentationApp; }; AvsSessionContext::AvsSessionContext() = default; AvsSessionContext::~AvsSessionContext() { //Q_ASSERT(m_refCount == 0); } bool AvsSessionContext::canAcquire(int exerciseId) const { Q_ASSERT(exerciseId > 0); if (!m_composite) return true; return exerciseId == m_composite->exerciseId; } AvsSessionContext::Composite *AvsSessionContext::acquire(int exerciseId, int operatorId, const QString &langCode, AvaGuiStyle guiStyle, const AvmExerciseContextHandle &exerciseContextHandle) { Q_ASSERT(exerciseId > 0); if (m_refCount == 0) m_composite.reset(new Composite(exerciseId, operatorId, langCode, guiStyle, exerciseContextHandle)); else Q_ASSERT(exerciseId == m_composite->exerciseId); ++m_refCount; return m_composite.get(); } void AvsSessionContext::release(Composite *composite) { Q_ASSERT(composite); Q_ASSERT(composite == m_composite.get()); --m_refCount; if (m_refCount == 0) m_composite.reset(); } /// AvsSessionContextHandle AvsSessionContextHandle::AvsSessionContextHandle(/*LtsSession::LtsSession *session, */AvsSessionContext *context, int exerciseId, int operatorId, const QString &langCode, AvaGuiStyle guiStyle, const AvmExerciseContextHandle &exerciseContextHandle) : m_composite(context->acquire(exerciseId, operatorId, langCode, guiStyle, exerciseContextHandle), [context](AvsSessionContext::Composite *composite) { context->release(composite); }) { Q_ASSERT(context); Q_ASSERT(m_composite); } AvaSession *AvsSessionContextHandle::avaSession() const { Q_ASSERT(m_composite); return &m_composite->avaSession; } AvaState *AvsSessionContextHandle::avaState() const { Q_ASSERT(m_composite); return &m_composite->avaState; } AvsMenus *AvsSessionContextHandle::menus() const { Q_ASSERT(m_composite); return &m_composite->avsMenus; } VdSession *AvsSessionContextHandle::vdSession() const { Q_ASSERT(m_composite); return &m_composite->vdSession; } AvsApp *AvsSessionContextHandle::liveVideoApp() const { Q_ASSERT(m_composite); return &m_composite->liveVideoApp; } PlaybackApp *AvsSessionContextHandle::videoPlaybackApp() const { Q_ASSERT(m_composite); return &m_composite->videoPlaybackApp; } PlaybackApp *AvsSessionContextHandle::audioPlaybackApp() const { Q_ASSERT(m_composite); return &m_composite->audioPlaybackApp; } PlaybackApp *AvsSessionContextHandle::videoPresentationApp() const { Q_ASSERT(m_composite); return &m_composite->videoPresentationApp; } PlaybackApp *AvsSessionContextHandle::audioPresentationApp() const { Q_ASSERT(m_composite); return &m_composite->audioPresentationApp; } } // namespace AudioVideoManagement