#include "preferences.h"
#include "renderengine.h"
#include "track.h"
+#include "tracks.h"
#include "transportque.h"
#include <stdio.h>
PluginClientThread::~PluginClientThread()
{
- join();
delete window;
delete init_complete;
}
window->lock_window("PluginClientThread::run");
//printf("PluginClientThread::run %p %d\n", this, __LINE__);
window->hide_window(1);
+ client->save_defaults_xml(); // needs window lock
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();
/* This is needed when the GUI is closed from itself */
if(result) client->client_side_close();
}
client->window_x /* - w / 2 */, client->window_y /* - h / 2 */,
w, h, min_w, min_h, allow_resize, 0, 1)
{
+ char title[BCTEXTLEN];
+
this->client = client;
+
+// *** CONTEXT_HELP ***
+ if(client) {
+ strcpy(title, client->plugin_title());
+ if(! strcmp(title, "Overlay")) {
+ // "Overlay" plugin title is ambiguous
+ if(client->is_audio()) strcat(title, " \\(Audio\\)");
+ if(client->is_video()) strcat(title, " \\(Video\\)");
+ }
+ if(client->server->is_ffmpeg()) {
+ // FFmpeg plugins can be audio or video
+ if(client->is_audio())
+ strcpy(title, "FFmpeg Audio Plugins");
+ if(client->is_video())
+ strcpy(title, "FFmpeg Video Plugins");
+ }
+ context_help_set_keyword(title);
+ }
}
PluginClientWindow::PluginClientWindow(const char *title,
: BC_Window(title, x, y, w, h, min_w, min_h, allow_resize, 0, 1)
{
this->client = 0;
+// *** CONTEXT_HELP ***
+ context_help_set_keyword(title);
}
PluginClientWindow::~PluginClientWindow()
{
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();
}
}
PluginClientFrame* PluginClient::get_gui_frame(double pos, int dir)
{
- return frame_buffer.get_gui_frame(pos, dir);
+ return client_frames.get_gui_frame(pos, dir);
}
PluginClientFrame* PluginClient::next_gui_frame()
{
- return frame_buffer.first;
+ return client_frames.first;
}
{
}
-int PluginClient::pending_gui_frames()
+int PluginClient::pending_gui_frame()
{
- PluginClientFrame *frame = frame_buffer.first;
+ PluginClientFrame *frame = client_frames.first;
if( !frame ) return 0;
double tracking_position = get_tracking_position();
int direction = get_tracking_direction();
return ret;
}
+int PluginClient::pending_gui_frames()
+{
+ PluginClientFrame *frame = client_frames.first;
+ if( !frame ) return 0;
+ double tracking_position = get_tracking_position();
+ int direction = get_tracking_direction();
+ int count = 0;
+ while( frame && !(direction == PLAY_REVERSE ?
+ frame->position < tracking_position :
+ frame->position > tracking_position) ) {
+ ++count; frame=frame->next;
+ }
+ return count;
+}
+
void PluginClient::add_gui_frame(PluginClientFrame *frame)
{
- frame_buffer.add_gui_frame(frame);
+ client_frames.add_gui_frame(frame);
+}
+int PluginClient::get_gui_frames()
+{
+ return client_frames.total();
}
double PluginClient::get_tracking_position()
void PluginClient::send_render_gui()
{
- server->send_render_gui(&frame_buffer);
+ server->send_render_gui(&client_frames);
}
void PluginClient::send_render_gui(void *data)
BC_WindowBase *window = thread->get_window();
if( !window ) return;
window->lock_window("PluginClient::plugin_reset_gui_frames");
- frame_buffer.reset();
+ client_frames.reset();
window->unlock_window();
}
BC_WindowBase *window = thread->get_window();
if( !window ) return;
window->lock_window("PluginClient::render_gui");
- while( frame_buffer.count > MAX_FRAME_BUFFER )
+ while( client_frames.count > MAX_FRAME_BUFFER )
delete get_gui_frame(0, 0);
-// append client frames to gui frame_buffer, consumes frames
- frame_buffer.concatenate(frames);
- frame_buffer.sort_position(get_tracking_direction());
+// append client frames to gui client_frames, consumes frames
+ client_frames.concatenate(frames);
+ client_frames.sort_position(get_tracking_direction());
update_timer->update();
window->unlock_window();
}
const char *PluginClient::get_source_path()
{
- if( server->plugin ) return 0;
- int64_t source_position = server->plugin->startproject;
- Edit *edit = server->plugin->track->edits->editof(source_position,PLAY_FORWARD,0);
+ Plugin *plugin = server->edl->tracks->plugin_exists(server->plugin_id);
+ int64_t source_position = plugin->startproject;
+ Edit *edit = plugin->track->edits->editof(source_position,PLAY_FORWARD,0);
Indexable *indexable = edit ? edit->get_source() : 0;
return indexable ? indexable->path : 0;
}
return server->get_use_opengl();
}
+int PluginClient::to_ram(VFrame *vframe)
+{
+ return server->to_ram(vframe);
+}
+
int PluginClient::get_total_buffers()
{
return total_in_buffers;
if(server->mwindow)
server->mwindow->undo->update_undo_before(_("tweek"), this);
#ifdef USE_KEYFRAME_SPANNING
- KeyFrame keyframe;
+ EDL *edl = server->edl;
+ Plugin *plugin = edl->tracks->plugin_exists(server->plugin_id);
+ KeyFrames *keyframes = plugin ? plugin->keyframes : 0;
+ KeyFrame keyframe(edl, keyframes);
save_data(&keyframe);
- server->apply_keyframe(&keyframe);
+ server->apply_keyframe(plugin, &keyframe);
#else
KeyFrame* keyframe = server->get_keyframe();
// Call save routine in plugin
return 0;
}
+// virtual default spanning keyframe update. If a range is selected,
+// then changed parameters are copied to (prev + selected) keyframes.
+// redefine per client for custom keyframe updates, see tracer, sketcher, crikey
+void PluginClient::span_keyframes(KeyFrame *src, int64_t start, int64_t end)
+{
+ src->span_keyframes(start, end);
+}
+
KeyFrame* PluginClient::get_prev_keyframe(int64_t position, int is_local)
{
EDL *edl = get_edl();
projector_x += edl->session->output_w / 2;
projector_y += edl->session->output_h / 2;
- Track *track = server->plugin ? server->plugin->track : 0;
+ Plugin *plugin = edl->tracks->plugin_exists(server->plugin_id);
+ Track *track = plugin ? plugin->track : 0;
int track_w = track ? track->track_w : edl->session->output_w;
int track_h = track ? track->track_h : edl->session->output_h;
tx = (ox - projector_x) / projector_z + track_w / 2;
EDL *edl = get_edl();
projector_x += edl->session->output_w / 2;
projector_y += edl->session->output_h / 2;
- Track *track = server->plugin ? server->plugin->track : 0;
+ Plugin *plugin = edl->tracks->plugin_exists(server->plugin_id);
+ Track *track = plugin ? plugin->track : 0;
int track_w = track ? track->track_w : edl->session->output_w;
int track_h = track ? track->track_h : edl->session->output_h;
ox = (tx - track_w / 2) * projector_z + projector_x;
return server->gui_open();
}
+