X-Git-Url: http://git.cinelerra-gg.org/git/?p=goodguy%2Fhistory.git;a=blobdiff_plain;f=cinelerra-5.1%2Fcinelerra%2Fmwindow.C;h=84ba6830aa88bd39cfea54d154dd94ead97a07ff;hp=9d3b4860858840b158f864ef4ae45943c7379659;hb=243336668c89096732786c6b3f3c5918aa2eff26;hpb=0513350234a8dcd08e5a0117d5121724ef7b76b6 diff --git a/cinelerra-5.1/cinelerra/mwindow.C b/cinelerra-5.1/cinelerra/mwindow.C index 9d3b4860..84ba6830 100644 --- a/cinelerra-5.1/cinelerra/mwindow.C +++ b/cinelerra-5.1/cinelerra/mwindow.C @@ -237,10 +237,8 @@ MWindow::MWindow() 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 @@ -252,6 +250,7 @@ MWindow::~MWindow() 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"); @@ -905,6 +904,7 @@ void MWindow::init_preferences() 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() @@ -1070,8 +1070,8 @@ void MWindow::init_theme() 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()); } @@ -1131,7 +1131,7 @@ ZWindow *MWindow::get_mixer(Mixer *&mixer) if( !mixer ) mixer = edl->mixers.new_mixer(); ZWindow *zwindow = 0; for( int i=0; !zwindow && iis_running() ) zwindow = zwindows[i]; + if( zwindows[i]->idx < 0 ) zwindow = zwindows[i]; if( !zwindow ) zwindows.append(zwindow = new ZWindow(this)); zwindow->idx = mixer->idx; @@ -1177,7 +1177,7 @@ void MWindow::start_mixer() zwindow->set_title(title); zwindow->start(); - queue_mixers(edl,CURRENT_FRAME,0,0,1,0); + refresh_mixers(); } int MWindow::mixer_track_active(Track *track) @@ -1208,7 +1208,7 @@ void MWindow::queue_mixers(EDL *edl, int command, int wait_tracking, zwindows_lock->lock("MWindow::queue_mixers"); for( int vidx=0; vidxrunning() ) continue; + if( zwindow->idx < 0 ) continue; Mixer *mixer = edl->mixers.get_mixer(zwindow->idx); if( !mixer || !mixer->mixer_ids.size() ) continue; int k = -1; @@ -1240,15 +1240,50 @@ void MWindow::queue_mixers(EDL *edl, int command, int wait_tracking, zwindows_lock->unlock(); } +void MWindow::refresh_mixers() +{ + queue_mixers(edl,CURRENT_FRAME,0,0,1,0); +} + void MWindow::stop_mixers() { for( int vidx=0; vidxrunning() ) continue; + 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; iidx < 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; iidx < 0 ) continue; + zwindow->close_window(); + } +} + +void MWindow::open_mixers() +{ + for( int i=0; imixers.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); @@ -1256,7 +1291,7 @@ int MWindow::select_zwindow(ZWindow *zwindow) session->selected_zwindow = n; for( int i=0; irunning() ) continue; + if( zwindow->idx < 0 ) continue; ZWindowGUI *zgui = zwindow->zgui; zgui->lock_window("MWindow::select_zwindow 0"); zwindow->highlighted = i == n ? 1 : 0; @@ -1272,6 +1307,60 @@ int MWindow::select_zwindow(ZWindow *zwindow) return ret; } +void MWindow::tile_mixers() +{ + int nz = 0; + for( int i=0; iidx < 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; iidx < 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() { @@ -1563,22 +1652,20 @@ int MWindow::put_commercial() 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->is_running() ) continue; - zwindow->zgui->playback_engine->stop_playback(); + if( zwindow->idx < 0 ) continue; + zwindow->stop_playback(wait); } - if( locked ) gui->lock_window("MWindow::stop_playback"); } int MWindow::load_filenames(ArrayList *filenames, @@ -1596,7 +1683,9 @@ if(debug) printf("MWindow::load_filenames %d\n", __LINE__); // 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(); @@ -1980,7 +2069,7 @@ if(debug) printf("MWindow::load_filenames %d\n", __LINE__); 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_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); @@ -2664,11 +2753,7 @@ void MWindow::sync_parameters(int change_type) } else { - queue_mixers(edl,CURRENT_FRAME,0,0,1,0); - cwindow->playback_engine->que->send_command(CURRENT_FRAME, - change_type, - edl, - 1); + cwindow->refresh_frame(change_type); } } @@ -3203,11 +3288,7 @@ void MWindow::update_project(int load_mode) } if(debug) PRINT_TRACE select_zwindow(0); - for( int i=0; iis_running() ) continue; - zwindow->close_window(); - } + close_mixers(); for( int i=0; imixers.size(); ++i ) { Mixer *mixer = edl->mixers[i]; @@ -3233,10 +3314,7 @@ void MWindow::update_project(int load_mode) 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 @@ -3375,31 +3453,29 @@ int MWindow::create_aspect_ratio(float &w, float &h, int width, int height) void MWindow::reset_caches() { - gui->resource_thread->get_video_source(0); - gui->resource_thread->get_audio_source(0); frame_cache->remove_all(); 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); @@ -3411,9 +3487,10 @@ void MWindow::remove_asset_from_caches(Asset *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); } }