#include "condition.h"
#include "edl.h"
#include "edlsession.h"
+#include "meterhistory.h"
#include "mutex.h"
#include "mwindow.h"
#include "playbackengine.h"
audio_cache = 0;
video_cache = 0;
- if(playback_engine && playback_engine->mwindow)
- mwindow = playback_engine->mwindow;
- else
- mwindow = 0;
- show_tc = 0;
-
+ mwindow = !playback_engine ? 0 : playback_engine->mwindow;
input_lock = new Condition(1, "RenderEngine::input_lock");
start_lock = new Condition(1, "RenderEngine::start_lock");
output_lock = new Condition(1, "RenderEngine::output_lock");
- interrupt_lock = new Mutex("RenderEngine::interrupt_lock");
+ render_active = new Condition(1,"RenderEngine::render_active");
+ interrupt_lock = new Condition(1, "RenderEngine::interrupt_lock");
first_frame_lock = new Condition(1, "RenderEngine::first_frame_lock");
}
delete input_lock;
delete start_lock;
delete output_lock;
+ delete render_active;
delete interrupt_lock;
delete first_frame_lock;
delete config;
- edl->Garbage::remove_user();
+ if( edl ) edl->Garbage::remove_user();
}
EDL* RenderEngine::get_edl()
do_video = 0;
//printf("RenderEngine::get_duty %d\n", __LINE__);
- if(!command->single_frame() &&
- get_edl()->tracks->playable_audio_tracks() &&
- get_edl()->session->audio_channels)
+ if( get_edl()->tracks->playable_audio_tracks() &&
+ get_edl()->session->audio_channels )
{
- do_audio = 1;
+ do_audio = !command->single_frame() ? 1 : 0;
+ if( command->audio_toggle ) do_audio = !do_audio;
}
//printf("RenderEngine::get_duty %d\n", __LINE__);
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; i<MAXCHANNELS; ++i ) {
+ if( !arender->audio_out[i] ) continue;
+ levels[i] = meter_history->get_peak(i, pos);
}
}
}
void RenderEngine::get_module_levels(ArrayList<double> *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; i<arender->total_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");
start_render_threads();
start_lock->unlock();
interrupt_lock->unlock();
// 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;
//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 ) {
+ double position = playback_engine->tracking_position -
+ 1./command->get_edl()->session->frame_rate;
+ playback_engine->tracking_position = position >= 0 ? position : 0;
}
if(!interrupted) playback_engine->command->command = STOP;
input_lock->unlock();
interrupt_lock->unlock();
+ render_active->unlock();
}
+void RenderEngine::wait_done()
+{
+ render_active->lock("RenderEngine::wait_done");
+ render_active->unlock();
+}