1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
|
#ifndef RENDERCONTEXT_H
#define RENDERCONTEXT_H
/*------------------------
Render context manages a rotor graph as a web service, and renders out linear movies
TJR Jan 2014
-------------------------*/
#include "Poco/Task.h"
#include "rotor.h"
#include "graph.h"
//
// When rendering, where do duration etc come from?
//
// It should come from:
// a) a specified duration
// b) the duration of the song being worked on
// c) a default duration
//
// graph.get_duration()
namespace Rotor {
#define IDLE 0
#define ANALYSING_AUDIO 1
#define AUDIO_READY 2
#define CREATING_PREVIEW 3
#define PREVIEW_READY 4
#define RENDERING 5
#define RENDER_READY 6
#define FAILED 7
#define NOT_FOUND 8
#define CANCELLED 9
#define LOADING_GRAPH 10
#define ANALYSE_AUDIO 1
#define PREVIEW 2
#define RENDER 3
#define LOAD_GRAPH 4
class Session_command {
public:
Session_command(){body="";};
string uid,method,id,body;
vector<string> commands;
};
class Render_status {
public:
Render_status():status(0),progress(0.0){};
Render_status(int _status):status(_status),progress(0.0){};
int status;
double progress;
};
class Render_settings {
public:
Render_settings(int w=640,int h=360):width(w),height(h){};
int width,height;
};
class Render_context: public Poco::Task {
public:
Render_context(const std::string& _id): Task(_id) {
id=_id;
graph.init(id);
//set up log
AutoPtr<SplitterChannel> splitterChannel(new SplitterChannel());
AutoPtr<Channel> consoleChannel(new ConsoleChannel());
AutoPtr<Channel> fileChannel(new FileChannel("Rotord_"+id+".log"));
splitterChannel->addChannel(consoleChannel);
splitterChannel->addChannel(fileChannel);
AutoPtr<Formatter> formatter(new PatternFormatter("%d-%m-%Y %H:%M:%S %s: %t"));
AutoPtr<Channel> formattingChannel(new FormattingChannel(formatter, splitterChannel));
Logger& logger = Logger::create(id, formattingChannel, Message::PRIO_TRACE);
logger.information("started thread");
}
~Render_context(){
Logger& logger = Logger::get(id);
cancel();
logger.information("stopped thread");
}
void runTask() {
while (!isCancelled()) {
sleep(100);
}
}
bool set_preset(std::string& _preset){
if (presets.find(_preset)==presets.end()) return false;
preset=_preset;
return true;
}
void session_command(const Session_command& command,xmlIO& XML,Poco::Net::HTTPResponse::HTTPStatus& status);
Render_status get_render_status(const string &uid){
if (renders.find(uid)!=renders.end()){
if (renders[uid].status==RENDERING){
renders[uid].progress=graph.progress;
}
return renders[uid];
}
return Render_status(NOT_FOUND);
};
std::string text_render(std::string node_id="");
Graph graph;
private:
std::string id;
std::unordered_map<std::string,Render_status> renders;
std::unordered_map<std::string,Render_settings> presets;
std::string preset;
};
};
#endif //RENDERCONTEXT_H
|