#include "theme.h"
#include "threadloader.h"
#include "timebar.h"
+#include "timelinepane.h"
#include "tipwindow.h"
#include "trackcanvas.h"
#include "track.h"
#include "wavecache.h"
#include "wwindow.h"
#include "zoombar.h"
+#include "zwindow.h"
+#include "zwindowgui.h"
#include "exportedl.h"
#include "defaultformats.h"
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");
+ zwindows_lock = new Mutex("MWindow::zwindows_lock");
brender_lock = new Mutex("MWindow::brender_lock");
keyframe_gui_lock = new Mutex("MWindow::keyframe_gui_lock");
MWindow::~MWindow()
{
run_lock->lock("MWindow::~MWindow");
- stop_playback(1);
in_destructor = 1;
//printf("MWindow::~MWindow %d\n", __LINE__);
- gui->stop_drawing();
gui->remote_control->deactivate();
gui->record->stop();
#ifdef HAVE_DVB
delete render; render = 0;
commit_commercial();
if( commercials && !commercials->remove_user() ) commercials = 0;
+ close_mixers();
// Save defaults for open plugins
plugin_gui_lock->lock("MWindow::~MWindow");
if( twindow && twindow->is_running() ) twindow->close_window();
if( wwindow && wwindow->is_running() ) wwindow->close_window();
vwindows.remove_all_objects();
+ zwindows.remove_all_objects();
gui->close(0);
if( awindow ) awindow->join();
if( cwindow ) cwindow->join();
close_gui(twindow);
close_gui(wwindow);
vwindows.remove_all_objects();
+ zwindows.remove_all_objects();
gui->close(0);
join();
#endif
delete dead_plugin_lock;
delete plugin_gui_lock;
delete vwindows_lock;
+ delete zwindows_lock;
delete brender_lock;
delete keyframe_gui_lock;
colormodels.remove_all_objects();
BC_WindowBase::get_resources()->popupmenu_btnup = preferences->popupmenu_btnup;
BC_WindowBase::get_resources()->textbox_focus_policy = preferences->textbox_focus_policy;
BC_WindowBase::get_resources()->grab_input_focus = preferences->grab_input_focus;
+ YUV::yuv.yuv_set_colors(preferences->yuv_color_space, preferences->yuv_color_range);
}
void MWindow::clean_indexes()
theme->build_menus();
init_menus();
+ theme->sort_image_sets();
theme->check_used();
-
//printf("MWindow::init_theme %d total_time=%d\n", __LINE__, (int)timer.get_difference());
}
return vwindow;
}
+ZWindow *MWindow::get_mixer(Mixer *&mixer)
+{
+ zwindows_lock->lock("MWindow::get_mixer");
+ if( !mixer ) mixer = edl->mixers.new_mixer();
+ ZWindow *zwindow = 0;
+ for( int i=0; !zwindow && i<zwindows.size(); ++i )
+ if( zwindows[i]->idx < 0 ) zwindow = zwindows[i];
+ if( !zwindow )
+ zwindows.append(zwindow = new ZWindow(this));
+ zwindow->idx = mixer->idx;
+ zwindows_lock->unlock();
+ return zwindow;
+}
+
+void MWindow::del_mixer(ZWindow *zwindow)
+{
+ zwindows_lock->lock("MWindow::del_mixer 0");
+ edl->mixers.del_mixer(zwindow->idx);
+ zwindow->idx = -1;
+ if( session->selected_zwindow >= 0 ) {
+ int i = zwindows.number_of(zwindow);
+ if( i >= 0 && i < session->selected_zwindow )
+ --session->selected_zwindow;
+ else if( i == session->selected_zwindow )
+ session->selected_zwindow = -1;
+ }
+ zwindows_lock->unlock();
+ gui->lock_window("MWindow::del_mixer 1");
+ gui->update_mixers(0, -1);
+ gui->unlock_window();
+}
+
+void MWindow::start_mixer()
+{
+ Mixer *mixer = 0;
+ ZWindow *zwindow = get_mixer(mixer);
+ const char *title = 0;
+
+ for( Track *track=edl->tracks->first; track!=0; track=track->next ) {
+ PatchGUI *patchgui = get_patchgui(track);
+ if( !patchgui || !patchgui->mixer ) continue;
+ mixer->mixer_ids.append(track->get_mixer_id());
+ if( !title ) title = track->title;
+ }
+
+ session->selected_zwindow = -1;
+ gui->lock_window("MWindow::start_mixer");
+ gui->update_mixers(0, 0);
+ gui->unlock_window();
+
+ zwindow->set_title(title);
+ zwindow->start();
+ refresh_mixers();
+}
+
+int MWindow::mixer_track_active(Track *track)
+{
+ int i = session->selected_zwindow;
+ if( i < 0 || i >= zwindows.size() ) return 0;
+ ZWindow *zwindow = zwindows[i];
+ Mixer *mixer = edl->mixers.get_mixer(zwindow->idx);
+ if( !mixer ) return 0;
+ int n = mixer->mixer_ids.number_of(track->get_mixer_id());
+ return n >= 0 ? 1 : 0;
+}
+
+void MWindow::update_mixer_tracks()
+{
+ zwindows_lock->lock("MixPatch::handle_event");
+ int i = session->selected_zwindow;
+ if( i >= 0 && i < zwindows.size() ) {
+ ZWindow *zwindow = zwindows[i];
+ zwindow->update_mixer_ids();
+ }
+ zwindows_lock->unlock();
+}
+
+void MWindow::queue_mixers(EDL *edl, int command, int wait_tracking,
+ int use_inout, int update_refresh, int toggle_audio)
+{
+ zwindows_lock->lock("MWindow::queue_mixers");
+ for( int vidx=0; vidx<zwindows.size(); ++vidx ) {
+ ZWindow *zwindow = zwindows[vidx];
+ if( zwindow->idx < 0 ) continue;
+ Mixer *mixer = edl->mixers.get_mixer(zwindow->idx);
+ if( !mixer || !mixer->mixer_ids.size() ) continue;
+ int k = -1;
+ for( Track *track = edl->tracks->first; k<0 && track!=0; track=track->next ) {
+ if( track->data_type != TRACK_VIDEO ) continue;
+ int mixer_id = track->get_mixer_id();
+ k = mixer->mixer_ids.size();
+ while( --k >= 0 && mixer_id != mixer->mixer_ids[k] );
+ }
+ if( k < 0 ) continue;
+ EDL *mixer_edl = new EDL(this->edl);
+ mixer_edl->create_objects();
+ mixer_edl->copy_all(edl);
+ mixer_edl->remove_vwindow_edls();
+ for( Track *track = mixer_edl->tracks->first; track!=0; track=track->next ) {
+ k = mixer->mixer_ids.size();
+ while( --k >= 0 && track->get_mixer_id() != mixer->mixer_ids[k] );
+ if( k >= 0 ) {
+ track->record = 1;
+ track->play = track->data_type == TRACK_VIDEO ? 1 : 0;
+ }
+ else
+ track->record = track->play = 0;
+ }
+ zwindow->change_source(mixer_edl);
+ zwindow->issue_command(command,
+ wait_tracking, use_inout, update_refresh, toggle_audio);
+ }
+ zwindows_lock->unlock();
+}
+
+void MWindow::refresh_mixers()
+{
+ queue_mixers(edl,CURRENT_FRAME,0,0,1,0);
+}
+
+void MWindow::stop_mixers()
+{
+ for( int vidx=0; vidx<zwindows.size(); ++vidx ) {
+ ZWindow *zwindow = zwindows[vidx];
+ if( zwindow->idx < 0 ) continue;
+ zwindow->issue_command(STOP, 0, 0, 0, 0);
+ }
+}
+
+void MWindow::close_mixers()
+{
+ zwindows_lock->lock("MWindow::close_mixers");
+ for( int i=0; i<zwindows.size(); ++i ) {
+ ZWindow *zwindow = zwindows[i];
+ if( zwindow->idx < 0 ) continue;
+ ZWindowGUI *zgui = zwindow->zgui;
+ zgui->lock_window("MWindow::select_zwindow 0");
+ zgui->set_done(0);
+ zgui->unlock_window();
+ }
+ zwindows_lock->unlock();
+ for( int i=0; i<zwindows.size(); ++i ) {
+ ZWindow *zwindow = zwindows[i];
+ if( zwindow->idx < 0 ) continue;
+ zwindow->close_window();
+ }
+}
+
+void MWindow::create_mixers()
+{
+ if( !session->drag_assets->size() ) return;
+ undo->update_undo_before();
+
+ select_zwindow(0);
+ ArrayList<ZWindow *>new_mixers;
+
+ for( int i=0; i<session->drag_assets->total; ++i ) {
+ Indexable *indexable = session->drag_assets->values[i];
+ ArrayList<Indexable*> new_assets;
+ new_assets.append(indexable);
+ Track *track = edl->tracks->last;
+ load_assets(&new_assets, -1, LOADMODE_NEW_TRACKS, 0, 0, 0, 0, 0, 0);
+ track = !track ? edl->tracks->first : track->next;
+ Mixer *mixer = 0;
+ ZWindow *zwindow = get_mixer(mixer);
+ while( track ) {
+ track->play = track->record = 0;
+ if( track->data_type == TRACK_VIDEO ) {
+ sprintf(track->title, _("Mixer %d"), zwindow->idx);
+ }
+ mixer->mixer_ids.append(track->get_mixer_id());
+ track = track->next;
+ }
+ char *path = indexable->path;
+ char *tp = strrchr(path, '/');
+ if( !tp ) tp = path; else ++tp;
+ zwindow->set_title(tp);
+ new_mixers.append(zwindow);
+ }
+
+ tile_mixers();
+ for( int i=0; i<new_mixers.size(); ++i )
+ new_mixers[i]->start();
+
+ refresh_mixers();
+ save_backup();
+ undo->update_undo_after(_("create mixers"), LOAD_ALL);
+ restart_brender();
+ gui->update(1, 2, 1, 1, 1, 1, 0);
+ sync_parameters(CHANGE_ALL);
+}
+
+void MWindow::open_mixers()
+{
+ for( int i=0; i<edl->mixers.size(); ++i ) {
+ Mixer *mixer = edl->mixers[i];
+ ZWindow *zwindow = get_mixer(mixer);
+ zwindow->set_title(mixer->title);
+ zwindow->start();
+ }
+ refresh_mixers();
+}
+
+int MWindow::select_zwindow(ZWindow *zwindow)
+{
+ int ret = 0, n = zwindows.number_of(zwindow);
+ if( session->selected_zwindow != n ) {
+ session->selected_zwindow = n;
+ for( int i=0; i<zwindows.size(); ++i ) {
+ ZWindow *zwindow = zwindows[i];
+ if( zwindow->idx < 0 ) continue;
+ ZWindowGUI *zgui = zwindow->zgui;
+ zgui->lock_window("MWindow::select_zwindow 0");
+ zwindow->highlighted = i == n ? 1 : 0;
+ if( zgui->draw_overlays() )
+ zgui->canvas->get_canvas()->flash(1);
+ zgui->unlock_window();
+ }
+ ret = 1;
+ gui->lock_window("MWindow::select_window 1");
+ gui->update_mixers(0, -1);
+ gui->unlock_window();
+ }
+ return ret;
+}
+
+void MWindow::tile_mixers()
+{
+ int nz = 0;
+ for( int i=0; i<zwindows.size(); ++i ) {
+ ZWindow *zwindow = zwindows[i];
+ if( zwindow->idx < 0 ) continue;
+ ++nz;
+ }
+ if( !nz ) return;
+ int zn = ceil(sqrt(nz));
+ int x1 = 1 + gui->get_x(), x2 = cwindow->gui->get_x();
+ int y1 = 1, y2 = gui->get_y();
+ int rw = gui->get_root_w(0), rh = gui->get_root_h(0);
+ if( x1 < 0 ) x1 = 0;
+ if( y1 < 0 ) y1 = 0;
+ if( x2 > rw ) x2 = rw;
+ if( y2 > rh ) y2 = rh;
+ int dx = x2 - x1, dy = y2 - y1;
+ int zw = dx / zn;
+ int lt = BC_DisplayInfo::get_left_border();
+ int top = BC_DisplayInfo::get_top_border();
+ int bw = lt + BC_DisplayInfo::get_right_border(); // borders
+ int bh = top + BC_DisplayInfo::get_bottom_border();
+ int zx = 0, zy = 0; // window origins
+ int mw = 10+10, mh = 10+10; // canvas margins
+ int rsz = 0, n = 0, dz = 0;
+ int ow = edl->session->output_w, oh = edl->session->output_h;
+ for( int i=0; i<zwindows.size(); ++i ) {
+ ZWindow *zwindow = zwindows[i];
+ if( zwindow->idx < 0 ) continue;
+ int ww = zw - bw, hh = (ww - mw) * oh / ow + mh, zh = hh + bh;
+ if( rsz < hh ) rsz = hh;
+ int xx = zx + x1, yy = zy + y1;
+ int mx = x2 - zw, my = y2 - zh;
+ if( xx > mx ) xx = mx;
+ if( yy > my ) yy = my;
+ xx += lt + dz; yy += top + dz;
+ zwindow->reposition(xx,yy, ww,hh);
+ if( zwindow->running() ) {
+ ZWindowGUI *gui = (ZWindowGUI *)zwindow->get_gui();
+ gui->lock_window("MWindow::tile_mixers");
+ gui->BC_WindowBase::reposition_window(xx,yy, ww,hh);
+ gui->unlock_window();
+ }
+ if( ++n >= zn ) {
+ n = 0; rsz += bh;
+ if( (zy += rsz) > (dy - rsz) ) dz += 10;
+ rsz = 0;
+ zx = 0;
+ }
+ else
+ zx += zw;
+ }
+}
+
void MWindow::init_cache()
{
audio_cache = new CICache(preferences);
void MWindow::stop_playback(int wait)
{
- int locked = gui->get_window_lock();
- if( locked ) gui->unlock_window();
+ gui->stop_drawing();
- cwindow->playback_engine->stop_playback();
+ cwindow->stop_playback(wait);
for(int i = 0; i < vwindows.size(); i++) {
VWindow *vwindow = vwindows[i];
if( !vwindow->is_running() ) continue;
- vwindow->playback_engine->stop_playback();
+ vwindow->stop_playback(wait);
+ }
+ for(int i = 0; i < zwindows.size(); i++) {
+ ZWindow *zwindow = zwindows[i];
+ if( zwindow->idx < 0 ) continue;
+ zwindow->stop_playback(wait);
}
- if( locked ) gui->lock_window("MWindow::stop_playback");
}
int MWindow::load_filenames(ArrayList<char*> *filenames,
// Need to stop playback since tracking depends on the EDL not getting
// deleted.
+ gui->unlock_window();
stop_playback(1);
+ gui->lock_window("MWindow::load_filenames 0");
if(debug) printf("MWindow::load_filenames %d\n", __LINE__);
undo->update_undo_before();
// Define new_edls and new_assets to load
int result = 0, ftype = -1;
- for(int i = 0; i < filenames->size(); i++)
- {
+
+ for( int i=0; i<filenames->size(); ++i ) {
// Get type of file
File *new_file = new File;
Asset *new_asset = new Asset(filenames->get(i));
if(debug) printf("MWindow::load_filenames %d\n", __LINE__);
result = 1;
- switch(ftype)
- {
+ switch( ftype ) {
// Convert media file to EDL
- case FILE_OK:
+ case FILE_OK:
// Warn about odd image dimensions
- if(new_asset->video_data &&
- ((new_asset->width % 2) ||
- (new_asset->height % 2)))
- {
- char string[BCTEXTLEN];
- sprintf(string, _("%s's resolution is %dx%d.\nImages with odd dimensions may not decode properly."),
- new_asset->path,
- new_asset->width,
- new_asset->height);
- MainError::show_error(string);
- }
-
- if(new_asset->program >= 0 &&
- edl->session->program_no != new_asset->program)
- {
- char string[BCTEXTLEN];
- sprintf(string, _("%s's index was built for program number %d\n"
- "Playback preference is %d.\n Using program %d."),
- new_asset->path, new_asset->program,
- edl->session->program_no, new_asset->program);
- MainError::show_error(string);
- }
+ if( new_asset->video_data &&
+ ((new_asset->width % 2) || (new_asset->height % 2)) ) {
+ char string[BCTEXTLEN];
+ sprintf(string, _("%s's resolution is %dx%d.\nImages with odd dimensions may not decode properly."),
+ new_asset->path, new_asset->width, new_asset->height);
+ MainError::show_error(string);
+ }
+ if( new_asset->program >= 0 &&
+ edl->session->program_no != new_asset->program ) {
+ char string[BCTEXTLEN];
+ sprintf(string, _("%s's index was built for program number %d\n"
+ "Playback preference is %d.\n Using program %d."),
+ new_asset->path, new_asset->program,
+ edl->session->program_no, new_asset->program);
+ MainError::show_error(string);
+ }
- if(load_mode != LOADMODE_RESOURCESONLY)
- {
- RecordLabels *labels = edl->session->label_cells ?
- new RecordLabels(new_file) : 0;
- asset_to_edl(new_edl, new_asset, labels);
- new_edls.append(new_edl);
- new_asset->Garbage::remove_user();
- delete labels;
- new_asset = 0;
- }
- else
- {
- new_assets.append(new_asset);
- new_asset = 0;
- }
+ if( load_mode != LOADMODE_RESOURCESONLY ) {
+ RecordLabels *labels = edl->session->label_cells ?
+ new RecordLabels(new_file) : 0;
+ asset_to_edl(new_edl, new_asset, labels);
+ new_edls.append(new_edl);
+ new_edl->add_user();
+ delete labels;
+ }
+ else {
+ new_assets.append(new_asset);
+ new_asset->add_user();
+ }
// Set filename to nothing for assets since save EDL would overwrite them.
- if(load_mode == LOADMODE_REPLACE ||
- load_mode == LOADMODE_REPLACE_CONCATENATE)
- {
- set_filename("");
+ if( load_mode == LOADMODE_REPLACE ||
+ load_mode == LOADMODE_REPLACE_CONCATENATE ) {
+ set_filename("");
// Reset timeline position
- for(int i = 0; i < TOTAL_PANES; i++)
- {
- new_edl->local_session->view_start[i] = 0;
- new_edl->local_session->track_start[i] = 0;
- }
+ for( int i=0; i<TOTAL_PANES; ++i ) {
+ new_edl->local_session->view_start[i] = 0;
+ new_edl->local_session->track_start[i] = 0;
}
+ }
- result = 0;
- break;
+ result = 0;
+ break;
// File not found
- case FILE_NOT_FOUND:
- sprintf(string, _("Failed to open %s"), new_asset->path);
- gui->show_message(string, theme->message_error);
- gui->update_default_message();
- break;
+ case FILE_NOT_FOUND:
+ sprintf(string, _("Failed to open %s"), new_asset->path);
+ gui->show_message(string, theme->message_error);
+ gui->update_default_message();
+ break;
// Unknown format
- case FILE_UNRECOGNIZED_CODEC:
- {
+ case FILE_UNRECOGNIZED_CODEC: {
// Test index file
- { IndexFile indexfile(this, new_asset);
- if( !(result = indexfile.open_index()) )
- indexfile.close_index();
- }
+ { IndexFile indexfile(this, new_asset);
+ if( !(result = indexfile.open_index()) )
+ indexfile.close_index(); }
// Test existing EDLs
- for(int j = 0; result && j <= new_edls.total; j++) {
- Asset *old_asset = j < new_edls.total ?
- new_edls[j]->assets->get_asset(new_asset->path) :
- edl->assets->get_asset(new_asset->path);
- if( old_asset ) {
- new_asset->copy_from(old_asset,1);
- result = 0;
- }
+ for( int j=0; result && j<new_edls.total; ++j ) {
+ Asset *old_asset = new_edls[j]->assets->get_asset(new_asset->path);
+ if( old_asset ) {
+ new_asset->copy_from(old_asset,1);
+ result = 0;
}
+ }
+ if( result ) {
+ Asset *old_asset = edl->assets->get_asset(new_asset->path);
+ if( old_asset ) {
+ new_asset->copy_from(old_asset,1);
+ result = 0;
+ }
+ }
// Prompt user
- if(result)
- {
- char string[BCTEXTLEN];
- FileSystem fs;
- fs.extract_name(string, new_asset->path);
-
- strcat(string, _("'s format couldn't be determined."));
- new_asset->audio_data = 1;
- new_asset->format = FILE_PCM;
- new_asset->channels = defaults->get("AUDIO_CHANNELS", 2);
- new_asset->sample_rate = defaults->get("SAMPLE_RATE", 44100);
- new_asset->bits = defaults->get("AUDIO_BITS", 16);
- new_asset->byte_order = defaults->get("BYTE_ORDER", 1);
- new_asset->signed_ = defaults->get("SIGNED_", 1);
- new_asset->header = defaults->get("HEADER", 0);
-
- FileFormat fwindow(this);
- fwindow.create_objects(new_asset, string);
- result = fwindow.run_window();
-
-
- defaults->update("AUDIO_CHANNELS", new_asset->channels);
- defaults->update("SAMPLE_RATE", new_asset->sample_rate);
- defaults->update("AUDIO_BITS", new_asset->bits);
- defaults->update("BYTE_ORDER", new_asset->byte_order);
- defaults->update("SIGNED_", new_asset->signed_);
- defaults->update("HEADER", new_asset->header);
- save_defaults();
- }
+ if( result ) {
+ char string[BCTEXTLEN];
+ FileSystem fs;
+ fs.extract_name(string, new_asset->path);
+
+ strcat(string, _("'s format couldn't be determined."));
+ new_asset->audio_data = 1;
+ new_asset->format = FILE_PCM;
+ new_asset->channels = defaults->get("AUDIO_CHANNELS", 2);
+ new_asset->sample_rate = defaults->get("SAMPLE_RATE", 44100);
+ new_asset->bits = defaults->get("AUDIO_BITS", 16);
+ new_asset->byte_order = defaults->get("BYTE_ORDER", 1);
+ new_asset->signed_ = defaults->get("SIGNED_", 1);
+ new_asset->header = defaults->get("HEADER", 0);
+
+ FileFormat fwindow(this);
+ fwindow.create_objects(new_asset, string);
+ result = fwindow.run_window();
+
+ defaults->update("AUDIO_CHANNELS", new_asset->channels);
+ defaults->update("SAMPLE_RATE", new_asset->sample_rate);
+ defaults->update("AUDIO_BITS", new_asset->bits);
+ defaults->update("BYTE_ORDER", new_asset->byte_order);
+ defaults->update("SIGNED_", new_asset->signed_);
+ defaults->update("HEADER", new_asset->header);
+ save_defaults();
+ }
// Append to list
- if(!result)
- {
+ if( !result ) {
// Recalculate length
- delete new_file;
- new_file = new File;
- result = new_file->open_file(preferences, new_asset, 1, 0);
+ delete new_file;
+ new_file = new File;
+ result = new_file->open_file(preferences, new_asset, 1, 0);
- if(load_mode != LOADMODE_RESOURCESONLY)
- {
- RecordLabels *labels = edl->session->label_cells ?
- new RecordLabels(new_file) : 0;
- asset_to_edl(new_edl, new_asset, labels);
- new_edls.append(new_edl);
- new_asset->Garbage::remove_user();
- delete labels;
- new_asset = 0;
- }
- else
- {
- new_assets.append(new_asset);
- new_asset = 0;
- }
+ if( load_mode != LOADMODE_RESOURCESONLY ) {
+ RecordLabels *labels = edl->session->label_cells ?
+ new RecordLabels(new_file) : 0;
+ asset_to_edl(new_edl, new_asset, labels);
+ new_edls.append(new_edl);
+ new_edl->add_user();
+ delete labels;
}
- else
- {
- result = 1;
+ else {
+ new_assets.append(new_asset);
+ new_asset->add_user();
}
- break;
}
+ else {
+ result = 1;
+ }
+ break; }
- case FILE_IS_XML:
- {
- FileXML xml_file;
+ case FILE_IS_XML: {
+ FileXML xml_file;
if(debug) printf("MWindow::load_filenames %d\n", __LINE__);
- xml_file.read_from_file(filenames->get(i));
+ 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;
+ 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;
}
- 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)
- {
+ }
+ 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.
- EDL *nested_edl = new EDL;
- nested_edl->create_objects();
- nested_edl->set_path(filenames->get(i));
- nested_edl->load_xml(&xml_file, LOAD_ALL);
+ EDL *nested_edl = new EDL;
+ nested_edl->create_objects();
+ nested_edl->set_path(filenames->get(i));
+ nested_edl->load_xml(&xml_file, LOAD_ALL);
//printf("MWindow::load_filenames %p %s\n", nested_edl, nested_edl->project_path);
- edl_to_nested(new_edl, nested_edl);
- nested_edl->Garbage::remove_user();
- }
- else
- {
+ edl_to_nested(new_edl, nested_edl);
+ nested_edl->Garbage::remove_user();
+ }
+ else {
// Load EDL for pasting
- new_edl->load_xml(&xml_file, LOAD_ALL);
+ new_edl->load_xml(&xml_file, LOAD_ALL);
if(debug) printf("MWindow::load_filenames %d\n", __LINE__);
- test_plugins(new_edl, filenames->get(i));
+ test_plugins(new_edl, filenames->get(i));
if(debug) printf("MWindow::load_filenames %d\n", __LINE__);
- if(load_mode == LOADMODE_REPLACE ||
- load_mode == LOADMODE_REPLACE_CONCATENATE)
- {
- strcpy(session->filename, filenames->get(i));
- strcpy(new_edl->local_session->clip_title,
- filenames->get(i));
- if(update_filename)
- set_filename(new_edl->local_session->clip_title);
- }
- else
- if( load_mode == LOADMODE_RESOURCESONLY ) {
- strcpy(new_edl->local_session->clip_title,
- filenames->get(i));
- struct stat st;
- time_t t = !stat(filenames->get(i),&st) ?
- st.st_mtime : time(&t);
- ctime_r(&t, new_edl->local_session->clip_notes);
- }
+ if( load_mode == LOADMODE_REPLACE ||
+ load_mode == LOADMODE_REPLACE_CONCATENATE ) {
+ strcpy(session->filename, filenames->get(i));
+ strcpy(new_edl->local_session->clip_title,
+ filenames->get(i));
+ if(update_filename)
+ set_filename(new_edl->local_session->clip_title);
+ }
+ else if( load_mode == LOADMODE_RESOURCESONLY ) {
+ strcpy(new_edl->local_session->clip_title,
+ filenames->get(i));
+ struct stat st;
+ time_t t = !stat(filenames->get(i),&st) ?
+ st.st_mtime : time(&t);
+ ctime_r(&t, new_edl->local_session->clip_notes);
}
-
- new_edls.append(new_edl);
- result = 0;
- break;
}
+
+ new_edls.append(new_edl);
+ new_edl->add_user();
+ result = 0;
+ break; }
}
-// edls are in new_edls
- if( result && new_edl ) new_edl->Garbage::remove_user();
-// assets are copied
- if( new_asset ) new_asset->Garbage::remove_user();
+ new_edl->Garbage::remove_user();
+ new_asset->Garbage::remove_user();
// Store for testing index
new_files.append(new_file);
edl->session->proxy_use_scaler = 0;
edl->session->proxy_auto_scale = 0;
edl->local_session->preview_start = 0;
- edl->local_session->preview_end = edl->tracks->total_playable_length();
+ edl->local_session->preview_end = 0;
edl->local_session->loop_playback = 0;
edl->local_session->set_selectionstart(0);
edl->local_session->set_selectionend(0);
}
else
{
- cwindow->playback_engine->que->send_command(CURRENT_FRAME,
- change_type,
- edl,
- 1);
+ cwindow->refresh_frame(change_type);
}
}
if(debug) PRINT_TRACE
// Close all the vwindows
- if(load_mode == LOADMODE_REPLACE ||
- load_mode == LOADMODE_REPLACE_CONCATENATE) {
+ if( load_mode == LOADMODE_REPLACE ||
+ load_mode == LOADMODE_REPLACE_CONCATENATE ) {
if(debug) PRINT_TRACE
int first_vwindow = 0;
if(session->show_vwindow) first_vwindow = 1;
vwindow->close_window();
}
if(debug) PRINT_TRACE
+ select_zwindow(0);
+ close_mixers();
+
+ for( int i=0; i<edl->mixers.size(); ++i ) {
+ Mixer *mixer = edl->mixers[i];
+ ZWindow *zwindow = get_mixer(mixer);
+ zwindow->set_title(mixer->title);
+ zwindow->start();
+ }
}
- else if(vwindows.size()) {
- VWindow *vwindow = vwindows[DEFAULT_VWINDOW];
- if( vwindow->is_running() ) {
- vwindow->gui->lock_window("MWindow::update_project");
- vwindow->update(1);
- vwindow->gui->unlock_window();
+ else {
+ if(vwindows.size()) {
+ VWindow *vwindow = vwindows[DEFAULT_VWINDOW];
+ if( vwindow->is_running() ) {
+ vwindow->gui->lock_window("MWindow::update_project");
+ vwindow->update(1);
+ vwindow->gui->unlock_window();
+ }
}
}
cwindow->gui->unlock_window();
if(debug) PRINT_TRACE
- cwindow->playback_engine->que->send_command(CURRENT_FRAME,
- CHANGE_ALL,
- edl,
- 1);
+ cwindow->refresh_frame(CHANGE_ALL);
awindow->gui->async_update_assets();
if(debug) PRINT_TRACE
gui->lock_window("MWindow::update_project");
+ gui->update_mixers(0, 0);
gui->flush();
if(debug) PRINT_TRACE
}
asset->reset_audio();
}
asset->reset_video();
+ remove_asset_from_caches(asset);
// File file; // re-probe the asset
// file.open_file(preferences, asset, 1, 0);
}
wave_cache->remove_all();
audio_cache->remove_all();
video_cache->remove_all();
- if( cwindow->playback_engine && cwindow->playback_engine->audio_cache )
- cwindow->playback_engine->audio_cache->remove_all();
- if( cwindow->playback_engine && cwindow->playback_engine->video_cache )
- cwindow->playback_engine->video_cache->remove_all();
-
+ if( cwindow->playback_engine ) {
+ if( cwindow->playback_engine->audio_cache )
+ cwindow->playback_engine->audio_cache->remove_all();
+ if( cwindow->playback_engine->video_cache )
+ cwindow->playback_engine->video_cache->remove_all();
+ }
for(int i = 0; i < vwindows.size(); i++) {
VWindow *vwindow = vwindows[i];
if( !vwindow->is_running() ) continue;
- if(vwindow->playback_engine && vwindow->playback_engine->audio_cache)
+ if( !vwindow->playback_engine ) continue;
+ if( vwindow->playback_engine->audio_cache )
vwindow->playback_engine->audio_cache->remove_all();
- if(vwindow->playback_engine && vwindow->playback_engine->video_cache)
+ if( vwindow->playback_engine->video_cache )
vwindow->playback_engine->video_cache->remove_all();
}
}
void MWindow::remove_asset_from_caches(Asset *asset)
{
- gui->resource_thread->get_video_source(0);
- gui->resource_thread->get_audio_source(0);
frame_cache->remove_asset(asset);
wave_cache->remove_asset(asset);
audio_cache->delete_entry(asset);
for(int i = 0; i < vwindows.size(); i++) {
VWindow *vwindow = vwindows[i];
if( !vwindow->is_running() ) continue;
- if(vwindow->playback_engine && vwindow->playback_engine->audio_cache)
+ if( !vwindow->playback_engine ) continue;
+ if( vwindow->playback_engine->audio_cache )
vwindow->playback_engine->audio_cache->delete_entry(asset);
- if(vwindow->playback_engine && vwindow->playback_engine->video_cache)
+ if( vwindow->playback_engine->video_cache )
vwindow->playback_engine->video_cache->delete_entry(asset);
}
}
return (PanAuto*)ptr->get_prev_auto( (long)unit_position, PLAY_FORWARD, current);
}
+PatchGUI *MWindow::get_patchgui(Track *track)
+{
+ PatchGUI *patchgui = 0;
+ TimelinePane **panes = gui->pane;
+ for( int i=0; i<TOTAL_PANES && !patchgui; ++i ) {
+ if( !panes[i] ) continue;
+ PatchBay *patchbay = panes[i]->patchbay;
+ if( !patchbay ) continue;
+ for( int j=0; j<patchbay->patches.total && !patchgui; ++j ) {
+ if( patchbay->patches.values[j]->track == track )
+ patchgui = patchbay->patches.values[j];
+ }
+ }
+ return patchgui;
+}