r602: Fix baver's code... don't insert timecode when show_tc is not set
[cinelerra_cv/mob.git] / cinelerra / playtransport.C
blobd5df35a54743c27585050ef59a5109de301b641d
1 #include "edl.h"
2 #include "keys.h"
3 #include "language.h"
4 #include "mwindow.h"
5 #include "playbackengine.h"
6 #include "playtransport.h"
7 #include "preferences.h"
8 #include "theme.h"
9 #include "transportque.h"
10 #include "vframe.h"
11 #include "localsession.h"
15 PlayTransport::PlayTransport(MWindow *mwindow, 
16         BC_WindowBase *subwindow, 
17         int x, 
18         int y)
20         this->subwindow = subwindow;
21         this->mwindow = mwindow;
22         this->x = x;
23         this->y = y;
24         this->slider = 0;
25         this->engine = 0;
29 PlayTransport::~PlayTransport()
31         delete forward_play;
32         delete frame_forward_play;
33         delete reverse_play;
34         delete frame_reverse_play;
35         delete fast_reverse;
36         delete fast_play;
37         delete rewind_button;
38         delete stop_button;
39         delete end_button;
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();
81         reverse = 0;
82         speed = 0;
84         return 0;
87 void PlayTransport::reposition_buttons(int x, int y)
89         this->x = x;
90         this->y = 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)
118         if(vertical)
119         {
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();
138         }
139         else
140         {
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();
159         }
161         return 0;
164 int PlayTransport::keypress_event()
166         int result = 0;
167         if(subwindow->shift_down())
168         {
169                 switch(subwindow->get_keypress())
170                 {
171                         case END:
172                                 subwindow->lock_window("PlayTransport::keypress_event 1");
173                                 goto_end();                                   
174                                 result = 1; 
175                                 subwindow->unlock_window();
176                                 break;
177                         case HOME:
178                                 subwindow->lock_window("PlayTransport::keypress_event 2");
179                         goto_start();                                 
180                                 result = 1; 
181                                 subwindow->unlock_window();
182                                 break;
183                 }
184                 return result;
185         }
187         subwindow->unlock_window();
189         if (subwindow->ctrl_down())
190         {
191                 switch(subwindow->get_keypress())
192                 {
193                         case KPPLUS:
194                         case KP6:
195                         case KP5:
196                         case KP4:
197                         case KP1:
198                         case KP2:
199                         case KP3:
200                         case KPENTER:
201                         case KPINS:
202                         case ' ':
203                         case 'k':
204                         {
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;
209                                 break;
210                         }
211                         default:
212                                 break;
213                 }
214         }
216         switch(subwindow->get_keypress())
217         {
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;
229                 case END:
230                         subwindow->lock_window("PlayTransport::keypress_event 3");
231                         goto_end();                                   
232                         result = 1; 
233                         subwindow->unlock_window();
234                         break;
235                 case HOME:
236                         subwindow->lock_window("PlayTransport::keypress_event 4");
237                     goto_start();                                 
238                         result = 1; 
239                         subwindow->unlock_window();
240                         break;
241         }
243         subwindow->lock_window("PlayTransport::keypress_event 5");
245         return result;
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);
267 // Dispatch command
268         switch(command)
269         {
270                 case FAST_REWIND:
271                 case NORMAL_REWIND:
272                 case SLOW_REWIND:
273                 case SINGLE_FRAME_REWIND:
274                 case SINGLE_FRAME_FWD:
275                 case SLOW_FWD:
276                 case NORMAL_FWD:
277                 case FAST_FWD:
278 // Stop
279 //printf("PlayTransport::handle_transport 3 %d %d\n", engine->command->command, command);
280                         if(engine->command->command == command && 
281                                 !engine->command->single_frame())
282                         {
283 //printf("PlayTransport::handle_transport 4 %d\n", command);
284                                 engine->que->send_command(STOP,
285                                         CHANGE_NONE, 
286                                         0,
287                                         0);
288                                 engine->interrupt_playback(wait_tracking);
289                         }
290                         else
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)
296                         {
297 //printf("PlayTransport::handle_transport 5 %d\n", command);
298                                 engine->que->send_command(STOP,
299                                         CHANGE_NONE, 
300                                         0,
301                                         0);
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,
306                                         CHANGE_NONE, 
307                                         get_edl(),
308                                         1,
309                                         1);
310 //printf("PlayTransport::handle_transport 5\n");
311                         }
312                         else
313 // Start from scratch
314                         {
315 //printf("PlayTransport::handle_transport 6 %d\n", command);
316                                 engine->que->send_command(command,
317                                         CHANGE_NONE, 
318                                         get_edl(),
319                                         1,
320                                         0);
321                         }
322                         break;
324                 case STOP:
325                 case REWIND:
326                 case GOTO_END:
327                         engine->que->send_command(STOP,
328                                 CHANGE_NONE, 
329                                 0,
330                                 0);
331                         engine->interrupt_playback(wait_tracking);
332                         break;
333         }
336 EDL* PlayTransport::get_edl()
338         return mwindow->edl;
341 int PlayTransport::pause_transport()
343         if(active_button) active_button->set_mode(PLAY_MODE);
344         return 0;
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);
356         return 0;
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;
364         mode = PLAY_MODE;
366 PTransportButton::~PTransportButton()
370 int PTransportButton::set_mode(int mode)
372         this->mode = mode;
373         return 0;
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()
384 //      unlock_window();
385         transport->goto_start();
386 //      lock_window();
387         return 1;
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() 
397         unlock_window();
398         transport->handle_transport(FAST_REWIND);
399         lock_window("FastReverseButton::handle_event");
400         return 1;
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()
412         unlock_window();
413         transport->handle_transport(NORMAL_REWIND);
414         lock_window("ReverseButton::handle_event");
415         return 1;
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()
427         unlock_window();
428         transport->handle_transport(SINGLE_FRAME_REWIND);
429         lock_window("FrameReverseButton::handle_event");
430         return 1;
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");
443         unlock_window();
444         transport->handle_transport(NORMAL_FWD);        
445         lock_window("PlayButton::handle_event");
446 //printf("PlayButton::handle_event 2\n");
447         return 1;
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()
461         unlock_window();
462         transport->handle_transport(SINGLE_FRAME_FWD);
463         lock_window("FramePlayButton::handle_event");
464         return 1;
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() 
476         unlock_window();
477         transport->handle_transport(FAST_FWD);
478         lock_window("FastPlayButton::handle_event");
479         return 1;
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()
488 {       
489 //      unlock_window();
490         transport->goto_end();
491 //      lock_window();
492         return 1;
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()
502         unlock_window();
503         transport->handle_transport(STOP);
504         lock_window("StopButton::handle_event");
505         return 1;