X-Git-Url: https://git.cinelerra-gg.org/git/?p=goodguy%2Fcinelerra.git;a=blobdiff_plain;f=cinelerra-5.1%2Fcinelerra%2Fmwindow.C;h=c4e7a7cbf1fe22118a12034cffddcfe47ed2c114;hp=b38e3c653c57556ac36f90595162b1100861c01f;hb=48a6854a1ca58aa291ffc6fe3a48807492dfbef7;hpb=3643286e2dbb3002604a62e3e6fd834716b4ae63 diff --git a/cinelerra-5.1/cinelerra/mwindow.C b/cinelerra-5.1/cinelerra/mwindow.C index b38e3c65..c4e7a7cb 100644 --- a/cinelerra-5.1/cinelerra/mwindow.C +++ b/cinelerra-5.1/cinelerra/mwindow.C @@ -243,6 +243,7 @@ MWindow::MWindow() in_destructor = 0; speed_edl = 0; beeper = 0; + redraw_tracks = 0; shuttle = 0; wintv = 0; x10tv = 0; @@ -265,9 +266,10 @@ MWindow::~MWindow() #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 @@ -301,6 +303,7 @@ MWindow::~MWindow() 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); @@ -329,7 +332,6 @@ MWindow::~MWindow() 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 @@ -1210,10 +1212,23 @@ ZWindow *MWindow::get_mixer(Mixer *&mixer) 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 && irunning() ) 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 ) @@ -1222,7 +1237,7 @@ void MWindow::del_mixer(ZWindow *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(); } @@ -1297,11 +1312,11 @@ void MWindow::handle_mixers(EDL *edl, int command, int wait_tracking, 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, @@ -1356,7 +1371,7 @@ ZWindow *MWindow::create_mixer(Indexable *indexable, double position) 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); } @@ -1499,6 +1514,14 @@ void MWindow::tile_mixers() } } +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); @@ -1769,7 +1792,7 @@ int MWindow::put_commercial() //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); @@ -1789,7 +1812,7 @@ int MWindow::put_commercial() //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; @@ -2974,6 +2997,7 @@ void MWindow::show_lwindow() void MWindow::restore_windows() { + gui->unlock_window(); if( !session->show_vwindow ) { for( int i=0, n=vwindows.size(); ishow_lwindow && lwindow->gui->is_hidden() ) show_lwindow(); + gui->lock_window("MWindow::restore_windows"); gui->focus(); } @@ -3750,6 +3775,7 @@ void MWindow::update_project(int load_mode) for( int i=0; imixers.size(); ++i ) { Mixer *mixer = edl->mixers[i]; + if( !mixer->show ) continue; ZWindow *zwindow = get_mixer(mixer); zwindow->set_title(mixer->title); zwindow->start(); @@ -3779,7 +3805,7 @@ void MWindow::update_project(int load_mode) 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; inested_edls.size(); ++i ) { @@ -3805,7 +3831,9 @@ void MWindow::stack_push(EDL *new_edl, Indexable *idxbl) 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; @@ -3838,6 +3866,17 @@ void MWindow::stack_pop() // 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; @@ -3847,6 +3886,7 @@ void MWindow::stack_pop() stack.remove(); if( idxbl ) { gui->unlock_window(); + gui->resource_thread->close_indexable(idxbl); remove_from_caches(idxbl); remove_indexfile(idxbl); mainindexes->add_indexable(idxbl); @@ -3950,6 +3990,7 @@ void MWindow::clip_to_media() return; } undo_before(); + awindow->gui->stop_vicon_drawing(); int clips_total = session->drag_clips->total; for( int i=0; idrag_clips->values[i]; @@ -4426,6 +4467,7 @@ int MWindow::create_aspect_ratio(float &w, float &h, int width, int height) void MWindow::reset_caches() { + awindow->gui->stop_vicon_drawing(); frame_cache->remove_all(); wave_cache->remove_all(); audio_cache->remove_all(); @@ -4449,6 +4491,7 @@ void MWindow::reset_caches() void MWindow::remove_from_caches(Indexable *idxbl) { + awindow->gui->stop_vicon_drawing(); frame_cache->remove_item(idxbl); wave_cache->remove_item(idxbl); if( gui->render_engine && @@ -4482,12 +4525,13 @@ void MWindow::remove_from_caches(Indexable *idxbl) 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 *drag_assets, ArrayList *drag_clips) { - awindow->gui->close_view_popup(); + awindow->gui->stop_vicon_drawing(); // Remove from VWindow. if( drag_clips ) { @@ -5103,3 +5147,28 @@ 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(); +} +