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;