summaryrefslogtreecommitdiff
path: root/rotord/src/rendercontext.h
blob: 62eb7f4c80fbb8d7ce66c6111d9e2b1cb01e7f12 (plain)
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
#ifndef RENDERCONTEXT_H
#define RENDERCONTEXT_H

#include "Poco/Task.h"
#include "Poco/StringTokenizer.h"

#include "rotor.h"
#include "graph.h"

/*------------------------

Render context packages the management of a rotor graph as a web service

-------------------------*/

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

	class Session_command {
		public:
			Session_command(){body="";};
		
			string uid,method,id,body;
			vector<string> commands;
	};
	class Session_task {
		public:
			Session_task():uid(""),task(0){};
			Session_task(const string &_uid,int _task):uid(_uid),task(_task) {};
			string uid;
			int task;

	};
	class Render_status {
		public:
			Render_status():status(0),progress(0.0f){};
			Render_status(int _status):status(_status),progress(0.0f){};
			int status;
			float progress;
	};
	class Render_context: public Poco::Task {				//Poco task object
															//manages a 'patchbay'
															//high level interfaces for the wizard
															//and low level interface onto the graph
		public:
			Render_context(const std::string& name): Task(name)  {
				audio_thumb=new Audio_thumbnailer();
				state=IDLE;
				output_framerate=25.0f;

				xmlIO xml;
				if(xml.loadFile("settings.xml") ){
					graph_dir=xml.getAttribute("Rotor","graph_dir","",0);
					media_dir=xml.getAttribute("Rotor","media_dir","",0);
					output_dir=xml.getAttribute("Rotor","output_dir","",0);
				}

				else cerr<<"Rotor: settings.xml not found, using defaults"<<endl;
			};
			~Render_context(){delete audio_thumb;};
			void runTask();
			void add_queue(Session_task item);
			void session_command(const Session_command& command,xmlIO& XML,Poco::Net::HTTPResponse::HTTPStatus& status);
			void cancel(){
				graph.clear();
			}								//interrupt locking process
			Render_status get_render_status(const string &uid){

				//cerr<<"render status requested: "<<uid<<" status: "<<renders[uid].status<<endl;
							
				if (renders.find(uid)!=renders.end()){
					if (renders[uid].status==RENDERING){
						renders[uid].progress=graph.progress;
					}
					return renders[uid];
				}
				else return Render_status(NOT_FOUND);
			};
		private:
			int state;
															//thread only does one thing at once
			std::deque<Session_task> work_queue;
			std::unordered_map<string,Render_status> renders;
			Poco::Mutex mutex;            					//lock for access from parent thread
			
			std::string output_filename;
			std::string graph_dir;
			std::string media_dir;
			std::string output_dir;

			Audio_thumbnailer *audio_thumb;
			Graph graph;
			float output_framerate;

	};
}

#endif