4 * Copyright (C) 1997-2014 Adam Williams <broadcast at earthling dot net>
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
23 #include "condition.h"
24 #include "cplayback.h"
26 #include "cwindowgui.h"
28 #include "edlsession.h"
29 #include "levelwindow.h"
30 #include "levelwindowgui.h"
31 #include "localsession.h"
32 #include "mainclock.h"
33 #include "meterpanel.h"
35 #include "mwindowgui.h"
38 #include "playbackengine.h"
39 #include "renderengine.h"
40 #include "mainsession.h"
41 #include "trackcanvas.h"
51 Tracking::Tracking(MWindow *mwindow)
54 this->mwindow = mwindow;
56 startup_lock = new Condition(0, "Tracking::startup_lock");
65 // Not working in NPTL for some reason
74 void Tracking::create_objects()
79 int Tracking::start_playback(double new_position)
83 last_position = new_position;
87 startup_lock->lock("Tracking::start_playback");
92 int Tracking::stop_playback()
98 // Not working in NPTL for some reason
102 // Final position is updated continuously during playback
103 // Get final position
104 double position = get_tracking_position();
106 update_tracker(position);
114 PlaybackEngine* Tracking::get_playback_engine()
116 return mwindow->cwindow->playback_engine;
119 double Tracking::get_tracking_position()
121 return get_playback_engine()->get_tracking_position();
124 void Tracking::update_meters(int64_t position)
126 double output_levels[MAXCHANNELS];
127 int do_audio = get_playback_engine()->get_output_levels(output_levels, position);
131 module_levels.remove_all();
132 get_playback_engine()->get_module_levels(&module_levels, position);
134 mwindow->cwindow->gui->lock_window("Tracking::update_meters 1");
135 mwindow->cwindow->gui->meters->update(output_levels);
136 mwindow->cwindow->gui->unlock_window();
138 mwindow->lwindow->gui->lock_window("Tracking::update_meters 2");
139 mwindow->lwindow->gui->panel->update(output_levels);
140 mwindow->lwindow->gui->unlock_window();
142 mwindow->gui->lock_window("Tracking::update_meters 3");
143 mwindow->gui->update_meters(&module_levels);
144 mwindow->gui->unlock_window();
148 void Tracking::stop_meters()
150 mwindow->cwindow->gui->lock_window("Tracking::stop_meters 1");
151 mwindow->cwindow->gui->meters->stop_meters();
152 mwindow->cwindow->gui->unlock_window();
154 mwindow->gui->lock_window("Tracking::stop_meters 2");
155 mwindow->gui->stop_meters();
156 mwindow->gui->unlock_window();
158 mwindow->lwindow->gui->lock_window("Tracking::stop_meters 3");
159 mwindow->lwindow->gui->panel->stop_meters();
160 mwindow->lwindow->gui->unlock_window();
166 void Tracking::update_tracker(double position)
170 void Tracking::draw()
172 // gui->lock_window("Tracking::draw");
175 // pixel = get_pixel(last_position);
178 // gui->canvas->set_color(GREEN);
179 // gui->canvas->set_inverse();
180 // gui->canvas->draw_line(pixel, 0, pixel, gui->canvas->get_h());
181 // gui->canvas->set_opaque();
182 // gui->canvas->flash(pixel, 0, pixel + 1, gui->canvas->get_h());
184 // gui->unlock_window();
190 startup_lock->unlock();
195 Thread::enable_cancel();
196 timer.delay(1000 / TRACKING_RATE);
197 Thread::disable_cancel();
202 // can be stopped during wait
203 if(get_playback_engine()->tracking_active)
205 // Get position of cursor
206 position = get_tracking_position();
209 update_tracker(position);