25 #include "DspCircuit.h"
26 #include "DspCircuitThread.h"
31 DspCircuit::DspCircuit(
unsigned short threadCount )
32 : _currentThreadIndex( 0 ),
34 _outToOutWires( false )
36 SetThreadCount( threadCount );
41 DspCircuit::~DspCircuit()
44 RemoveAllComponents();
50 void DspCircuit::PauseAutoTick()
53 DspComponent::PauseAutoTick();
56 while( _currentThreadIndex != 0 )
63 for(
unsigned short i = 0; i < _circuitThreads.size(); i++ )
65 _circuitThreads[i].Sync();
71 void DspCircuit::SetThreadCount(
unsigned short threadCount )
73 if( threadCount != _circuitThreads.size() )
78 for(
unsigned short i = 0; i < _circuitThreads.size(); i++ )
80 _circuitThreads[i].Stop();
84 _circuitThreads.resize( threadCount );
87 for(
unsigned short i = 0; i < _circuitThreads.size(); i++ )
89 _circuitThreads[i].Initialise( &_components, i );
90 _circuitThreads[i].Start();
94 for(
unsigned short i = 0; i < _components.size(); i++ )
96 _components[i]->SetBufferCount( threadCount );
105 unsigned short DspCircuit::GetThreadCount()
const
107 return _circuitThreads.size();
112 bool DspCircuit::AddComponent(
DspComponent* component, std::string componentName )
114 if( component !=
this )
117 if( component->GetComponentName() !=
"" && componentName ==
"" )
119 componentName = component->GetComponentName();
122 unsigned short componentIndex;
124 if( _FindComponent( component, componentIndex ) )
128 if( _FindComponent( componentName, componentIndex ) )
134 component->SetParentCircuit(
this );
135 component->SetBufferCount( _circuitThreads.size() );
136 component->SetComponentName( componentName );
139 _components.push_back( component );
150 bool DspCircuit::AddComponent(
DspComponent& component, std::string componentName )
152 return AddComponent( &component, componentName );
157 void DspCircuit::RemoveComponent(
DspComponent* component )
159 unsigned short componentIndex;
161 if( _FindComponent( component, componentIndex ) )
164 _RemoveComponent( componentIndex );
171 void DspCircuit::RemoveComponent(
DspComponent& component )
173 RemoveComponent( &component );
178 void DspCircuit::RemoveComponent( std::string componentName )
180 unsigned short componentIndex;
182 if( _FindComponent( componentName, componentIndex ) )
185 _RemoveComponent( componentIndex );
192 void DspCircuit::RemoveAllComponents()
194 for(
unsigned short i = 0; i < _components.size(); i++ )
197 _RemoveComponent( i-- );
204 unsigned short DspCircuit::GetComponentCount()
const
206 return _components.size();
211 void DspCircuit::DisconnectComponent( std::string component )
213 unsigned short componentIndex;
215 if( !_FindComponent( component, componentIndex ) )
221 _DisconnectComponent( componentIndex );
227 bool DspCircuit::AddInput( std::string inputName )
230 bool result = AddInput_( inputName );
238 bool DspCircuit::AddOutput( std::string outputName )
241 bool result = AddOutput_( outputName );
249 void DspCircuit::ClearInputs()
256 void DspCircuit::ClearOutputs()
270 if( _circuitThreads.size() == 0 )
273 for(
unsigned short i = 0; i < _inToInWires.GetWireCount(); i++ )
275 wire = _inToInWires.GetWire( i );
276 signal = inputs.GetSignal( wire->fromSignalIndex );
277 wire->linkedComponent->SetInputSignal( wire->toSignalIndex, signal );
281 for(
unsigned short i = 0; i < _components.size(); i++ )
283 _components[i]->Tick();
287 for(
unsigned short i = 0; i < _components.size(); i++ )
289 _components[i]->Reset();
293 for(
unsigned short i = 0; i < _outToOutWires.GetWireCount(); i++ )
295 wire = _outToOutWires.GetWire( i );
296 signal = wire->linkedComponent->GetOutputSignal( wire->fromSignalIndex );
297 outputs.SetSignal( wire->toSignalIndex, signal );
304 _circuitThreads[_currentThreadIndex].Sync();
307 for(
unsigned short i = 0; i < _outToOutWires.GetWireCount(); i++ )
309 wire = _outToOutWires.GetWire( i );
310 signal = wire->linkedComponent->GetOutputSignal( wire->fromSignalIndex, _currentThreadIndex );
311 outputs.SetSignal( wire->toSignalIndex, signal );
315 for(
unsigned short i = 0; i < _inToInWires.GetWireCount(); i++ )
317 wire = _inToInWires.GetWire( i );
318 signal = inputs.GetSignal( wire->fromSignalIndex );
319 wire->linkedComponent->SetInputSignal( wire->toSignalIndex, _currentThreadIndex, signal );
322 _circuitThreads[_currentThreadIndex].Resume();
324 if( ++_currentThreadIndex >= _circuitThreads.size() )
326 _currentThreadIndex = 0;
333 bool DspCircuit::_FindComponent(
DspComponent* component,
unsigned short& returnIndex )
const
335 for(
unsigned short i = 0; i < _components.size(); i++ )
337 if( _components[i] == component )
349 bool DspCircuit::_FindComponent(
DspComponent& component,
unsigned short& returnIndex )
const
351 return _FindComponent( &component, returnIndex );
356 bool DspCircuit::_FindComponent( std::string componentName,
unsigned short& returnIndex )
const
358 for(
unsigned short i = 0; i < _components.size(); i++ )
360 if( _components[i]->GetComponentName() !=
"" && _components[i]->GetComponentName() == componentName )
372 bool DspCircuit::_FindComponent(
unsigned short componentIndex,
unsigned short& returnIndex )
const
374 if( componentIndex < _components.size() )
376 returnIndex = componentIndex;
385 void DspCircuit::_DisconnectComponent(
unsigned short componentIndex )
388 _components[ componentIndex ]->DisconnectInputs();
392 for(
unsigned short i = 0; i < _inToInWires.GetWireCount(); i++ )
394 wire = _inToInWires.GetWire( i );
395 if( wire->linkedComponent == _components[ componentIndex ] )
397 _inToInWires.RemoveWire( i );
402 for(
unsigned short i = 0; i < _outToOutWires.GetWireCount(); i++ )
404 wire = _outToOutWires.GetWire( i );
405 if( wire->linkedComponent == _components[ componentIndex ] )
407 _outToOutWires.RemoveWire( i );
414 void DspCircuit::_RemoveComponent(
unsigned short componentIndex )
416 _DisconnectComponent( componentIndex );
419 if( _components[componentIndex]->GetParentCircuit() != NULL )
421 _components[componentIndex]->SetParentCircuit( NULL );
424 else if( _components.size() != 0 )
426 for(
unsigned short i = componentIndex; i < _components.size() - 1; i++ )
428 _components[i] = _components[i + 1];
431 _components.pop_back();