X-Git-Url: http://git.cinelerra-gg.org/git/?p=goodguy%2Fhistory.git;a=blobdiff_plain;f=cinelerra-5.1%2Fcinelerra%2Fpluginclient.C;h=7f1fdd04323959926339ba8bc5ad108803b207ea;hp=c401ef22dd19634f00196342d573505251256491;hb=a19a685a46ddc630010788707d9e5b9d2342af46;hpb=50a589b1decdd353a984d8a710e064ebaf8b4f7b diff --git a/cinelerra-5.1/cinelerra/pluginclient.C b/cinelerra-5.1/cinelerra/pluginclient.C index c401ef22..7f1fdd04 100644 --- a/cinelerra-5.1/cinelerra/pluginclient.C +++ b/cinelerra-5.1/cinelerra/pluginclient.C @@ -1,22 +1,22 @@ - + /* * CINELERRA * Copyright (C) 1997-2011 Adam Williams - * + * * 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" @@ -24,16 +24,23 @@ #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 "filexml.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" @@ -55,8 +62,9 @@ PluginClientThread::PluginClientThread(PluginClient *client) PluginClientThread::~PluginClientThread() { -//printf("PluginClientThread::~PluginClientThread %p %d\n", this, __LINE__); join(); +//printf("PluginClientThread::~PluginClientThread %p %d\n", this, __LINE__); + delete window; window = 0; //printf("PluginClientThread::~PluginClientThread %p %d\n", this, __LINE__); delete init_complete; } @@ -67,10 +75,10 @@ void PluginClientThread::run() 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 = (PluginClientWindow*)client->new_window(); - if(window) - { + if(window) { window->lock_window("PluginClientThread::run"); window->create_objects(); window->unlock_window(); @@ -84,7 +92,7 @@ void PluginClientThread::run() //printf("PluginClientThread::run %p %d\n", this, __LINE__); window->hide_window(1); window->unlock_window(); - delete window; window = 0; + 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(); @@ -114,8 +122,8 @@ PluginClient* PluginClientThread::get_client() -PluginClientFrame::PluginClientFrame(int data_size, - int period_n, +PluginClientFrame::PluginClientFrame(int data_size, + int period_n, int period_d) { this->data_size = data_size; @@ -126,30 +134,31 @@ PluginClientFrame::PluginClientFrame(int data_size, 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) +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 */, + (int)(w*get_resources()->font_scale+0.5), (int)(h*get_resources()->font_scale+0.5), + (int)(min_w*get_resources()->font_scale+0.5), (int)(min_h*get_resources()->font_scale+0.5), + 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) + : BC_Window(title, x, y, + (int)(w*get_resources()->font_scale+0.5), (int)(h*get_resources()->font_scale+0.5), + (int)(min_w*get_resources()->font_scale+0.5), (int)(min_h*get_resources()->font_scale+0.5), + allow_resize, 0, 1) { this->client = 0; } @@ -185,7 +194,7 @@ PluginClient::PluginClient(PluginServer *server) { 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. @@ -193,8 +202,11 @@ PluginClient::PluginClient(PluginServer *server) PluginClient::~PluginClient() { -// Delete the GUI thread. The GUI must be hidden with hide_gui first. - delete thread; + if( thread ) { + hide_gui(); + thread->join(); + delete thread; + } // Virtual functions don't work here. if(defaults) delete defaults; @@ -237,12 +249,11 @@ void 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 PluginClient::plugin_init_realtime(int realtime_priority, int total_in_buffers, int buffer_size) { @@ -261,9 +272,9 @@ int PluginClient::plugin_init_realtime(int realtime_priority, 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", @@ -330,14 +341,8 @@ int PluginClient::show_gui() 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; } @@ -386,9 +391,9 @@ void PluginClient::end_process_buffer() void PluginClient::plugin_update_gui() { - + update_gui(); - + // Delete unused GUI frames while(frame_buffer.size() > MAX_FRAME_BUFFER) frame_buffer.remove_object_number(0); @@ -404,17 +409,17 @@ 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 / + 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, @@ -484,12 +489,12 @@ 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 *src = + ArrayList *src = (ArrayList*)data; // Shift GUI data to GUI client @@ -498,7 +503,7 @@ void PluginClient::render_gui(void *data) 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(); @@ -522,20 +527,20 @@ 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() +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); @@ -543,47 +548,44 @@ void PluginClient::load_defaults_xml() 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); + FILE *fp = fopen(path, "r"); + if( fp ) { + struct stat st; int fd = fileno(fp); + int64_t sz = !fstat(fd, &st) ? st.st_size : BCTEXTLEN; + char *data = temp_keyframe.get_data(sz+1); + int data_size = fread(data, 1, sz, fp); if( data_size < 0 ) data_size = 0; - if( data_size > 0 ) - { + if( data_size > 0 ) { + data[data_size] = 0; + temp_keyframe.xbuf->oseek(data_size); // 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++; + int i = 0; + for( int state=0; i<(data_size-8) && state>=0; ++i ) { + if( !data[i] || data[i] == '<' ) break; + if( !isdigit(data[i]) ) continue; + if( !state ) { + window_x = atoi(data + i); + state = 1; + } + else { + window_y = atoi(data + i); + state = -1; } + while( iiseek(i); read_data(&temp_keyframe); } - fclose(fd); + fclose(fp); } using_defaults = 0; //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); @@ -592,23 +594,21 @@ void PluginClient::save_defaults_xml() 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)) - { + + const char *data = temp_keyframe.get_data(); + int len = strlen(data); + FILE *fp = fopen(path, "w"); + + if( fp ) { + fprintf(fp, "%d\n%d\n", window_x, window_y); + if( len > 0 && !fwrite(data, len, 1, fp) ) { fprintf(stderr, "PluginClient::save_defaults_xml %d \"%s\" %d bytes: %s\n", - __LINE__, - path, - (int)strlen(temp_keyframe.get_data()), - strerror(errno)); + __LINE__, path, len, strerror(errno)); } - - fclose(fd); + fclose(fp); } + using_defaults = 0; } @@ -626,10 +626,10 @@ PluginClientThread* PluginClient::get_thread() 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(); } @@ -660,12 +660,6 @@ 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() { @@ -690,6 +684,14 @@ double PluginClient::get_project_framerate() 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() { @@ -729,39 +731,29 @@ int PluginClient::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; + 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; @@ -816,7 +808,7 @@ int PluginClient::get_project_smp() const char* PluginClient::get_defaultdir() { - return BCASTDIR; + return File::get_plugin_path(); } @@ -833,7 +825,6 @@ int PluginClient::send_configure_change() 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 @@ -873,7 +864,7 @@ void PluginClient::get_projector(float *x, float *y, float *z, int64_t position) EDLSession* PluginClient::get_edlsession() { - if(server->edl) + if(server->edl) return server->edl->session; return 0; }