diff options
Diffstat (limited to 'rotord/rotor.h')
| -rwxr-xr-x | rotord/rotor.h | 74 |
1 files changed, 46 insertions, 28 deletions
diff --git a/rotord/rotor.h b/rotord/rotor.h index 436de10..11e1170 100755 --- a/rotord/rotor.h +++ b/rotord/rotor.h @@ -222,18 +222,31 @@ namespace Rotor { private: float image_time; }; + class Base_audio_processor: public Signal_node { + public: + virtual int process_frame(uint8_t *data,int samples)=0; + virtual void init(int _channels,int _bits,int _samples,int _rate)=0; + int channels,bits,samples,rate; + }; //actual nodes------------------------------------------------- - class Audio_analysis: public Signal_node { + class Audio_analysis: public Base_audio_processor { public: Audio_analysis(){}; Audio_analysis(map<string,string> &settings) { base_settings(settings); + soname=check(settings,"soname"); + id=check(settings,"id"); }; Audio_analysis* clone(map<string,string> &_settings) { return new Audio_analysis(_settings);}; + void init(int _channels,int _bits,int _samples,int _rate); + int process_frame(uint8_t *data,int samples_in_frame); float get_output(const float &time) { float t=time; return t; } + private: + string soname,id; + vampHost::Analyser analyser; }; class Signal_divide: public Signal_node { //divides incoming signal by a fixed amount @@ -308,52 +321,61 @@ namespace Rotor { }; class Graph{ public: - Graph(){framerate=25.0f;duration=10.0f;}; - Graph(const string& _uid,const string& _desc){ uid=_uid;description=_desc;framerate=25.0f;duration=10.0f;}; + Graph(){framerate=25.0f;duration=10.0f;loaded = false;}; + Graph(const string& _uid,const string& _desc){init(_uid,_desc);}; + void init(const string& _uid,const string& _desc){ uid=_uid;description=_desc;framerate=25.0f;duration=10.0f;}; string uid; //every version of a graph has a UUID, no particular need to actually read its data(?) //?? is it faster than using strings?? string description; std::unordered_map<string,Node*> nodes; - Node* find(const string &type){ + vector<Node*> find_nodes(const string &type){ + vector<Node*> found; + for (std::unordered_map<string,Node*>::iterator it=nodes.begin();it!=nodes.end();++it) { + if (it->second->type==type) found.push_back(it->second); + } + return found; + }; + Node* find_node(const string &type){ for (std::unordered_map<string,Node*>::iterator it=nodes.begin();it!=nodes.end();++it) { if (it->second->type==type) return it->second; } - return NULL; + return nullptr; //can be tested against }; bool signal_render(const float _fr,string &signal_xml) { if (_fr>.001) framerate=_fr; - if (find("signal_output")) { - Signal_output *signal_output=dynamic_cast<Signal_output*>(find("signal_output")); + if (find_node("signal_output")) { + Signal_output *signal_output=dynamic_cast<Signal_output*>(find_node("signal_output")); return signal_output->render(duration,framerate,signal_xml); } else return false; } + int load(Poco::UUID uid); + bool load(string &graph_filename); + UUID save(); //save to DB, returns UUID of saved graph + bool loaded; + const string toString(); private: Node_factory factory; float framerate; float duration; + xmlIO xml; }; - class base_audio_processor { - public: - virtual int process_frame(uint8_t *data,int samples)=0; - virtual void init(int _channels,int _bits,int _samples)=0; - int channels,bits,samples; - }; - class audio_thumbnailer: public base_audio_processor { + class Audio_thumbnailer: public Base_audio_processor { //how to deal with the fact that frames don't correspond with pixels? //buffer the data somehow //draw pixels based on rms value public: - audio_thumbnailer(){ - height=48; - width=128; //fit + Audio_thumbnailer(){ + height=32; + width=64; //fit data=new uint8_t[height*width]; memset(data,0,height*width); - } - ~audio_thumbnailer(){ + }; + ~Audio_thumbnailer(){ delete[] data; - } - void init(int _channels,int _bits,int _samples); + }; + Audio_thumbnailer* clone(map<string,string> &_settings) { return new Audio_thumbnailer();}; + void init(int _channels,int _bits,int _samples,int _rate); int process_frame(uint8_t *data,int samples_in_frame); string print(); uint8_t *data; @@ -369,7 +391,7 @@ namespace Rotor { //and low level interface onto the graph public: Render_context(const std::string& name): Task(name) { - audio_thumb=new audio_thumbnailer(); + audio_thumb=new Audio_thumbnailer(); state=IDLE; }; void runTask(); @@ -378,10 +400,7 @@ namespace Rotor { Render_status get_status(); void cancel(); //interrupt locking process int make_preview(int nodeID, float time); //starts a frame preview - returns status code - how to retrieve? - int load_graph(Poco::UUID uid); - bool load_graph(string &graph_filename); //should eventually be as above - UUID save_graph(); //returns UUID of saved graph - bool load_audio(const string &filename,vector<base_audio_processor*> processors); + bool load_audio(const string &filename,vector<Base_audio_processor*> processors); Render_requirements get_requirements(); int load_video(int num,string &filename); //can be performance or clip @@ -392,9 +411,8 @@ namespace Rotor { std::deque<int> work_queue; Poco::Mutex mutex; //lock for access from parent thread std::string audio_filename; - audio_thumbnailer *audio_thumb; + Audio_thumbnailer *audio_thumb; vampHost::QMAnalyser audio_analyser; - xmlIO xml; Graph graph; Node_factory factory; }; |
