X-Git-Url: http://git.cinelerra-gg.org/git/?a=blobdiff_plain;f=cinelerra-5.1%2Fcinelerra%2Frenderengine.C;h=721e3be85c9e77759604a12742bc37828004d906;hb=5621db270ccbeabc106e0f438941dba6f930652b;hp=628255b56a814c5a44996ed8cfb84e4fc21e7566;hpb=9d5997d77ab7736be577456d8fd3dda0ba522d39;p=goodguy%2Fhistory.git diff --git a/cinelerra-5.1/cinelerra/renderengine.C b/cinelerra-5.1/cinelerra/renderengine.C index 628255b5..721e3be8 100644 --- a/cinelerra-5.1/cinelerra/renderengine.C +++ b/cinelerra-5.1/cinelerra/renderengine.C @@ -27,6 +27,7 @@ #include "condition.h" #include "edl.h" #include "edlsession.h" +#include "meterhistory.h" #include "mutex.h" #include "mwindow.h" #include "playbackengine.h" @@ -72,7 +73,7 @@ RenderEngine::RenderEngine(PlaybackEngine *playback_engine, start_lock = new Condition(1, "RenderEngine::start_lock"); output_lock = new Condition(1, "RenderEngine::output_lock"); render_active = new Condition(1,"RenderEngine::render_active"); - interrupt_lock = new Mutex("RenderEngine::interrupt_lock"); + interrupt_lock = new Condition(1, "RenderEngine::interrupt_lock"); first_frame_lock = new Condition(1, "RenderEngine::first_frame_lock"); } @@ -90,7 +91,7 @@ RenderEngine::~RenderEngine() delete interrupt_lock; delete first_frame_lock; delete config; - edl->Garbage::remove_user(); + if( edl ) edl->Garbage::remove_user(); } EDL* RenderEngine::get_edl() @@ -468,36 +469,31 @@ int RenderEngine::close_output() void RenderEngine::get_output_levels(double *levels, int64_t position) { - if(do_audio) - { - int history_entry = arender->get_history_number(arender->level_samples, - position); - for(int i = 0; i < MAXCHANNELS; i++) - { - if(arender->audio_out[i]) - levels[i] = arender->level_history[i][history_entry]; + if( do_audio ) { + MeterHistory *meter_history = arender->meter_history; + int64_t tolerance = 4*arender->meter_render_fragment; + int pos = meter_history->get_nearest(position, tolerance); + for( int i=0; iaudio_out[i] ) continue; + levels[i] = meter_history->get_peak(i, pos); } } } void RenderEngine::get_module_levels(ArrayList *module_levels, int64_t position) { - if(do_audio) - { - for(int i = 0; i < arender->total_modules; i++) - { -//printf("RenderEngine::get_module_levels %p %p\n", ((AModule*)arender->modules[i]), ((AModule*)arender->modules[i])->level_samples); - int history_entry = arender->get_history_number(((AModule*)arender->modules[i])->level_samples, position); - - module_levels->append(((AModule*)arender->modules[i])->level_history[history_entry]); + if( do_audio ) { + int64_t tolerance = 4*arender->meter_render_fragment; + for( int i=0; itotal_modules; ++i ) { + AModule *amodule = (AModule *)arender->modules[i]; + MeterHistory *meter_history = amodule->meter_history; + int pos = meter_history->get_nearest(position, tolerance); + module_levels->append(meter_history->get_peak(0, pos)); } } } - - - void RenderEngine::run() { render_active->lock("RenderEngine::run"); @@ -520,7 +516,7 @@ void RenderEngine::run() // Fix the tracking position if(playback_engine) { - if(command->command == CURRENT_FRAME) + if(command->command == CURRENT_FRAME || command->command == LAST_FRAME) { //printf("RenderEngine::run 4.1 %d\n", playback_engine->tracking_position); playback_engine->tracking_position = command->playbackstart; @@ -531,17 +527,9 @@ void RenderEngine::run() //printf("RenderEngine::run 4.1 %d\n", playback_engine->tracking_position); if(!interrupted) { - if(do_audio) - playback_engine->tracking_position = - (double)arender->current_position / - command->get_edl()->session->sample_rate; - else - if(do_video) - { - playback_engine->tracking_position = - (double)vrender->current_position / - command->get_edl()->session->frame_rate; - } + playback_engine->tracking_position = + command->get_direction() == PLAY_FORWARD ? + command->end_position : command->start_position; } if( playback_engine->is_playing_back && command->displacement ) {