00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031 #include "syn/Module/SplitterModule.h"
00032
00033 namespace syn
00034 {
00035 SplitterModule::SplitterModule() : Module(), mPutCount( 0 ), mIsOpen( false )
00036 {
00037 mTerminal = this->createInput( "input" );
00038 this->createOutput( "output1" );
00039 this->createOutput( "output2" );
00040 }
00041
00042 bool SplitterModule::open()
00043 {
00044 mIsOpen = true;
00045 return mIsOpen;
00046 }
00047
00048 void SplitterModule::close()
00049 {
00050 mIsOpen = false;
00051 }
00052
00053 bool SplitterModule::isOutputHigh()
00054 {
00055 std::map<std::string, TerminalPtr>::iterator output_itr;
00056 for (output_itr = this->outputs().begin(); output_itr != this->outputs().end(); ++output_itr)
00057 {
00058 TerminalPtr output_term = (*output_itr).second;
00059 if (output_term->high())
00060 return true;
00061 }
00062 return false;
00063 }
00064
00065 void SplitterModule::setDoneState( bool state )
00066 {
00067 std::map<std::string, TerminalPtr>::iterator output_itr;
00068 for (output_itr = this->outputs().begin(); output_itr != this->outputs().end(); ++output_itr)
00069 {
00070 TerminalPtr output_term = (*output_itr).second;
00071 output_term->setDone( state );
00072 }
00073 }
00074
00075 void SplitterModule::update()
00076 {
00077
00078
00079
00080
00081 if (mTerminal->empty() || isOutputHigh())
00082 {
00083 this->setDoneState( mTerminal->done() );
00084 return;
00085 }
00086
00087 SampleBuffer1f* read_buf = mTerminal->front();
00088 mPutCount = read_buf->size();
00089
00090
00091 std::map<std::string, TerminalPtr>::iterator output_itr;
00092 for (output_itr = this->outputs().begin(); output_itr != this->outputs().end(); ++output_itr)
00093 {
00094 TerminalPtr output_term = (*output_itr).second;
00095 SampleBuffer1f* write_buf = NULL;
00096 SampleBufferRepos::instance()->take( write_buf );
00097
00098
00099 (*write_buf) = (*read_buf);
00100 output_term->push( write_buf );
00101 }
00102
00103 SampleBufferRepos::instance()->putback( read_buf );
00104 mTerminal->pop();
00105
00106
00107 this->setDoneState( mTerminal->done() );
00108 }
00109
00110 }