Hi all,

I have attached a patch i did this morning as i think that it could be
interesting to some other people as well:

The patch adds 8 additional playback speeds which are accessible via
ALT+NUMPADKEY. So just hold down ALT to get faster playback. This is
a somewhat convenient feature when rushing through about 2 hours of
video as you don't have to move the mouse but can let your fingers on
the keyboard.

Nevertheless i haven't tested the speeds thoroughly, so you might
want to find out what the best speed is for you by editing
cinelerra/transportque.C and change the returned values of
float TransportCommand::get_speed()

NOTE: you should not select the option play every frame. I doubt
that cinelerra will handle 160 fps ;-)

If the playback is accelerated by more than 2 no sound should be
played due to the limits of alsa i found on my laptop. If you want
to change that, edit line 247 in cinelerra/virtualaconsole.C

Simeon
diff --git a/cinelerra/playbackengine.C b/cinelerra/playbackengine.C
index 6ca11e0..a88b15c 100644
--- a/cinelerra/playbackengine.C
+++ b/cinelerra/playbackengine.C
@@ -295,6 +295,7 @@ double PlaybackEngine::get_tracking_position()
                        if(command->get_direction() == PLAY_FORWARD)
                        {
 // Interpolate
+//                                printf("playbackengine.C: 
command->get_speed() returned %f\n",command->get_speed());
                                result = tracking_position + 
                                        command->get_speed() * 
                                        tracking_timer.get_difference() /
diff --git a/cinelerra/playtransport.C b/cinelerra/playtransport.C
index 05d7f8e..a066028 100644
--- a/cinelerra/playtransport.C
+++ b/cinelerra/playtransport.C
@@ -192,32 +192,54 @@ int PlayTransport::keypress_event()
        }
        subwindow->unlock_window();
 
