| @@ -2,7 +2,8 @@ | |||||
| #include <stdlib.h> | #include <stdlib.h> | ||||
| #include <assert.h> | #include <assert.h> | ||||
| #include <math.h> | #include <math.h> | ||||
| #include <set> | |||||
| #include <vector> | |||||
| #include <algorithm> | |||||
| #include <chrono> | #include <chrono> | ||||
| #include <thread> | #include <thread> | ||||
| #include <xmmintrin.h> | #include <xmmintrin.h> | ||||
| @@ -22,9 +23,9 @@ static std::mutex mutex; | |||||
| static std::thread thread; | static std::thread thread; | ||||
| static VIPMutex vipMutex; | static VIPMutex vipMutex; | ||||
| static std::set<Module*> modules; | |||||
| static std::vector<Module*> modules; | |||||
| // Merely used for keeping track of which module inputs point to which module outputs, to prevent pointer mistakes and make the rack API more rigorous | // Merely used for keeping track of which module inputs point to which module outputs, to prevent pointer mistakes and make the rack API more rigorous | ||||
| static std::set<Wire*> wires; | |||||
| static std::vector<Wire*> wires; | |||||
| // Parameter interpolation | // Parameter interpolation | ||||
| static Module *smoothModule = NULL; | static Module *smoothModule = NULL; | ||||
| @@ -58,21 +59,10 @@ static void engineStep() { | |||||
| smoothModule->params[smoothParamId] = value; | smoothModule->params[smoothParamId] = value; | ||||
| } | } | ||||
| } | } | ||||
| // Step all modules | |||||
| // std::chrono::time_point<std::chrono::high_resolution_clock> start, end; | |||||
| for (Module *module : modules) { | |||||
| // Start clock for CPU usage | |||||
| // start = std::chrono::high_resolution_clock::now(); | |||||
| // Step module by one frame | |||||
| // Step modules | |||||
| for (size_t i = 0; i < modules.size(); i++) { | |||||
| Module *module = modules[i]; | |||||
| module->step(); | module->step(); | ||||
| // Stop clock and smooth step time value | |||||
| // end = std::chrono::high_resolution_clock::now(); | |||||
| // std::chrono::duration<float> diff = end - start; | |||||
| // float elapsed = diff.count() * gSampleRate; | |||||
| // const float lambda = 1.0; | |||||
| // module->cpuTime += (elapsed - module->cpuTime) * lambda / gSampleRate; | |||||
| } | } | ||||
| // Step cables by moving their output values to inputs | // Step cables by moving their output values to inputs | ||||
| for (Wire *wire : wires) { | for (Wire *wire : wires) { | ||||
| @@ -134,8 +124,9 @@ void engineAddModule(Module *module) { | |||||
| VIPLock vipLock(vipMutex); | VIPLock vipLock(vipMutex); | ||||
| std::lock_guard<std::mutex> lock(mutex); | std::lock_guard<std::mutex> lock(mutex); | ||||
| // Check that the module is not already added | // Check that the module is not already added | ||||
| assert(modules.find(module) == modules.end()); | |||||
| modules.insert(module); | |||||
| auto it = std::find(modules.begin(), modules.end(), module); | |||||
| assert(it == modules.end()); | |||||
| modules.push_back(module); | |||||
| } | } | ||||
| void engineRemoveModule(Module *module) { | void engineRemoveModule(Module *module) { | ||||
| @@ -151,10 +142,9 @@ void engineRemoveModule(Module *module) { | |||||
| assert(wire->outputModule != module); | assert(wire->outputModule != module); | ||||
| assert(wire->inputModule != module); | assert(wire->inputModule != module); | ||||
| } | } | ||||
| auto it = modules.find(module); | |||||
| if (it != modules.end()) { | |||||
| modules.erase(it); | |||||
| } | |||||
| auto it = std::find(modules.begin(), modules.end(), module); | |||||
| assert(it != modules.end()); | |||||
| modules.erase(it); | |||||
| } | } | ||||
| void engineAddWire(Wire *wire) { | void engineAddWire(Wire *wire) { | ||||
| @@ -162,7 +152,8 @@ void engineAddWire(Wire *wire) { | |||||
| VIPLock vipLock(vipMutex); | VIPLock vipLock(vipMutex); | ||||
| std::lock_guard<std::mutex> lock(mutex); | std::lock_guard<std::mutex> lock(mutex); | ||||
| // Check that the wire is not already added | // Check that the wire is not already added | ||||
| assert(wires.find(wire) == wires.end()); | |||||
| auto it = std::find(wires.begin(), wires.end(), wire); | |||||
| assert(it == wires.end()); | |||||
| assert(wire->outputModule); | assert(wire->outputModule); | ||||
| assert(wire->inputModule); | assert(wire->inputModule); | ||||
| // Check that the inputs/outputs are not already used by another cable | // Check that the inputs/outputs are not already used by another cable | ||||
| @@ -172,7 +163,7 @@ void engineAddWire(Wire *wire) { | |||||
| assert(!(wire2->inputModule == wire->inputModule && wire2->inputId == wire->inputId)); | assert(!(wire2->inputModule == wire->inputModule && wire2->inputId == wire->inputId)); | ||||
| } | } | ||||
| // Add the wire | // Add the wire | ||||
| wires.insert(wire); | |||||
| wires.push_back(wire); | |||||
| // Connect the wire to inputModule | // Connect the wire to inputModule | ||||
| wire->inputModule->inputs[wire->inputId] = &wire->inputValue; | wire->inputModule->inputs[wire->inputId] = &wire->inputValue; | ||||
| wire->outputModule->outputs[wire->outputId] = &wire->outputValue; | wire->outputModule->outputs[wire->outputId] = &wire->outputValue; | ||||
| @@ -187,7 +178,7 @@ void engineRemoveWire(Wire *wire) { | |||||
| wire->outputModule->outputs[wire->outputId] = NULL; | wire->outputModule->outputs[wire->outputId] = NULL; | ||||
| // Remove the wire | // Remove the wire | ||||
| auto it = wires.find(wire); | |||||
| auto it = std::find(wires.begin(), wires.end(), wire); | |||||
| assert(it != wires.end()); | assert(it != wires.end()); | ||||
| wires.erase(it); | wires.erase(it); | ||||
| } | } | ||||