3 #include "attachmentpoint.h"
9 #include "edlsession.h"
10 #include "floatautos.h"
11 #include "localsession.h"
12 #include "mainprogress.h"
13 #include "menueffects.h"
15 #include "mwindowgui.h"
16 #include "playbackengine.h"
18 #include "pluginaclient.h"
19 #include "pluginaclientlad.h"
20 #include "pluginclient.h"
21 #include "plugincommands.h"
22 #include "pluginserver.h"
23 #include "pluginvclient.h"
24 #include "preferences.h"
26 #include "mainsession.h"
27 #include "trackcanvas.h"
28 #include "transportque.h"
30 #include "virtualanode.h"
31 #include "virtualvnode.h"
36 #include <sys/types.h>
41 PluginServer::PluginServer()
44 modules = new ArrayList<Module*>;
45 nodes = new ArrayList<VirtualNode*>;
48 PluginServer::PluginServer(char *path)
52 modules = new ArrayList<Module*>;
53 nodes = new ArrayList<VirtualNode*>;
56 PluginServer::PluginServer(PluginServer &that)
62 title = new char[strlen(that.title) + 1];
63 strcpy(title, that.title);
68 path = new char[strlen(that.path) + 1];
69 strcpy(path, that.path);
72 modules = new ArrayList<Module*>;
73 nodes = new ArrayList<VirtualNode*>;
75 attachment = that.attachment;
76 realtime = that.realtime;
77 multichannel = that.multichannel;
78 preferences = that.preferences;
79 synthesis = that.synthesis;
84 uses_gui = that.uses_gui;
85 mwindow = that.mwindow;
86 keyframe = that.keyframe;
87 plugin_fd = that.plugin_fd;
88 new_plugin = that.new_plugin;
91 lad_descriptor = that.lad_descriptor;
92 lad_descriptor_function = that.lad_descriptor_function;
95 PluginServer::~PluginServer()
98 if(path) delete [] path;
99 if(title) delete [] title;
100 if(modules) delete modules;
101 if(nodes) delete nodes;
102 if(picon) delete picon;
105 // Done only once at creation
106 int PluginServer::reset_parameters()
119 audio = video = theme = 0;
121 realtime = multichannel = fileio = 0;
123 start_auto = end_auto = 0;
130 lad_descriptor_function = 0;
135 // Done every time the plugin is opened or closed
136 int PluginServer::cleanup_plugin()
138 in_buffer_size = out_buffer_size = 0;
139 total_in_buffers = total_out_buffers = 0;
144 written_samples = written_frames = 0;
150 void PluginServer::set_mwindow(MWindow *mwindow)
152 this->mwindow = mwindow;
155 void PluginServer::set_attachmentpoint(AttachmentPoint *attachmentpoint)
157 this->attachmentpoint = attachmentpoint;
160 void PluginServer::set_keyframe(KeyFrame *keyframe)
162 this->keyframe = keyframe;
165 void PluginServer::set_prompt(MenuEffectPrompt *prompt)
167 this->prompt = prompt;
171 int PluginServer::set_path(char *path)
173 if(this->path) delete [] this->path;
174 this->path = new char[strlen(path) + 1];
175 strcpy(this->path, path);
178 void PluginServer::set_title(char *string)
180 if(title) delete [] title;
181 title = new char[strlen(string) + 1];
182 strcpy(title, string);
185 void PluginServer::generate_display_title(char *string)
187 if(plugin && plugin->track)
188 sprintf(string, "%s: %s", plugin->track->title, title);
190 strcpy(string, title);
193 // Open plugin for signal processing
194 int PluginServer::open_plugin(int master,
195 Preferences *preferences,
200 if(plugin_open) return 0;
202 this->preferences = preferences;
203 this->plugin = plugin;
208 if(!new_plugin && !plugin_fd) plugin_fd = dlopen(path, RTLD_NOW);
210 if(!new_plugin && !plugin_fd)
212 // If the dlopen failed it may still be an executable tool for a specific
213 // file format, in which case we just store the path.
215 char string[BCTEXTLEN];
216 strcpy(string, dlerror());
218 if(!strstr(string, "executable"))
219 printf("PluginServer::open_plugin: %s\n", string);
225 if(!new_plugin && !lad_descriptor)
227 new_plugin = (PluginClient* (*)(PluginServer*))dlsym(plugin_fd, "new_plugin");
229 // Probably a LAD plugin but we're not going to instantiate it here anyway.
232 lad_descriptor_function = (LADSPA_Descriptor_Function)dlsym(
234 "ladspa_descriptor");
236 if(!lad_descriptor_function)
238 // Not a recognized plugin
239 fprintf(stderr, "PluginServer::open_plugin: new_plugin undefined in %s\n", path);
242 return PLUGINSERVER_NOT_RECOGNIZED;
246 // LAD plugin, Load the descriptor and get parameters.
250 lad_descriptor = lad_descriptor_function(lad_index);
253 // make plugin initializer handle the subplugins in the LAD plugin or stop
254 // trying subplugins.
259 return PLUGINSERVER_IS_LAD;
268 client = new PluginAClientLAD(this);
272 client = new_plugin(this);
275 realtime = client->is_realtime();
276 audio = client->is_audio();
277 video = client->is_video();
278 theme = client->is_theme();
279 fileio = client->is_fileio();
280 uses_gui = client->uses_gui();
281 multichannel = client->is_multichannel();
282 synthesis = client->is_synthesis();
283 transition = client->is_transition();
284 set_title(client->plugin_title());
288 picon = client->new_picon();
291 //printf("PluginServer::open_plugin 2\n");
293 return PLUGINSERVER_OK;
296 int PluginServer::close_plugin()
298 if(!plugin_open) return 0;
300 int plugin_status, result;
301 if(client) delete client;
303 // shared object is persistent since plugin deletion would unlink its own object
304 // dlclose(plugin_fd);
312 void PluginServer::client_side_close()
314 // Last command executed in client thread
316 mwindow->hide_plugin(plugin, 1);
320 prompt->lock_window();
322 prompt->unlock_window();
326 int PluginServer::init_realtime(int realtime_sched,
327 int total_in_buffers,
330 if(!plugin_open) return 0;
331 // set for realtime priority
333 // Call start_realtime
334 client->plugin_init_realtime(realtime_sched,
340 // Replaced by pull method but still needed for transitions
341 void PluginServer::process_transition(VFrame *input,
343 int64_t current_position,
346 if(!plugin_open) return;
347 PluginVClient *vclient = (PluginVClient*)client;
349 vclient->source_position = current_position;
350 vclient->source_start = 0;
351 vclient->total_len = total_len;
352 vclient->process_realtime(input, output);
356 void PluginServer::process_transition(double *input,
358 int64_t current_position,
359 int64_t fragment_size,
362 if(!plugin_open) return;
363 PluginAClient *aclient = (PluginAClient*)client;
365 aclient->source_position = current_position;
366 aclient->total_len = total_len;
367 aclient->source_start = 0;
368 aclient->process_realtime(fragment_size,
374 void PluginServer::process_buffer(VFrame **frame,
375 int64_t current_position,
380 if(!plugin_open) return;
381 PluginVClient *vclient = (PluginVClient*)client;
383 vclient->source_position = current_position;
384 vclient->total_len = total_len;
385 vclient->frame_rate = frame_rate;
386 vclient->source_start = (int64_t)(plugin ?
387 plugin->startproject *
389 vclient->project_frame_rate :
391 vclient->direction = direction;
395 vclient->process_buffer(frame, current_position, frame_rate);
399 vclient->process_buffer(frame[0], current_position, frame_rate);
406 void PluginServer::process_buffer(double **buffer,
407 int64_t current_position,
408 int64_t fragment_size,
413 if(!plugin_open) return;
414 PluginAClient *aclient = (PluginAClient*)client;
415 aclient->source_position = current_position;
416 aclient->total_len = total_len;
417 aclient->sample_rate = sample_rate;
419 aclient->source_start = plugin->startproject *
421 aclient->project_sample_rate;
422 aclient->direction = direction;
424 aclient->process_buffer(fragment_size,
430 aclient->process_buffer(fragment_size,
438 void PluginServer::send_render_gui(void *data)
440 //printf("PluginServer::send_render_gui 1 %p\n", attachmentpoint);
441 if(attachmentpoint) attachmentpoint->render_gui(data);
444 void PluginServer::send_render_gui(void *data, int size)
446 //printf("PluginServer::send_render_gui 1 %p\n", attachmentpoint);
447 if(attachmentpoint) attachmentpoint->render_gui(data, size);
450 void PluginServer::render_gui(void *data)
452 if(client) client->plugin_render_gui(data);
455 void PluginServer::render_gui(void *data, int size)
457 if(client) client->plugin_render_gui(data, size);
460 MainProgressBar* PluginServer::start_progress(char *string, int64_t length)
462 mwindow->gui->lock_window();
463 MainProgressBar *result = mwindow->mainprogress->start_progress(string, length);
464 mwindow->gui->unlock_window();
468 int64_t PluginServer::get_written_samples()
470 if(!plugin_open) return 0;
471 return written_samples;
474 int64_t PluginServer::get_written_frames()
476 if(!plugin_open) return 0;
477 return written_frames;
489 // ======================= Non-realtime plugin
491 int PluginServer::get_parameters(int64_t start, int64_t end, int channels)
493 if(!plugin_open) return 0;
495 client->start = start;
497 client->source_start = start;
498 client->total_len = end - start;
499 client->total_in_buffers = channels;
500 return client->plugin_get_parameters();
503 int PluginServer::set_interactive()
505 if(!plugin_open) return 0;
506 client->set_interactive();
510 void PluginServer::append_module(Module *module)
512 modules->append(module);
515 void PluginServer::append_node(VirtualNode *node)
520 void PluginServer::reset_nodes()
525 int PluginServer::set_error()
531 int PluginServer::set_realtime_sched()
533 struct sched_param params;
534 params.sched_priority = 1;
539 int PluginServer::process_loop(VFrame **buffers, int64_t &write_length)
541 if(!plugin_open) return 1;
542 return client->plugin_process_loop(buffers, write_length);
545 int PluginServer::process_loop(double **buffers, int64_t &write_length)
547 if(!plugin_open) return 1;
548 return client->plugin_process_loop(buffers, write_length);
552 int PluginServer::start_loop(int64_t start,
557 if(!plugin_open) return 0;
558 client->plugin_start_loop(start, end, buffer_size, total_buffers);
562 int PluginServer::stop_loop()
564 if(!plugin_open) return 0;
565 return client->plugin_stop_loop();
568 int PluginServer::read_frame(VFrame *buffer,
570 int64_t start_position)
572 ((VModule*)modules->values[channel])->render(buffer,
575 mwindow->edl->session->frame_rate,
581 int PluginServer::read_samples(double *buffer,
583 int64_t start_position,
584 int64_t total_samples)
586 ((AModule*)modules->values[channel])->render(buffer,
590 mwindow->edl->session->sample_rate,
595 int PluginServer::read_frame(VFrame *buffer,
597 int64_t start_position,
600 // Data source depends on whether we're part of a virtual console or a
604 // If we're a VirtualNode, read_data in the virtual plugin node handles
605 // backward propogation and produces the data.
606 // If we're a Module, render in the module produces the data.
608 if(!multichannel) channel = 0;
611 if(nodes->total > channel)
613 return ((VirtualVNode*)nodes->values[channel])->read_data(buffer,
618 if(modules->total > channel)
620 return ((VModule*)modules->values[channel])->render(buffer,
629 printf("PluginServer::read_frame no object available for channel=%d\n",
632 //printf("PluginServer::read_frame 10\n");
637 int PluginServer::read_samples(double *buffer,
640 int64_t start_position,
643 if(!multichannel) channel = 0;
645 if(nodes->total > channel)
646 return ((VirtualANode*)nodes->values[channel])->read_data(buffer,
651 if(modules->total > channel)
652 return ((AModule*)modules->values[channel])->render(buffer,
660 printf("PluginServer::read_samples no object available for channel=%d\n",
687 int PluginServer::get_gui_status()
690 return plugin->show ? GUI_ON : GUI_OFF;
695 void PluginServer::raise_window()
697 if(!plugin_open) return;
698 client->raise_window();
701 void PluginServer::show_gui()
703 if(!plugin_open) return;
704 client->smp = preferences->processors - 1;
705 if(plugin) client->total_len = plugin->length;
706 if(plugin) client->source_start = plugin->startproject;
709 client->source_position = Units::to_int64(
710 mwindow->edl->local_session->selectionstart *
711 mwindow->edl->session->frame_rate);
716 client->source_position = Units::to_int64(
717 mwindow->edl->local_session->selectionstart *
718 mwindow->edl->session->sample_rate);
720 client->update_display_title();
724 void PluginServer::update_gui()
726 if(!plugin_open || !plugin) return;
728 client->total_len = plugin->length;
729 client->source_start = plugin->startproject;
732 client->source_position = Units::to_int64(
733 mwindow->edl->local_session->selectionstart *
734 mwindow->edl->session->frame_rate);
739 client->source_position = Units::to_int64(
740 mwindow->edl->local_session->selectionstart *
741 mwindow->edl->session->sample_rate);
743 client->update_gui();
746 void PluginServer::update_title()
748 if(!plugin_open) return;
750 client->update_display_title();
754 int PluginServer::set_string(char *string)
756 if(!plugin_open) return 0;
758 client->set_string_client(string);
763 // ============================= queries
765 int PluginServer::get_samplerate()
767 if(!plugin_open) return 0;
770 return client->get_samplerate();
774 return mwindow->edl->session->sample_rate;
777 printf("PluginServer::get_samplerate audio and mwindow == NULL\n");
783 double PluginServer::get_framerate()
785 if(!plugin_open) return 0;
788 return client->get_framerate();
792 return mwindow->edl->session->frame_rate;
795 printf("PluginServer::get_framerate video and mwindow == NULL\n");
800 int PluginServer::get_project_samplerate()
803 return mwindow->edl->session->sample_rate;
806 return edl->session->sample_rate;
809 printf("PluginServer::get_project_samplerate mwindow and edl are NULL.\n");
814 double PluginServer::get_project_framerate()
817 return mwindow->edl->session->frame_rate;
820 return edl->session->frame_rate;
823 printf("PluginServer::get_project_framerate mwindow and edl are NULL.\n");
830 int PluginServer::detach_buffers()
832 ring_buffers_out.remove_all();
833 offset_out_render.remove_all();
834 double_buffer_out_render.remove_all();
835 realtime_out_size.remove_all();
837 ring_buffers_in.remove_all();
838 offset_in_render.remove_all();
839 double_buffer_in_render.remove_all();
840 realtime_in_size.remove_all();
844 total_out_buffers = 0;
846 total_in_buffers = 0;
850 int PluginServer::arm_buffer(int buffer_number,
853 int double_buffer_in,
854 int double_buffer_out)
856 offset_in_render.values[buffer_number] = offset_in;
857 offset_out_render.values[buffer_number] = offset_out;
858 double_buffer_in_render.values[buffer_number] = double_buffer_in;
859 double_buffer_out_render.values[buffer_number] = double_buffer_out;
863 int PluginServer::set_automation(FloatAutos *autos, FloatAuto **start_auto, FloatAuto **end_auto, int reverse)
866 this->start_auto = start_auto;
867 this->end_auto = end_auto;
868 this->reverse = reverse;
873 void PluginServer::save_data(KeyFrame *keyframe)
875 if(!plugin_open) return;
876 client->save_data(keyframe);
879 KeyFrame* PluginServer::get_prev_keyframe(int64_t position)
881 KeyFrame *result = 0;
883 result = plugin->get_prev_keyframe(position, client->direction);
889 KeyFrame* PluginServer::get_next_keyframe(int64_t position)
891 KeyFrame *result = 0;
893 result = plugin->get_next_keyframe(position, client->direction);
899 KeyFrame* PluginServer::get_keyframe()
902 return plugin->get_keyframe();
908 int PluginServer::get_interpolation_type()
910 return plugin->edl->session->interpolation_type;
913 Theme* PluginServer::new_theme()
917 return client->new_theme();
923 Theme* PluginServer::get_theme()
925 if(mwindow) return mwindow->theme;
926 printf("PluginServer::get_theme mwindow not set\n");
931 // Called when plugin interface is tweeked
932 void PluginServer::sync_parameters()
934 if(video) mwindow->restart_brender();
935 mwindow->sync_parameters();
936 if(mwindow->edl->session->auto_conf->plugins)
938 mwindow->gui->lock_window("PluginServer::sync_parameters");
939 mwindow->gui->canvas->draw_overlays();
940 mwindow->gui->canvas->flash();
941 mwindow->gui->unlock_window();
947 void PluginServer::dump()
949 printf(" PluginServer %s %s\n", path, title);