2011-05-23 04:43:56 +02:00
/*
2011-12-10 03:18:48 +01:00
PlayProcess - state frame for an ongoing play / render process
2011-05-23 04:43:56 +02:00
Copyright ( C ) Lumiera . org
2011-05-23 05:46:40 +02:00
2011 , Hermann Vosseler < Ichthyostega @ web . de >
2011-05-23 04:43:56 +02:00
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 0213 9 , USA .
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2011-05-23 05:46:40 +02:00
# include "proc/play/play-process.hpp"
2011-12-10 03:18:48 +01:00
# include "proc/play/render-configurator.hpp"
2011-06-25 17:44:28 +02:00
# include "lib/itertools.hpp"
2011-05-23 04:43:56 +02:00
2011-05-23 05:46:40 +02:00
//#include <string>
//#include <memory>
2011-06-25 17:44:28 +02:00
# include <tr1/functional>
2011-05-23 05:46:40 +02:00
//#include <boost/scoped_ptr.hpp>
2011-05-23 04:43:56 +02:00
2011-06-25 17:44:28 +02:00
namespace proc {
namespace play {
2011-05-23 04:43:56 +02:00
2011-05-23 05:46:40 +02:00
// using std::string;
// using lumiera::Subsys;
// using std::auto_ptr;
// using boost::scoped_ptr;
// using std::tr1::bind;
2011-06-25 17:44:28 +02:00
namespace { // Implementation details...
using std : : tr1 : : bind ;
using std : : tr1 : : function ;
using std : : tr1 : : placeholders : : _1 ;
2011-06-26 03:59:03 +02:00
using lib : : transform ;
2011-06-25 17:44:28 +02:00
Feed
resolveOutputConnection ( ModelPort port , POutputManager outputResolver )
{
REQUIRE ( outputResolver ) ;
OutputSlot & slot = outputResolver - > getOutputFor ( port ) ;
if ( ! slot . isFree ( ) )
throw error : : State ( " unable to acquire a suitable output slot " /////////////////////TICKET #197 #816
, LUMIERA_ERROR_CANT_PLAY ) ;
2011-12-10 03:18:48 +01:00
2011-12-17 02:20:48 +01:00
RenderConfigurator & configurator ( * ( RenderConfigurator * ) NULL ) ; //////////////////////////////////TODO: how to get the RenderConfigurator (strategy) here???
return Feed ( port , slot , configurator ) ;
2011-06-25 17:44:28 +02:00
}
2011-05-23 04:43:56 +02:00
2011-06-25 17:44:28 +02:00
typedef function < Feed ( ModelPort ) > ConnectFunction ;
2011-05-23 04:43:56 +02:00
2011-06-25 17:44:28 +02:00
/** try to establish an output slot for the given
* global bus or data production exit point .
* @ param outputResolver a facility able to resolve to
* a concrete output slot within the actual context
* @ throw error : : State when resolution fails
*/
ConnectFunction
resolve ( POutputManager outputResolver )
{
return bind ( resolveOutputConnection , _1 , outputResolver ) ;
}
2011-05-23 04:43:56 +02:00
2011-06-25 17:44:28 +02:00
} // (End) hidden service impl details
/**
* Factory : Initialise and configure a new PlayProcess .
* The caller gets to own and manage the returned process entry .
*/
PlayProcess *
PlayProcess : : initiate ( ModelPorts dataGenerators , POutputManager outputDestinations )
{
return new PlayProcess ( transform ( dataGenerators ,
resolve ( outputDestinations ) ) ) ;
}
/** @internal actually create and configure a play process instance */
PlayProcess : : PlayProcess ( Feed : : Connections pipeConnections )
{
if ( isnil ( pipeConnections ) )
throw error : : State ( " creating a PlayProcess without any usable output connections "
, LUMIERA_ERROR_CANT_PLAY ) ;
UNIMPLEMENTED ( " iterate over the connections and allocate/establish each of them, creating and storing Feed objects " ) ;
while ( pipeConnections )
{
}
}
/** */
2011-12-10 03:18:48 +01:00
Feed : : Feed ( ModelPort port , OutputSlot & output , RenderConfigurator & renderStrategy )
: renderStreams_ ( renderStrategy . buildCalculationStreams ( port , output ) )
{ }
2011-06-25 17:44:28 +02:00
2011-05-23 04:43:56 +02:00
2011-05-23 05:46:40 +02:00
} } // namespace proc::play