#pragma once #include #include #include #include #include namespace rack { namespace engine { struct Engine { struct Internal; Internal* internal; Engine(); ~Engine(); /** Starts engine thread. */ void start(); /** Stops engine thread. */ void stop(); void setPaused(bool paused); bool isPaused(); float getSampleRate(); /** Returns the inverse of the current sample rate. */ float getSampleTime(); /** Causes worker threads to block on a mutex instead of spinlock. Call this in your Module::step() method to hint that the operation will take more than ~0.1 ms. */ void yieldWorkers(); uint64_t getFrame(); // Modules /** Adds a module to the rack engine. The module ID must not be taken by another module. If the module ID is -1, an ID is automatically assigned. Does not transfer pointer ownership. */ void addModule(Module* module); void removeModule(Module* module); Module* getModule(int moduleId); void resetModule(Module* module); void randomizeModule(Module* module); void bypassModule(Module* module, bool bypass); // Cables /** Adds a cable to the rack engine. The cable ID must not be taken by another cable. If the cable ID is -1, an ID is automatically assigned. Does not transfer pointer ownership. */ void addCable(Cable* cable); void removeCable(Cable* cable); // Params void setParam(Module* module, int paramId, float value); float getParam(Module* module, int paramId); void setSmoothParam(Module* module, int paramId, float value); float getSmoothParam(Module* module, int paramId); // ParamHandles void addParamHandle(ParamHandle* paramHandle); void removeParamHandle(ParamHandle* paramHandle); /** Returns the unique ParamHandle for the given paramId */ ParamHandle* getParamHandle(int moduleId, int paramId); /** Use getParamHandle(int, int) instead. */ DEPRECATED ParamHandle* getParamHandle(Module* module, int paramId); /** Sets the ParamHandle IDs and module pointer. If `overwrite` is true and another ParamHandle points to the same param, unsets that one and replaces it with the given handle. */ void updateParamHandle(ParamHandle* paramHandle, int moduleId, int paramId, bool overwrite = true); }; } // namespace engine } // namespace rack