-
-       switch(subwindow->get_keypress())
+       if (subwindow->alt_down())
        {
-               case KPPLUS:        handle_transport(FAST_REWIND, 0, 
use_inout);                result = 1; break;
-               case KP6:           handle_transport(NORMAL_REWIND, 0, 
use_inout);              result = 1; break;
-               case KP5:           handle_transport(SLOW_REWIND, 0, 
use_inout);                result = 1; break;
-               case KP4:           handle_transport(SINGLE_FRAME_REWIND, 0, 
use_inout);        result = 1; break;
-               case KP1:           handle_transport(SINGLE_FRAME_FWD, 0, 
use_inout);                     result = 1; break;
-               case KP2:           handle_transport(SLOW_FWD, 0, use_inout);   
                          result = 1; break;
-               case KP3:           handle_transport(NORMAL_FWD, 0, use_inout); 
                          result = 1; break;
-               case KPENTER:       handle_transport(FAST_FWD, 0, use_inout);   
                          result = 1; break;
-               case KPINS:         handle_transport(STOP, 0, use_inout);       
                result = 1; break;
-               case ' ':           handle_transport(NORMAL_FWD, 0, use_inout); 
                result = 1; break;
-               case 'k':           handle_transport(STOP, 0, use_inout);       
                                  result = 1; break;
-               case END:
-                       subwindow->lock_window("PlayTransport::keypress_event 
3");
-                       goto_end();                                   
-                       result = 1; 
-                       subwindow->unlock_window();
-                       break;
-               case HOME:
-                       subwindow->lock_window("PlayTransport::keypress_event 
4");
-                   goto_start();                                 
-                       result = 1; 
-                       subwindow->unlock_window();
-                       break;
+               printf("received numpad-hit with hold alt! %i\n", 
subwindow->get_keypress());
+               switch(subwindow->get_keypress())
+               {
+                       case KPPLUS:        
handle_transport(SHIFTED_FAST_REWIND, 0, use_inout);                result = 1; 
break;
+                       case KP6:           
handle_transport(SHIFTED_NORMAL_REWIND, 0, use_inout);              result = 1; 
break;
+                       case KP5:           
handle_transport(SHIFTED_SLOW_REWIND, 0, use_inout);                result = 1; 
break;
+                       case KP4:           
handle_transport(SHIFTED_SINGLE_FRAME_REWIND, 0, use_inout);        result = 1; 
break;
+                       case KP1:           
handle_transport(SHIFTED_SINGLE_FRAME_FWD, 0, use_inout);                     
result = 1; break;
+                       case KP2:           handle_transport(SHIFTED_SLOW_FWD, 
0, use_inout);                             result = 1; break;
+                       case KP3:           
handle_transport(SHIFTED_NORMAL_FWD, 0, use_inout);                           
result = 1; break;
+                       case KPENTER:       handle_transport(SHIFTED_FAST_FWD, 
0, use_inout);                             result = 1; break;
+                       case KPINS:         handle_transport(STOP, 0, 
use_inout);                       result = 1; break;
+                       case ' ':           handle_transport(NORMAL_FWD, 0, 
use_inout);                 result = 1; break;
+                       case 'k':           handle_transport(STOP, 0, 
use_inout);                                         result = 1; break;
+               }
+       }
+       else
+       {
+               printf("received numpad-hit without hold alt! %i\n", 
subwindow->get_keypress());
+
+               switch(subwindow->get_keypress())
+               {
+                       case KPPLUS:        handle_transport(FAST_REWIND, 0, 
use_inout);                result = 1; break;
+                       case KP6:           handle_transport(NORMAL_REWIND, 0, 
use_inout);              result = 1; break;
+                       case KP5:           handle_transport(SLOW_REWIND, 0, 
use_inout);                result = 1; break;
+                       case KP4:           
handle_transport(SINGLE_FRAME_REWIND, 0, use_inout);        result = 1; break;
+                       case KP1:           handle_transport(SINGLE_FRAME_FWD, 
0, use_inout);                     result = 1; break;
+                       case KP2:           handle_transport(SLOW_FWD, 0, 
use_inout);                             result = 1; break;
+                       case KP3:           handle_transport(NORMAL_FWD, 0, 
use_inout);                           result = 1; break;
+                       case KPENTER:       handle_transport(FAST_FWD, 0, 
use_inout);                             result = 1; break;
+                       case KPINS:         handle_transport(STOP, 0, 
use_inout);                       result = 1; break;
+                       case ' ':           handle_transport(NORMAL_FWD, 0, 
use_inout);                 result = 1; break;
+                       case 'k':           handle_transport(STOP, 0, 
use_inout);                                         result = 1; break;
+                       case END:
+                               
subwindow->lock_window("PlayTransport::keypress_event 3");
+                               goto_end();                                   
+                               result = 1; 
+                               subwindow->unlock_window();
+                               break;
+                       case HOME:
+                               
subwindow->lock_window("PlayTransport::keypress_event 4");
+                               goto_start();                                 
+                               result = 1; 
+                               subwindow->unlock_window();
+                               break;
+               }
        }
 
        subwindow->lock_window("PlayTransport::keypress_event 5");
@@ -256,6 +278,14 @@ void PlayTransport::handle_transport(int command,
        switch(command)
        {
 // Commands that play back
+               case SHIFTED_FAST_REWIND:
+               case SHIFTED_NORMAL_REWIND:
+               case SHIFTED_SLOW_REWIND:
+               case SHIFTED_SINGLE_FRAME_REWIND:
+               case SHIFTED_SINGLE_FRAME_FWD:
+               case SHIFTED_SLOW_FWD:
+               case SHIFTED_NORMAL_FWD:
+               case SHIFTED_FAST_FWD:
                case FAST_REWIND:
                case NORMAL_REWIND:
                case SLOW_REWIND:
diff --git a/cinelerra/transportque.C b/cinelerra/transportque.C
index 0ffbc4f..16e54aa 100644
--- a/cinelerra/transportque.C
+++ b/cinelerra/transportque.C
@@ -84,6 +84,10 @@ int TransportCommand::get_direction()
 {
        switch(command)
        {
+               case SHIFTED_SINGLE_FRAME_FWD:
+               case SHIFTED_NORMAL_FWD:
+               case SHIFTED_FAST_FWD:
+               case SHIFTED_SLOW_FWD:
                case SINGLE_FRAME_FWD:
                case NORMAL_FWD:
                case FAST_FWD:
@@ -92,6 +96,10 @@ int TransportCommand::get_direction()
                        return PLAY_FORWARD;
                        break;
 
+               case SHIFTED_SINGLE_FRAME_REWIND:
+               case SHIFTED_NORMAL_REWIND:
+               case SHIFTED_FAST_REWIND:
+               case SHIFTED_SLOW_REWIND:
                case SINGLE_FRAME_REWIND:
                case NORMAL_REWIND:
                case FAST_REWIND:
@@ -107,6 +115,7 @@ int TransportCommand::get_direction()
 
 float TransportCommand::get_speed()
 {
+//        printf("get_speed(): switch(command)\n");
        switch(command)
        {
                case SLOW_FWD:
@@ -126,6 +135,30 @@ float TransportCommand::get_speed()
                case FAST_REWIND:
                        return 2;
                        break;
+               
+               case SHIFTED_SINGLE_FRAME_FWD:
+               case SHIFTED_SINGLE_FRAME_REWIND:
+//                     printf("speed = 6\n");
+                       return 6;
+                       break;
+       
+               case SHIFTED_SLOW_FWD:
+               case SHIFTED_SLOW_REWIND:
+//                     printf("speed = 16\n");
+                       return 20;
+                       break;
+               
+               case SHIFTED_NORMAL_FWD:
+               case SHIFTED_NORMAL_REWIND:
+//                     printf("speed = 48\n");
+                       return 60;
+                       break;
+               
+               case SHIFTED_FAST_FWD:
+               case SHIFTED_FAST_REWIND:
+//                     printf("speed = 96\n");
+                       return 160;
+                       break;
        }
 }
 
@@ -139,6 +172,10 @@ void TransportCommand::set_playback_range(EDL *edl, int 
use_inout)
 
        switch(command)
        {
+               case SHIFTED_SLOW_FWD:
+               case SHIFTED_FAST_FWD:
+               case SHIFTED_NORMAL_FWD:
+               case SHIFTED_SINGLE_FRAME_FWD:
                case SLOW_FWD:
                case FAST_FWD:
                case NORMAL_FWD:
@@ -154,6 +191,10 @@ void TransportCommand::set_playback_range(EDL *edl, int 
use_inout)
                        }
                        break;
                
+               case SHIFTED_SLOW_REWIND:
+               case SHIFTED_FAST_REWIND:
+               case SHIFTED_NORMAL_REWIND:
+               case SHIFTED_SINGLE_FRAME_REWIND:
                case SLOW_REWIND:
                case FAST_REWIND:
                case NORMAL_REWIND:
diff --git a/cinelerra/transportque.inc b/cinelerra/transportque.inc
index d13e1e4..9fde107 100644
--- a/cinelerra/transportque.inc
+++ b/cinelerra/transportque.inc
@@ -23,6 +23,15 @@
 #define REWIND                   11
 #define GOTO_END                 12
 #define CURRENT_FRAME             13
+#define SHIFTED_SINGLE_FRAME_FWD         14
+#define SHIFTED_NORMAL_FWD               15
+#define SHIFTED_FAST_FWD                 16
+#define SHIFTED_SINGLE_FRAME_REWIND      17
+#define SHIFTED_NORMAL_REWIND                    18
+#define SHIFTED_FAST_REWIND                      19
+#define SHIFTED_PAUSE                            20
+#define SHIFTED_SLOW_FWD                 21
+#define SHIFTED_SLOW_REWIND              22
 
 // Level of change.  Changes have to be inclusive of all the lesser changes.
 // Delete cache
diff --git a/cinelerra/virtualaconsole.C b/cinelerra/virtualaconsole.C
index 3e1ab64..16b55c5 100644
--- a/cinelerra/virtualaconsole.C
+++ b/cinelerra/virtualaconsole.C
@@ -201,6 +201,7 @@ int VirtualAConsole::process_buffer(int64_t len,
 // Time stretch the fragment to the real_output size
                        if(renderengine->command->get_speed() > 1)
                        {
+//                             printf("get_speed() returned 
%i\n",(int)renderengine->command->get_speed());
 // Number of samples in real output buffer for each to sample rendered.
                                int interpolate_len = 
(int)renderengine->command->get_speed();
                                for(in = 0, out = 0; in < len; )
@@ -243,8 +244,11 @@ int VirtualAConsole::process_buffer(int64_t len,
                }
                if(!renderengine->audio->get_interrupted())
                {
-                       renderengine->audio->write_buffer(audio_out_packed, 
-                               real_output_len);
+                        if (renderengine->command->get_speed() <= 2)
+                        {
+                               
renderengine->audio->write_buffer(audio_out_packed, 
+                                       real_output_len);
+                        }
                }
 
                if(renderengine->audio->get_interrupted()) interrupt = 1;

Reply via email to