{
start_lock->unlock();
- do
- {
+ while( !done ) {
// Wait for current command to finish
que->output_lock->lock("PlaybackEngine::run");
-
wait_render_engine();
-
// Read the new command
que->input_lock->lock("PlaybackEngine::run");
if(done) return;
command->copy_from(&que->command);
que->command.reset();
que->input_lock->unlock();
-
//printf("PlaybackEngine::run 1 %d\n", command->command);
-
- switch(command->command)
- {
+ switch( command->command ) {
// Parameter change only
- case COMMAND_NONE:
-// command->command = last_command;
- perform_change();
- break;
-
- case PAUSE:
- init_cursor(0);
- pause_lock->lock("PlaybackEngine::run");
- stop_cursor();
- break;
-
- case STOP:
+ case COMMAND_NONE:
+// command->command = last_command;
+ perform_change();
+ break;
+
+ case PAUSE:
+ init_cursor(0);
+ pause_lock->lock("PlaybackEngine::run");
+ stop_cursor();
+ break;
+
+ case STOP:
// No changing
- break;
+ break;
- case CURRENT_FRAME:
- last_command = command->command;
- perform_change();
- arm_render_engine();
+ case CURRENT_FRAME:
+ last_command = command->command;
+ perform_change();
+ arm_render_engine();
// Dispatch the command
- start_render_engine();
- break;
-
- default:
- last_command = command->command;
- is_playing_back = 1;
- if(command->command == SINGLE_FRAME_FWD ||
- command->command == SINGLE_FRAME_REWIND)
- {
- command->playbackstart = get_tracking_position();
- }
+ start_render_engine();
+ break;
- perform_change();
- arm_render_engine();
+ case SINGLE_FRAME_FWD:
+ case SINGLE_FRAME_REWIND:
+// fall through
+ default:
+ last_command = command->command;
+ is_playing_back = 1;
+
+ perform_change();
+ arm_render_engine();
// Start tracking after arming so the tracking position doesn't change.
// The tracking for a single frame command occurs during PAUSE
- init_tracking();
+ init_tracking();
// Dispatch the command
- start_render_engine();
- break;
+ start_render_engine();
+ break;
}
//printf("PlaybackEngine::run 100\n");
- }while(!done);
+ }
}
+void PlaybackEngine::stop_playback()
+{
+ que->send_command(STOP, CHANGE_NONE, 0, 0);
+ interrupt_playback(1);
+ renderengine_lock->lock("PlaybackEngine::stop_playback");
+ if(render_engine)
+ render_engine->wait_done();
+ renderengine_lock->unlock();
+}