lumiera_documentation/src/proc/facade.cpp
Ichthyostega 34686713d4 Proc-Layer: Builder is not a subsystem (anymore)
We found out that it's best to run it single threaded
within the session loop thread. This does not mean the Builder
itself is necessarily single threaded, but the Builder's top level
will block any other session operation, and this is a good thing.
For this reason it makes more sense to have the Builder integrated
as a component into the session subsystem.
2017-01-03 21:10:27 +01:00

147 lines
3.9 KiB
C++

/*
Facade - access point for communicating with the Proc-Interface
Copyright (C) Lumiera.org
2008, Hermann Vosseler <Ichthyostega@web.de>
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License as
published by the Free Software Foundation; either version 2 of
the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
* *****************************************************/
#include "proc/facade.hpp"
#include "lib/depend.hpp"
//#include "lib/sync.hpp"
#include "proc/control/proc-dispatcher.hpp"
#include "proc/play/output-director.hpp"
#include <string>
//#include <memory>
namespace proc {
using std::string;
using std::unique_ptr;
using lumiera::Subsys;
using lumiera::Option;
using lib::Sync;
// using lib::RecursiveLock_NoWait;
using proc::control::ProcDispatcher;
class SessionSubsystem
: public Subsys
{
operator string() const { return "Session"; }
/** @remarks there is no need explicitly to start the session core,
* since it will usually be pulled up as prerequisite */
bool
shouldStart (Option&) override
{
return false;
}
bool
start (Option&, Subsys::SigTerm termNotification) override
{
return ProcDispatcher::instance().start (termNotification);
}
void
triggerShutdown() noexcept override
{
ProcDispatcher::instance().requestStop();
}
bool
checkRunningState() noexcept override
{
return ProcDispatcher::instance().isRunning();
}
};
class PlayOutSubsysDescriptor
: public Subsys
{
operator string() const { return "PlayOut"; }
/** determine, if any output system is required to start up explicitly.
* Moreover, extract configuration variations for specific kinds of output
* @return true if any output system is required to start stand-alone.
* otherwise, the player and a default configured output connection
* is pulled up only when required by another subsystem (e.g. GUI)
* @todo actually define cmdline options and parse/decide here!
*/
bool
shouldStart (Option&) override
{
TODO ("extract options about specific output systems to be brought up");
return false;
}
bool
start (Option&, Subsys::SigTerm termination) override
{
this->completedSignal_ = termination;
return play::OutputDirector::instance().connectUp();
}
SigTerm completedSignal_;
void
triggerShutdown() noexcept override
{
play::OutputDirector::instance().triggerDisconnect (completedSignal_);
}
bool
checkRunningState() noexcept override
{
return play::OutputDirector::instance().isOperational();
}
};
namespace {
lib::Depend<SessionSubsystem> theSessionSubsystemLifecycle;
lib::Depend<PlayOutSubsysDescriptor> thePlayOutDescriptor;
}
/** @internal intended for use by main(). */
Subsys&
Facade::getSessionDescriptor()
{
return theSessionSubsystemLifecycle();
}
/** @internal intended for use by main(). */
Subsys&
Facade::getPlayOutDescriptor()
{
return thePlayOutDescriptor();
}
} // namespace proc