/* ZynAddSubFX - a software synthesizer WatchPoint.h - Synthesis State Watcher Copyright (C) 2015-2015 Mark McCurry Author: Mark McCurry This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. */ #pragma once struct WatchManager; namespace rtosc {class ThreadLink;} struct WatchPoint { bool active; int samples_left; WatchManager *reference; char identity[128]; WatchPoint(WatchManager *ref, const char *prefix, const char *id); bool is_active(void); }; #define MAX_WATCH 16 #define MAX_WATCH_PATH 128 #define MAX_SAMPLE 128 struct WatchManager { typedef rtosc::ThreadLink thrlnk; thrlnk *write_back; bool new_active; char active_list[MAX_WATCH][MAX_WATCH_PATH]; float data_list[MAX_SAMPLE][MAX_WATCH]; int sample_list[MAX_WATCH]; bool deactivate[MAX_WATCH]; //External API WatchManager(thrlnk *link=0); void add_watch(const char *); void del_watch(const char *); void tick(void); //Watch Point Query API bool active(const char *) const; int samples(const char *) const; //Watch Point Response API void satisfy(const char *, float); void satisfy(const char *, float*, int); }; struct FloatWatchPoint:public WatchPoint { FloatWatchPoint(WatchManager *ref, const char *prefix, const char *id); inline void operator()(float f) { if(is_active() && reference) { reference->satisfy(identity, f); active = false; } } }; //basically the same as the float watch point, only it consumes tuples struct VecWatchPoint : public WatchPoint { VecWatchPoint(WatchManager *ref, const char *prefix, const char *id); inline void operator()(float *f, int n) { if(is_active() && reference) { reference->satisfy(identity, f, n); active = false; } } };