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");
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());
}
if( !mixer ) mixer = edl->mixers.new_mixer();
ZWindow *zwindow = 0;
for( int i=0; !zwindow && i<zwindows.size(); ++i )
- if( !zwindows[i]->is_running() ) zwindow = zwindows[i];
+ if( zwindows[i]->idx < 0 ) zwindow = zwindows[i];
if( !zwindow )
zwindows.append(zwindow = new ZWindow(this));
zwindow->idx = mixer->idx;
zwindow->set_title(title);
zwindow->start();
- queue_mixers(edl,CURRENT_FRAME,0,0,1,0);
+ refresh_mixers();
}
int MWindow::mixer_track_active(Track *track)
zwindows_lock->lock("MWindow::queue_mixers");
for( int vidx=0; vidx<zwindows.size(); ++vidx ) {
ZWindow *zwindow = zwindows[vidx];
- if( !zwindow->running() ) continue;
+ if( zwindow->idx < 0 ) continue;
Mixer *mixer = edl->mixers.get_mixer(zwindow->idx);
if( !mixer || !mixer->mixer_ids.size() ) continue;
int k = -1;
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->running() ) 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; 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::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);
session->selected_zwindow = n;
for( int i=0; i<zwindows.size(); ++i ) {
ZWindow *zwindow = zwindows[i];
- if( !zwindow->running() ) continue;
+ if( zwindow->idx < 0 ) continue;
ZWindowGUI *zgui = zwindow->zgui;
zgui->lock_window("MWindow::select_zwindow 0");
zwindow->highlighted = i == n ? 1 : 0;
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()
{
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<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();
}
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);
}
}
}
if(debug) PRINT_TRACE
select_zwindow(0);
- for( int i=0; i<zwindows.size(); ++i ) {
- ZWindow *zwindow = zwindows[i];
- if( !zwindow->is_running() ) continue;
- zwindow->close_window();
- }
+ close_mixers();
for( int i=0; i<edl->mixers.size(); ++i ) {
Mixer *mixer = edl->mixers[i];
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
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);
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);
}
}