#include "asset.h"
#include "audiodevice.h"
#include "bcsignals.h"
+#include "canvas.h"
#include "condition.h"
#include "edl.h"
#include "edlsession.h"
void RenderEngine::wait_render_threads()
{
+ interrupt_lock->unlock();
if( do_audio ) arender->Thread::join();
if( do_video ) vrender->Thread::join();
+ interrupt_lock->lock("RenderEngine::wait_render_threads");
}
void RenderEngine::interrupt_playback()
{
render_active->lock("RenderEngine::run");
- interrupt_lock->unlock();
start_render_threads();
wait_render_threads();
- interrupt_lock->lock("RenderEngine::wait_render_threads");
close_output();
- if( playback_engine && playback_engine->is_playing_back ) {
- double position = interrupted ?
- playback_engine->get_tracking_position() :
- command->get_direction() == PLAY_FORWARD ?
- command->end_position :
- command->start_position;
- playback_engine->command->command = STOP;
- if( playback_engine->is_playing_back && command->displacement ) {
- position -= 1./command->get_edl()->session->frame_rate;
- if( position < 0 ) position = 0;
- }
+ if( playback_engine ) {
+ double position = command->command == CURRENT_FRAME ||
+ command->command == LAST_FRAME ? command->playbackstart :
+ playback_engine->is_playing_back && !interrupted ?
+ ( command->get_direction() == PLAY_FORWARD ?
+ command->end_position : command->start_position ) :
+ playback_engine->get_tracking_position() ;
+ position -= command->displacement;
+ if( position < 0 ) position = 0;
playback_engine->is_playing_back = 0;
- playback_engine->tracking_position = position;
- playback_engine->stop_tracking();
+ playback_engine->stop_tracking(position);
}
render_active->unlock();
render_active->unlock();
}
+void RenderEngine::update_scope(VFrame *frame)
+{
+ if( !video || !output || !output->scope_on() ) return;
+ output->lock_canvas("RenderEngine::update_scope");
+ output->process_scope(video, frame);
+ output->unlock_canvas();
+}