/* OUTPUT-SLOT-CONNECTION.hpp - implementation API for concrete output slots Copyright (C) Lumiera.org 2011, Hermann Vosseler 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. */ /** @file output-slot-connection.hpp ** Interface for concrete output implementations to talk to the OutputSlot frontend. ** The OutputSlot concept helps to decouple the render engine implementation from the details ** of handling external output connections. For this to work, a concrete implementation of such ** an external output needs to integrate with the generic OutputSlot frontend, as used by the ** engine. This generic frontend uses a PImpl, pointing to a ConnectionState object, which embodies ** the actual implementation. Moreover, this actual implementation is free to use specifically crafted ** OutputSlot::Connection elements to handle the ongoing output for individual channels. The latter ** thus becomes the central implementation side API for providing actual output capabilities. ** ** @see OutputSlotProtocol_test ** @see diagnostic-output-slot.hpp ////TODO */ #ifndef PROC_PLAY_OUTPUT_SLOT_CONNECTION_H #define PROC_PLAY_OUTPUT_SLOT_CONNECTION_H #include "lib/error.hpp" #include "proc/play/output-slot.hpp" #include "lib/handle.hpp" //#include "lib/time/timevalue.hpp" //#include "proc/engine/buffer-provider.hpp" //#include "proc/play/timings.hpp" #include "lib/iter-source.hpp" #include "lib/iter-adapter-stl.hpp" //#include "lib/sync.hpp" #include #include //#include //#include //#include namespace proc { namespace play { //using ::engine::BuffHandle; //using ::engine::BufferProvider; //using lib::time::Time; //using std::string; using lib::transform; using lib::iter_stl::eachElm; //using std::vector; //using std::tr1::shared_ptr; using boost::scoped_ptr; /** established output channel */ class OutputSlot::Connection { public: virtual ~Connection(); virtual void lock (FrameID) =0; virtual void transfer (FrameID) =0; virtual void pushout (FrameID) =0; }; class OutputSlot::ConnectionState : public OutputSlot::Allocation , boost::noncopyable { public: virtual ~ConnectionState() { } }; template class ConnectionStateManager : public OutputSlot::ConnectionState , public vector { typedef OutputSlot::OpenedSinks OpenedSinks; /* == Allocation Interface == */ OpenedSinks getOpenedSinks() { REQUIRE (this->isActive()); return transform (eachElm(*this), connectOutputSink); } bool isActive() { return 0 < vector::size(); } public: ConnectionStateManager() { UNIMPLEMENTED ("immediately build up the necessary number of connections"); } virtual ~ConnectionStateManager() { UNIMPLEMENTED ("shut down all connections"); } virtual CON buildConnection() =0; private: // Implementation details DataSink connectOutputSink (CON& connection) { DataSink newSink; newSink.activate(&connection, shutdownConnection); return newSink; } void shutdownConnection (CON* toClose) { UNIMPLEMENTED ("how to mark a connection as closed"); } }; }} // namespace proc::play #endif