improvements/fixes from MatN and Andrew related to AppImage and batch render
[goodguy/cinelerra.git] / cinelerra-5.1 / cinelerra / render.C
index 015bebd5fe1102f196a2b3975c2f738b79ba918e..1136be9bb5415c475b0efcd58f11baaa9ad858e3 100644 (file)
@@ -222,6 +222,7 @@ Render::Render(MWindow *mwindow)
 
 Render::~Render()
 {
+       stop_operation();
        close_window();
        delete package_lock;
        delete counter_lock;
@@ -337,7 +338,7 @@ void Render::handle_close_event(int result)
        }
        EDL *edl = mwindow->edl;
        if( !result && use_labels && !edl->labels->first ) {
-               eprintf(_("render file per label and no labels\n"));
+               eprintf(_("Create new file at labels checked, but no labels\n"));
                result = 1;
        }
        if( !result && asset->video_data ) {
@@ -445,15 +446,16 @@ int Render::check_asset(EDL *edl, Asset &asset)
        return 0;
 }
 
-int Render::get_strategy(int use_renderfarm, int use_labels)
+int Render::get_strategy(int use_renderfarm, int use_labels, int range_type)
 {
-       return use_renderfarm ?
-               (use_labels ? FILE_PER_LABEL_FARM : SINGLE_PASS_FARM) :
-               (use_labels ? FILE_PER_LABEL      : SINGLE_PASS     ) ;
+       return range_type == RANGE_1FRAME ? SINGLE_PASS :
+                use_renderfarm ?
+                       (use_labels ? FILE_PER_LABEL_FARM : SINGLE_PASS_FARM) :
+                       (use_labels ? FILE_PER_LABEL      : SINGLE_PASS     ) ;
 }
 int Render::get_strategy()
 {
-       return get_strategy(preferences->use_renderfarm, use_labels);
+       return get_strategy(preferences->use_renderfarm, use_labels, range_type);
 }
 
 void Render::start_progress()
@@ -682,7 +684,7 @@ void RenderThread::render_single(int test_overwrite, Asset *asset, EDL *edl,
        render->result = 0;
 
 // Create rendering command
-       TransportCommand *command = new TransportCommand;
+       TransportCommand *command = new TransportCommand(render->preferences);
        command->command = NORMAL_FWD;
        command->get_edl()->copy_all(edl);
        command->change_type = CHANGE_ALL;
@@ -732,8 +734,8 @@ void RenderThread::render_single(int test_overwrite, Asset *asset, EDL *edl,
                        render->result = 1;
                }
        }
-
-       render_frames = render->default_asset->frame_rate * total_length;
+// prevent single frame truncation to zero frames
+       render_frames = render->default_asset->frame_rate * total_length + 1e-4;
 
 // Generate packages
        if( !render->result ) {
@@ -881,8 +883,8 @@ printf("Render::render_single: Session finished.\n");
                mwindow->restart_brender();
        if( farm_server ) delete farm_server;
        delete command;
-       delete audio_cache;
-       delete video_cache;
+       audio_cache->remove_user();
+       video_cache->remove_user();
 // Must delete packages after server
        delete render->packages;
 
@@ -954,8 +956,9 @@ void RenderThread::run()
                        render_frames, render_time, render_rate);
        }
 
-       if( render->mode == Render::INTERACTIVE && render->beep )
-               mwindow->beep(3000., 1.5, 0.5);
+       float gain = render->beep;
+       if( render->mode == Render::INTERACTIVE && gain > 0 )
+               mwindow->beep(3000., 1.5, gain);
 
        if( script ) {
                if( !render->result )
@@ -987,6 +990,8 @@ RenderWindow::RenderWindow(MWindow *mwindow,
        rangeselection = 0;
        rangeinout = 0;
        range1frame = 0;
+// *** CONTEXT_HELP ***
+       context_help_set_keyword("Single File Rendering");
 }
 
 RenderWindow::~RenderWindow()
@@ -1056,6 +1061,8 @@ void RenderWindow::create_objects()
        x1 = x2 + xs20;
        render->beep = mwindow->edl->session->render_beep;
        add_subwindow(beep_on_done = new RenderBeepOnDone(this, x1, y1));
+       y1 += beep_on_done->get_h();
+       add_subwindow(new BC_Title(x1, y1, _("Beep on done volume")));
 
        renderprofile = new RenderProfile(mwindow, this, x, y, 1);
        renderprofile->create_objects();
@@ -1211,14 +1218,14 @@ int RenderFormat::handle_event()
 }
 
 RenderBeepOnDone::RenderBeepOnDone(RenderWindow *rwindow, int x, int y)
- : BC_CheckBox(x, y, rwindow->render->beep, _("Beep on done"))
+ : BC_FPot(x, y, rwindow->render->beep*100.f, 0.f, 100.f)
 {
        this->rwindow = rwindow;
 }
 
 int RenderBeepOnDone::handle_event()
 {
-       rwindow->render->beep = get_value();
+       rwindow->render->beep = get_value()/100.f;
        return 1;
 }