#include "asset.h"
#include "assets.h"
+#include "atrack.h"
#include "audioalsa.h"
+#include "autos.h"
#include "awindowgui.h"
#include "awindow.h"
#include "batchrender.h"
#include "bcdisplayinfo.h"
#include "bcsignals.h"
#include "bctimer.h"
+#include "bctrace.h"
#include "bdcreate.h"
#include "brender.h"
#include "cache.h"
#include "file.h"
#include "filesystem.h"
#include "filexml.h"
+#include "floatautos.h"
#include "framecache.h"
#include "gwindow.h"
#include "gwindowgui.h"
#include "keyframegui.h"
#include "indexfile.h"
+#include "intautos.h"
#include "interlacemodes.h"
#include "language.h"
#include "levelwindowgui.h"
#include "mwindow.h"
#include "nestededls.h"
#include "new.h"
+#include "panautos.h"
#include "patchbay.h"
#include "playback3d.h"
#include "playbackengine.h"
#include "transition.h"
#include "transportque.h"
#include "vframe.h"
+#include "vtrack.h"
+#include "versioninfo.h"
#include "videodevice.inc"
#include "videowindow.h"
#include "vplayback.h"
MWindow::MWindow()
: Thread(1, 0, 0)
{
+ run_lock = new Mutex("MWindow::run_lock");
plugin_gui_lock = new Mutex("MWindow::plugin_gui_lock");
dead_plugin_lock = new Mutex("MWindow::dead_plugin_lock");
vwindows_lock = new Mutex("MWindow::vwindows_lock");
// Need to delete brender temporary here.
MWindow::~MWindow()
{
+ run_lock->lock("MWindow::~MWindow");
in_destructor = 1;
- stop_playback(1);
- stop_brender();
//printf("MWindow::~MWindow %d\n", __LINE__);
gui->stop_drawing();
gui->remote_control->deactivate();
#ifdef HAVE_DVB
gui->channel_info->stop();
#endif
- brender_lock->lock("MWindow::quit");
- delete brender; brender = 0;
- brender_lock->unlock();
delete create_bd; create_bd = 0;
delete create_dvd; create_dvd = 0;
delete batch_render; batch_render = 0;
+ delete render; render = 0;
commit_commercial();
if( commercials && !commercials->remove_user() ) commercials = 0;
finit_error();
keyframe_threads->remove_all_objects();
colormodels.remove_all_objects();
- delete gui; gui = 0;
- delete render; render = 0;
delete awindow; awindow = 0;
delete lwindow; lwindow = 0;
delete twindow; twindow = 0;
delete wwindow; wwindow = 0;
delete gwindow; gwindow = 0;
- // must be last or nouveau chokes
delete cwindow; cwindow = 0;
+ delete gui; gui = 0;
//delete file_server; file_server = 0; // reusable
delete mainindexes; mainindexes = 0;
delete mainprogress; mainprogress = 0;
interlace_asset_fixmethods.remove_all_objects();
sighandler->terminate();
delete sighandler;
+ delete run_lock;
}
-void MWindow::quit(int unlock)
+void MWindow::quit()
{
- stop_playback(1);
- if(unlock) gui->unlock_window();
-
- brender_lock->lock("MWindow::quit");
- delete brender; brender = 0;
- brender_lock->unlock();
-
- interrupt_indexes();
- clean_indexes();
- save_defaults();
gui->set_done(0);
- if(unlock) gui->lock_window("MWindow::quit");
}
void MWindow::init_error()
strcpy(plugin_path, path); delete [] path;
printf("init ladspa index: %s\n", plugin_dir);
FILE *fp = fopen(index_path,"w");
- if( !fp ) {
+ if( !fp ) {
fprintf(stderr,_("MWindow::init_ladspa_index: "
"can't create plugin index: %s\n"), index_path);
return 1;
}
fprintf(fp, "%d\n", PLUGIN_FILE_VERSION);
fprintf(fp, "%s\n", plugin_dir);
- init_plugin_index(mwindow, preferences, fp, plugin_path);
+ init_plugin_index(mwindow, preferences, fp, plugin_path);
fclose(fp);
return 0;
}
session->load_defaults(defaults);
// set x11_host, screens, window_config
screens = session->set_default_x11_host();
- BC_Signals::set_trap_path("/tmp/cinelerra_%d.dmp");
BC_Signals::set_trap_hook(trap_hook, this);
BC_Signals::set_catch_segv(preferences->trap_sigsegv);
BC_Signals::set_catch_intr(preferences->trap_sigintr);
+ if( preferences->trap_sigsegv || preferences->trap_sigintr ) {
+ BC_Trace::enable_locks();
+ }
+ else {
+ BC_Trace::disable_locks();
+ }
+ BC_WindowBase::get_resources()->popupmenu_btnup = preferences->popupmenu_btnup;
}
void MWindow::clean_indexes()
interlace_asset_fixmethods.append(new InterlacefixmethodItem(string, x));
// Interlacing Modes
- ILACEASSETMODELISTADD(BC_ILACE_MODE_UNDETECTED); // Not included in the list for the project options.
+ ILACEASSETMODELISTADD(ILACE_MODE_UNDETECTED); // Not included in the list for the project options.
- ILACEASSETMODELISTADD(BC_ILACE_MODE_TOP_FIRST);
- ILACEPROJECTMODELISTADD(BC_ILACE_MODE_TOP_FIRST);
+ ILACEASSETMODELISTADD(ILACE_MODE_TOP_FIRST);
+ ILACEPROJECTMODELISTADD(ILACE_MODE_TOP_FIRST);
- ILACEASSETMODELISTADD(BC_ILACE_MODE_BOTTOM_FIRST);
- ILACEPROJECTMODELISTADD(BC_ILACE_MODE_BOTTOM_FIRST);
+ ILACEASSETMODELISTADD(ILACE_MODE_BOTTOM_FIRST);
+ ILACEPROJECTMODELISTADD(ILACE_MODE_BOTTOM_FIRST);
- ILACEASSETMODELISTADD(BC_ILACE_MODE_NOTINTERLACED);
- ILACEPROJECTMODELISTADD(BC_ILACE_MODE_NOTINTERLACED);
+ ILACEASSETMODELISTADD(ILACE_MODE_NOTINTERLACED);
+ ILACEPROJECTMODELISTADD(ILACE_MODE_NOTINTERLACED);
// Interlacing Fixing Methods
- ILACEFIXMETHODLISTADD(BC_ILACE_FIXMETHOD_NONE);
- ILACEFIXMETHODLISTADD(BC_ILACE_FIXMETHOD_UPONE);
- ILACEFIXMETHODLISTADD(BC_ILACE_FIXMETHOD_DOWNONE);
+ ILACEFIXMETHODLISTADD(ILACE_FIXMETHOD_NONE);
+ ILACEFIXMETHODLISTADD(ILACE_FIXMETHOD_UPONE);
+ ILACEFIXMETHODLISTADD(ILACE_FIXMETHOD_DOWNONE);
}
void MWindow::init_indexes()
void MWindow::init_signals()
{
sighandler = new SigHandler;
- sighandler->initialize();
+ sighandler->initialize("/tmp/cinelerra_%d.dmp");
ENABLE_BUFFER
}
return result;
}
-void MWindow::set_brender_start()
+void MWindow::set_brender_range()
{
edl->session->brender_start = edl->local_session->get_selectionstart(1);
+ edl->session->brender_end = edl->local_session->get_selectionend(1);
+
+ if(EQUIV(edl->session->brender_end, edl->session->brender_start))
+ {
+ edl->session->brender_end = edl->tracks->total_video_length();
+ }
+
restart_brender();
gui->draw_overlays(1);
}
void MWindow::stop_playback(int wait)
{
int locked = gui->get_window_lock();
- if( locked ) gui->unlock_window();
+ if( locked ) gui->unlock_window();
cwindow->playback_engine->que->send_command(STOP,
CHANGE_NONE,
vwindow->playback_engine->que->send_command(STOP, CHANGE_NONE, 0, 0);
vwindow->playback_engine->interrupt_playback(wait);
}
- if( locked ) gui->lock_window("MWindow::stop_playback");
+ if( locked ) gui->lock_window("MWindow::stop_playback");
}
int MWindow::load_filenames(ArrayList<char*> *filenames,
if(debug) printf("MWindow::load_filenames %d\n", __LINE__);
xml_file.read_from_file(filenames->get(i));
if(debug) printf("MWindow::load_filenames %d\n", __LINE__);
-
+ const char *cin_version = 0;
+ while( !xml_file.read_tag() ) {
+ if( xml_file.tag.title_is("EDL") ) {
+ cin_version = xml_file.tag.get_property("VERSION");
+ break;
+ }
+ }
+ xml_file.rewind();
+ if( !cin_version ) {
+ eprintf(_("XML file %s\n not from cinelerra."),filenames->get(i));
+ char string[BCTEXTLEN];
+ sprintf(string,_("Unknown %s"), filenames->get(i));
+ gui->show_message(string);
+ result = 1;
+ break;
+ }
+ if( strcmp(cin_version, CINELERRA_VERSION) ) {
+ char string[BCTEXTLEN];
+ snprintf(string, sizeof(string),
+ _("Warning: XML from cinelerra version %s\n"
+ "Session data may be incompatible."), cin_version);
+ show_warning(&preferences->warn_version, string);
+ }
if(load_mode == LOADMODE_NESTED)
{
// Load temporary EDL for nesting.
void MWindow::run()
{
+ run_lock->lock("MWindow::run");
gui->run_window();
+ stop_playback(1);
+
+ brender_lock->lock("MWindow::run 1");
+ delete brender; brender = 0;
+ brender_lock->unlock();
+
+ interrupt_indexes();
+ clean_indexes();
+ save_defaults();
+ run_lock->unlock();
}
void MWindow::show_vwindow()
gui->mainmenu->show_gwindow->set_checked(1);
}
+void MWindow::hide_gwindow()
+{
+ session->show_gwindow = 0;
+
+ gwindow->gui->lock_window("MWindow::show_gwindow");
+ gwindow->gui->hide_window();
+ gwindow->gui->unlock_window();
+}
void MWindow::show_lwindow()
{
if(lock_cwindow) cwindow->gui->unlock_window();
}
+void MWindow::set_auto_visibility(Autos *autos, int value)
+{
+ if( autos->type == Autos::AUTOMATION_TYPE_PLUGIN )
+ edl->session->auto_conf->plugins = value;
+ else if( autos->autoidx >= 0 )
+ edl->session->auto_conf->autos[autos->autoidx] = value;
+ else
+ return;
+
+ gui->update(0, 1, 0, 0, 0, 0, 0);
+ gui->mainmenu->update_toggles(1);
+ gui->unlock_window();
+ gwindow->gui->update_toggles(1);
+ gui->lock_window("MWindow::set_auto_visibility");
+}
+
void MWindow::set_keyframe_type(int mode)
{
gui->lock_window("MWindow::set_keyframe_type");
void MWindow::dump_exe(FILE *fp)
{
- char proc_path[BCTEXTLEN], exe_path[BCTEXTLEN];
- sprintf(proc_path, "/proc/%d/exe", (int)getpid());
- int ret = readlink(proc_path, exe_path, sizeof(exe_path));
- if( ret < 0 ) { fprintf(fp,"readlink: %m\n"); return; }
- exe_path[ret] = 0;
+ char proc_path[BCTEXTLEN], exe_path[BCTEXTLEN];
+ sprintf(proc_path, "/proc/%d/exe", (int)getpid());
+
+ int ret = -1, n = 100;
+ for( int len; (len=readlink(proc_path, exe_path, sizeof(exe_path)))>0; --n ) {
+ exe_path[len] = 0; strcpy(proc_path, exe_path);
+ ret = 0;
+ }
+ if( n < 0 || ret < 0 ) { fprintf(fp,"readlink: %m\n"); return; }
+
struct stat st;
- if( stat(exe_path,&st) ) { fprintf(fp,"stat: %m\n"); return; }
- fprintf(fp, "path: %s = %9jd bytes\n",exe_path,st.st_size);
- int fd = open(exe_path,O_RDONLY+O_NONBLOCK);
+ if( stat(proc_path,&st) ) { fprintf(fp,"stat: %m\n"); return; }
+ fprintf(fp, "path: %s = %9jd bytes\n",proc_path,st.st_size);
+ struct tm *tm = localtime(&st.st_mtime);
+ char mtime[256];
+ strftime(mtime, sizeof(mtime), "%F %T", tm);
+ fprintf(fp,"mtime: %s\n", mtime);
+
+ int fd = open(proc_path,O_RDONLY+O_NONBLOCK);
if( fd < 0 ) { fprintf(fp,"open: %m\n"); return; }
uint8_t *bfr = 0;
int64_t bfrsz = 0;
EDLSession *session = edl->session;
double old_framerate = session->frame_rate;
double old_samplerate = session->sample_rate;
+ int old_auto_keyframes = session->auto_keyframes;
+ session->auto_keyframes = 0;
int result = file->open_file(preferences, asset, 1, 0);
if( !result && delete_tracks > 0 )
undo->update_undo_before();
edl->resample(old_samplerate, session->sample_rate, TRACK_AUDIO);
}
delete file;
+ session->auto_keyframes = old_auto_keyframes;
if( !result && delete_tracks > 0 ) {
save_backup();
undo->update_undo_after(_("select asset"), LOAD_ALL);
plugindb->get(i)->dump(fp);
}
+FloatAuto* MWindow::get_float_auto(PatchGUI *patch,int idx)
+{
+ Auto *current = 0;
+ double unit_position = edl->local_session->get_selectionstart(1);
+ unit_position = patch->track->to_units(unit_position, 0);
+
+ FloatAutos *ptr = (FloatAutos*)patch->track->automation->autos[idx];
+ return (FloatAuto*)ptr->get_prev_auto( (long)unit_position, PLAY_FORWARD, current);
+}
+
+IntAuto* MWindow::get_int_auto(PatchGUI *patch,int idx)
+{
+ Auto *current = 0;
+ double unit_position = edl->local_session->get_selectionstart(1);
+ unit_position = patch->track->to_units(unit_position, 0);
+
+ IntAutos *ptr = (IntAutos*)patch->track->automation->autos[idx];
+ return (IntAuto*)ptr->get_prev_auto( (long)unit_position, PLAY_FORWARD, current);
+}
+
+PanAuto* MWindow::get_pan_auto(PatchGUI *patch)
+{
+ Auto *current = 0;
+ double unit_position = edl->local_session->get_selectionstart(1);
+ unit_position = patch->track->to_units(unit_position, 0);
+
+ PanAutos *ptr = (PanAutos*)patch->track->automation->autos[AUTOMATION_PAN];
+ return (PanAuto*)ptr->get_prev_auto( (long)unit_position, PLAY_FORWARD, current);
+}
+
+