3 #include "awindowgui.h"
5 #include "batchrender.h"
6 #include "bcdisplayinfo.h"
10 #include "channeldb.h"
12 #include "colormodels.h"
13 #include "cplayback.h"
15 #include "cwindowgui.h"
18 #include "editpanel.h"
20 #include "edlsession.h"
22 #include "fileformat.h"
24 #include "filesystem.h"
26 #include "indexfile.h"
28 #include "levelwindowgui.h"
29 #include "levelwindow.h"
30 #include "loadfile.inc"
31 #include "localsession.h"
32 #include "maincursor.h"
33 #include "mainindexes.h"
35 #include "mainprogress.h"
36 #include "mainsession.h"
40 #include "mwindowgui.h"
44 #include "playbackengine.h"
46 #include "pluginserver.h"
47 #include "pluginset.h"
48 #include "preferences.h"
50 #include "recordlabel.h"
52 #include "samplescroll.h"
53 #include "sighandler.h"
54 #include "splashgui.h"
55 #include "statusbar.h"
57 #include "threadloader.h"
59 #include "trackcanvas.h"
62 #include "trackscroll.h"
64 #include "transportque.h"
66 #include "videodevice.inc"
67 #include "videowindow.h"
68 #include "vplayback.h"
69 #include "vwindowgui.h"
83 // Hack for libdv to remove glib dependancy
86 // g_log (const char *log_domain,
88 // const char *format,
94 // g_logv (const char *log_domain,
96 // const char *format,
103 // Hack for XFree86 4.1.0
105 int atexit(void (*function)(void))
120 plugin_gui_lock = new Mutex("MWindow::plugin_gui_lock");
121 brender_lock = new Mutex("MWindow::brender_lock");
124 channeldb_buz = new ChannelDB;
125 channeldb_v4l2jpeg = new ChannelDB;
130 brender_lock->lock("MWindow::~MWindow");
131 if(brender) delete brender;
133 brender_lock->unlock();
138 TRACE("MWindow::~MWindow 1\n");
140 TRACE("MWindow::~MWindow 2\n");
143 TRACE("MWindow::~MWindow 3\n");
144 // Give up and go to a movie
147 TRACE("MWindow::~MWindow 4\n");
149 delete audio_cache; // delete the cache after the assets
150 delete video_cache; // delete the cache after the assets
156 // delete renderlist;
161 plugin_guis->remove_all_objects();
163 delete plugin_gui_lock;
166 void MWindow::init_defaults(Defaults* &defaults, char *config_path)
168 char path[BCTEXTLEN];
169 // Use user supplied path
172 strcpy(path, config_path);
176 // set the .bcast path
179 sprintf(path, "%s", BCASTDIR);
180 fs.complete_path(path);
187 strcat(path, "Cinelerra_rc");
190 defaults = new Defaults(path);
194 void MWindow::init_plugin_path(Preferences *preferences,
195 ArrayList<PluginServer*>* &plugindb,
197 SplashGUI *splash_window,
201 PluginServer *newplugin;
205 for(int i = 0; i < fs->dir_list.total; i++)
207 char path[BCTEXTLEN];
208 strcpy(path, fs->dir_list.values[i]->path);
210 // File is a directory
211 if(!fs->is_dir(path))
217 // Try to query the plugin
218 fs->complete_path(path);
219 //printf("MWindow::init_plugin_path %s\n", path);
220 PluginServer *new_plugin = new PluginServer(path);
221 int result = new_plugin->open_plugin(1, preferences, 0, 0, -1);
225 plugindb->append(new_plugin);
226 new_plugin->close_plugin();
228 splash_window->operation->update(_(new_plugin->title));
231 if(result == PLUGINSERVER_IS_LAD)
234 // Open LAD subplugins
238 new_plugin = new PluginServer(path);
239 result = new_plugin->open_plugin(1,
247 plugindb->append(new_plugin);
248 new_plugin->close_plugin();
250 splash_window->operation->update(_(new_plugin->title));
256 // Plugin failed to open
260 if(splash_window) splash_window->progress->update((*counter)++);
265 void MWindow::init_plugins(Preferences *preferences,
266 ArrayList<PluginServer*>* &plugindb,
267 SplashGUI *splash_window)
269 plugindb = new ArrayList<PluginServer*>;
273 FileSystem cinelerra_fs;
274 ArrayList<FileSystem*> lad_fs;
278 cinelerra_fs.set_filter("[*.plugin][*.so]");
279 result = cinelerra_fs.update(preferences->global_plugin_dir);
284 _("MWindow::init_plugins: couldn't open %s directory\n"),
285 preferences->global_plugin_dir);
288 // Parse LAD environment variable
289 char *env = getenv("LADSPA_PATH");
292 char string[BCTEXTLEN];
296 char *ptr = strchr(ptr1, ':');
304 end = env + strlen(env);
309 int len = end - ptr1;
310 memcpy(string, ptr1, len);
314 FileSystem *fs = new FileSystem;
316 fs->set_filter("*.so");
317 result = fs->update(string);
322 _("MWindow::init_plugins: couldn't open %s directory\n"),
334 int total = cinelerra_fs.total_files();
336 for(int i = 0; i < lad_fs.total; i++)
337 total += lad_fs.values[i]->total_files();
338 if(splash_window) splash_window->progress->update_length(total);
342 init_plugin_path(preferences,
348 // Call automatically generated routine to get plugins
352 for(int i = 0; i < lad_fs.total; i++)
353 init_plugin_path(preferences,
359 lad_fs.remove_all_objects();
362 void MWindow::delete_plugins()
364 for(int i = 0; i < plugindb->total; i++)
366 delete plugindb->values[i];
371 void MWindow::create_plugindb(int do_audio,
376 ArrayList<PluginServer*> &plugindb)
379 for(int i = 0; i < this->plugindb->total; i++)
381 PluginServer *current = this->plugindb->values[i];
383 if(current->audio == do_audio &&
384 current->video == do_video &&
385 (current->realtime == is_realtime || is_realtime < 0) &&
386 current->transition == is_transition &&
387 current->theme == is_theme)
388 plugindb.append(current);
391 // Alphabetize list by title
397 for(int i = 0; i < plugindb.total - 1; i++)
399 PluginServer *value1 = plugindb.values[i];
400 PluginServer *value2 = plugindb.values[i + 1];
401 if(strcmp(value1->title, value2->title) > 0)
404 plugindb.values[i] = value2;
405 plugindb.values[i + 1] = value1;
411 PluginServer* MWindow::scan_plugindb(char *title,
416 printf("MWindow::scan_plugindb data_type < 0\n");
420 for(int i = 0; i < plugindb->total; i++)
422 PluginServer *server = plugindb->values[i];
423 if(!strcasecmp(server->title, title) &&
424 ((data_type == TRACK_AUDIO && server->audio) ||
425 (data_type == TRACK_VIDEO && server->video)))
426 return plugindb->values[i];
431 void MWindow::init_preferences()
433 preferences = new Preferences;
434 preferences->load_defaults(defaults);
435 session = new MainSession(this);
436 session->load_defaults(defaults);
439 void MWindow::clean_indexes()
446 char string[BCTEXTLEN];
448 // Delete extra indexes
449 fs.set_filter("*.idx");
450 fs.complete_path(preferences->index_directory);
451 fs.update(preferences->index_directory);
452 //printf("MWindow::clean_indexes 1 %d\n", fs.dir_list.total);
454 // Eliminate directories
459 for(int i = 0; i < fs.dir_list.total && !result; i++)
461 fs.join_names(string, preferences->index_directory, fs.dir_list.values[i]->name);
462 if(!fs.is_dir(string))
464 delete fs.dir_list.values[i];
465 fs.dir_list.remove_number(i);
470 total_excess = fs.dir_list.total - preferences->index_count;
472 //printf("MWindow::clean_indexes 2 %d\n", fs.dir_list.total);
473 while(total_excess > 0)
476 for(int i = 0; i < fs.dir_list.total; i++)
478 fs.join_names(string, preferences->index_directory, fs.dir_list.values[i]->name);
480 if(i == 0 || fs.get_date(string) <= oldest)
482 oldest = fs.get_date(string);
487 fs.join_names(string, preferences->index_directory, fs.dir_list.values[oldest_item]->name);
489 perror("delete_indexes");
490 delete fs.dir_list.values[oldest_item];
491 fs.dir_list.remove_number(oldest_item);
496 void MWindow::init_awindow()
498 awindow = new AWindow(this);
499 awindow->create_objects();
502 void MWindow::init_theme()
506 for(int i = 0; i < plugindb->total; i++)
508 if(plugindb->values[i]->theme &&
509 !strcasecmp(preferences->theme, plugindb->values[i]->title))
511 PluginServer plugin = *plugindb->values[i];
512 plugin.open_plugin(0, preferences, 0, 0, -1);
513 theme = plugin.new_theme();
514 theme->mwindow = this;
515 strcpy(theme->path, plugin.path);
516 plugin.close_plugin();
522 fprintf(stderr, _("MWindow::init_theme: theme %s not found.\n"), preferences->theme);
528 // Load images which may have been forgotten
529 theme->Theme::initialize();
534 void MWindow::init_edl()
537 edl->create_objects();
538 edl->load_defaults(defaults);
539 edl->create_default_tracks();
540 edl->tracks->update_y_pixels(theme);
543 void MWindow::init_compositor()
545 cwindow = new CWindow(this);
546 cwindow->create_objects();
549 void MWindow::init_levelwindow()
551 lwindow = new LevelWindow(this);
552 lwindow->create_objects();
555 void MWindow::init_viewer()
557 vwindow = new VWindow(this);
558 vwindow->load_defaults();
559 vwindow->create_objects();
562 void MWindow::init_cache()
564 audio_cache = new CICache(edl, preferences, plugindb);
565 video_cache = new CICache(edl, preferences, plugindb);
568 void MWindow::init_channeldb()
570 channeldb_buz->load("channeldb_buz");
571 channeldb_v4l2jpeg->load("channeldb_v4l2jpeg");
574 void MWindow::init_menus()
576 char string[BCTEXTLEN];
577 cmodel_to_text(string, BC_RGB888);
578 colormodels.append(new ColormodelItem(string, BC_RGB888));
579 cmodel_to_text(string, BC_RGBA8888);
580 colormodels.append(new ColormodelItem(string, BC_RGBA8888));
581 // cmodel_to_text(string, BC_RGB161616);
582 // colormodels.append(new ColormodelItem(string, BC_RGB161616));
583 // cmodel_to_text(string, BC_RGBA16161616);
584 // colormodels.append(new ColormodelItem(string, BC_RGBA16161616));
585 cmodel_to_text(string, BC_RGB_FLOAT);
586 colormodels.append(new ColormodelItem(string, BC_RGB_FLOAT));
587 cmodel_to_text(string, BC_RGBA_FLOAT);
588 colormodels.append(new ColormodelItem(string, BC_RGBA_FLOAT));
589 cmodel_to_text(string, BC_YUV888);
590 colormodels.append(new ColormodelItem(string, BC_YUV888));
591 cmodel_to_text(string, BC_YUVA8888);
592 colormodels.append(new ColormodelItem(string, BC_YUVA8888));
593 cmodel_to_text(string, BC_YUV161616);
594 colormodels.append(new ColormodelItem(string, BC_YUV161616));
595 cmodel_to_text(string, BC_YUVA16161616);
596 colormodels.append(new ColormodelItem(string, BC_YUVA16161616));
599 void MWindow::init_indexes()
601 mainindexes = new MainIndexes(this);
602 mainindexes->start_loop();
605 void MWindow::init_gui()
607 gui = new MWindowGUI(this);
608 gui->create_objects();
609 gui->load_defaults(defaults);
612 void MWindow::init_signals()
614 sighandler = new SigHandler;
615 sighandler->initialize();
619 void MWindow::init_render()
621 render = new Render(this);
622 // renderlist = new Render(this);
623 batch_render = new BatchRenderThread(this);
626 void MWindow::init_brender()
628 if(preferences->use_brender && !brender)
630 brender_lock->lock("MWindow::init_brender 1");
631 brender = new BRender(this);
632 brender->initialize();
633 session->brender_end = 0;
634 brender_lock->unlock();
637 if(!preferences->use_brender && brender)
639 brender_lock->lock("MWindow::init_brender 2");
642 session->brender_end = 0;
643 brender_lock->unlock();
645 if(brender) brender->restart(edl);
648 void MWindow::restart_brender()
650 //printf("MWindow::restart_brender 1\n");
651 if(brender) brender->restart(edl);
654 void MWindow::stop_brender()
656 if(brender) brender->stop();
659 int MWindow::brender_available(int position)
662 brender_lock->lock("MWindow::brender_available 1");
665 if(brender->map_valid)
667 brender->map_lock->lock("MWindow::brender_available 2");
668 if(position < brender->map_size &&
671 //printf("MWindow::brender_available 1 %d %d\n", position, brender->map[position]);
672 if(brender->map[position] == BRender::RENDERED)
675 brender->map_lock->unlock();
678 brender_lock->unlock();
682 void MWindow::set_brender_start()
684 edl->session->brender_start = edl->local_session->get_selectionstart();
686 gui->canvas->draw_overlays();
687 gui->canvas->flash();
692 int MWindow::load_filenames(ArrayList<char*> *filenames,
696 TRACE("MWindow::load_filenames 1");
697 ArrayList<EDL*> new_edls;
698 ArrayList<Asset*> new_assets;
700 // Need to stop playback since tracking depends on the EDL not getting
702 cwindow->playback_engine->que->send_command(STOP,
706 vwindow->playback_engine->que->send_command(STOP,
710 cwindow->playback_engine->interrupt_playback(0);
711 vwindow->playback_engine->interrupt_playback(0);
715 // Define new_edls and new_assets to load
717 for(int i = 0; i < filenames->total; i++)
720 File *new_file = new File;
721 Asset *new_asset = new Asset(filenames->values[i]);
722 EDL *new_edl = new EDL;
723 char string[BCTEXTLEN];
725 new_edl->create_objects();
726 new_edl->copy_session(edl);
728 sprintf(string, "Loading %s", new_asset->path);
729 gui->show_message(string, BLACK);
730 result = new_file->open_file(plugindb, new_asset, 1, 0, 0, 0);
734 // Convert media file to EDL
736 if(load_mode != LOAD_RESOURCESONLY)
738 asset_to_edl(new_edl, new_asset);
739 new_edls.append(new_edl);
744 new_assets.append(new_asset);
747 // Set filename to nothing for assets since save EDL would overwrite them.
748 if(load_mode == LOAD_REPLACE ||
749 load_mode == LOAD_REPLACE_CONCATENATE)
752 // Reset timeline position
753 new_edl->local_session->view_start = 0;
754 new_edl->local_session->track_start = 0;
761 sprintf(string, _("Failed to open %s"), new_asset->path);
762 gui->show_message(string, RED);
767 case FILE_UNRECOGNIZED_CODEC:
770 IndexFile indexfile(this);
771 result = indexfile.open_index(this, new_asset);
774 indexfile.close_index();
777 // Test existing EDLs
780 for(int j = 0; j < new_edls.total + 1; j++)
783 if(j == new_edls.total)
785 if(old_asset = edl->assets->get_asset(new_asset->path))
787 *new_asset = *old_asset;
793 if(old_asset = new_edls.values[j]->assets->get_asset(new_asset->path))
795 *new_asset = *old_asset;
805 char string[BCTEXTLEN];
807 fs.extract_name(string, new_asset->path);
809 strcat(string, _("'s format couldn't be determined."));
810 new_asset->audio_data = 1;
811 new_asset->format = FILE_PCM;
812 new_asset->channels = defaults->get("AUDIO_CHANNELS", 2);
813 new_asset->sample_rate = defaults->get("SAMPLE_RATE", 44100);
814 new_asset->bits = defaults->get("AUDIO_BITS", 16);
815 new_asset->byte_order = defaults->get("BYTE_ORDER", 1);
816 new_asset->signed_ = defaults->get("SIGNED_", 1);
817 new_asset->header = defaults->get("HEADER", 0);
819 FileFormat fwindow(this);
820 fwindow.create_objects(new_asset, string);
821 result = fwindow.run_window();
823 defaults->update("AUDIO_CHANNELS", new_asset->channels);
824 defaults->update("SAMPLE_RATE", new_asset->sample_rate);
825 defaults->update("AUDIO_BITS", new_asset->bits);
826 defaults->update("BYTE_ORDER", new_asset->byte_order);
827 defaults->update("SIGNED_", new_asset->signed_);
828 defaults->update("HEADER", new_asset->header);
835 // Recalculate length
838 result = new_file->open_file(plugindb, new_asset, 1, 0, 0, 0);
840 if(load_mode != LOAD_RESOURCESONLY)
842 asset_to_edl(new_edl, new_asset);
843 new_edls.append(new_edl);
848 new_assets.append(new_asset);
861 xml_file.read_from_file(filenames->values[i]);
862 // Load EDL for pasting
863 new_edl->load_xml(plugindb, &xml_file, LOAD_ALL);
864 if(load_mode == LOAD_REPLACE ||
865 load_mode == LOAD_REPLACE_CONCATENATE)
867 strcpy(session->filename, filenames->values[i]);
868 strcpy(new_edl->local_session->clip_title, filenames->values[i]);
870 set_filename(new_edl->local_session->clip_title);
873 new_edls.append(new_edl);
890 if(!result) gui->statusbar->default_message();
900 // Don't back up here.
903 // For pasting, clear the active region
904 if(load_mode == LOAD_PASTE)
906 double start = edl->local_session->get_selectionstart();
907 double end = edl->local_session->get_selectionend();
908 if(!EQUIV(start, end))
911 edl->session->labels_follow_edits,
912 edl->session->plugins_follow_edits);
915 paste_edls(&new_edls,
919 edl->session->labels_follow_edits,
920 edl->session->plugins_follow_edits);
931 for(int i = 0; i < new_assets.total; i++)
933 mainindexes->add_next_asset(new_assets.values[i]);
934 edl->assets->update(new_assets.values[i]);
938 // Start examining next batch of index files
939 mainindexes->start_build();
942 TRACE("MWindow::load_filenames 100");
943 update_project(load_mode);
944 TRACE("MWindow::load_filenames 110");
946 //printf("MWindow::load_filenames 9\n");
949 new_edls.remove_all_objects();
950 new_assets.remove_all_objects();
951 //printf("MWindow::load_filenames 10 %d\n", edl->session->audio_module_fragment);
953 if(load_mode == LOAD_REPLACE ||
954 load_mode == LOAD_REPLACE_CONCATENATE)
955 session->changes_made = 0;
961 void MWindow::create_objects(int want_gui,
965 char string[BCTEXTLEN];
972 // For some reason, init_signals must come after show_splash or the signals won't
978 TRACE("MWindow::create_objects 1");
979 init_defaults(defaults, config_path);
980 TRACE("MWindow::create_objects 2");
982 TRACE("MWindow::create_objects 3");
983 init_plugins(preferences, plugindb, splash_window);
984 if(splash_window) splash_window->operation->update(_("Initializing GUI"));
985 TRACE("MWindow::create_objects 4");
987 // Default project created here
988 TRACE("MWindow::create_objects 5");
991 TRACE("MWindow::create_objects 6");
993 TRACE("MWindow::create_objects 7");
995 TRACE("MWindow::create_objects 8");
997 TRACE("MWindow::create_objects 9");
999 TRACE("MWindow::create_objects 10");
1001 TRACE("MWindow::create_objects 11");
1003 TRACE("MWindow::create_objects 12");
1005 TRACE("MWindow::create_objects 13");
1008 TRACE("MWindow::create_objects 14");
1011 mainprogress = new MainProgress(this, gui);
1012 undo = new MainUndo(this);
1014 plugin_guis = new ArrayList<PluginServer*>;
1016 TRACE("MWindow::create_objects 15");
1017 if(session->show_vwindow) vwindow->gui->show_window();
1018 if(session->show_cwindow) cwindow->gui->show_window();
1019 if(session->show_awindow) awindow->gui->show_window();
1020 if(session->show_lwindow) lwindow->gui->show_window();
1021 TRACE("MWindow::create_objects 16");
1023 // vwindow->start();
1024 // awindow->start();
1025 // cwindow->start();
1026 // lwindow->start();
1027 //printf("MWindow::create_objects 1");
1029 gui->mainmenu->load_defaults(defaults);
1030 TRACE("MWindow::create_objects 17");
1031 gui->mainmenu->update_toggles();
1032 TRACE("MWindow::create_objects 18");
1033 gui->patchbay->update();
1034 TRACE("MWindow::create_objects 19");
1035 gui->canvas->draw();
1036 TRACE("MWindow::create_objects 20");
1037 gui->cursor->draw();
1038 TRACE("MWindow::create_objects 21");
1039 gui->raise_window();
1040 TRACE("MWindow::create_objects 22");
1042 TRACE("MWindow::create_objects 23");
1049 void MWindow::show_splash()
1051 #include "data/heroine_logo11_png.h"
1052 VFrame *frame = new VFrame(heroine_logo11_png);
1053 BC_DisplayInfo display_info;
1054 splash_window = new SplashGUI(frame,
1055 display_info.get_root_w() / 2 - frame->get_w() / 2,
1056 display_info.get_root_h() / 2 - frame->get_h() / 2);
1057 splash_window->create_objects();
1060 void MWindow::hide_splash()
1063 delete splash_window;
1068 void MWindow::start()
1077 void MWindow::show_vwindow()
1079 session->show_vwindow = 1;
1080 vwindow->gui->lock_window("MWindow::show_vwindow");
1081 vwindow->gui->show_window();
1082 vwindow->gui->raise_window();
1083 vwindow->gui->flush();
1084 vwindow->gui->unlock_window();
1085 gui->mainmenu->show_vwindow->set_checked(1);
1088 void MWindow::show_awindow()
1090 session->show_awindow = 1;
1091 awindow->gui->lock_window("MWindow::show_awindow");
1092 awindow->gui->show_window();
1093 awindow->gui->raise_window();
1094 awindow->gui->flush();
1095 awindow->gui->unlock_window();
1096 gui->mainmenu->show_awindow->set_checked(1);
1099 void MWindow::show_cwindow()
1101 session->show_cwindow = 1;
1102 cwindow->gui->lock_window("MWindow::show_cwindow");
1103 cwindow->gui->show_window();
1104 cwindow->gui->raise_window();
1105 cwindow->gui->flush();
1106 cwindow->gui->unlock_window();
1107 gui->mainmenu->show_cwindow->set_checked(1);
1110 void MWindow::show_lwindow()
1112 session->show_lwindow = 1;
1113 lwindow->gui->lock_window("MWindow::show_lwindow");
1114 lwindow->gui->show_window();
1115 lwindow->gui->raise_window();
1116 lwindow->gui->flush();
1117 lwindow->gui->unlock_window();
1118 gui->mainmenu->show_lwindow->set_checked(1);
1121 void MWindow::tile_windows()
1123 session->default_window_positions();
1124 gui->default_positions();
1127 void MWindow::toggle_loop_playback()
1129 edl->local_session->loop_playback = !edl->local_session->loop_playback;
1130 set_loop_boundaries();
1133 gui->canvas->draw_overlays();
1134 gui->canvas->flash();
1135 sync_parameters(CHANGE_PARAMS);
1138 void MWindow::set_titles(int value)
1140 edl->session->show_titles = value;
1141 trackmovement(edl->local_session->track_start);
1144 void MWindow::set_auto_keyframes(int value)
1146 gui->lock_window("MWindow::set_auto_keyframes");
1147 edl->session->auto_keyframes = value;
1148 gui->mbuttons->edit_panel->keyframe->update(value);
1150 gui->unlock_window();
1151 cwindow->gui->lock_window("MWindow::set_auto_keyframes");
1152 cwindow->gui->edit_panel->keyframe->update(value);
1153 cwindow->gui->flush();
1154 cwindow->gui->unlock_window();
1157 int MWindow::set_editing_mode(int new_editing_mode)
1159 gui->lock_window("MWindow::set_editing_mode");
1160 edl->session->editing_mode = new_editing_mode;
1161 gui->mbuttons->edit_panel->editing_mode = edl->session->editing_mode;
1162 gui->mbuttons->edit_panel->update();
1163 gui->canvas->update_cursor();
1164 gui->unlock_window();
1165 cwindow->gui->lock_window("MWindow::set_editing_mode");
1166 cwindow->gui->edit_panel->update();
1167 cwindow->gui->edit_panel->editing_mode = edl->session->editing_mode;
1168 cwindow->gui->unlock_window();
1173 void MWindow::sync_parameters(int change_type)
1176 // Sync engines which are playing back
1177 if(cwindow->playback_engine->is_playing_back)
1179 if(change_type == CHANGE_PARAMS)
1181 // TODO: block keyframes until synchronization is done
1182 cwindow->playback_engine->sync_parameters(edl);
1187 int command = cwindow->playback_engine->command->command;
1188 cwindow->playback_engine->que->send_command(STOP,
1192 // Waiting for tracking to finish would make the restart position more
1193 // accurate but it can't lock the window to stop tracking for some reason.
1194 // Not waiting for tracking gives a faster response but restart position is
1195 // only as accurate as the last tracking update.
1196 cwindow->playback_engine->interrupt_playback(0);
1197 cwindow->playback_engine->que->send_command(command,
1206 cwindow->playback_engine->que->send_command(CURRENT_FRAME,
1213 void MWindow::update_caches()
1215 audio_cache->set_edl(edl);
1216 video_cache->set_edl(edl);
1219 void MWindow::show_plugin(Plugin *plugin)
1222 //printf("MWindow::show_plugin 1\n");
1223 plugin_gui_lock->lock("MWindow::show_plugin");
1224 for(int i = 0; i < plugin_guis->total; i++)
1226 // Pointer comparison
1227 if(plugin_guis->values[i]->plugin == plugin)
1229 plugin_guis->values[i]->raise_window();
1235 //printf("MWindow::show_plugin 1\n");
1240 printf("MWindow::show_plugin track not defined.\n");
1242 PluginServer *server = scan_plugindb(plugin->title,
1243 plugin->track->data_type);
1245 //printf("MWindow::show_plugin %p %d\n", server, server->uses_gui);
1246 if(server && server->uses_gui)
1248 PluginServer *gui = plugin_guis->append(new PluginServer(*server));
1249 // Needs mwindow to do GUI
1250 gui->set_mwindow(this);
1251 gui->open_plugin(0, preferences, edl, plugin, -1);
1256 plugin_gui_lock->unlock();
1257 //printf("MWindow::show_plugin 2\n");
1260 void MWindow::hide_plugin(Plugin *plugin, int lock)
1262 if(lock) plugin_gui_lock->lock("MWindow::hide_plugin");
1264 for(int i = 0; i < plugin_guis->total; i++)
1266 if(plugin_guis->values[i]->plugin == plugin)
1268 PluginServer *ptr = plugin_guis->values[i];
1269 plugin_guis->remove(ptr);
1270 if(lock) plugin_gui_lock->unlock();
1271 // Last command executed in client side close
1276 if(lock) plugin_gui_lock->unlock();
1279 void MWindow::hide_plugins()
1281 plugin_gui_lock->lock("MWindow::hide_plugins");
1282 plugin_guis->remove_all_objects();
1283 plugin_gui_lock->unlock();
1286 void MWindow::update_plugin_guis()
1288 plugin_gui_lock->lock("MWindow::update_plugin_guis");
1290 for(int i = 0; i < plugin_guis->total; i++)
1292 plugin_guis->values[i]->update_gui();
1294 plugin_gui_lock->unlock();
1297 void MWindow::render_plugin_gui(void *data, Plugin *plugin)
1299 plugin_gui_lock->lock("MWindow::render_plugin_gui");
1300 for(int i = 0; i < plugin_guis->total; i++)
1302 if(plugin_guis->values[i]->plugin->identical_location(plugin))
1304 plugin_guis->values[i]->render_gui(data);
1308 plugin_gui_lock->unlock();
1311 void MWindow::render_plugin_gui(void *data, int size, Plugin *plugin)
1313 plugin_gui_lock->lock("MWindow::render_plugin_gui");
1314 for(int i = 0; i < plugin_guis->total; i++)
1316 if(plugin_guis->values[i]->plugin->identical_location(plugin))
1318 plugin_guis->values[i]->render_gui(data, size);
1322 plugin_gui_lock->unlock();
1326 void MWindow::update_plugin_states()
1329 plugin_gui_lock->lock("MWindow::update_plugin_states");
1330 for(int i = 0; i < plugin_guis->total; i++)
1333 Plugin *src_plugin = plugin_guis->values[i]->plugin;
1334 PluginServer *src_plugingui = plugin_guis->values[i];
1336 // Search for plugin in EDL. Only the master EDL shows plugin GUIs.
1337 for(Track *track = edl->tracks->first;
1339 track = track->next)
1342 j < track->plugin_set.total && !result;
1345 PluginSet *plugin_set = track->plugin_set.values[j];
1346 for(Plugin *plugin = (Plugin*)plugin_set->first;
1348 plugin = (Plugin*)plugin->next)
1350 if(plugin == src_plugin &&
1351 !strcmp(plugin->title, src_plugingui->title)) result = 1;
1357 // Doesn't exist anymore
1360 hide_plugin(src_plugin, 0);
1364 plugin_gui_lock->unlock();
1368 void MWindow::update_plugin_titles()
1370 for(int i = 0; i < plugin_guis->total; i++)
1372 plugin_guis->values[i]->update_title();
1376 int MWindow::asset_to_edl(EDL *new_edl,
1378 RecordLabels *labels)
1380 //printf("MWindow::asset_to_edl 1\n");
1381 // new_edl->load_defaults(defaults);
1383 // Keep frame rate, sample rate, and output size unchanged.
1384 // These parameters would revert the project if VWindow displayed an asset
1385 // of different size than the project.
1386 if(new_asset->video_data)
1388 new_edl->session->video_tracks = new_asset->layers;
1389 // new_edl->session->frame_rate = new_asset->frame_rate;
1390 // new_edl->session->output_w = new_asset->width;
1391 // new_edl->session->output_h = new_asset->height;
1394 new_edl->session->video_tracks = 0;
1401 if(new_asset->audio_data)
1403 new_edl->session->audio_tracks = new_asset->channels;
1404 // new_edl->session->sample_rate = new_asset->sample_rate;
1407 new_edl->session->audio_tracks = 0;
1408 //printf("MWindow::asset_to_edl 2 %d %d\n", new_edl->session->video_tracks, new_edl->session->audio_tracks);
1410 new_edl->create_default_tracks();
1411 //printf("MWindow::asset_to_edl 2 %d %d\n", new_edl->session->video_tracks, new_edl->session->audio_tracks);
1413 // Disable drawing if the file format isn't fast enough.
1414 if(new_asset->format == FILE_MPEG)
1416 for(Track *current = new_edl->tracks->first;
1420 if(current->data_type == TRACK_VIDEO) current->draw = 0;
1426 //printf("MWindow::asset_to_edl 3\n");
1427 new_edl->insert_asset(new_asset, 0, 0, labels);
1428 //printf("MWindow::asset_to_edl 3\n");
1434 char string[BCTEXTLEN];
1436 fs.extract_name(string, new_asset->path);
1437 //printf("MWindow::asset_to_edl 3\n");
1439 strcpy(new_edl->local_session->clip_title, string);
1440 //printf("MWindow::asset_to_edl 4 %s\n", string);
1446 // Reset everything after a load.
1447 void MWindow::update_project(int load_mode)
1450 //TRACE("MWindow::update_project 1");
1451 edl->tracks->update_y_pixels(theme);
1454 //TRACE("MWindow::update_project 2");
1457 TRACE("MWindow::update_project 3");
1458 gui->update(1, 1, 1, 1, 1, 1, 1);
1460 TRACE("MWindow::update_project 4");
1461 cwindow->update(0, 0, 1, 1, 1);
1463 TRACE("MWindow::update_project 5");
1465 if(load_mode == LOAD_REPLACE ||
1466 load_mode == LOAD_REPLACE_CONCATENATE)
1468 vwindow->change_source();
1475 TRACE("MWindow::update_project 6");
1477 cwindow->gui->slider->set_position();
1478 TRACE("MWindow::update_project 6.1");
1479 cwindow->gui->timebar->update(1, 1);
1480 TRACE("MWindow::update_project 6.2");
1481 cwindow->playback_engine->que->send_command(CURRENT_FRAME,
1486 TRACE("MWindow::update_project 7");
1487 awindow->gui->lock_window("MWindow::update_project");
1488 awindow->gui->update_assets();
1489 awindow->gui->flush();
1490 awindow->gui->unlock_window();
1492 TRACE("MWindow::update_project 100");
1496 void MWindow::rebuild_indices()
1498 char source_filename[BCTEXTLEN], index_filename[BCTEXTLEN];
1500 for(int i = 0; i < session->drag_assets->total; i++)
1502 //printf("MWindow::rebuild_indices 1 %s\n", session->drag_assets->values[i]->path);
1504 IndexFile::get_index_filename(source_filename,
1505 preferences->index_directory,
1507 session->drag_assets->values[i]->path);
1508 remove(index_filename);
1509 // Schedule index build
1510 session->drag_assets->values[i]->index_status = INDEX_NOTTESTED;
1511 mainindexes->add_next_asset(session->drag_assets->values[i]);
1513 mainindexes->start_build();
1517 void MWindow::save_backup()
1520 edl->set_project_path(session->filename);
1521 edl->save_xml(plugindb,
1526 file.terminate_string();
1527 char path[BCTEXTLEN];
1529 strcpy(path, BACKUP_PATH);
1530 fs.complete_path(path);
1532 if(file.write_to_file(path))
1535 sprintf(string2, _("Couldn't open %s for writing."), BACKUP_PATH);
1536 gui->show_message(string2);
1541 int MWindow::create_aspect_ratio(float &w, float &h, int width, int height)
1544 float fraction = (float)width / height;
1546 for(denominator = 1;
1547 denominator < 100 &&
1548 fabs(fraction * denominator - (int)(fraction * denominator)) > .001;
1552 w = denominator * width / height;
1558 void MWindow::remove_assets_from_project(int push_undo)
1560 if(push_undo) undo->update_undo_before(_("remove assets"), LOAD_ALL);
1562 // Remove from caches
1563 for(int i = 0; i < session->drag_assets->total; i++)
1565 audio_cache->delete_entry(session->drag_assets->values[i]);
1566 video_cache->delete_entry(session->drag_assets->values[i]);
1569 printf("MWindow::remove_assets_from_project 1\n");
1570 video_cache->dump();
1571 audio_cache->dump();
1572 printf("MWindow::remove_assets_from_project 100\n");
1574 // Remove from VWindow.
1575 for(int i = 0; i < session->drag_clips->total; i++)
1577 if(session->drag_clips->values[i] == vwindow->get_edl())
1579 vwindow->gui->lock_window("MWindow::remove_assets_from_project 1");
1580 vwindow->remove_source();
1581 vwindow->gui->unlock_window();
1585 for(int i = 0; i < session->drag_assets->total; i++)
1587 if(session->drag_assets->values[i] == vwindow->get_asset())
1589 vwindow->gui->lock_window("MWindow::remove_assets_from_project 2");
1590 vwindow->remove_source();
1591 vwindow->gui->unlock_window();
1595 edl->remove_from_project(session->drag_assets);
1596 edl->remove_from_project(session->drag_clips);
1598 if(push_undo) undo->update_undo_after();
1601 gui->lock_window("MWindow::remove_assets_from_project 3");
1609 gui->unlock_window();
1611 awindow->gui->lock_window("MWindow::remove_assets_from_project 4");
1612 awindow->gui->update_assets();
1613 awindow->gui->flush();
1614 awindow->gui->unlock_window();
1616 // Removes from playback here
1617 sync_parameters(CHANGE_ALL);
1620 void MWindow::remove_assets_from_disk()
1623 for(int i = 0; i < session->drag_assets->total; i++)
1625 remove(session->drag_assets->values[i]->path);
1628 remove_assets_from_project(1);
1631 void MWindow::dump_plugins()
1633 for(int i = 0; i < plugindb->total; i++)
1635 printf("audio=%d video=%d realtime=%d transition=%d theme=%d %s\n",
1636 plugindb->values[i]->audio,
1637 plugindb->values[i]->video,
1638 plugindb->values[i]->realtime,
1639 plugindb->values[i]->transition,
1640 plugindb->values[i]->theme,
1641 plugindb->values[i]->title);
1669 int MWindow::save_defaults()
1671 gui->save_defaults(defaults);
1672 edl->save_defaults(defaults);
1673 session->save_defaults(defaults);
1674 preferences->save_defaults(defaults);
1680 int MWindow::run_script(FileXML *script)
1682 int result = 0, result2 = 0;
1683 while(!result && !result2)
1685 result = script->read_tag();
1688 if(script->tag.title_is("new_project"))
1690 // Run new in immediate mode.
1691 // gui->mainmenu->new_project->run_script(script);
1694 if(script->tag.title_is("record"))
1696 // Run record as a thread. It is a terminal command.
1698 // Will read the complete scipt file without letting record read it if not
1704 printf("MWindow::run_script: Unrecognized command: %s\n",script->tag.get_title() );
1711 // ================================= synchronization
1714 int MWindow::interrupt_indexes()
1716 mainindexes->interrupt_build();
1722 void MWindow::next_time_format()
1724 switch(edl->session->time_format)
1726 case 0: edl->session->time_format = 1; break;
1727 case 1: edl->session->time_format = 2; break;
1728 case 2: edl->session->time_format = 3; break;
1729 case 3: edl->session->time_format = 4; break;
1730 case 4: edl->session->time_format = 5; break;
1731 case 5: edl->session->time_format = 0; break;
1735 gui->redraw_time_dependancies();
1739 char string[BCTEXTLEN], string2[BCTEXTLEN];
1740 sprintf(string, _("Using %s."), Units::print_time_format(edl->session->time_format, string2));
1741 gui->show_message(string, BLACK);
1743 gui->unlock_window();
1746 int MWindow::set_filename(char *filename)
1748 strcpy(session->filename, filename);
1751 if(filename[0] == 0)
1753 gui->set_title(PROGRAM_NAME);
1758 char string[BCTEXTLEN], string2[BCTEXTLEN];
1759 dir.extract_name(string, filename);
1760 sprintf(string2, PROGRAM_NAME ": %s", string);
1761 gui->set_title(string2);
1774 int MWindow::set_loop_boundaries()
1776 double start = edl->local_session->get_selectionstart();
1777 double end = edl->local_session->get_selectionend();
1785 if(edl->tracks->total_length())
1788 end = edl->tracks->total_length();
1795 if(edl->local_session->loop_playback && start != end)
1797 edl->local_session->loop_start = start;
1798 edl->local_session->loop_end = end;
1809 int MWindow::reset_meters()
1811 cwindow->gui->lock_window("MWindow::reset_meters 1");
1812 cwindow->gui->meters->reset_meters();
1813 cwindow->gui->unlock_window();
1815 vwindow->gui->lock_window("MWindow::reset_meters 2");
1816 vwindow->gui->meters->reset_meters();
1817 vwindow->gui->unlock_window();
1819 lwindow->gui->lock_window("MWindow::reset_meters 3");
1820 lwindow->gui->panel->reset_meters();
1821 lwindow->gui->unlock_window();
1823 gui->lock_window("MWindow::reset_meters 4");
1824 gui->patchbay->reset_meters();
1825 gui->unlock_window();