else
// Interpolate
{
- double loop_start = command->get_edl()->local_session->loop_start;
- double loop_end = command->get_edl()->local_session->loop_end;
+ double loop_start, loop_end;
+ int play_loop = command->play_loop ? 1 : 0;
+ EDL *edl = command->get_edl();
+ int loop_playback = edl->local_session->loop_playback ? 1 : 0;
+ if( play_loop || !loop_playback ) {
+ loop_start = command->start_position;
+ loop_end = command->end_position;
+ }
+ else {
+ loop_start = edl->local_session->loop_start;
+ loop_end = edl->local_session->loop_end;
+ play_loop = 1;
+ }
double loop_size = loop_end - loop_start;
- if(command->get_direction() == PLAY_FORWARD)
- {
+ if( command->get_direction() == PLAY_FORWARD ) {
// Interpolate
result = tracking_position +
command->get_speed() *
// Compensate for loop
//printf("PlaybackEngine::get_tracking_position 1 %d\n", command->get_edl()->local_session->loop_playback);
- if(command->get_edl()->local_session->loop_playback)
- {
- while(result > loop_end) result -= loop_size;
+ if( play_loop && loop_size > 0 ) {
+ while( result > loop_end ) result -= loop_size;
}
}
- else
- {
+ else {
// Interpolate
result = tracking_position -
command->get_speed() *
1000.0;
// Compensate for loop
- if(command->get_edl()->local_session->loop_playback)
- {
- while(result < loop_start) result += loop_size;
+ if( play_loop && loop_size > 0 ) {
+ while( result < loop_start ) result += loop_size;
}
}
break;
case CURRENT_FRAME:
+ case LAST_FRAME:
last_command = command->command;
perform_change();
arm_render_engine();
void PlaybackEngine::issue_command(EDL *edl, int command, int wait_tracking,
- int use_inout, int update_refresh, int toggle_audio)
+ int use_inout, int update_refresh, int toggle_audio, int loop_play)
{
-//printf("PlayTransport::handle_transport 1 %d\n", command);
+//printf("PlaybackEngine::issue_command 1 %d\n", command);
// Stop requires transferring the output buffer to a refresh buffer.
int do_stop = 0, resume = 0;
int prev_command = this->command->command;
case SLOW_FWD:
case NORMAL_FWD:
case FAST_FWD:
+ case CURRENT_FRAME:
+ case LAST_FRAME:
if( !prev_single_frame &&
prev_command == command &&
cur_audio == prev_audio ) {
case COMMAND_NONE:
case SINGLE_FRAME_FWD:
case SINGLE_FRAME_REWIND:
+ case CURRENT_FRAME:
+ case LAST_FRAME:
// Start from scratch
que->send_command(command, CHANGE_NONE, edl,
- 1, resume, use_inout, toggle_audio,
+ 1, resume, use_inout, toggle_audio, loop_play,
mwindow->preferences->forward_render_displacement);
break;
}
}
}
+void PlaybackEngine::refresh_frame(int change_type, EDL *edl, int dir)
+{
+ que->send_command(dir >= 0 ? CURRENT_FRAME : LAST_FRAME,
+ change_type, edl, 1);
+}
+