in_destructor = 0;
speed_edl = 0;
beeper = 0;
+ redraw_tracks = 0;
shuttle = 0;
wintv = 0;
x10tv = 0;
#ifdef HAVE_DVB
gui->channel_info->stop();
#endif
- delete beeper;
- delete create_bd; create_bd = 0;
- delete create_dvd; create_dvd = 0;
+ delete beeper; beeper = 0;
+ delete redraw_tracks; redraw_tracks = 0;
+ delete create_bd; create_bd = 0;
+ delete create_dvd; create_dvd = 0;
#ifdef HAVE_SHUTTLE
delete shuttle; shuttle = 0;
#endif
gui->del_keyboard_listener(
(int (BC_WindowBase::*)(BC_WindowBase *))
&MWindowGUI::keyboard_listener);
+ reset_caches();
#if 0
// release the hounds
if( awindow && awindow->gui ) awindow->gui->close(0);
gui->close(0);
join();
#endif
- reset_caches();
dead_plugins->remove_all_objects();
// must delete theme before destroying plugindb
// theme destructor will be deleted by delete_plugins
delete gui; gui = 0;
delete mainindexes; mainindexes = 0;
delete mainprogress; mainprogress = 0;
- delete audio_cache; audio_cache = 0; // delete the cache after the assets
- delete video_cache; video_cache = 0; // delete the cache after the assets
+ // delete the caches after the assets
+ if( audio_cache ) { audio_cache->remove_user(); audio_cache = 0; }
+ if( video_cache ) { video_cache->remove_user(); video_cache = 0; }
delete frame_cache; frame_cache = 0;
delete wave_cache; wave_cache = 0;
delete plugin_guis; plugin_guis = 0;
return zwindow;
}
-void MWindow::del_mixer(ZWindow *zwindow)
+ZWindow *MWindow::get_mixer(int idx)
+{
+ ZWindow *zwindow = 0;
+ zwindows_lock->lock("MWindow::get_mixer");
+ for( int i=0; !zwindow && i<zwindows.size(); ++i ) {
+ ZWindow *zwdw = zwindows[i];
+ if( !zwdw->running() ) continue;
+ if( zwdw->idx != idx ) continue;
+ zwindow = zwindows[i];
+ }
+ zwindows_lock->unlock();
+ return zwindow;
+}
+
+void MWindow::close_mixer(ZWindow *zwindow)
{
- zwindows_lock->lock("MWindow::del_mixer 0");
- edl->mixers.del_mixer(zwindow->idx);
+ zwindows_lock->lock("MWindow::close_mixer 0");
if( session->selected_zwindow >= 0 ) {
int i = zwindows.number_of(zwindow);
if( i >= 0 && i < session->selected_zwindow )
session->selected_zwindow = -1;
}
zwindows_lock->unlock();
- gui->lock_window("MWindow::del_mixer 1");
+ gui->lock_window("MWindow::close_mixer 1");
gui->update_mixers(0, -1);
gui->unlock_window();
}
k = mixer->mixer_ids.size();
while( --k >= 0 && track->get_mixer_id() != mixer->mixer_ids[k] );
if( k >= 0 ) {
- track->record = 1;
+ track->armed = 1;
track->play = track->data_type == TRACK_VIDEO ? 1 : 0;
}
else
- track->record = track->play = 0;
+ track->armed = track->play = 0;
}
zwindow->change_source(mixer_edl);
zwindow->handle_mixer(command, 0,
Mixer *mixer = 0;
ZWindow *zwindow = get_mixer(mixer);
while( track ) {
- track->play = track->record = 0;
+ track->play = track->armed = 0;
if( track->data_type == TRACK_VIDEO ) {
sprintf(track->title, _("Mixer %d"), zwindow->idx);
}
}
}
+void MWindow::set_gang_tracks(int v)
+{
+ edl->session->gang_tracks = v;
+ gui->update(1, 1, 0, 0, 1, 0, 0);
+ gui->flush();
+}
+
+
void MWindow::init_cache()
{
audio_cache = new CICache(preferences);
//check it
for(Track *track=tracks->first; track && !errmsg; track=track->next) {
if( track->data_type != TRACK_VIDEO ) continue;
- if( !track->record ) continue;
+ if( !track->armed ) continue;
if( count > 0 ) { errmsg = _("multiple video tracks"); break; }
++count;
int64_t units_start = track->to_units(start,0);
//run it
for(Track *track=tracks->first; track && !errmsg; track=track->next) {
if( track->data_type != TRACK_VIDEO ) continue;
- if( !track->record ) continue;
+ if( !track->armed ) continue;
int64_t units_start = track->to_units(start,0);
int64_t units_end = track->to_units(end,0);
Edits *edits = track->edits;
if(got_indexes) mainindexes->start_build();
// Open plugin GUIs
- Track *track = edl->tracks->first;
- while( track ) {
- for( int j = 0; j < track->plugin_set.size(); j++ ) {
- PluginSet *plugins = track->plugin_set[j];
- Plugin *plugin = plugins->get_first_plugin();
-
- while(plugin) {
- if( load_mode == LOADMODE_REPLACE ||
- load_mode == LOADMODE_REPLACE_CONCATENATE ) {
- if( plugin->plugin_type == PLUGIN_STANDALONE &&
- plugin->show ) {
- show_plugin(plugin);
- }
- }
-
- plugin = (Plugin*)plugin->next;
- }
- }
-
- track = track->next;
- }
+ show_plugins();
// opening new session
if( ( load_mode == LOADMODE_REPLACE ||
for( int i=0,n=edl->nested_edls.size(); i<n; ++i ) {
EDL *orig_nested = edl->nested_edls[i];
char new_path[BCTEXTLEN];
- if( !ProxyRender::from_proxy_path(new_path, orig_nested, proxy_scale) )
- continue;
proxy_render.to_proxy_path(new_path, orig_nested, proxy_scale);
// test if proxy asset was already added to proxy_assets
int got_it = 0;
void MWindow::restore_windows()
{
+ gui->unlock_window();
if( !session->show_vwindow ) {
for( int i=0, n=vwindows.size(); i<n; ++i ) {
VWindow *vwindow = vwindows[i];
else if( session->show_lwindow && lwindow->gui->is_hidden() )
show_lwindow();
+ gui->lock_window("MWindow::restore_windows");
gui->focus();
}
gui->mbuttons->edit_panel->keyframe->update(value);
gui->flush();
cwindow->gui->lock_window("MWindow::set_auto_keyframes");
- cwindow->gui->edit_panel->keyframe->update(value);
cwindow->gui->flush();
cwindow->gui->unlock_window();
}
gui->mbuttons->edit_panel->span_keyframe->update(value);
gui->flush();
cwindow->gui->lock_window("MWindow::set_span_keyframes");
- cwindow->gui->edit_panel->span_keyframe->update(value);
cwindow->gui->flush();
cwindow->gui->unlock_window();
}
{
keyframe_gui_lock->lock("MWindow::show_keyframe_gui");
// Find existing thread
- for(int i = 0; i < keyframe_threads->size(); i++)
- {
- if(keyframe_threads->get(i)->plugin == plugin)
- {
+ for( int i=0; i<keyframe_threads->size(); ++i ) {
+ int plugin_id = keyframe_threads->get(i)->plugin_id;
+ if( plugin_id == plugin->orig_id ) {
keyframe_threads->get(i)->start_window(plugin, 0);
keyframe_gui_lock->unlock();
return;
}
// Find unused thread
- for(int i = 0; i < keyframe_threads->size(); i++)
- {
- if(!keyframe_threads->get(i)->plugin)
- {
+ for( int i=0; i<keyframe_threads->size(); ++i ) {
+ if( keyframe_threads->get(i)->plugin_id < 0 ) {
keyframe_threads->get(i)->start_window(plugin, 0);
keyframe_gui_lock->unlock();
return;
KeyFrameThread *thread = new KeyFrameThread(this);
keyframe_threads->append(thread);
thread->start_window(plugin, 0);
-
keyframe_gui_lock->unlock();
}
//printf("MWindow::show_plugin %d\n", __LINE__);
SET_TRACE
-
plugin_gui_lock->lock("MWindow::show_plugin");
- for(int i = 0; i < plugin_guis->total; i++)
- {
-// Pointer comparison
- if(plugin_guis->get(i)->plugin == plugin)
- {
- plugin_guis->get(i)->raise_window();
+ for( int i=0; i<plugin_guis->total; ++i ) {
+// Pointer/id comparison
+ PluginServer *plugin_gui = plugin_guis->get(i);
+ if( plugin_gui->plugin_id == plugin->orig_id ) {
+ plugin_gui->raise_window();
done = 1;
break;
}
void MWindow::hide_plugin(Plugin *plugin, int lock)
{
plugin->show = 0;
+ return hide_plugin(plugin->orig_id, lock);
+}
+
+void MWindow::hide_plugin(int plugin_id, int lock)
+{
// Update the toggle
gui->lock_window("MWindow::hide_plugin");
gui->update(0, NORMAL_DRAW, 0, 0, 0, 0, 0);
gui->unlock_window();
if(lock) plugin_gui_lock->lock("MWindow::hide_plugin");
- for(int i = 0; i < plugin_guis->total; i++)
- {
- if(plugin_guis->get(i)->plugin == plugin)
- {
- PluginServer *ptr = plugin_guis->get(i);
- plugin_guis->remove(ptr);
+ for( int i=0; i<plugin_guis->total; ++i ) {
+ PluginServer *plugin_gui = plugin_guis->get(i);
+ if( plugin_gui->plugin_id == plugin_id ) {
+ plugin_guis->remove(plugin_gui);
if(lock) plugin_gui_lock->unlock();
// Last command executed in client side close
// Schedule for deletion
- ptr->hide_gui();
- delete_plugin(ptr);
+ plugin_gui->hide_gui();
+ delete_plugin(plugin_gui);
//sleep(1);
return;
}
void MWindow::hide_keyframe_gui(Plugin *plugin)
{
keyframe_gui_lock->lock("MWindow::hide_keyframe_gui");
- for(int i = 0; i < keyframe_threads->size(); i++)
- {
- if(keyframe_threads->get(i)->plugin == plugin)
- {
- keyframe_threads->get(i)->close_window();
+ for( int i = 0; i < keyframe_threads->size(); i++) {
+ KeyFrameThread *keyframe_gui = keyframe_threads->get(i);
+ if( keyframe_gui->plugin_id == plugin->orig_id ) {
+ keyframe_gui->close_window();
break;
}
}
char path[BCTEXTLEN];
if( !edit->asset || edit->track->data_type != TRACK_VIDEO ||
edl->session->proxy_scale == 1 ||
- ProxyRender::from_proxy_path(path, idxbl, edl->session->proxy_scale) )
+ ProxyRender::from_proxy_path(path, (Asset*)idxbl, edl->session->proxy_scale) )
strcpy(path, idxbl->path);
char *cp = strrchr(path, '/');
cp = !cp ? path : cp+1;
{
// Send new configuration to keyframe GUI's
keyframe_gui_lock->lock("MWindow::update_keyframe_guis");
- for(int i = 0; i < keyframe_threads->size(); i++)
- {
- KeyFrameThread *ptr = keyframe_threads->get(i);
- if(edl->tracks->plugin_exists(ptr->plugin))
- ptr->update_gui(1);
+ for( int i=0; i<keyframe_threads->size(); ++i ) {
+ KeyFrameThread *keyframe_gui = keyframe_threads->get(i);
+ Plugin *plugin = edl->tracks->plugin_exists(keyframe_gui->plugin_id);
+ if( plugin )
+ keyframe_gui->update_gui(1);
else
- {
- ptr->close_window();
- }
+ keyframe_gui->close_window();
}
keyframe_gui_lock->unlock();
}
// Send new configuration to plugin GUI's
plugin_gui_lock->lock("MWindow::update_plugin_guis");
- for(int i = 0; i < plugin_guis->size(); i++)
- {
- PluginServer *ptr = plugin_guis->get(i);
- if(edl->tracks->plugin_exists(ptr->plugin))
- ptr->update_gui();
- else
- {
-// Schedule for deletion if no plugin
- plugin_guis->remove_number(i);
- i--;
-
- ptr->hide_gui();
- delete_plugin(ptr);
+ for( int i=0; i<plugin_guis->size(); ++i ) {
+ PluginServer *plugin_gui = plugin_guis->get(i);
+ Plugin *plugin = edl->tracks->plugin_exists(plugin_gui->plugin_id);
+ if( plugin && plugin->show )
+ plugin_gui->update_gui();
+ else {
+// Schedule for deletion if no plugin or not shown
+ plugin_guis->remove_number(i--);
+ plugin_gui->hide_gui();
+ delete_plugin(plugin_gui);
}
}
// Change plugin variable if not visible
Track *track = edl->tracks->first;
- while(track)
- {
- for(int i = 0; i < track->plugin_set.size(); i++)
- {
+ for( ; track; track=track->next ) {
+ for( int i=0; i < track->plugin_set.size(); ++i ) {
Plugin *plugin = (Plugin*)track->plugin_set[i]->first;
- while(plugin)
- {
+ for( ; plugin; plugin = (Plugin*)plugin->next ) {
int got_it = 0;
- for(int i = 0; i < plugin_guis->size(); i++)
- {
+ for( int i=0; i<plugin_guis->size(); ++i ) {
PluginServer *server = plugin_guis->get(i);
- if(server->plugin == plugin)
- {
+ if( server->plugin_id == plugin->orig_id ) {
got_it = 1;
break;
}
}
-
- if(!got_it) plugin->show = 0;
- plugin = (Plugin*)plugin->next;
+ if( !got_it ) plugin->show = 0;
}
}
-
- track = track->next;
}
plugin_gui_lock->unlock();
-
-
- if(do_keyframe_guis) update_keyframe_guis();
+ if( do_keyframe_guis )
+ update_keyframe_guis();
}
void MWindow::stop_plugin_guis()
plugin_gui_lock->lock("MWindow::stop_plugin_guis");
for( int i=0; i<plugin_guis->size(); ++i ) {
- PluginServer *ptr = plugin_guis->get(i);
- if( edl->tracks->plugin_exists(ptr->plugin) ) {
- ptr->render_stop();
- }
+ PluginServer *plugin_gui = plugin_guis->get(i);
+ plugin_gui->render_stop();
}
plugin_gui_lock->unlock();
}
void MWindow::update_plugin_states()
{
plugin_gui_lock->lock("MWindow::update_plugin_states");
- for(int i = 0; i < plugin_guis->total; i++)
- {
- int result = 0;
+ for( int i=0; i<plugin_guis->total; ++i ) {
// Get a plugin GUI
- Plugin *src_plugin = plugin_guis->get(i)->plugin;
PluginServer *src_plugingui = plugin_guis->get(i);
-
-// Search for plugin in EDL. Only the master EDL shows plugin GUIs.
- for(Track *track = edl->tracks->first;
- track && !result;
- track = track->next)
- {
- for(int j = 0;
- j < track->plugin_set.total && !result;
- j++)
- {
- PluginSet *plugin_set = track->plugin_set[j];
- for(Plugin *plugin = (Plugin*)plugin_set->first;
- plugin && !result;
- plugin = (Plugin*)plugin->next)
- {
- if(plugin == src_plugin &&
- !strcmp(plugin->title, src_plugingui->title)) result = 1;
- }
- }
- }
-
-
+ int plugin_id = src_plugingui->plugin_id;
+ Plugin *src_plugin = edl->tracks->plugin_exists(plugin_id);
// Doesn't exist anymore
- if(!result)
- {
- hide_plugin(src_plugin, 0);
- i--;
+ if( !src_plugin ) {
+ hide_plugin(plugin_id, 0);
+ --i;
}
}
plugin_gui_lock->unlock();
void MWindow::update_plugin_titles()
{
- for(int i = 0; i < plugin_guis->total; i++)
- {
+ for( int i=0; i<plugin_guis->total; ++i )
plugin_guis->get(i)->update_title();
- }
}
int MWindow::asset_to_edl(EDL *new_edl,
for( int i=0; i<edl->mixers.size(); ++i ) {
Mixer *mixer = edl->mixers[i];
+ if( !mixer->show ) continue;
ZWindow *zwindow = get_mixer(mixer);
zwindow->set_title(mixer->title);
zwindow->start();
if(debug) PRINT_TRACE
}
-void MWindow::stack_push(EDL *new_edl, Indexable *idxbl)
+void MWindow::stack_push(EDL *new_edl, Indexable *idxbl, Edit *edit)
{
int got_indexes = 0;
for( int i=0; i<new_edl->nested_edls.size(); ++i ) {
gui->lock_window("MWindow::stack_push");
if( stack.size() < 9 ) {
save_backup();
+ hide_plugins();
undo_before();
StackItem &item = stack.append();
item.edl = edl;
+ item.edit = edit;
item.new_edl = new_edl;
+ item.duration = new_edl->tracks->total_length();
item.undo = undo;
item.idxbl = idxbl;
item.mtime = 0;
update_project(LOADMODE_REPLACE);
}
gui->unlock_window();
+ show_plugins();
}
void MWindow::stack_pop()
if( !stack.size() ) return;
// writes on config_path/backup%d.xml
save_backup();
+ hide_plugins();
// already have gui lock
StackItem &item = stack.last();
// session edl replaced, overwrite and save clip data
if( item.new_edl != edl )
item.new_edl->overwrite_clip(edl);
+ Edit *edit = item.edit;
+// resize the referring edit if the edl duration changed
+ if( edit ) {
+ double duration = item.new_edl->tracks->total_length();
+ double dt = duration - item.duration;
+ if( fabs(dt) > 1e-4 ) {
+ int64_t du = edit->track->to_units(dt,0);
+ if( (edit->length+=du) < 0 )
+ edit->length = 0;
+ }
+ }
edl->remove_user();
edl = item.edl;
delete undo;
stack.remove();
if( idxbl ) {
gui->unlock_window();
+ gui->resource_thread->close_indexable(idxbl);
remove_from_caches(idxbl);
remove_indexfile(idxbl);
mainindexes->add_indexable(idxbl);
strcpy(session->filename, edl->path);
update_project(LOADMODE_REPLACE);
undo_after(_("open edl"), LOAD_ALL);
+ show_plugins();
gui->stack_button->update();
if( mtime && idxbl && idxbl->is_asset ) {
struct stat st;
}
}
+int MWindow::save(EDL *edl, char *filename, int stat)
+{
+ FileXML file;
+ edl->save_xml(&file, filename);
+ file.terminate_string();
+ if( file.write_to_file(filename) ) {
+ eprintf(_("Couldn't open %s"), filename);
+ return 1;
+ }
+ if( stat ) {
+ char string[BCTEXTLEN];
+ char *filename = stack.size() ?
+ stack[0].edl->path : session->filename;
+ sprintf(string, _("\"%s\" %jdC written"),
+ filename, file.length());
+ gui->lock_window("SaveAs::run");
+ gui->show_message(string);
+ gui->unlock_window();
+ }
+ return 0;
+}
+
+int MWindow::save(int save_as)
+{
+ char new_path[BCTEXTLEN]; new_path[0] = 0;
+ char *path = stack.size() ? stack[0].edl->path : session->filename;
+ if( save_as || !path[0] ) {
+ if( ConfirmSave::get_save_path(this, new_path) )
+ return 1;
+ if( stack.size() ) {
+ strcpy(path, new_path);
+ set_titlebar(new_path);
+ }
+ else
+ set_filename(new_path);
+ gui->mainmenu->add_load(new_path);
+ path = new_path;
+ }
+ for( int i=stack.size(); --i>=0; ) {
+ StackItem &item = stack[i];
+ Indexable *idxbl = item.idxbl;
+ if( idxbl->is_asset ) {
+ Asset *asset = (Asset *)idxbl;
+ if( asset->format == FILE_REF ) {
+ if( save(item.new_edl, asset->path, 0) )
+ return 1;
+ }
+ }
+ else if( item.new_edl != item.idxbl )
+ item.new_edl->overwrite_clip((EDL*)item.idxbl);
+ }
+ EDL *new_edl = stack.size() ? stack[0].edl : edl;
+ save(new_edl, path, 1);
+ return 0;
+}
+
+void MWindow::show_plugins()
+{
+ for( Track *track=edl->tracks->first; track; track=track->next ) {
+ for( int i=0; i<track->plugin_set.size(); ++i ) {
+ PluginSet *plugins = track->plugin_set[i];
+ Plugin *plugin = plugins->get_first_plugin();
+ for( ; plugin; plugin=(Plugin*)plugin->next ) {
+ if( plugin->plugin_type == PLUGIN_STANDALONE &&
+ plugin->show )
+ show_plugin(plugin);
+ }
+ }
+ }
+}
+
void MWindow::clip_to_media()
{
if( edl->session->proxy_scale != 1 ) {
return;
}
undo_before();
+ awindow->gui->stop_vicon_drawing();
int clips_total = session->drag_clips->total;
for( int i=0; i<clips_total; ++i ) {
EDL *clip = session->drag_clips->values[i];
char *bp = strrchr(clip->local_session->clip_title, '/');
bp = bp ? bp+1 : clip->local_session->clip_title;
cp += snprintf(cp, ep-cp, "%s", bp);
- EDL *nested = edl->new_nested_edl(clip, path);
+ EDL *nested = edl->new_nested_clip(clip, path);
edl->clips.remove(clip);
clip->remove_user();
mainindexes->add_indexable(nested);
void MWindow::reset_caches()
{
+ int locked = gui->get_window_lock();
+ if( locked ) gui->unlock_window();
+ awindow->gui->stop_vicon_drawing(1);
frame_cache->remove_all();
wave_cache->remove_all();
audio_cache->remove_all();
if( vwindow->playback_engine->video_cache )
vwindow->playback_engine->video_cache->remove_all();
}
+ if( locked ) gui->lock_window("MWindow::reset_caches");
}
void MWindow::remove_from_caches(Indexable *idxbl)
{
+ awindow->gui->stop_vicon_drawing(1);
frame_cache->remove_item(idxbl);
wave_cache->remove_item(idxbl);
if( gui->render_engine &&
delete gui->render_engine;
gui->render_engine = 0;
}
- if( gui->resource_thread->render_engine_id == idxbl->id ) {
- gui->resource_thread->render_engine_id = -1;
- delete gui->resource_thread->render_engine;
- gui->resource_thread->render_engine = 0;
- }
+ gui->resource_thread->close_indexable(idxbl);
if( !idxbl->is_asset ) return;
Asset *asset = (Asset *)idxbl;
audio_cache->delete_entry(asset);
if( zwindow->zgui->playback_engine->video_cache )
zwindow->zgui->playback_engine->video_cache->delete_entry(asset);
}
+ awindow->gui->start_vicon_drawing();
}
void MWindow::remove_assets_from_project(int push_undo, int redraw, int delete_indexes,
ArrayList<Indexable*> *drag_assets, ArrayList<EDL*> *drag_clips)
{
- awindow->gui->close_view_popup();
+ awindow->gui->stop_vicon_drawing(1);
// Remove from VWindow.
if( drag_clips ) {
fprintf(fp, "\n");
}
+void MWindow::dump_caches(FILE *fp)
+{
+ fprintf(fp, "audio cache: ");
+ audio_cache->dump(fp);
+ fprintf(fp, "video cache: ");
+ video_cache->dump(fp);
+}
+
void MWindow::trap_hook(FILE *fp, void *vp)
{
MWindow *mwindow = (MWindow *)vp;
mwindow->dump_undo(fp);
fprintf(fp, "\nEXE: %s\n", AboutPrefs::build_timestamp);
mwindow->dump_exe(fp);
+ fprintf(fp, "\nCACHES:\n");
+ mwindow->dump_caches(fp);
}
strcpy(session->filename, filename);
if( filename != edl->path )
strcpy(edl->path, filename);
+ return set_titlebar(filename);
+}
- if(gui)
- {
- if(filename[0] == 0)
- {
- gui->set_title(PROGRAM_NAME);
- }
- else
- {
- FileSystem dir;
- char string[BCTEXTLEN], string2[BCTEXTLEN];
- dir.extract_name(string, filename);
- sprintf(string2, PROGRAM_NAME ": %s", string);
- gui->set_title(string2);
- }
+int MWindow::set_titlebar(const char *filename)
+{
+ if( !gui ) return 0;
+ if( filename[0] ) {
+ FileSystem dir;
+ char string[BCTEXTLEN], string2[BCTEXTLEN];
+ dir.extract_name(string, filename);
+ sprintf(string2, PROGRAM_NAME ": %s", string);
+ gui->set_title(string2);
}
+ else
+ gui->set_title(PROGRAM_NAME);
return 0;
}
-
-
-
-
-
-
int MWindow::set_loop_boundaries()
{
double start = edl->local_session->get_selectionstart();
track->track_h = edl->session->output_h;
}
else if( delete_tracks )
- edl->tracks->delete_track(track);
+ edl->tracks->delete_track(track, 0);
}
edl->retrack();
edl->resample(old_framerate, session->frame_rate, TRACK_VIDEO);
delete edit;
}
if( !track->edits->first )
- edl->tracks->delete_track(track);
+ edl->tracks->delete_track(track, 0);
}
}
edl->rechannel();
return patchgui;
}
+int MWindow::get_cpus(int out_w, int out_h)
+{
+ if( !out_w ) out_w = edl->session->output_w;
+ if( !out_h ) out_h = edl->session->output_h;
+ int cpus = out_w*out_h/0x80000 + 1;
+ if( cpus > preferences->processors )
+ cpus = preferences->processors;
+ return cpus;
+}
+int MWindow::get_cpus()
+{
+ return get_cpus(edl->session->output_w, edl->session->output_h);
+}
+
+void MWindow::draw_trackmovement()
+{
+ if( !redraw_tracks )
+ redraw_tracks = new DrawTrackMovement(this);
+ redraw_tracks->start();
+}
+
+DrawTrackMovement::DrawTrackMovement(MWindow *mwindow)
+ : Thread(1, 0, 0)
+{
+ this->mwindow = mwindow;
+}
+DrawTrackMovement::~DrawTrackMovement()
+{
+ join();
+}
+
+void DrawTrackMovement::run()
+{
+ mwindow->gui->lock_window("DrawTrackMovement::run");
+ mwindow->edl->tracks->update_y_pixels(mwindow->theme);
+ mwindow->gui->draw_trackmovement();
+ mwindow->gui->unlock_window();
+}
+