X-Git-Url: https://git.cinelerra-gg.org/git/?a=blobdiff_plain;f=cinelerra-5.1%2Fcinelerra%2Fmwindow.C;h=75e3bb14723041cc0e7747513c89240526888e06;hb=3abbd84aa85907d646b13c98295ce778d2a71215;hp=c6c8235a57b165285692555a9b470f1873e56181;hpb=0e16112661802284c0d2c9eb8d1df84141125e91;p=goodguy%2Fcinelerra.git diff --git a/cinelerra-5.1/cinelerra/mwindow.C b/cinelerra-5.1/cinelerra/mwindow.C index c6c8235a..75e3bb14 100644 --- a/cinelerra-5.1/cinelerra/mwindow.C +++ b/cinelerra-5.1/cinelerra/mwindow.C @@ -27,6 +27,7 @@ #include "awindowgui.h" #include "awindow.h" #include "batchrender.h" +#include "bccmodels.h" #include "bcdisplayinfo.h" #include "bcprogressbox.h" #include "bcsignals.h" @@ -40,9 +41,9 @@ #include "channelinfo.h" #include "clip.h" #include "clipedls.h" -#include "bccmodels.h" #include "commercials.h" #include "confirmsave.h" +#include "convert.h" #include "cplayback.h" #include "ctimebar.h" #include "cwindowgui.h" @@ -179,7 +180,6 @@ extern "C" } - extern long cin_timezone; ArrayList* MWindow::plugindb = 0; @@ -225,6 +225,7 @@ MWindow::MWindow() create_bd = 0; create_dvd = 0; batch_render = 0; + convert_render = 0; render = 0; edl = 0; gui = 0; @@ -239,7 +240,7 @@ MWindow::MWindow() screens = 1; in_destructor = 0; speed_edl = 0; - proxy_beep = 0; + beeper = 0; shuttle = 0; mixers_align = 0; } @@ -260,11 +261,12 @@ MWindow::~MWindow() #ifdef HAVE_DVB gui->channel_info->stop(); #endif - delete proxy_beep; + delete beeper; delete create_bd; create_bd = 0; delete create_dvd; create_dvd = 0; delete shuttle; shuttle = 0; delete batch_render; batch_render = 0; + delete convert_render; convert_render = 0; delete render; render = 0; delete mixers_align; mixers_align = 0; commit_commercial(); @@ -1309,7 +1311,7 @@ void MWindow::stop_mixers() } } -void MWindow::close_mixers(int destroy) +void MWindow::close_mixers(int result) { ArrayList closed; zwindows_lock->lock("MWindow::close_mixers"); @@ -1317,10 +1319,9 @@ void MWindow::close_mixers(int destroy) ZWindow *zwindow = zwindows[i]; if( zwindow->idx < 0 ) continue; zwindow->idx = -1; - zwindow->destroy = destroy; ZWindowGUI *zgui = zwindow->zgui; zgui->lock_window("MWindow::select_zwindow 0"); - zgui->set_done(0); + zgui->set_done(result); zgui->unlock_window(); closed.append(zwindow); } @@ -1824,10 +1825,92 @@ void MWindow::undo_after(const char *description, uint32_t load_flags, int chang void MWindow::beep(double freq, double secs, double gain) { - if( !proxy_beep ) proxy_beep = new ProxyBeep(this); - proxy_beep->tone(freq, secs, gain); + if( !beeper ) beeper = new Beeper(this); + beeper->tone(freq, secs, gain); +} + +Beeper::Beeper(MWindow *mwindow) + : Thread(1, 0, 0) +{ + this->mwindow = mwindow; + audio = new AudioDevice(mwindow); + playing_audio = 0; + interrupted = -1; +} + +Beeper::~Beeper() +{ + stop(0); + delete audio; +} + +void Beeper::run() +{ + int channels = 2; + int64_t bfrsz = BEEP_SAMPLE_RATE; + EDL *edl = mwindow->edl; + EDLSession *session = edl->session; + AudioOutConfig *aconfig = session->playback_config->aconfig; + audio->open_output(aconfig, BEEP_SAMPLE_RATE, bfrsz, channels, 0); + audio->start_playback(); + + double out0[bfrsz], out1[bfrsz], *out[2] = { out0, out1 }; + const double two_pi = 2*M_PI; + int64_t audio_len = BEEP_SAMPLE_RATE * secs; + const double dt = two_pi * freq/BEEP_SAMPLE_RATE; + double th = 0; + + audio_pos = 0; + playing_audio = 1; + while( !interrupted ) { + int len = audio_len - audio_pos; + if( len <= 0 ) break; + if( len > bfrsz ) len = bfrsz; + int k = audio_pos; + for( int i=0; i= 0 ) th = t; + out0[i] = out1[i] = sin(th) * gain; + } + audio->write_buffer(out, channels, len); + audio_pos = k; + } + + if( !interrupted ) + audio->set_last_buffer(); + audio->stop_audio(interrupted ? 0 : 1); + playing_audio = 0; + + audio->close_all(); +} + +void Beeper::start() +{ + if( running() ) return; + audio_pos = -1; + interrupted = 0; + Thread::start(); } +void Beeper::stop(int wait) +{ + if( running() && !interrupted ) { + interrupted = 1; + audio->stop_audio(wait); + } + Thread::join(); +} + +void Beeper::tone(double freq, double secs, double gain) +{ + stop(0); + this->freq = freq; + this->secs = secs; + this->gain = gain; + start(); +} + + int MWindow::load_filenames(ArrayList *filenames, int load_mode, int update_filename) @@ -2115,6 +2198,8 @@ if(debug) printf("MWindow::load_filenames %d\n", __LINE__); edl->session->autos_follow_edits, 0); // overwrite } + else if( load_mode == LOADMODE_NEW_TRACKS ) + paste_edls(&new_edls, load_mode, 0, -1, 0, 0, 0, 0); else paste_edls(&new_edls, load_mode, 0, -1, 1, 1, 1, 0); } @@ -2218,11 +2303,12 @@ if(debug) printf("MWindow::load_filenames %d\n", __LINE__); gui->unlock_window(); // to update progress bar int ret = render_proxy(orig_idxbls); gui->lock_window("MWindow::load_filenames"); - if( ret >= 0 && edl->session->proxy_beep ) { + float gain = edl->session->proxy_beep; + if( ret >= 0 && gain > 0 ) { if( ret > 0 ) - beep(2000., 1.5, 0.5); + beep(2000., 1.5, gain); else - beep(4000., 0.25, 0.5); + beep(4000., 0.25, gain); } } @@ -2306,14 +2392,19 @@ int MWindow::enable_proxy() edl->session->proxy_disabled_scale != 1 ) { int new_scale = edl->session->proxy_disabled_scale; int new_use_scaler = edl->session->proxy_use_scaler; - edl->session->proxy_disabled_scale = 1; Asset *asset = new Asset; asset->format = FILE_FFMPEG; asset->load_defaults(defaults, "PROXY_", 1, 1, 0, 0, 0); ret = to_proxy(asset, new_scale, new_use_scaler); asset->remove_user(); - if( ret > 0 ) - beep(2000., 1.5, 0.5); + if( ret > 0 ) { + float gain = edl->session->proxy_beep; + beep(2000., 1.5, gain); + } + edl->session->proxy_disabled_scale = 1; + gui->lock_window("MWindow::to_proxy"); + update_project(LOADMODE_REPLACE); + gui->unlock_window(); } return 1; } @@ -2322,14 +2413,17 @@ int MWindow::disable_proxy() { if( edl->session->proxy_scale != 1 && edl->session->proxy_disabled_scale == 1 ) { - int new_scale = 1; + int old_scale = edl->session->proxy_scale, new_scale = 1; int new_use_scaler = edl->session->proxy_use_scaler; - edl->session->proxy_disabled_scale = edl->session->proxy_scale; Asset *asset = new Asset; asset->format = FILE_FFMPEG; asset->load_defaults(defaults, "PROXY_", 1, 1, 0, 0, 0); to_proxy(asset, new_scale, new_use_scaler); asset->remove_user(); + edl->session->proxy_disabled_scale = old_scale; + gui->lock_window("MWindow::to_proxy"); + update_project(LOADMODE_REPLACE); + gui->unlock_window(); } return 1; } @@ -2460,10 +2554,6 @@ int MWindow::to_proxy(Asset *asset, int new_scale, int new_use_scaler) edl->Garbage::remove_user(); restart_brender(); - gui->lock_window("MWindow::to_proxy"); - update_project(LOADMODE_REPLACE); - gui->unlock_window(); - return !result ? proxy_render.needed_proxies.size() : -1; } @@ -3443,6 +3533,20 @@ void MWindow::update_plugin_guis(int do_keyframe_guis) if(do_keyframe_guis) update_keyframe_guis(); } +void MWindow::stop_plugin_guis() +{ +// Send new configuration to plugin GUI's + plugin_gui_lock->lock("MWindow::stop_plugin_guis"); + + for( int i=0; isize(); ++i ) { + PluginServer *ptr = plugin_guis->get(i); + if( edl->tracks->plugin_exists(ptr->plugin) ) { + ptr->render_stop(); + } + } + plugin_gui_lock->unlock(); +} + int MWindow::plugin_gui_open(Plugin *plugin) { int gui_id = plugin->gui_id; @@ -3454,11 +3558,12 @@ int MWindow::plugin_gui_open(Plugin *plugin) return result; } + void MWindow::render_plugin_gui(void *data, Plugin *plugin) { int gui_id = plugin->gui_id; if( gui_id < 0 ) return; - plugin_gui_lock->lock("MWindow::render_plugin_gui"); + plugin_gui_lock->lock("MWindow::render_plugin_gui 0"); PluginServer *plugin_server = plugin_guis->gui_server(gui_id); if( plugin_server ) plugin_server->render_gui(data); @@ -3469,13 +3574,44 @@ void MWindow::render_plugin_gui(void *data, int size, Plugin *plugin) { int gui_id = plugin->gui_id; if( gui_id < 0 ) return; - plugin_gui_lock->lock("MWindow::render_plugin_gui"); + plugin_gui_lock->lock("MWindow::render_plugin_gui 1"); PluginServer *plugin_server = plugin_guis->gui_server(gui_id); if( plugin_server ) plugin_server->render_gui(data, size); plugin_gui_lock->unlock(); } +void MWindow::reset_plugin_gui_frames(Plugin *plugin) +{ + int gui_id = plugin->gui_id; + if( gui_id < 0 ) return; + plugin_gui_lock->lock("MWindow::reset_plugin_gui_frames"); + PluginServer *plugin_server = plugin_guis->gui_server(gui_id); + if( plugin_server ) + plugin_server->reset_plugin_gui_frames(); + plugin_gui_lock->unlock(); +} + +void MWindow::render_plugin_gui_frames(PluginClientFrames *frames, Plugin *plugin) +{ + int gui_id = plugin->gui_id; + if( gui_id < 0 ) return; + plugin_gui_lock->lock("MWindow::render_plugin_gui_frames"); + PluginServer *plugin_server = plugin_guis->gui_server(gui_id); + if( plugin_server ) + plugin_server->render_plugin_gui_frames(frames); + plugin_gui_lock->unlock(); +} + +double MWindow::get_tracking_position() +{ + return edl->local_session->get_selectionstart(1); +} + +int MWindow::get_tracking_direction() +{ + return cwindow->playback_engine->get_direction(); +} void MWindow::update_plugin_states() { @@ -3685,6 +3821,146 @@ void MWindow::update_project(int load_mode) if(debug) PRINT_TRACE } +void MWindow::stack_push(EDL *new_edl) +{ +// needs gui lock + gui->lock_window("MWindow::stack_push"); + if( stack.size() < 9 ) { + save_backup(); + undo_before(); + StackItem &item = stack.append(); + item.edl = edl; + item.new_edl = new_edl; + item.undo = undo; + edl = new_edl; + edl->add_user(); + strcpy(session->filename, edl->path); + undo = new MainUndo(this); + gui->stack_button->update(); + update_project(LOADMODE_REPLACE); + } + gui->unlock_window(); +} + +void MWindow::stack_pop() +{ + if( !stack.size() ) return; +// writes on config_path/backup%d.xml + save_backup(); +// already have gui lock + forget_nested_edl(edl); + StackItem &item = stack.last(); +// session edl replaced, overwrite and save clip data + if( item.new_edl != edl ) + item.new_edl->overwrite_clip(edl); + edl->remove_user(); + edl = item.edl; + delete undo; + undo = item.undo; + stack.remove(); + strcpy(session->filename, edl->path); + update_project(LOADMODE_REPLACE); + undo_after(_("open edl"), LOAD_ALL); + gui->stack_button->update(); +} + +void MWindow::forget_nested_edl(EDL *nested) +{ + frame_cache->remove_item(nested); + wave_cache->remove_item(nested); + if( gui->render_engine && + gui->render_engine_id == nested->id ) { + delete gui->render_engine; + gui->render_engine = 0; + } + if( gui->resource_thread->render_engine_id == nested->id ) { + gui->resource_thread->render_engine_id = -1; + delete gui->resource_thread->render_engine; + gui->resource_thread->render_engine = 0; + } +} + +void MWindow::clip_to_media() +{ + if( edl->session->proxy_scale != 1 ) { + eprintf("Nesting not allowed when proxy scale != 1"); + return; + } + undo_before(); + int clips_total = session->drag_clips->total; + for( int i=0; idrag_clips->values[i]; + time_t dt; time(&dt); + struct tm dtm; localtime_r(&dt, &dtm); + char path[BCTEXTLEN], *cp = path, *ep = cp+sizeof(path)-1; +// path_basename = "Nested_-