-
+
/*
* 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 "bcsignals.h"
#include "clip.h"
#include "condition.h"
+#include "edits.h"
+#include "edit.h"
#include "edl.h"
#include "edlsession.h"
#include "file.h"
#include "filesystem.h"
+#include "indexable.h"
#include "language.h"
#include "localsession.h"
#include "mainundo.h"
#include "mwindow.h"
+#include "plugin.h"
#include "pluginclient.h"
#include "pluginserver.h"
#include "preferences.h"
+#include "track.h"
#include "transportque.inc"
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();
if(!window)
- window = client->new_window();
+ window = (PluginClientWindow*)client->new_window();
if(window) {
window->lock_window("PluginClientThread::run");
//printf("PluginClientThread::run %p %d\n", this, __LINE__);
window->hide_window(1);
window->unlock_window();
+ window->done_event(result);
// Can't save defaults in the destructor because it's not called immediately
// after closing.
/* if(client->defaults) */ client->save_defaults_xml();
-PluginClientFrame::PluginClientFrame(int data_size,
- int period_n,
+PluginClientFrame::PluginClientFrame(int data_size,
+ int period_n,
int period_d)
{
this->data_size = data_size;
PluginClientFrame::~PluginClientFrame()
{
-
+
}
-PluginClientWindow::PluginClientWindow(PluginClient *client,
+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 */,
+ : 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,
+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)
{
{
reset();
this->server = server;
- smp = server->preferences->processors;
+ smp = server->preferences->project_smp;
defaults = 0;
update_timer = new Timer;
// Virtual functions don't work here.
}
// For realtime plugins initialize buffers
-int PluginClient::plugin_init_realtime(int realtime_priority,
+int PluginClient::plugin_init_realtime(int realtime_priority,
int total_in_buffers,
int buffer_size)
{
return 0;
}
-int PluginClient::plugin_start_loop(int64_t start,
- int64_t end,
- int64_t buffer_size,
+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",
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;
- }
+ if( !thread->window ) return 1;
+ thread->window->init_wait();
return 0;
}
void PluginClient::plugin_update_gui()
{
-
+
update_gui();
-
+
// Delete unused GUI frames
while(frame_buffer.size() > MAX_FRAME_BUFFER)
frame_buffer.remove_object_number(0);
if(frame_buffer.size())
{
PluginClientFrame *frame = frame_buffer.get(0);
- int total_frames = update_timer->get_difference() *
- frame->period_d /
- frame->period_n /
+ 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 /
+ 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__,
+// 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,
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*> *src =
(ArrayList<PluginClientFrame*>*)data;
// Shift GUI data to GUI client
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();
int PluginClient::is_theme() { return 0; }
int PluginClient::uses_gui() { return 1; }
int PluginClient::is_transition() { return 0; }
-int PluginClient::load_defaults()
+int PluginClient::load_defaults()
{
// printf("PluginClient::load_defaults undefined in %s.\n", plugin_title());
- return 0;
+ return 0;
}
-int PluginClient::save_defaults()
-{
+int PluginClient::save_defaults()
+{
save_defaults_xml();
// printf("PluginClient::save_defaults undefined in %s.\n", plugin_title());
- return 0;
+ return 0;
}
-void PluginClient::load_defaults_xml()
+void PluginClient::load_defaults_xml()
{
char path[BCTEXTLEN];
server->get_defaults_path(path);
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)
//printf("PluginClient::load_defaults_xml %d %s\n", __LINE__, path);
}
-void PluginClient::save_defaults_xml()
+void PluginClient::save_defaults_xml()
{
char path[BCTEXTLEN];
server->get_defaults_path(path);
return thread;
}
-BC_WindowBase* PluginClient::new_window()
-{
+BC_WindowBase* PluginClient::new_window()
+{
printf("PluginClient::new_window undefined in %s.\n", plugin_title());
- return 0;
+ return 0;
}
int PluginClient::get_parameters() { return 0; }
int PluginClient::get_samplerate() { return get_project_samplerate(); }
return server->get_project_framerate();
}
+const char *PluginClient::get_source_path()
+{
+ int64_t source_position = server->plugin->startproject;
+ Edit *edit = server->plugin->track->edits->editof(source_position,PLAY_FORWARD,0);
+ Indexable *indexable = edit ? edit->get_source() : 0;
+ return indexable ? indexable->path : 0;
+}
+
void PluginClient::update_display_title()
{
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;
+ EDL *edl = server->mwindow ? server->mwindow->edl : server->edl;
+ return !edl ? 0 : edl->local_session->use_max ?
+ edl->local_session->red_max :
+ edl->local_session->red;
}
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;
+ EDL *edl = server->mwindow ? server->mwindow->edl : server->edl;
+ return !edl ? 0 : edl->local_session->use_max ?
+ edl->local_session->green_max :
+ edl->local_session->green;
}
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;
+ EDL *edl = server->mwindow ? server->mwindow->edl : server->edl;
+ return !edl ? 0 : edl->local_session->use_max ?
+ edl->local_session->blue_max :
+ edl->local_session->blue;
}
-
int64_t PluginClient::get_source_position()
{
return source_position;
EDLSession* PluginClient::get_edlsession()
{
- if(server->edl)
+ if(server->edl)
return server->edl->session;
return 0;
}