5 #include "playbackengine.h"
6 #include "playtransport.h"
7 #include "preferences.h"
9 #include "transportque.h"
11 #include "localsession.h"
15 PlayTransport::PlayTransport(MWindow *mwindow,
16 BC_WindowBase *subwindow,
20 this->subwindow = subwindow;
21 this->mwindow = mwindow;
29 PlayTransport::~PlayTransport()
32 delete frame_forward_play;
34 delete frame_reverse_play;
42 void PlayTransport::set_engine(PlaybackEngine *engine)
44 this->engine = engine;
47 void PlayTransport::set_slider(BC_Slider *slider)
49 this->slider = slider;
52 int PlayTransport::get_transport_width(MWindow *mwindow)
54 //printf("PlayTransport::get_transport_width %p\n", mwindow->theme->rewind_data);
55 return mwindow->theme->stop_data[0]->get_w() * 7 +
56 mwindow->theme->rewind_data[0]->get_w() * 2;
59 int PlayTransport::create_objects()
61 int x = this->x, y = this->y;
62 subwindow->add_subwindow(rewind_button = new RewindButton(mwindow, this, x, y));
63 x += rewind_button->get_w();
64 subwindow->add_subwindow(fast_reverse = new FastReverseButton(mwindow, this, x, y));
65 x += fast_reverse->get_w();
66 subwindow->add_subwindow(reverse_play = new ReverseButton(mwindow, this, x, y));
67 x += reverse_play->get_w();
68 subwindow->add_subwindow(frame_reverse_play = new FrameReverseButton(mwindow, this, x, y));
69 x += frame_reverse_play->get_w();
70 subwindow->add_subwindow(stop_button = new StopButton(mwindow, this, x, y));
71 x += stop_button->get_w();
72 subwindow->add_subwindow(frame_forward_play = new FramePlayButton(mwindow, this, x, y));
73 x += frame_forward_play->get_w();
74 subwindow->add_subwindow(forward_play = new PlayButton(mwindow, this, x, y));
75 x += forward_play->get_w();
76 subwindow->add_subwindow(fast_play = new FastPlayButton(mwindow, this, x, y));
77 x += fast_play->get_w();
78 subwindow->add_subwindow(end_button = new EndButton(mwindow, this, x, y));
79 x += end_button->get_w();
87 void PlayTransport::reposition_buttons(int x, int y)
91 rewind_button->reposition_window(x, y);
92 x += rewind_button->get_w();
93 fast_reverse->reposition_window(x, y);
94 x += fast_reverse->get_w();
95 reverse_play->reposition_window(x, y);
96 x += reverse_play->get_w();
97 frame_reverse_play->reposition_window(x, y);
98 x += frame_reverse_play->get_w();
99 stop_button->reposition_window(x, y);
100 x += stop_button->get_w();
101 frame_forward_play->reposition_window(x, y);
102 x += frame_forward_play->get_w();
103 forward_play->reposition_window(x, y);
104 x += forward_play->get_w();
105 fast_play->reposition_window(x, y);
106 x += fast_play->get_w();
107 end_button->reposition_window(x, y);
108 x += end_button->get_w();
111 int PlayTransport::get_w()
113 return end_button->get_x() + end_button->get_w() - rewind_button->get_x();
116 int PlayTransport::flip_vertical(int vertical, int &x, int &y)
120 rewind_button->reposition_window(x, y);
121 y += rewind_button->get_h();
122 fast_reverse->reposition_window(x, y);
123 y += fast_reverse->get_h();
124 reverse_play->reposition_window(x, y);
125 y += reverse_play->get_h();
126 frame_reverse_play->reposition_window(x, y);
127 y += frame_reverse_play->get_h();
128 stop_button->reposition_window(x, y);
129 y += stop_button->get_h();
130 frame_forward_play->reposition_window(x, y);
131 y += frame_forward_play->get_h();
132 forward_play->reposition_window(x, y);
133 y += forward_play->get_h();
134 fast_play->reposition_window(x, y);
135 y += fast_play->get_h();
136 end_button->reposition_window(x, y);
137 y += end_button->get_h();
141 rewind_button->reposition_window(x, y - 2);
142 x += rewind_button->get_w();
143 fast_reverse->reposition_window(x, y - 2);
144 x += fast_reverse->get_w();
145 reverse_play->reposition_window(x, y - 2);
146 x += reverse_play->get_w();
147 frame_reverse_play->reposition_window(x, y - 2);
148 x += frame_reverse_play->get_w();
149 stop_button->reposition_window(x, y - 2);
150 x += stop_button->get_w();
151 frame_forward_play->reposition_window(x, y - 2);
152 x += frame_forward_play->get_w();
153 forward_play->reposition_window(x, y - 2);
154 x += forward_play->get_w();
155 fast_play->reposition_window(x, y - 2);
156 x += fast_play->get_w();
157 end_button->reposition_window(x, y - 2);
158 x += end_button->get_w();
164 int PlayTransport::keypress_event()
167 if(subwindow->shift_down())
169 switch(subwindow->get_keypress())
172 subwindow->lock_window("PlayTransport::keypress_event 1");
175 subwindow->unlock_window();
178 subwindow->lock_window("PlayTransport::keypress_event 2");
181 subwindow->unlock_window();
187 subwindow->unlock_window();
189 if (subwindow->ctrl_down())
191 switch(subwindow->get_keypress())
205 if (get_edl()->local_session->in_point > 0)
206 get_edl()->local_session->selectionstart = get_edl()->local_session->in_point;
207 if (get_edl()->local_session->out_point > 0)
208 get_edl()->local_session->selectionend = get_edl()->local_session->out_point;
216 switch(subwindow->get_keypress())
218 case KPPLUS: handle_transport(FAST_REWIND); result = 1; break;
219 case KP6: handle_transport(NORMAL_REWIND); result = 1; break;
220 case KP5: handle_transport(SLOW_REWIND); result = 1; break;
221 case KP4: handle_transport(SINGLE_FRAME_REWIND); result = 1; break;
222 case KP1: handle_transport(SINGLE_FRAME_FWD); result = 1; break;
223 case KP2: handle_transport(SLOW_FWD); result = 1; break;
224 case KP3: handle_transport(NORMAL_FWD); result = 1; break;
225 case KPENTER: handle_transport(FAST_FWD); result = 1; break;
226 case KPINS: handle_transport(STOP); result = 1; break;
227 case ' ': handle_transport(NORMAL_FWD); result = 1; break;
228 case 'k': handle_transport(STOP); result = 1; break;
230 subwindow->lock_window("PlayTransport::keypress_event 3");
233 subwindow->unlock_window();
236 subwindow->lock_window("PlayTransport::keypress_event 4");
239 subwindow->unlock_window();
243 subwindow->lock_window("PlayTransport::keypress_event 5");
249 void PlayTransport::goto_start()
251 handle_transport(REWIND, 1);
254 void PlayTransport::goto_end()
256 handle_transport(GOTO_END, 1);
261 void PlayTransport::handle_transport(int command, int wait_tracking)
263 //printf("PlayTransport::handle_transport 1\n");
264 if(!get_edl()) return;
265 //printf("PlayTransport::handle_transport 2 %d\n", command);
273 case SINGLE_FRAME_REWIND:
274 case SINGLE_FRAME_FWD:
279 //printf("PlayTransport::handle_transport 3 %d %d\n", engine->command->command, command);
280 if(engine->command->command == command &&
281 !engine->command->single_frame())
283 //printf("PlayTransport::handle_transport 4 %d\n", command);
284 engine->que->send_command(STOP,
288 engine->interrupt_playback(wait_tracking);
291 // Resume or change direction
292 if(engine->command->command != STOP &&
293 engine->command->command != COMMAND_NONE &&
294 engine->command->command != SINGLE_FRAME_FWD &&
295 engine->command->command != SINGLE_FRAME_REWIND)
297 //printf("PlayTransport::handle_transport 5 %d\n", command);
298 engine->que->send_command(STOP,
302 //printf("PlayTransport::handle_transport 3\n");
303 engine->interrupt_playback(wait_tracking);
304 //printf("PlayTransport::handle_transport 4\n");
305 engine->que->send_command(command,
310 //printf("PlayTransport::handle_transport 5\n");
313 // Start from scratch
315 //printf("PlayTransport::handle_transport 6 %d\n", command);
316 engine->que->send_command(command,
327 engine->que->send_command(STOP,
331 engine->interrupt_playback(wait_tracking);
336 EDL* PlayTransport::get_edl()
341 int PlayTransport::pause_transport()
343 if(active_button) active_button->set_mode(PLAY_MODE);
348 int PlayTransport::reset_transport()
350 fast_reverse->set_mode(PLAY_MODE);
351 reverse_play->set_mode(PLAY_MODE);
352 forward_play->set_mode(PLAY_MODE);
353 frame_reverse_play->set_mode(PLAY_MODE);
354 frame_forward_play->set_mode(PLAY_MODE);
355 fast_play->set_mode(PLAY_MODE);
359 PTransportButton::PTransportButton(MWindow *mwindow, PlayTransport *transport, int x, int y, VFrame **data)
360 : BC_Button(x, y, data)
362 this->mwindow = mwindow;
363 this->transport = transport;
366 PTransportButton::~PTransportButton()
370 int PTransportButton::set_mode(int mode)
377 RewindButton::RewindButton(MWindow *mwindow, PlayTransport *transport, int x, int y)
378 : PTransportButton(mwindow, transport, x, y, mwindow->theme->rewind_data)
380 set_tooltip(_("Rewind ( Home )"));
382 int RewindButton::handle_event()
385 transport->goto_start();
390 FastReverseButton::FastReverseButton(MWindow *mwindow, PlayTransport *transport, int x, int y)
391 : PTransportButton(mwindow, transport, x, y, mwindow->theme->fastrev_data)
393 set_tooltip(_("Fast reverse ( + )"));
395 int FastReverseButton::handle_event()
398 transport->handle_transport(FAST_REWIND);
399 lock_window("FastReverseButton::handle_event");
403 // Reverse playback normal speed
405 ReverseButton::ReverseButton(MWindow *mwindow, PlayTransport *transport, int x, int y)
406 : PTransportButton(mwindow, transport, x, y, mwindow->theme->reverse_data)
408 set_tooltip(_("Normal reverse ( 6 )"));
410 int ReverseButton::handle_event()
413 transport->handle_transport(NORMAL_REWIND);
414 lock_window("ReverseButton::handle_event");
418 // Reverse playback one frame
420 FrameReverseButton::FrameReverseButton(MWindow *mwindow, PlayTransport *transport, int x, int y)
421 : PTransportButton(mwindow, transport, x, y, mwindow->theme->framerev_data)
423 set_tooltip(_("Frame reverse ( 4 )"));
425 int FrameReverseButton::handle_event()
428 transport->handle_transport(SINGLE_FRAME_REWIND);
429 lock_window("FrameReverseButton::handle_event");
433 // forward playback normal speed
435 PlayButton::PlayButton(MWindow *mwindow, PlayTransport *transport, int x, int y)
436 : PTransportButton(mwindow, transport, x, y, mwindow->theme->forward_data)
438 set_tooltip(_("Normal forward ( 3 )"));
440 int PlayButton::handle_event()
442 //printf("PlayButton::handle_event 1\n");
444 transport->handle_transport(NORMAL_FWD);
445 lock_window("PlayButton::handle_event");
446 //printf("PlayButton::handle_event 2\n");
452 // forward playback one frame
454 FramePlayButton::FramePlayButton(MWindow *mwindow, PlayTransport *transport, int x, int y)
455 : PTransportButton(mwindow, transport, x, y, mwindow->theme->framefwd_data)
457 set_tooltip(_("Frame forward ( 1 )"));
459 int FramePlayButton::handle_event()
462 transport->handle_transport(SINGLE_FRAME_FWD);
463 lock_window("FramePlayButton::handle_event");
469 FastPlayButton::FastPlayButton(MWindow *mwindow, PlayTransport *transport, int x, int y)
470 : PTransportButton(mwindow, transport, x, y, mwindow->theme->fastfwd_data)
472 set_tooltip(_("Fast forward ( Enter )"));
474 int FastPlayButton::handle_event()
477 transport->handle_transport(FAST_FWD);
478 lock_window("FastPlayButton::handle_event");
482 EndButton::EndButton(MWindow *mwindow, PlayTransport *transport, int x, int y)
483 : PTransportButton(mwindow, transport, x, y, mwindow->theme->end_data)
485 set_tooltip(_("Jump to end ( End )"));
487 int EndButton::handle_event()
490 transport->goto_end();
495 StopButton::StopButton(MWindow *mwindow, PlayTransport *transport, int x, int y)
496 : PTransportButton(mwindow, transport, x, y, mwindow->theme->stop_data)
498 set_tooltip(_("Stop ( 0 )"));
500 int StopButton::handle_event()
503 transport->handle_transport(STOP);
504 lock_window("StopButton::handle_event");