+++ /dev/null
-
-/*
- * CINELERRA
- * Copyright (C) 1997-2011 Adam Williams <broadcast at earthling dot net>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-#include "bcdisplayinfo.h"
-#include "bchash.h"
-#include "bcsignals.h"
-#include "clip.h"
-#include "condition.h"
-#include "edl.h"
-#include "edlsession.h"
-#include "filesystem.h"
-#include "language.h"
-#include "localsession.h"
-#include "mainundo.h"
-#include "mwindow.h"
-#include "pluginclient.h"
-#include "pluginserver.h"
-#include "preferences.h"
-#include "transportque.inc"
-
-
-#include <ctype.h>
-#include <errno.h>
-#include <string.h>
-
-
-
-
-
-PluginClientThread::PluginClientThread(PluginClient *client)
- : Thread(1, 0, 0)
-{
- this->client = client;
- window = 0;
- init_complete = new Condition(0, "PluginClientThread::init_complete");
-}
-
-PluginClientThread::~PluginClientThread()
-{
-//printf("PluginClientThread::~PluginClientThread %p %d\n", this, __LINE__);
- delete window;
-//printf("PluginClientThread::~PluginClientThread %p %d\n", this, __LINE__);
- window = 0;
- delete init_complete;
-}
-
-void PluginClientThread::run()
-{
- BC_DisplayInfo info;
- int result = 0;
- if(client->window_x < 0) client->window_x = info.get_abs_cursor_x();
- if(client->window_y < 0) client->window_y = info.get_abs_cursor_y();
- window = client->new_window();
-
- if(window)
- {
- window->lock_window("PluginClientThread::run");
- window->create_objects();
- window->unlock_window();
-
-/* Only set it here so tracking doesn't update it until everything is created. */
- client->thread = this;
- init_complete->unlock();
-
- result = window->run_window();
- window->lock_window("PluginClientThread::run");
-//printf("PluginClientThread::run %p %d\n", this, __LINE__);
- window->hide_window(1);
- window->unlock_window();
-
-
-// Can't save defaults in the destructor because it's not called immediately
-// after closing.
- /* if(client->defaults) */ client->save_defaults_xml();
-/* This is needed when the GUI is closed from itself */
- if(result) client->client_side_close();
- }
- else
-// No window
- {
- client->thread = this;
- init_complete->unlock();
- }
-}
-
-BC_WindowBase* PluginClientThread::get_window()
-{
- return window;
-}
-
-PluginClient* PluginClientThread::get_client()
-{
- return client;
-}
-
-
-
-
-
-
-PluginClientFrame::PluginClientFrame(int data_size,
- int period_n,
- int period_d)
-{
- this->data_size = data_size;
- force = 0;
- this->period_n = period_n;
- this->period_d = period_d;
-}
-
-PluginClientFrame::~PluginClientFrame()
-{
-
-}
-
-
-
-
-
-PluginClientWindow::PluginClientWindow(PluginClient *client,
- int w,
- int h,
- int min_w,
- int min_h,
- int allow_resize)
- : BC_Window(client->gui_string,
- client->window_x /* - w / 2 */,
- client->window_y /* - h / 2 */,
- w,
- h,
- min_w,
- min_h,
- allow_resize,
- 0,
- 1)
-{
- this->client = client;
-}
-
-PluginClientWindow::PluginClientWindow(const char *title,
- int x,
- int y,
- int w,
- int h,
- int min_w,
- int min_h,
- int allow_resize)
- : BC_Window(title,
- x,
- y,
- w,
- h,
- min_w,
- min_h,
- allow_resize,
- 0,
- 1)
-{
- this->client = 0;
-}
-
-PluginClientWindow::~PluginClientWindow()
-{
-}
-
-
-int PluginClientWindow::translation_event()
-{
- if(client)
- {
- client->window_x = get_x();
- client->window_y = get_y();
- }
-
- return 1;
-}
-
-int PluginClientWindow::close_event()
-{
-/* Set result to 1 to indicate a client side close */
- set_done(1);
- return 1;
-}
-
-
-
-
-
-PluginClient::PluginClient(PluginServer *server)
-{
- reset();
- this->server = server;
- smp = server->preferences->processors;
- defaults = 0;
- update_timer = new Timer;
-// Virtual functions don't work here.
-}
-
-PluginClient::~PluginClient()
-{
-// Delete the GUI thread. The GUI must be hidden with hide_gui first.
- if(thread)
- {
- thread->join();
- delete thread;
- }
-
-// Virtual functions don't work here.
- if(defaults) delete defaults;
- frame_buffer.remove_all_objects();
- delete update_timer;
-}
-
-int PluginClient::reset()
-{
- window_x = -1;
- window_y = -1;
- interactive = 0;
- show_initially = 0;
- wr = rd = 0;
- master_gui_on = 0;
- client_gui_on = 0;
- realtime_priority = 0;
- gui_string[0] = 0;
- total_in_buffers = 0;
- total_out_buffers = 0;
- source_position = 0;
- source_start = 0;
- total_len = 0;
- direction = PLAY_FORWARD;
- thread = 0;
- using_defaults = 0;
- return 0;
-}
-
-
-void PluginClient::hide_gui()
-{
- if(thread && thread->window)
- {
-//printf("PluginClient::delete_thread %d\n", __LINE__);
-/* This is needed when the GUI is closed from elsewhere than itself */
-/* Since we now use autodelete, this is all that has to be done, thread will take care of itself ... */
-/* Thread join will wait if this was not called from the thread itself or go on if it was */
- thread->window->lock_window("PluginClient::hide_gui");
- thread->window->set_done(0);
-//printf("PluginClient::hide_gui %d thread->window=%p\n", __LINE__, thread->window);
- thread->window->unlock_window();
-//printf("PluginClient::delete_thread %d\n", __LINE__);
- }
-}
-
-// For realtime plugins initialize buffers
-int PluginClient::plugin_init_realtime(int realtime_priority,
- int total_in_buffers,
- int buffer_size)
-{
-
-// Get parameters for all
- master_gui_on = get_gui_status();
-
-
-
-// get parameters depending on video or audio
- init_realtime_parameters();
-
- this->realtime_priority = realtime_priority;
- this->total_in_buffers = this->total_out_buffers = total_in_buffers;
- this->out_buffer_size = this->in_buffer_size = buffer_size;
- return 0;
-}
-
-int PluginClient::plugin_start_loop(int64_t start,
- int64_t end,
- int64_t buffer_size,
- int total_buffers)
-{
-//printf("PluginClient::plugin_start_loop %d %ld %ld %ld %d\n",
-// __LINE__, start, end, buffer_size, total_buffers);
- this->source_start = start;
- this->total_len = end - start;
- this->start = start;
- this->end = end;
- this->in_buffer_size = this->out_buffer_size = buffer_size;
- this->total_in_buffers = this->total_out_buffers = total_buffers;
- start_loop();
- return 0;
-}
-
-int PluginClient::plugin_process_loop()
-{
- return process_loop();
-}
-
-int PluginClient::plugin_stop_loop()
-{
- return stop_loop();
-}
-
-MainProgressBar* PluginClient::start_progress(char *string, int64_t length)
-{
- return server->start_progress(string, length);
-}
-
-
-// Non realtime parameters
-int PluginClient::plugin_get_parameters()
-{
- int result = get_parameters();
- if(defaults) save_defaults();
- return result;
-}
-
-// ========================= main loop
-
-int PluginClient::is_multichannel() { return 0; }
-int PluginClient::is_synthesis() { return 0; }
-int PluginClient::is_realtime() { return 0; }
-int PluginClient::is_fileio() { return 0; }
-int PluginClient::delete_buffer_ptrs() { return 0; }
-const char* PluginClient::plugin_title() { return _("Untitled"); }
-
-Theme* PluginClient::new_theme() { return 0; }
-
-int PluginClient::load_configuration()
-{
- return 0;
-}
-
-Theme* PluginClient::get_theme()
-{
- return server->get_theme();
-}
-
-int PluginClient::show_gui()
-{
- load_configuration();
- thread = new PluginClientThread(this);
- thread->start();
- thread->init_complete->lock("PluginClient::show_gui");
-// Must wait before sending any hide_gui
- if(thread->window)
- {
- thread->window->init_wait();
- }
- else
- {
- return 1;
- }
- return 0;
-}
-
-void PluginClient::raise_window()
-{
- if(thread && thread->window)
- {
- thread->window->lock_window("PluginClient::raise_window");
- thread->window->raise_window();
- thread->window->flush();
- thread->window->unlock_window();
- }
-}
-
-int PluginClient::set_string()
-{
- if(thread)
- {
- thread->window->lock_window("PluginClient::set_string");
- thread->window->set_title(gui_string);
- thread->window->unlock_window();
- }
- return 0;
-}
-
-
-
-
-
-void PluginClient::begin_process_buffer()
-{
-// Delete all unused GUI frames
- frame_buffer.remove_all_objects();
-}
-
-
-void PluginClient::end_process_buffer()
-{
- if(frame_buffer.size())
- {
- send_render_gui();
- }
-}
-
-
-
-void PluginClient::plugin_update_gui()
-{
-
- update_gui();
-
-// Delete unused GUI frames
- while(frame_buffer.size() > MAX_FRAME_BUFFER)
- frame_buffer.remove_object_number(0);
-
-}
-
-void PluginClient::update_gui()
-{
-}
-
-int PluginClient::get_gui_update_frames()
-{
- if(frame_buffer.size())
- {
- PluginClientFrame *frame = frame_buffer.get(0);
- int total_frames = update_timer->get_difference() *
- frame->period_d /
- frame->period_n /
- 1000;
- if(total_frames) update_timer->subtract(total_frames *
- frame->period_n *
- 1000 /
- frame->period_d);
-
-// printf("PluginClient::get_gui_update_frames %d %ld %d %d %d\n",
-// __LINE__,
-// update_timer->get_difference(),
-// frame->period_n * 1000 / frame->period_d,
-// total_frames,
-// frame_buffer.size());
-
-// Add forced frames
- for(int i = 0; i < frame_buffer.size(); i++)
- if(frame_buffer.get(i)->force) total_frames++;
- total_frames = MIN(frame_buffer.size(), total_frames);
-
-
- return total_frames;
- }
- else
- {
- return 0;
- }
-}
-
-PluginClientFrame* PluginClient::get_gui_frame()
-{
- if(frame_buffer.size())
- {
- PluginClientFrame *frame = frame_buffer.get(0);
- frame_buffer.remove_number(0);
- return frame;
- }
- else
- {
- return 0;
- }
-}
-
-void PluginClient::add_gui_frame(PluginClientFrame *frame)
-{
- frame_buffer.append(frame);
-}
-
-void PluginClient::send_render_gui()
-{
- server->send_render_gui(&frame_buffer);
-}
-
-void PluginClient::send_render_gui(void *data)
-{
- server->send_render_gui(data);
-}
-
-void PluginClient::send_render_gui(void *data, int size)
-{
- server->send_render_gui(data, size);
-}
-
-void PluginClient::plugin_render_gui(void *data, int size)
-{
- render_gui(data, size);
-}
-
-
-void PluginClient::plugin_render_gui(void *data)
-{
- render_gui(data);
-}
-
-void PluginClient::render_gui(void *data)
-{
- if(thread)
- {
- thread->get_window()->lock_window("PluginClient::render_gui");
-
-// Set all previous frames to draw immediately
- for(int i = 0; i < frame_buffer.size(); i++)
- frame_buffer.get(i)->force = 1;
-
- ArrayList<PluginClientFrame*> *src =
- (ArrayList<PluginClientFrame*>*)data;
-
-// Shift GUI data to GUI client
- while(src->size())
- {
- this->frame_buffer.append(src->get(0));
- src->remove_number(0);
- }
-
-// Start the timer for the current buffer
- update_timer->update();
- thread->get_window()->unlock_window();
- }
-}
-
-void PluginClient::render_gui(void *data, int size)
-{
- printf("PluginClient::render_gui %d\n", __LINE__);
-}
-
-
-
-
-
-
-
-
-int PluginClient::is_audio() { return 0; }
-int PluginClient::is_video() { return 0; }
-int PluginClient::is_theme() { return 0; }
-int PluginClient::uses_gui() { return 1; }
-int PluginClient::is_transition() { return 0; }
-int PluginClient::load_defaults()
-{
-// printf("PluginClient::load_defaults undefined in %s.\n", plugin_title());
- return 0;
-}
-
-int PluginClient::save_defaults()
-{
- save_defaults_xml();
-// printf("PluginClient::save_defaults undefined in %s.\n", plugin_title());
- return 0;
-}
-
-void PluginClient::load_defaults_xml()
-{
- char path[BCTEXTLEN];
- server->get_defaults_path(path);
- FileSystem fs;
- fs.complete_path(path);
- using_defaults = 1;
-//printf("PluginClient::load_defaults_xml %d %s\n", __LINE__, path);
-
- KeyFrame temp_keyframe;
- FILE *fd = fopen(path, "r");
- if(fd)
- {
- char *data = temp_keyframe.get_data();
- int data_size = fread(data, 1, MESSAGESIZE-1, fd);
- if( data_size < 0 ) data_size = 0;
- if( data_size > 0 )
- {
-// Get window extents
- int state = 0;
- for(int i = 0; i < data_size - 8; i++)
- {
- if(data[i] == '<') break;
- if(isdigit(data[i]))
- {
- if(state == 0)
- {
- window_x = atoi(data + i);
- state++;
- }
- else
- {
- window_y = atoi(data + i);
- break;
- }
- while(i < data_size && isdigit(data[i])) i++;
- }
- }
- data[data_size] = 0;
- read_data(&temp_keyframe);
- }
-
- fclose(fd);
- }
- using_defaults = 0;
-//printf("PluginClient::load_defaults_xml %d %s\n", __LINE__, path);
-}
-
-void PluginClient::save_defaults_xml()
-{
- char path[BCTEXTLEN];
- server->get_defaults_path(path);
- FileSystem fs;
- fs.complete_path(path);
- using_defaults = 1;
-
- KeyFrame temp_keyframe;
-
- save_data(&temp_keyframe);
- FILE *fd = fopen(path, "w");
- if(fd)
- {
- fprintf(fd, "%d\n%d\n", window_x, window_y);
- if(!fwrite(temp_keyframe.get_data(), strlen(temp_keyframe.get_data()), 1, fd))
- {
- fprintf(stderr, "PluginClient::save_defaults_xml %d \"%s\" %d bytes: %s\n",
- __LINE__,
- path,
- (int)strlen(temp_keyframe.get_data()),
- strerror(errno));
- }
-
- fclose(fd);
- }
- using_defaults = 0;
-}
-
-int PluginClient::is_defaults()
-{
- return using_defaults;
-}
-
-BC_Hash* PluginClient::get_defaults()
-{
- return defaults;
-}
-PluginClientThread* PluginClient::get_thread()
-{
- return thread;
-}
-
-BC_WindowBase* PluginClient::new_window()
-{
- printf("PluginClient::new_window undefined in %s.\n", plugin_title());
- return 0;
-}
-int PluginClient::get_parameters() { return 0; }
-int PluginClient::get_samplerate() { return get_project_samplerate(); }
-double PluginClient::get_framerate() { return get_project_framerate(); }
-int PluginClient::init_realtime_parameters() { return 0; }
-int PluginClient::delete_nonrealtime_parameters() { return 0; }
-int PluginClient::start_loop() { return 0; };
-int PluginClient::process_loop() { return 0; };
-int PluginClient::stop_loop() { return 0; };
-
-void PluginClient::set_interactive()
-{
- interactive = 1;
-}
-
-int64_t PluginClient::get_in_buffers(int64_t recommended_size)
-{
- return recommended_size;
-}
-
-int64_t PluginClient::get_out_buffers(int64_t recommended_size)
-{
- return recommended_size;
-}
-
-int PluginClient::get_gui_status()
-{
- return server->get_gui_status();
-}
-
-int PluginClient::start_plugin()
-{
- printf(_("No processing defined for this plugin.\n"));
- return 0;
-}
-
-// close event from client side
-void PluginClient::client_side_close()
-{
-// Last command executed
- server->client_side_close();
-}
-
-int PluginClient::stop_gui_client()
-{
- if(!client_gui_on) return 0;
- client_gui_on = 0;
- return 0;
-}
-
-int PluginClient::get_project_samplerate()
-{
- return server->get_project_samplerate();
-}
-
-double PluginClient::get_project_framerate()
-{
- return server->get_project_framerate();
-}
-
-
-void PluginClient::update_display_title()
-{
- server->generate_display_title(gui_string);
- set_string();
-}
-
-char* PluginClient::get_gui_string()
-{
- return gui_string;
-}
-
-
-char* PluginClient::get_path()
-{
- return server->path;
-}
-
-char* PluginClient::get_plugin_dir()
-{
- return server->preferences->plugin_dir;
-}
-
-int PluginClient::set_string_client(char *string)
-{
- strcpy(gui_string, string);
- set_string();
- return 0;
-}
-
-
-int PluginClient::get_interpolation_type()
-{
- return server->get_interpolation_type();
-}
-
-
-float PluginClient::get_red()
-{
- if(server->mwindow)
- return server->mwindow->edl->local_session->red;
- else
- if(server->edl)
- return server->edl->local_session->red;
- else
- return 0;
-}
-
-float PluginClient::get_green()
-{
- if(server->mwindow)
- return server->mwindow->edl->local_session->green;
- else
- if(server->edl)
- return server->edl->local_session->green;
- else
- return 0;
-}
-
-float PluginClient::get_blue()
-{
- if(server->mwindow)
- return server->mwindow->edl->local_session->blue;
- else
- if(server->edl)
- return server->edl->local_session->blue;
- else
- return 0;
-}
-
-
-
-int64_t PluginClient::get_source_position()
-{
- return source_position;
-}
-
-int64_t PluginClient::get_source_start()
-{
- return source_start;
-}
-
-int64_t PluginClient::get_total_len()
-{
- return total_len;
-}
-
-int PluginClient::get_direction()
-{
- return direction;
-}
-
-
-int64_t PluginClient::local_to_edl(int64_t position)
-{
- return position;
-}
-
-int64_t PluginClient::edl_to_local(int64_t position)
-{
- return position;
-}
-
-int PluginClient::get_use_opengl()
-{
- return server->get_use_opengl();
-}
-
-int PluginClient::get_total_buffers()
-{
- return total_in_buffers;
-}
-
-int PluginClient::get_buffer_size()
-{
- return in_buffer_size;
-}
-
-int PluginClient::get_project_smp()
-{
-//printf("PluginClient::get_project_smp %d %d\n", __LINE__, smp);
- return smp;
-}
-
-const char* PluginClient::get_defaultdir()
-{
- return BCASTDIR;
-}
-
-
-int PluginClient::send_hide_gui()
-{
-// Stop the GUI server and delete GUI messages
- client_gui_on = 0;
- return 0;
-}
-
-int PluginClient::send_configure_change()
-{
- if(server->mwindow)
- server->mwindow->undo->update_undo_before(_("tweek"), this);
-#ifdef USE_KEYFRAME_SPANNING
- KeyFrame keyframe;
- keyframe.copy_from(server->get_keyframe());
- save_data(&keyframe);
- server->apply_keyframe(&keyframe);
-#else
- KeyFrame* keyframe = server->get_keyframe();
-// Call save routine in plugin
- save_data(keyframe);
-#endif
- if(server->mwindow)
- server->mwindow->undo->update_undo_after(_("tweek"), LOAD_AUTOMATION);
- server->sync_parameters();
- return 0;
-}
-
-
-KeyFrame* PluginClient::get_prev_keyframe(int64_t position, int is_local)
-{
- if(is_local) position = local_to_edl(position);
- return server->get_prev_keyframe(position);
-}
-
-KeyFrame* PluginClient::get_next_keyframe(int64_t position, int is_local)
-{
- if(is_local) position = local_to_edl(position);
- return server->get_next_keyframe(position);
-}
-
-void PluginClient::get_camera(float *x, float *y, float *z, int64_t position)
-{
- server->get_camera(x, y, z, position, direction);
-}
-
-void PluginClient::get_projector(float *x, float *y, float *z, int64_t position)
-{
- server->get_projector(x, y, z, position, direction);
-}
-
-
-EDLSession* PluginClient::get_edlsession()
-{
- if(server->edl)
- return server->edl->session;
- return 0;
-}
-
-int PluginClient::gui_open()
-{
- return server->gui_open();
-}