fix awdw solo vicon crash, fix nested clip for binfolders, open edit edl
[goodguy/cinelerra.git] / cinelerra-5.1 / cinelerra / playbackengine.C
index d9b636dff1debb0cd6e10756be532b2c50f2b7d2..8ce98234c3ffc7ed2b0ed6e4c00b4f6e3fa749ee 100644 (file)
@@ -258,8 +258,9 @@ void PlaybackEngine::init_tracking()
        init_meters();
 }
 
-void PlaybackEngine::stop_tracking()
+void PlaybackEngine::stop_tracking(double position)
 {
+       tracking_position = position;
        tracking_active = 0;
        stop_cursor();
        tracking_done->unlock();
@@ -402,12 +403,11 @@ void PlaybackEngine::run()
 // Dispatch the command
                        start_render_engine();
                        break;
-
-               case SINGLE_FRAME_FWD:
-               case SINGLE_FRAME_REWIND:
 // fall through
                default:
                        is_playing_back = 1;
+               case REWIND:
+               case GOTO_END:
                        perform_change();
                        arm_render_engine();
 
@@ -452,12 +452,16 @@ void PlaybackEngine::stop_playback(int wait_tracking)
        renderengine_lock->unlock();
 }
 
+int PlaybackEngine::get_direction()
+{
+       int curr_command = is_playing_back ? this->command->command : STOP;
+       return TransportCommand::get_direction(curr_command);
+}
 
 void PlaybackEngine::send_command(int command, EDL *edl, int wait_tracking, int use_inout)
 {
 //printf("PlaybackEngine::send_command 1 %d\n", command);
 // Stop requires transferring the output buffer to a refresh buffer.
-       int do_stop = 0;
        int curr_command = is_playing_back ? this->command->command : STOP;
        int curr_single_frame = TransportCommand::single_frame(curr_command);
        int curr_audio = this->command->toggle_audio ?
@@ -465,9 +469,11 @@ void PlaybackEngine::send_command(int command, EDL *edl, int wait_tracking, int
        int single_frame = TransportCommand::single_frame(command);
        int next_audio = next_command->toggle_audio ? !single_frame : single_frame;
        float next_speed = next_command->speed;
-
 // Dispatch command
        switch( command ) {
+       case STOP:
+               transport_stop(wait_tracking);
+               break;
        case FAST_REWIND:       // Commands that play back
        case NORMAL_REWIND:
        case SLOW_REWIND:
@@ -482,38 +488,38 @@ void PlaybackEngine::send_command(int command, EDL *edl, int wait_tracking, int
                if( next_speed ) curr_command = COMMAND_NONE;
 // Same direction pressed twice, not shuttle, and no change in audio state,  Stop
                if( curr_command == command && !curr_single_frame &&
-                   curr_audio == next_audio ) { do_stop = 1;  break; }
-
+                   curr_audio == next_audio ) {
+                       transport_stop(wait_tracking);
+                       break;
+               }
 // Resume or change direction
                switch( curr_command ) {
-               default:
-                       transport_stop(0);
-                       next_command->resume = 1;
-// fall through
+               case REWIND:
+               case GOTO_END:
                case STOP:
                case COMMAND_NONE:
                case SINGLE_FRAME_FWD:
                case SINGLE_FRAME_REWIND:
                case CURRENT_FRAME:
                case LAST_FRAME:
-                       next_command->realtime = 1;
-// Start from scratch
-                       transport_command(command, CHANGE_NONE, edl, use_inout);
+// already stopped
+                       break;
+               default:
+                       transport_stop(0);
+                       next_command->resume = 1;
                        break;
                }
+               next_command->realtime = 1;
+               transport_command(command, CHANGE_NONE, edl, use_inout);
                break;
-
-// Commands that stop
-       case STOP:
        case REWIND:
        case GOTO_END:
-               do_stop = 1;
+               transport_stop(1);
+               next_command->realtime = 1;
+               transport_command(command, CHANGE_NONE, edl, use_inout);
+               stop_tracking(this->command->playbackstart);
                break;
        }
-
-       if( do_stop ) {
-               transport_stop(wait_tracking);
-       }
 }
 
 int PlaybackEngine::put_command(TransportCommand *command, int reset)