2 #include "audioconfig.h"
3 #include "audiodevice.inc"
9 #include "filesystem.h"
11 #include "preferences.h"
13 #include "videoconfig.h"
14 #include "videodevice.inc"
17 //#define CLAMP(x, y, z) (x) = ((x) < (y) ? (y) : ((x) > (z) ? (z) : (x)))
30 Preferences::Preferences()
35 preferences_lock = new Mutex("Preferences::preferences_lock");
36 sprintf(index_directory, BCASTDIR);
37 if(strlen(index_directory))
38 fs.complete_path(index_directory);
39 cache_size = 0xa00000;
40 index_size = 0x300000;
45 force_uniprocessor = 0;
46 renderfarm_port = DEAMON_PORT;
49 renderfarm_mountpoint[0] = 0;
51 renderfarm_job_count = 20;
52 processors = calculate_processors();
54 // Default brender asset
55 brender_asset = new Asset;
56 brender_asset->audio_data = 0;
57 brender_asset->video_data = 1;
58 sprintf(brender_asset->path, "/tmp/brender");
59 brender_asset->format = FILE_JPEG_LIST;
60 brender_asset->jpeg_quality = 80;
67 Preferences::~Preferences()
70 delete preferences_lock;
73 void Preferences::copy_rates_from(Preferences *preferences)
75 preferences_lock->lock("Preferences::copy_rates_from");
76 // Need to match node titles in case the order changed and in case
77 // one of the nodes in the source is the master node.
78 local_rate = preferences->local_rate;
81 j < preferences->renderfarm_nodes.total;
84 double new_rate = preferences->renderfarm_rate.values[j];
85 // Put in the master node
86 if(preferences->renderfarm_nodes.values[j][0] == '/')
88 if(!EQUIV(new_rate, 0.0))
89 local_rate = new_rate;
92 // Search for local node and copy it to that node
93 if(!EQUIV(new_rate, 0.0))
95 for(int i = 0; i < renderfarm_nodes.total; i++)
97 if(!strcmp(preferences->renderfarm_nodes.values[j], renderfarm_nodes.values[i]) &&
98 preferences->renderfarm_ports.values[j] == renderfarm_ports.values[i])
100 renderfarm_rate.values[i] = new_rate;
107 //printf("Preferences::copy_rates_from 1 %f %f\n", local_rate, preferences->local_rate);
108 preferences_lock->unlock();
111 void Preferences::copy_from(Preferences *that)
113 // ================================= Performance ================================
114 strcpy(index_directory, that->index_directory);
115 index_size = that->index_size;
116 index_count = that->index_count;
117 use_thumbnails = that->use_thumbnails;
118 strcpy(global_plugin_dir, that->global_plugin_dir);
119 strcpy(theme, that->theme);
121 cache_size = that->cache_size;
122 force_uniprocessor = that->force_uniprocessor;
123 processors = calculate_processors();
124 renderfarm_nodes.remove_all_objects();
125 renderfarm_ports.remove_all();
126 renderfarm_enabled.remove_all();
127 renderfarm_rate.remove_all();
128 local_rate = that->local_rate;
129 for(int i = 0; i < that->renderfarm_nodes.total; i++)
131 add_node(that->renderfarm_nodes.values[i],
132 that->renderfarm_ports.values[i],
133 that->renderfarm_enabled.values[i],
134 that->renderfarm_rate.values[i]);
136 use_renderfarm = that->use_renderfarm;
137 renderfarm_port = that->renderfarm_port;
138 render_preroll = that->render_preroll;
139 brender_preroll = that->brender_preroll;
140 renderfarm_job_count = that->renderfarm_job_count;
141 renderfarm_vfs = that->renderfarm_vfs;
142 strcpy(renderfarm_mountpoint, that->renderfarm_mountpoint);
143 renderfarm_consolidate = that->renderfarm_consolidate;
144 use_brender = that->use_brender;
145 brender_fragment = that->brender_fragment;
146 *brender_asset = *that->brender_asset;
151 if(strlen(index_directory))
153 fs.complete_path(index_directory);
154 fs.add_end_slash(index_directory);
157 if(strlen(global_plugin_dir))
159 fs.complete_path(global_plugin_dir);
160 fs.add_end_slash(global_plugin_dir);
166 void Preferences::boundaries()
168 renderfarm_job_count = MAX(renderfarm_job_count, 1);
169 CLAMP(cache_size, MIN_CACHE_SIZE, MAX_CACHE_SIZE);
172 Preferences& Preferences::operator=(Preferences &that)
174 printf("Preferences::operator=\n");
179 int Preferences::load_defaults(Defaults *defaults)
181 char string[BCTEXTLEN];
183 defaults->get("INDEX_DIRECTORY", index_directory);
184 index_size = defaults->get("INDEX_SIZE", index_size);
185 index_count = defaults->get("INDEX_COUNT", index_count);
186 use_thumbnails = defaults->get("USE_THUMBNAILS", use_thumbnails);
188 sprintf(global_plugin_dir, PLUGIN_DIR);
189 defaults->get("GLOBAL_PLUGIN_DIR", global_plugin_dir);
190 if(getenv("GLOBAL_PLUGIN_DIR"))
192 strcpy(global_plugin_dir, getenv("GLOBAL_PLUGIN_DIR"));
195 strcpy(theme, DEFAULT_THEME);
196 defaults->get("THEME", theme);
199 brender_asset->load_defaults(defaults,
209 force_uniprocessor = defaults->get("FORCE_UNIPROCESSOR", 0);
210 processors = calculate_processors();
211 use_brender = defaults->get("USE_BRENDER", use_brender);
212 brender_fragment = defaults->get("BRENDER_FRAGMENT", brender_fragment);
213 cache_size = defaults->get("CACHE_SIZE", cache_size);
214 local_rate = defaults->get("LOCAL_RATE", local_rate);
215 use_renderfarm = defaults->get("USE_RENDERFARM", use_renderfarm);
216 renderfarm_port = defaults->get("RENDERFARM_PORT", renderfarm_port);
217 render_preroll = defaults->get("RENDERFARM_PREROLL", render_preroll);
218 brender_preroll = defaults->get("BRENDER_PREROLL", brender_preroll);
219 renderfarm_job_count = defaults->get("RENDERFARM_JOBS_COUNT", renderfarm_job_count);
220 renderfarm_consolidate = defaults->get("RENDERFARM_CONSOLIDATE", renderfarm_consolidate);
221 renderfarm_vfs = defaults->get("RENDERFARM_VFS", renderfarm_vfs);
222 defaults->get("RENDERFARM_MOUNTPOINT", renderfarm_mountpoint);
223 int renderfarm_total = defaults->get("RENDERFARM_TOTAL", 0);
225 for(int i = 0; i < renderfarm_total; i++)
227 sprintf(string, "RENDERFARM_NODE%d", i);
228 char result[BCTEXTLEN];
230 int result_enabled = 0;
231 float result_rate = 0.0;
234 defaults->get(string, result);
236 sprintf(string, "RENDERFARM_PORT%d", i);
237 result_port = defaults->get(string, renderfarm_port);
239 sprintf(string, "RENDERFARM_ENABLED%d", i);
240 result_enabled = defaults->get(string, result_enabled);
242 sprintf(string, "RENDERFARM_RATE%d", i);
243 result_rate = defaults->get(string, result_rate);
247 add_node(result, result_port, result_enabled, result_rate);
256 int Preferences::save_defaults(Defaults *defaults)
258 char string[BCTEXTLEN];
259 defaults->update("CACHE_SIZE", cache_size);
260 defaults->update("INDEX_DIRECTORY", index_directory);
261 defaults->update("INDEX_SIZE", index_size);
262 defaults->update("INDEX_COUNT", index_count);
263 defaults->update("USE_THUMBNAILS", use_thumbnails);
264 defaults->update("GLOBAL_PLUGIN_DIR", global_plugin_dir);
265 defaults->update("THEME", theme);
269 defaults->update("FORCE_UNIPROCESSOR", force_uniprocessor);
270 brender_asset->save_defaults(defaults,
277 defaults->update("USE_BRENDER", use_brender);
278 defaults->update("BRENDER_FRAGMENT", brender_fragment);
279 defaults->update("USE_RENDERFARM", use_renderfarm);
280 defaults->update("LOCAL_RATE", local_rate);
281 defaults->update("RENDERFARM_PORT", renderfarm_port);
282 defaults->update("RENDERFARM_PREROLL", render_preroll);
283 defaults->update("BRENDER_PREROLL", brender_preroll);
284 defaults->update("RENDERFARM_VFS", renderfarm_vfs);
285 defaults->update("RENDERFARM_MOUNTPOINT", renderfarm_mountpoint);
286 defaults->update("RENDERFARM_JOBS_COUNT", renderfarm_job_count);
287 defaults->update("RENDERFARM_CONSOLIDATE", renderfarm_consolidate);
288 defaults->update("RENDERFARM_TOTAL", (int64_t)renderfarm_nodes.total);
289 for(int i = 0; i < renderfarm_nodes.total; i++)
291 sprintf(string, "RENDERFARM_NODE%d", i);
292 defaults->update(string, renderfarm_nodes.values[i]);
293 sprintf(string, "RENDERFARM_PORT%d", i);
294 defaults->update(string, renderfarm_ports.values[i]);
295 sprintf(string, "RENDERFARM_ENABLED%d", i);
296 defaults->update(string, renderfarm_enabled.values[i]);
297 sprintf(string, "RENDERFARM_RATE%d", i);
298 defaults->update(string, renderfarm_rate.values[i]);
304 void Preferences::add_node(char *text, int port, int enabled, float rate)
306 if(text[0] == 0) return;
308 preferences_lock->lock("Preferences::add_node");
309 char *new_item = new char[strlen(text) + 1];
310 strcpy(new_item, text);
311 renderfarm_nodes.append(new_item);
312 renderfarm_ports.append(port);
313 renderfarm_enabled.append(enabled);
314 renderfarm_rate.append(rate);
315 preferences_lock->unlock();
318 void Preferences::delete_node(int number)
320 preferences_lock->lock("Preferences::delete_node");
321 if(number < renderfarm_nodes.total)
323 delete [] renderfarm_nodes.values[number];
324 renderfarm_nodes.remove_number(number);
325 renderfarm_ports.remove_number(number);
326 renderfarm_enabled.remove_number(number);
327 renderfarm_rate.remove_number(number);
329 preferences_lock->unlock();
332 void Preferences::delete_nodes()
334 preferences_lock->lock("Preferences::delete_nodes");
335 for(int i = 0; i < renderfarm_nodes.total; i++)
336 delete [] renderfarm_nodes.values[i];
337 renderfarm_nodes.remove_all();
338 renderfarm_ports.remove_all();
339 renderfarm_enabled.remove_all();
340 renderfarm_rate.remove_all();
341 preferences_lock->unlock();
344 void Preferences::reset_rates()
346 for(int i = 0; i < renderfarm_nodes.total; i++)
348 renderfarm_rate.values[i] = 0.0;
353 void Preferences::set_rate(float rate, int node)
355 //printf("Preferences::set_rate %f %d\n", rate, node);
363 for(int i = 0; i < renderfarm_nodes.total; i++)
365 if(renderfarm_enabled.values[i]) total++;
366 if(total == node + 1)
368 renderfarm_rate.values[i] = rate;
375 float Preferences::get_avg_rate(int use_master_node)
377 preferences_lock->lock("Preferences::get_avg_rate");
379 if(renderfarm_rate.total)
384 if(EQUIV(local_rate, 0.0))
386 preferences_lock->unlock();
396 for(int i = 0; i < renderfarm_rate.total; i++)
398 if(renderfarm_enabled.values[i])
401 total += renderfarm_rate.values[i];
402 if(EQUIV(renderfarm_rate.values[i], 0.0))
404 preferences_lock->unlock();
415 preferences_lock->unlock();
420 void Preferences::sort_nodes()
427 for(int i = 0; i < renderfarm_nodes.total - 1; i++)
429 if(strcmp(renderfarm_nodes.values[i], renderfarm_nodes.values[i + 1]) > 0)
431 char *temp = renderfarm_nodes.values[i];
432 int temp_port = renderfarm_ports.values[i];
434 renderfarm_nodes.values[i] = renderfarm_nodes.values[i + 1];
435 renderfarm_nodes.values[i + 1] = temp;
437 renderfarm_ports.values[i] = renderfarm_ports.values[i + 1];
438 renderfarm_ports.values[i + 1] = temp_port;
440 renderfarm_enabled.values[i] = renderfarm_enabled.values[i + 1];
441 renderfarm_enabled.values[i + 1] = temp_port;
443 renderfarm_rate.values[i] = renderfarm_rate.values[i + 1];
444 renderfarm_rate.values[i + 1] = temp_port;
451 void Preferences::edit_node(int number,
456 char *new_item = new char[strlen(new_text) + 1];
457 strcpy(new_item, new_text);
459 delete [] renderfarm_nodes.values[number];
460 renderfarm_nodes.values[number] = new_item;
461 renderfarm_ports.values[number] = new_port;
462 renderfarm_enabled.values[number] = new_enabled;
465 int Preferences::get_enabled_nodes()
468 for(int i = 0; i < renderfarm_enabled.total; i++)
469 if(renderfarm_enabled.values[i]) result++;
473 char* Preferences::get_node_hostname(int number)
476 for(int i = 0; i < renderfarm_nodes.total; i++)
478 if(renderfarm_enabled.values[i])
481 return renderfarm_nodes.values[i];
489 int Preferences::get_node_port(int number)
492 for(int i = 0; i < renderfarm_ports.total; i++)
494 if(renderfarm_enabled.values[i])
497 return renderfarm_ports.values[i];
506 int Preferences::calculate_processors()
508 /* Get processor count */
512 if(force_uniprocessor) return 1;
514 if(proc = fopen("/proc/cpuinfo", "r"))
516 char string[BCTEXTLEN];
519 fgets(string, BCTEXTLEN, proc);
520 if(!strncasecmp(string, "processor", 9))
522 char *ptr = strchr(string, ':');
526 result = atol(ptr) + 1;
530 if(!strncasecmp(string, "cpus detected", 13))
532 char *ptr = strchr(string, ':');