def _auto_renconvert_after_proxy_render_in_proxy_mode(): # Save to temp to convert to using original media project = editorstate.PROJECT() project.proxy_data.proxy_mode = appconsts.CONVERTING_TO_USE_ORIGINAL_MEDIA conv_temp_project_path = utils.get_hidden_user_dir_path() + "proxy_conv.flb" persistance.save_project(editorstate.PROJECT(), conv_temp_project_path) project.proxy_data.proxy_mode = appconsts.USE_ORIGINAL_MEDIA # Load saved temp original media project persistance.show_messages = False project = persistance.load_project(conv_temp_project_path) # Save to temp to convert back to using proxy media project.proxy_data.proxy_mode = appconsts.CONVERTING_TO_USE_PROXY_MEDIA persistance.save_project(project, conv_temp_project_path) project.proxy_data.proxy_mode = appconsts.USE_PROXY_MEDIA # Load saved temp proxy project project = persistance.load_project(conv_temp_project_path) # Open saved temp project app.stop_autosave() gtk.gdk.threads_enter() app.open_project(project) gtk.gdk.threads_leave() app.start_autosave() editorstate.update_current_proxy_paths() persistance.show_messages = True
def _auto_renconvert_after_proxy_render_in_proxy_mode(): # Save to temp to convert to using original media project = editorstate.PROJECT() project.proxy_data.proxy_mode = appconsts.CONVERTING_TO_USE_ORIGINAL_MEDIA conv_temp_project_path = utils.get_hidden_user_dir_path( ) + "proxy_conv.flb" persistance.save_project(editorstate.PROJECT(), conv_temp_project_path) project.proxy_data.proxy_mode = appconsts.USE_ORIGINAL_MEDIA # Load saved temp original media project persistance.show_messages = False project = persistance.load_project(conv_temp_project_path) # Save to temp to convert back to using proxy media project.proxy_data.proxy_mode = appconsts.CONVERTING_TO_USE_PROXY_MEDIA persistance.save_project(project, conv_temp_project_path) project.proxy_data.proxy_mode = appconsts.USE_PROXY_MEDIA # Load saved temp proxy project project = persistance.load_project(conv_temp_project_path) # Open saved temp project app.stop_autosave() Gdk.threads_enter() app.open_project(project) Gdk.threads_leave() app.start_autosave() editorstate.update_current_proxy_paths() persistance.show_messages = True
def run(self): Gdk.threads_enter() _info_window.info.set_text("Loading project " + self.filename + "...") Gdk.threads_leave() persistance.show_messages = False target_project = persistance.load_project(self.filename, False, True) target_project.c_seq = target_project.sequences[ target_project.c_seq_index] # Media file media assets media_assets = "" for media_file_id, media_file in target_project.media_files.iteritems( ): if isinstance(media_file, patternproducer.AbstractBinClip): continue if os.path.isfile(media_file.path): media_assets = media_assets + str(media_file.path) + "\n" f = open(_get_assets_file(), 'w') f.write(media_assets) f.close() _shutdown()
def run(self): gtk.gdk.threads_enter() linker_window.project_label.set_text("Loading...") gtk.gdk.threads_leave() persistance.show_messages = False project = persistance.load_project(self.filename, False) global target_project target_project = project _update_media_assets() gtk.gdk.threads_enter() linker_window.relink_list.fill_data_model() linker_window.project_label.set_text(self.filename) linker_window.set_active_state() linker_window.update_files_info() gtk.gdk.threads_leave()
def run(self): pulse_runner = guiutils.PulseThread(self.progressbar) pulse_runner.start() time.sleep(2.0) persistance.show_messages = False try: Gdk.threads_enter() project = persistance.load_project(self.proxy_project_path) sequence.set_track_counts(project) Gdk.threads_leave() except persistance.FileProducerNotFoundError as e: print "did not find file:", e pulse_runner.running = False time.sleep(0.3) # need to be sure pulse_runner has stopped project.c_seq.tractor.mark_in = self.mark_in project.c_seq.tractor.mark_out = self.mark_out app.stop_autosave() Gdk.threads_enter() app.open_project(project) Gdk.threads_leave() # Loaded project has been converted, set proxy mode to correct mode if project.proxy_data.proxy_mode == appconsts.CONVERTING_TO_USE_PROXY_MEDIA: project.proxy_data.proxy_mode = appconsts.USE_PROXY_MEDIA else: project.proxy_data.proxy_mode = appconsts.USE_ORIGINAL_MEDIA app.start_autosave() global load_thread load_thread = None persistance.show_messages = True Gdk.threads_enter() selections = project.get_project_property( appconsts.P_PROP_LAST_RENDER_SELECTIONS) if selections != None: render.set_saved_gui_selections(selections) _converting_proxy_mode_done() Gdk.threads_leave()
def run(self): pulse_runner = guiutils.PulseThread(self.progressbar) pulse_runner.start() time.sleep(2.0) persistance.show_messages = False try: Gdk.threads_enter() project = persistance.load_project(self.proxy_project_path) sequence.set_track_counts(project) Gdk.threads_leave() except persistance.FileProducerNotFoundError as e: print "did not find file:", e pulse_runner.running = False time.sleep(0.3) # need to be sure pulse_runner has stopped project.c_seq.tractor.mark_in = self.mark_in project.c_seq.tractor.mark_out = self.mark_out app.stop_autosave() Gdk.threads_enter() app.open_project(project) Gdk.threads_leave() # Loaded project has been converted, set proxy mode to correct mode if project.proxy_data.proxy_mode == appconsts.CONVERTING_TO_USE_PROXY_MEDIA: project.proxy_data.proxy_mode = appconsts.USE_PROXY_MEDIA else: project.proxy_data.proxy_mode = appconsts.USE_ORIGINAL_MEDIA app.start_autosave() global load_thread load_thread = None persistance.show_messages = True Gdk.threads_enter() selections = project.get_project_property(appconsts.P_PROP_LAST_RENDER_SELECTIONS) if selections != None: render.set_saved_gui_selections(selections) _converting_proxy_mode_done() Gdk.threads_leave()
def run(self): Gdk.threads_enter() linker_window.project_label.set_text("Loading...") Gdk.threads_leave() persistance.show_messages = False project = persistance.load_project(self.filename, False, True) global target_project target_project = project target_project.c_seq = project.sequences[target_project.c_seq_index] _update_media_assets() Gdk.threads_enter() linker_window.relink_list.fill_data_model() linker_window.project_label.set_text(self.filename) linker_window.set_active_state() linker_window.update_files_info() Gdk.threads_leave()
def run(self): Gdk.threads_enter() linker_window.project_label.set_text("Loading...") Gdk.threads_leave() persistance.show_messages = False project = persistance.load_project(self.filename, False, True) global target_project target_project = project target_project.c_seq = project.sequences[target_project.c_seq_index] _update_media_assets() Gdk.threads_enter() linker_window.relink_list.fill_data_model() linker_window.project_label.set_text(self.filename) linker_window.set_active_state() linker_window.update_files_info() linker_window.load_button.set_sensitive(False) Gdk.threads_leave()
def run(self): Gdk.threads_enter() _info_window.info.set_text("Loading project " + self.filename + "...") Gdk.threads_leave() persistance.show_messages = False target_project = persistance.load_project(self.filename, False, True) target_project.c_seq = target_project.sequences[target_project.c_seq_index] # Media file media assets media_assets = "" for media_file_id, media_file in target_project.media_files.iteritems(): if isinstance(media_file, patternproducer.AbstractBinClip): continue if os.path.isfile(media_file.path): media_assets = media_assets + str(media_file.path) + "\n" f = open(_get_assets_file(), 'w') f.write(media_assets) f.close() _shutdown()
def run(self): pulse_runner = guiutils.PulseThread(self.progressbar) pulse_runner.start() time.sleep(2.0) persistance.show_messages = False try: gtk.gdk.threads_enter() project = persistance.load_project(self.proxy_project_path) sequence.set_track_counts(project) gtk.gdk.threads_leave() except persistance.FileProducerNotFoundError as e: print "did not find file:", e pulse_runner.running = False time.sleep(0.3) # need to be sure pulse_runner has stopped app.stop_autosave() gtk.gdk.threads_enter() app.open_project(project) gtk.gdk.threads_leave() # Loaded project has been converted, set proxy mode to correct mode if project.proxy_data.proxy_mode == appconsts.CONVERTING_TO_USE_PROXY_MEDIA: project.proxy_data.proxy_mode = appconsts.USE_PROXY_MEDIA else: project.proxy_data.proxy_mode = appconsts.USE_ORIGINAL_MEDIA app.start_autosave() global load_thread load_thread = None persistance.show_messages = True gtk.gdk.threads_enter() _converting_proxy_mode_done() gtk.gdk.threads_leave()
def run(self): Gdk.threads_enter() updater.set_info_icon(Gtk.STOCK_OPEN) dialog = dialogs.load_dialog() persistance.load_dialog = dialog Gdk.threads_leave() ticker = utils.Ticker(_load_pulse_bar, 0.15) ticker.start_ticker() old_project = editorstate.project try: editorstate.project_is_loading = True project = persistance.load_project(self.filename) sequence.set_track_counts(project) editorstate.project_is_loading = False except persistance.FileProducerNotFoundError as e: print "did not find file:", e self._error_stop(dialog, ticker) primary_txt = _("Media asset was missing!") secondary_txt = _("Path of missing asset:") + "\n <b>" + e.value + "</b>\n\n" + \ _("Relative search for replacement file in sub folders of project file failed.") + "\n\n" + \ _("To load the project you will need to either:") + "\n" + \ u"\u2022" + " " + _("Use 'Media Linker' tool to relink media assets to new files, or") + "\n" + \ u"\u2022" + " " + _("Place a file with the same exact name and path on the hard drive") dialogutils.warning_message(primary_txt, secondary_txt, None, is_info=False) editorstate.project = old_project # persistance.load_project() changes this, # we simply change it back as no GUI or other state is yet changed return except persistance.ProjectProfileNotFoundError as e: self._error_stop(dialog, ticker) primary_txt = _("Profile with Description: '") + e.value + _("' was not found on load!") secondary_txt = _("It is possible to load the project by creating a User Profile with exactly the same Description\nas the missing profile. ") + "\n\n" + \ _("User Profiles can be created by selecting 'Edit->Profiles Manager'.") dialogutils.warning_message(primary_txt, secondary_txt, None, is_info=False) editorstate.project = old_project # persistance.load_project() changes this, # we simply change it back as no GUI or other state is yet changed return Gdk.threads_enter() dialog.info.set_text(_("Opening")) Gdk.threads_leave() time.sleep(0.3) Gdk.threads_enter() app.open_project(project) if self.block_recent_files: # naming flipped ???? editorpersistance.add_recent_project_path(self.filename) editorpersistance.fill_recents_menu_widget(gui.editor_window.uimanager.get_widget('/MenuBar/FileMenu/OpenRecent'), open_recent_project) Gdk.threads_leave() Gdk.threads_enter() updater.set_info_icon(None) dialog.destroy() Gdk.threads_leave() ticker.stop_ticker()
def main(root_path): """ Called at application start. Initializes application with a default project. """ # Print OS, Python version and GTK+ version try: os_release_file = open("/etc/os-release","r") os_text = os_release_file.read() s_index = os_text.find("PRETTY_NAME=") e_index = os_text.find("\n", s_index) print "OS: " + os_text[s_index + 13:e_index - 1] except: pass print "Python", sys.version gtk_version = "%s.%s.%s" % (Gtk.get_major_version(), Gtk.get_minor_version(), Gtk.get_micro_version()) print "GTK+ version:", gtk_version editorstate.gtk_version = gtk_version try: editorstate.mlt_version = mlt.LIBMLT_VERSION except: editorstate.mlt_version = "0.0.99" # magic string for "not found" # passing -xdg as a flag will change the user_dir location with XDG_CONFIG_HOME # For full xdg-app support all the launch processes need to add this too, currently not impl. for arg in sys.argv: if arg.lower() == "-xdg": editorstate.use_xdg = True # Create hidden folders if not present user_dir = utils.get_hidden_user_dir_path() print "User dir:",user_dir if not os.path.exists(user_dir): os.mkdir(user_dir) if not os.path.exists(user_dir + mltprofiles.USER_PROFILES_DIR): os.mkdir(user_dir + mltprofiles.USER_PROFILES_DIR) if not os.path.exists(user_dir + AUTOSAVE_DIR): os.mkdir(user_dir + AUTOSAVE_DIR) if not os.path.exists(user_dir + BATCH_DIR): os.mkdir(user_dir + BATCH_DIR) if not os.path.exists(user_dir + appconsts.AUDIO_LEVELS_DIR): os.mkdir(user_dir + appconsts.AUDIO_LEVELS_DIR) if not os.path.exists(utils.get_hidden_screenshot_dir_path()): os.mkdir(utils.get_hidden_screenshot_dir_path()) if not os.path.exists(user_dir + appconsts.GMIC_DIR): os.mkdir(user_dir + appconsts.GMIC_DIR) # Set paths. respaths.set_paths(root_path) # Load editor prefs and list of recent projects editorpersistance.load() if editorpersistance.prefs.dark_theme == True: respaths.apply_dark_theme() if editorpersistance.prefs.display_all_audio_levels == False: editorstate.display_all_audio_levels = False editorpersistance.create_thumbs_folder_if_needed(user_dir) editorpersistance.create_rendered_clips_folder_if_needed(user_dir) editorpersistance.save() # Init translations module with translations data translations.init_languages() translations.load_filters_translations() mlttransitions.init_module() # RHEL7/CentOS compatibility fix if gtk_version == "3.8.8": GObject.threads_init() # Init gtk threads Gdk.threads_init() Gdk.threads_enter() # Request dark them if so desired if editorpersistance.prefs.dark_theme == True: Gtk.Settings.get_default().set_property("gtk-application-prefer-dark-theme", True) # Load drag'n'drop images dnd.init() # Adjust gui parameters for smaller screens scr_w = Gdk.Screen.width() scr_h = Gdk.Screen.height() editorstate.SCREEN_WIDTH = scr_w editorstate.SCREEN_HEIGHT = scr_h print "Small height:", editorstate.screen_size_small_height() print "Small width:", editorstate.screen_size_small_width() _set_draw_params() # Refuse to run on too small screen. if scr_w < 1151 or scr_h < 767: _too_small_screen_exit() return # Splash screen if editorpersistance.prefs.display_splash_screen == True: show_splash_screen() # Init MLT framework repo = mlt.Factory().init() # Set numeric locale to use "." as radix, MLT initilizes this to OS locale and this causes bugs locale.setlocale(locale.LC_NUMERIC, 'C') # Check for codecs and formats on the system mltenv.check_available_features(repo) renderconsumer.load_render_profiles() # Load filter and compositor descriptions from xml files. mltfilters.load_filters_xml(mltenv.services) mlttransitions.load_compositors_xml(mltenv.transitions) # Replace some services if better replacements available mltfilters.replace_services(mltenv.services) # Create list of available mlt profiles mltprofiles.load_profile_list() # Launch association file if found in arguments launch_file_path = get_assoc_file_path() if launch_file_path != None: try: print "Launching assoc file:" + launch_file_path persistance.show_messages = False editorstate.project = persistance.load_project(launch_file_path) persistance.show_messages = True check_crash = False except: editorstate.project = projectdata.get_default_project() persistance.show_messages = True check_crash = True else: # There is always a project open, so at startup we create a default project. # Set default project as the project being edited. editorstate.project = projectdata.get_default_project() check_crash = True # Audiomonitoring being available needs to be known before GUI creation audiomonitoring.init(editorstate.project.profile) # Create player object create_player() # Create main window and set widget handles in gui.py for more convenient reference. create_gui() # Inits widgets with project data init_project_gui() # Inits widgets with current sequence data init_sequence_gui() # Launch player now that data and gui exist launch_player() # Editor and modules need some more initializing init_editor_state() # Tracks need to be recentered if window is resized. # Connect listener for this now that the tline panel size allocation is sure to be available. global window_resize_id, window_state_id window_resize_id = gui.editor_window.window.connect("size-allocate", lambda w, e:updater.window_resized()) window_state_id = gui.editor_window.window.connect("window-state-event", lambda w, e:updater.window_resized()) # Get existing autosave files autosave_files = get_autosave_files() # Show splash if ((editorpersistance.prefs.display_splash_screen == True) and len(autosave_files) == 0): global splash_timeout_id splash_timeout_id = GLib.timeout_add(2600, destroy_splash_screen) splash_screen.show_all() appconsts.SAVEFILE_VERSION = projectdata.SAVEFILE_VERSION # THIS IS A QUESTIONABLE IDEA TO SIMPLIFY IMPORTS, NOT DRY. WHEN DOING TOOLS THAT RUN IN ANOTHER PROCESSES AND SAVE PROJECTS, THIS LINE NEEDS TO BE THERE ALSO. # Every running instance has unique autosave file which is deleted at exit set_instance_autosave_id() # Existance of autosave file hints that program was exited abnormally if check_crash == True and len(autosave_files) > 0: if len(autosave_files) == 1: GObject.timeout_add(10, autosave_recovery_dialog) else: GObject.timeout_add(10, autosaves_many_recovery_dialog) else: start_autosave() # We prefer to monkeypatch some callbacks into some modules, usually to # maintain a simpler and/or non-circular import structure monkeypatch_callbacks() # Launch gtk+ main loop Gtk.main() Gdk.threads_leave()
def run(self): hidden_dir = utils.get_hidden_user_dir_path() try: data_file_path = hidden_dir + CURRENT_RENDER_RENDER_ITEM data_file = open(data_file_path) render_item = pickle.load(data_file) self.error_status = None except Exception as e: if self.error_status == None: self.error_status = [] self.error_status = ("Current render datafile load failed with ") + str(e) # something return current_render_time = 0 # Create render objects project_file_path = hidden_dir + CURRENT_RENDER_PROJECT_FILE persistance.show_messages = False project = persistance.load_project(project_file_path, False) producer = project.c_seq.tractor consumer = renderconsumer.get_mlt_render_consumer(render_item.render_path, project.profile, render_item.args_vals_list) # Get render range start_frame, end_frame, wait_for_stop_render = get_render_range(render_item) # Create and launch render thread render_thread = renderconsumer.FileRenderPlayer(None, producer, consumer, start_frame, end_frame) # None == file name not needed this time when using FileRenderPlayer because callsite keeps track of things render_thread.wait_for_producer_end_stop = wait_for_stop_render render_thread.start() # Set render start time and item state render_item.render_started() Gdk.threads_enter() #single_render_window.update_queue_view() single_render_window.current_render.set_text(" " + os.path.basename(render_item.render_path)) Gdk.threads_leave() # Make sure that render thread is actually running before # testing render_thread.running value later while render_thread.has_started_running == False: time.sleep(0.05) # View update loop self.running = True while self.running: render_fraction = render_thread.get_render_fraction() now = time.time() current_render_time = now - render_item.start_time Gdk.threads_enter() single_render_window.update_render_progress(render_fraction, render_item.get_display_name(), current_render_time) Gdk.threads_leave() if render_thread.running == False: # Rendering has reached end self.running = False Gdk.threads_enter() single_render_window.render_progress_bar.set_fraction(1.0) Gdk.threads_leave() time.sleep(0.33) render_thread.shutdown() global single_render_thread single_render_thread = None # Update view for render end GLib.idle_add(_single_render_shutdown)
def run(self): self.running = True items = 0 global render_queue, batch_window for render_item in render_queue.queue: if self.running == False: break if render_item.render_this_item == False: continue current_render_time = 0 # Create render objects identifier = render_item.generate_identifier() project_file_path = get_projects_dir() + identifier + ".flb" persistance.show_messages = False project = persistance.load_project(project_file_path, False) producer = project.c_seq.tractor consumer = renderconsumer.get_mlt_render_consumer( render_item.render_path, project.profile, render_item.args_vals_list) # Get render range start_frame, end_frame, wait_for_stop_render = get_render_range( render_item) # Create and launch render thread global render_thread render_thread = renderconsumer.FileRenderPlayer( None, producer, consumer, start_frame, end_frame ) # None == file name not needed this time when using FileRenderPlayer because callsite keeps track of things render_thread.wait_for_producer_end_stop = wait_for_stop_render render_thread.start() # Set render start time and item state render_item.render_started() gtk.gdk.threads_enter() batch_window.update_queue_view() batch_window.current_render.set_text( " " + render_item.get_display_name()) gtk.gdk.threads_leave() # Make sure that render thread is actually running before # testing render_thread.running value later while render_thread.has_started_running == False: time.sleep(0.05) # View update loop self.thread_running = True self.aborted = False while self.thread_running: if self.aborted == True: break render_fraction = render_thread.get_render_fraction() now = time.time() current_render_time = now - render_item.start_time gtk.gdk.threads_enter() batch_window.update_render_progress( render_fraction, items, render_item.get_display_name(), current_render_time) gtk.gdk.threads_leave() if render_thread.running == False: # Rendering has reached end self.thread_running = False gtk.gdk.threads_enter() batch_window.render_progress_bar.set_fraction(1.0) gtk.gdk.threads_leave() render_item.render_completed() else: time.sleep(0.33) if not self.aborted: items = items + 1 gtk.gdk.threads_enter() batch_window.update_render_progress( 0, items, render_item.get_display_name(), 0) gtk.gdk.threads_leave() else: if render_item != None: render_item.render_aborted() break render_thread.shutdown() # Update view for render end gtk.gdk.threads_enter() batch_window.reload_queue( ) # item may havee added to queue while rendering batch_window.render_queue_stopped() gtk.gdk.threads_leave()
def main(root_path): """ Called at application start. Initializes application with a default project. """ # Print OS, Python version and GTK+ version try: os_release_file = open("/etc/os-release", "r") os_text = os_release_file.read() s_index = os_text.find("PRETTY_NAME=") e_index = os_text.find("\n", s_index) print "OS: " + os_text[s_index + 13:e_index - 1] except: pass print "Python", sys.version print "GTK+ version:", gtk.gtk_version editorstate.gtk_version = gtk.gtk_version try: editorstate.mlt_version = mlt.LIBMLT_VERSION except: editorstate.mlt_version = "0.0.99" # magic string for "not found" # Create hidden folders if not present user_dir = utils.get_hidden_user_dir_path() if not os.path.exists(user_dir): os.mkdir(user_dir) if not os.path.exists(user_dir + mltprofiles.USER_PROFILES_DIR): os.mkdir(user_dir + mltprofiles.USER_PROFILES_DIR) if not os.path.exists(user_dir + AUTOSAVE_DIR): os.mkdir(user_dir + AUTOSAVE_DIR) if not os.path.exists(user_dir + BATCH_DIR): os.mkdir(user_dir + BATCH_DIR) if not os.path.exists(user_dir + appconsts.AUDIO_LEVELS_DIR): os.mkdir(user_dir + appconsts.AUDIO_LEVELS_DIR) if not os.path.exists(utils.get_hidden_screenshot_dir_path()): os.mkdir(utils.get_hidden_screenshot_dir_path()) # Set paths. respaths.set_paths(root_path) # Init translations module with translations data translations.init_languages() translations.load_filters_translations() mlttransitions.init_module() # Load editor prefs and list of recent projects editorpersistance.load() if editorpersistance.prefs.dark_theme == True: respaths.apply_dark_theme() editorpersistance.create_thumbs_folder_if_needed(user_dir) editorpersistance.create_rendered_clips_folder_if_needed(user_dir) editorpersistance.save() # Init gtk threads gtk.gdk.threads_init() gtk.gdk.threads_enter() # Load drag'n'drop images dnd.init() # Adjust gui parameters for smaller screens scr_w = gtk.gdk.screen_width() scr_h = gtk.gdk.screen_height() editorstate.SCREEN_WIDTH = scr_w editorstate.SCREEN_HEIGHT = scr_h _set_draw_params(scr_w, scr_h) # Refuse to run on too small screen. if scr_w < 1151 or scr_h < 767: _too_small_screen_exit() return # Splash screen if editorpersistance.prefs.display_splash_screen == True: show_splash_screen() # Init MLT framework repo = mlt.Factory().init() # Set numeric locale to use "." as radix, MLT initilizes this to OS locale and this causes bugs locale.setlocale(locale.LC_NUMERIC, 'C') # Check for codecs and formats on the system mltenv.check_available_features(repo) renderconsumer.load_render_profiles() # Load filter and compositor descriptions from xml files. mltfilters.load_filters_xml(mltenv.services) mlttransitions.load_compositors_xml(mltenv.transitions) # Replace some services if better replacements available mltfilters.replace_services(mltenv.services) # Create list of available mlt profiles mltprofiles.load_profile_list() # Launch association file if found in arguments launch_file_path = get_assoc_file_path() if launch_file_path != None: try: print "Launching assoc file:" + launch_file_path persistance.show_messages = False editorstate.project = persistance.load_project(launch_file_path) persistance.show_messages = True check_crash = False except: editorstate.project = projectdata.get_default_project() persistance.show_messages = True check_crash = True else: # There is always a project open, so at startup we create a default project. # Set default project as the project being edited. editorstate.project = projectdata.get_default_project() check_crash = True # Audiomonitoring being available needs to be known before GUI creation audiomonitoring.init(editorstate.project.profile) # Do JACK audio start-up action jackaudio.start_up() # Create player object create_player() # Create main window and set widget handles in gui.py for more convenient reference. create_gui() # Inits widgets with project data init_project_gui() # Inits widgets with current sequence data init_sequence_gui() # Launch player now that data and gui exist launch_player() # Editor and modules need some more initializing init_editor_state() # Tracks need to be recentered if window is resized. # Connect listener for this now that the tline panel size allocation is sure to be available. gui.editor_window.window.connect("size-allocate", lambda w, e: updater.window_resized()) gui.editor_window.window.connect("window-state-event", lambda w, e: updater.window_resized()) # Get existing autosave files autosave_files = get_autosave_files() # Show splash if ((editorpersistance.prefs.display_splash_screen == True) and len(autosave_files) == 0): global splash_timeout_id splash_timeout_id = gobject.timeout_add(2600, destroy_splash_screen) splash_screen.show_all() appconsts.SAVEFILE_VERSION = projectdata.SAVEFILE_VERSION # THIS IS A QUESTIONABLE IDEA TO SIMPLIFY IMPORTS, NOT DRY. WHEN DOING TOOLS THAT RUN IN ANOTHER PROCESSES AND SAVE PROJECTS, THIS LINE NEEDS TO BE THERE ALSO. # Every running instance has unique autosave file which is deleted at exit set_instance_autosave_id() # Existance of autosave file hints that program was exited abnormally if check_crash == True and len(autosave_files) > 0: if len(autosave_files) == 1: gobject.timeout_add(10, autosave_recovery_dialog) else: gobject.timeout_add(10, autosaves_many_recovery_dialog) else: start_autosave() # We prefer to monkeypatch some callbacks into some modules, usually to # maintain a simpler and non-circular import structure monkeypatch_callbacks() # Launch gtk+ main loop gtk.main() gtk.gdk.threads_leave()
def run(self): self.running = True items = 0 global render_queue, batch_window for render_item in render_queue.queue: if self.running == False: break if render_item.render_this_item == False: continue current_render_time = 0 # Create render objects identifier = render_item.generate_identifier() project_file_path = get_projects_dir() + identifier + ".flb" persistance.show_messages = False project = persistance.load_project(project_file_path, False) producer = project.c_seq.tractor consumer = renderconsumer.get_mlt_render_consumer(render_item.render_path, project.profile, render_item.args_vals_list) # Get render range start_frame, end_frame, wait_for_stop_render = get_render_range(render_item) # Create and launch render thread global render_thread render_thread = renderconsumer.FileRenderPlayer(None, producer, consumer, start_frame, end_frame) # None == file name not needed this time when using FileRenderPlayer because callsite keeps track of things render_thread.wait_for_producer_end_stop = wait_for_stop_render render_thread.start() # Set render start time and item state render_item.render_started() Gdk.threads_enter() batch_window.update_queue_view() batch_window.current_render.set_text(" " + render_item.get_display_name()) Gdk.threads_leave() # Make sure that render thread is actually running before # testing render_thread.running value later while render_thread.has_started_running == False: time.sleep(0.05) # View update loop self.thread_running = True self.aborted = False while self.thread_running: if self.aborted == True: break render_fraction = render_thread.get_render_fraction() now = time.time() current_render_time = now - render_item.start_time Gdk.threads_enter() batch_window.update_render_progress(render_fraction, items, render_item.get_display_name(), current_render_time) Gdk.threads_leave() if render_thread.running == False: # Rendering has reached end self.thread_running = False Gdk.threads_enter() batch_window.render_progress_bar.set_fraction(1.0) Gdk.threads_leave() render_item.render_completed() else: time.sleep(0.33) if not self.aborted: items = items + 1 Gdk.threads_enter() batch_window.update_render_progress(0, items, render_item.get_display_name(), 0) Gdk.threads_leave() else: if render_item != None: render_item.render_aborted() break render_thread.shutdown() # Update view for render end Gdk.threads_enter() batch_window.reload_queue() # item may havee added to queue while rendering batch_window.render_queue_stopped() Gdk.threads_leave()