summaryrefslogtreecommitdiff
path: root/rotord/rotor.h
diff options
context:
space:
mode:
Diffstat (limited to 'rotord/rotor.h')
-rwxr-xr-xrotord/rotor.h74
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;
};