X-Git-Url: https://git.cinelerra-gg.org/git/?a=blobdiff_plain;ds=inline;f=cinelerra-5.1%2Fcinelerra%2Fctracking.C;fp=cinelerra-5.1%2Fcinelerra%2Fctracking.C;h=5de2a20c578420fda5b068b0faf7cba6c43985d1;hb=30bdb85eb33a8ee7ba675038a86c6be59c43d7bd;hp=0000000000000000000000000000000000000000;hpb=52fcc46226f9df46f9ce9d0566dc568455a7db0b;p=goodguy%2Fhistory.git diff --git a/cinelerra-5.1/cinelerra/ctracking.C b/cinelerra-5.1/cinelerra/ctracking.C new file mode 100644 index 00000000..5de2a20c --- /dev/null +++ b/cinelerra-5.1/cinelerra/ctracking.C @@ -0,0 +1,178 @@ + +/* + * CINELERRA + * Copyright (C) 2008 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 "bcsignals.h" +#include "cplayback.h" +#include "ctimebar.h" +#include "ctracking.h" +#include "cwindow.h" +#include "cwindowgui.h" +#include "edl.h" +#include "edlsession.h" +#include "localsession.h" +#include "mainclock.h" +#include "maincursor.h" +#include "mtimebar.h" +#include "mwindow.h" +#include "mwindowgui.h" +#include "patchbay.h" +#include "trackcanvas.h" +#include "transportque.h" +#include "zoombar.h" + +CTracking::CTracking(MWindow *mwindow, CWindow *cwindow) + : Tracking(mwindow) +{ + this->cwindow = cwindow; +} + +CTracking::~CTracking() +{ +} + +PlaybackEngine* CTracking::get_playback_engine() +{ + return cwindow->playback_engine; +} + +int CTracking::start_playback(double new_position, int active) +{ + mwindow->gui->set_playing_back(1); + if( active ) + mwindow->edl->local_session->set_playback_start(new_position); + return Tracking::start_playback(new_position); +} + +int CTracking::stop_playback() +{ + mwindow->gui->set_playing_back(0); + Tracking::stop_playback(); + mwindow->edl->local_session->set_playback_end(get_tracking_position()); + return 0; +} + +#define SCROLL_THRESHOLD .5 + + +int CTracking::update_scroll(double position) +{ + int updated_scroll = 0; + + if(mwindow->edl->session->view_follows_playback) + { + TimelinePane *pane = mwindow->gui->get_focused_pane(); + double seconds_per_pixel = (double)mwindow->edl->local_session->zoom_sample / + mwindow->edl->session->sample_rate; + double half_canvas = seconds_per_pixel * + pane->canvas->get_w() / 2; + double midpoint = mwindow->edl->local_session->view_start[pane->number] * + seconds_per_pixel + + half_canvas; + + if(get_playback_engine()->command->get_direction() == PLAY_FORWARD) + { + double left_boundary = midpoint + SCROLL_THRESHOLD * half_canvas; + double right_boundary = midpoint + half_canvas; + + if(position > left_boundary && + position < right_boundary) + { + int pixels = Units::to_int64((position - left_boundary) * + mwindow->edl->session->sample_rate / + mwindow->edl->local_session->zoom_sample); + if(pixels) + { + mwindow->move_right(pixels); +//printf("CTracking::update_scroll 1 %d\n", pixels); + updated_scroll = 1; + } + } + } + else + { + double right_boundary = midpoint - SCROLL_THRESHOLD * half_canvas; + double left_boundary = midpoint - half_canvas; + + if(position < right_boundary && + position > left_boundary && + mwindow->edl->local_session->view_start > 0) + { + int pixels = Units::to_int64((right_boundary - position) * + mwindow->edl->session->sample_rate / + mwindow->edl->local_session->zoom_sample); + if(pixels) + { + mwindow->move_left(pixels); + updated_scroll = 1; + } + } + } + } + + return updated_scroll; +} + +void CTracking::update_tracker(double position) +{ + int updated_scroll = 0; + cwindow->gui->lock_window("CTracking::update_tracker 1"); + +// This is going to boost the latency but we need to update the timebar + cwindow->gui->timebar->update(1); +// cwindow->gui->timebar->flash(); + cwindow->gui->unlock_window(); + +// Update mwindow cursor + mwindow->gui->lock_window("CTracking::update_tracker 2"); + + mwindow->edl->local_session->set_selectionstart(position); + mwindow->edl->local_session->set_selectionend(position); + + updated_scroll = update_scroll(position); + + mwindow->gui->mainclock->update(position); + mwindow->gui->update_patchbay(); + mwindow->gui->update_timebar(0); + + if(!updated_scroll) + { + mwindow->gui->update_cursor(); + // we just need to update clocks, not everything + mwindow->gui->zoombar->update_clocks(); + + for(int i = 0; i < TOTAL_PANES; i++) + if(mwindow->gui->pane[i]) + mwindow->gui->pane[i]->canvas->flash(0); + } + + mwindow->gui->flush(); + mwindow->gui->unlock_window(); + +// Plugin GUI's hold lock on mwindow->gui here during user interface handlers. + mwindow->update_plugin_guis(); + + + update_meters((int64_t)(position * mwindow->edl->session->sample_rate)); +} + +void CTracking::draw() +{ +}