diff options
Diffstat (limited to 'src/process.h')
-rw-r--r-- | src/process.h | 63 |
1 files changed, 59 insertions, 4 deletions
diff --git a/src/process.h b/src/process.h index 3dba625..c5d049b 100644 --- a/src/process.h +++ b/src/process.h @@ -5,26 +5,81 @@ #define JALV_PROCESS_H #include "attributes.h" +#include "lv2_evbuf.h" #include "types.h" +#include "worker.h" + +#include <lilv/lilv.h> +#include <lv2/atom/atom.h> +#include <lv2/atom/forge.h> +#include <zix/ring.h> +#include <zix/sem.h> #include <stdbool.h> +#include <stddef.h> #include <stdint.h> // Code and data used in the realtime process thread JALV_BEGIN_DECLS +/// Port state used in the process thread +typedef struct { + PortType type; ///< Data type + PortFlow flow; ///< Data flow direction + void* sys_port; ///< For audio/MIDI ports, otherwise NULL + char* symbol; ///< Port symbol (stable/unique C-like identifier) + char* label; ///< Human-readable label + LV2_Evbuf* evbuf; ///< Sequence port event buffer + uint32_t buf_size; ///< Custom buffer size, or 0 + bool reports_latency; ///< Whether control port reports latency + bool is_primary; ///< True for main control/reponse channel + bool supports_midi; ///< Whether event port supports MIDI +} JalvProcessPort; + +/** + State accessed in the process thread. + + Everything accessed by the process thread is stored here, to keep it + somewhat insulated from the UI and to make references to it stand out in the + code. +*/ +typedef struct { + LilvInstance* instance; ///< Plugin instance + ZixRing* ui_to_plugin; ///< Messages from UI to plugin/process + ZixRing* plugin_to_ui; ///< Messages from plugin/process to UI + JalvWorker* worker; ///< Worker thread implementation + JalvWorker* state_worker; ///< Synchronous worker for state restore + JalvProcessPort* ports; ///< Port array of size num_ports + LV2_Atom_Forge forge; ///< Atom forge + LV2_Atom_Object get_msg; ///< General patch:Get message + float* controls_buf; ///< Control port buffers array + size_t process_msg_size; ///< Maximum size of a single message + void* process_msg; ///< Buffer for receiving messages + ZixSem paused; ///< Paused signal from process thread + JalvRunState run_state; ///< Current run state + uint32_t control_in; ///< Index of control input port + uint32_t num_ports; ///< Total number of ports on the plugin + uint32_t pending_frames; ///< Frames since last UI update sent + uint32_t update_frames; ///< UI update period in frames, or zero + uint32_t plugin_latency; ///< Latency reported by plugin (if any) + uint32_t position; ///< Transport position in frames + float bpm; ///< Transport tempo in beats per minute + bool rolling; ///< Transport speed (0=stop, 1=play) + bool has_ui; ///< True iff a control UI is present +} JalvProcess; + /** Run the plugin for a block of frames. Applies any pending messages from the UI, runs the plugin instance, and processes any worker replies. - @param jalv Application state. + @param proc Process thread state. @param nframes Number of frames to process. @return Whether output value updates should be sent to the UI now. */ bool -jalv_run(Jalv* jalv, uint32_t nframes); +jalv_run(JalvProcess* proc, uint32_t nframes); /** Bypass the plugin for a block of frames. @@ -32,12 +87,12 @@ jalv_run(Jalv* jalv, uint32_t nframes); This is like jalv_run(), but doesn't actually run the plugin and only does the minimum necessary internal work for the cycle. - @param jalv Application state. + @param proc Process thread state. @param nframes Number of frames to bypass. @return Zero. */ int -jalv_bypass(Jalv* jalv, uint32_t nframes); +jalv_bypass(JalvProcess* proc, uint32_t nframes); JALV_END_DECLS |