X-Git-Url: http://git.cinelerra-gg.org/git/?p=goodguy%2Fhistory.git;a=blobdiff_plain;f=cinelerra-5.1%2Fcinelerra%2Fmwindow.C;h=6150f954131af90569483dc305304075ff4c09d8;hp=1f69fd504e785390946c478552a394248a75945b;hb=a94468d6de897136e77c70662177f4b8b4454b6b;hpb=c2c09a4c97194b07dbd1eae82aa0226d9774f350 diff --git a/cinelerra-5.1/cinelerra/mwindow.C b/cinelerra-5.1/cinelerra/mwindow.C index 1f69fd50..6150f954 100644 --- a/cinelerra-5.1/cinelerra/mwindow.C +++ b/cinelerra-5.1/cinelerra/mwindow.C @@ -38,6 +38,7 @@ #include "channeldb.h" #include "channelinfo.h" #include "clip.h" +#include "clipedls.h" #include "bccmodels.h" #include "commercials.h" #include "cplayback.h" @@ -80,7 +81,6 @@ #include "mutex.h" #include "mwindowgui.h" #include "mwindow.h" -#include "nestededls.h" #include "new.h" #include "panautos.h" #include "patchbay.h" @@ -230,6 +230,7 @@ MWindow::MWindow() restart_status = 0; screens = 1; in_destructor = 0; + speed_edl = 0; } @@ -251,7 +252,7 @@ MWindow::~MWindow() commit_commercial(); if( commercials && !commercials->remove_user() ) commercials = 0; close_mixers(); - + if( speed_edl ) { speed_edl->remove_user(); speed_edl = 0; } // Save defaults for open plugins plugin_gui_lock->lock("MWindow::~MWindow"); for(int i = 0; i < plugin_guis->size(); i++) { @@ -746,7 +747,7 @@ void MWindow::add_plugins(ArrayList &plugins) void MWindow::init_plugin_tips(ArrayList &plugins, const char *lang) { const char *cfg_path = File::get_cindat_path(); - char msg_path[BCTEXTLEN]; int txt = 0; + char msg_path[BCTEXTLEN]; FILE *fp = 0; if( BC_Resources::language[0] ) { snprintf(msg_path, sizeof(msg_path), "%s/info/plugins.%s", @@ -754,7 +755,6 @@ void MWindow::init_plugin_tips(ArrayList &plugins, const char *la fp = fopen(msg_path, "r"); } if( !fp ) { - txt = 1; snprintf(msg_path, sizeof(msg_path), "%s/info/plugins.txt", cfg_path); fp = fopen(msg_path, "r"); @@ -775,9 +775,8 @@ void MWindow::init_plugin_tips(ArrayList &plugins, const char *la if( done ) { if( tp > text && *--tp == '\n' ) *tp = 0; if( title[0] ) { - tp = !txt ? title : _(title); int idx = plugins.size(); - while( --idx>=0 && strcmp(plugins[idx]->title, tp) ); + while( --idx>=0 && strcmp(plugins[idx]->title, title) ); if( idx >= 0 ) { delete [] plugins[idx]->tip; plugins[idx]->tip = cstrdup(text); @@ -1217,7 +1216,7 @@ void MWindow::update_mixer_tracks() } void MWindow::queue_mixers(EDL *edl, int command, int wait_tracking, - int use_inout, int update_refresh, int toggle_audio) + int use_inout, int update_refresh, int toggle_audio, int loop_play) { zwindows_lock->lock("MWindow::queue_mixers"); for( int vidx=0; vidxchange_source(mixer_edl); zwindow->issue_command(command, - wait_tracking, use_inout, update_refresh, toggle_audio); + wait_tracking, use_inout, update_refresh, toggle_audio, loop_play); } zwindows_lock->unlock(); } -void MWindow::refresh_mixers() +void MWindow::refresh_mixers(int dir) { - queue_mixers(edl,CURRENT_FRAME,0,0,1,0); + int command = dir >= 0 ? CURRENT_FRAME : LAST_FRAME; + queue_mixers(edl,command,0,0,1,0,0); } void MWindow::stop_mixers() @@ -1264,7 +1264,7 @@ void MWindow::stop_mixers() for( int vidx=0; vidxidx < 0 ) continue; - zwindow->issue_command(STOP, 0, 0, 0, 0); + zwindow->issue_command(STOP, 0, 0, 0, 0, 0); } } @@ -1287,35 +1287,53 @@ void MWindow::close_mixers() } } +ZWindow *MWindow::create_mixer(Indexable *indexable) +{ + ArrayList new_assets; + new_assets.append(indexable); + Track *track = edl->tracks->last; + load_assets(&new_assets, 0, LOADMODE_NEW_TRACKS, 0, 0, 0, 0, 0, 0); + track = !track ? edl->tracks->first : track->next; + Mixer *mixer = 0; + ZWindow *zwindow = get_mixer(mixer); + while( track ) { + track->play = track->record = 0; + if( track->data_type == TRACK_VIDEO ) { + sprintf(track->title, _("Mixer %d"), zwindow->idx); + } + mixer->mixer_ids.append(track->get_mixer_id()); + track = track->next; + } + if( indexable->is_asset ) { + char *path = indexable->path; + char *tp = strrchr(path, '/'); + if( !tp ) tp = path; else ++tp; + zwindow->set_title(tp); + } + else { + char *title = ((EDL*)indexable)->local_session->clip_title; + zwindow->set_title(title); + } + return zwindow; +} + void MWindow::create_mixers() { - if( !session->drag_assets->size() ) return; + if( !session->drag_assets->size() && + !session->drag_clips->size() ) return; undo->update_undo_before(); select_zwindow(0); ArrayListnew_mixers; - for( int i=0; idrag_assets->total; ++i ) { - Indexable *indexable = session->drag_assets->values[i]; - ArrayList new_assets; - new_assets.append(indexable); - Track *track = edl->tracks->last; - load_assets(&new_assets, -1, LOADMODE_NEW_TRACKS, 0, 0, 0, 0, 0, 0); - track = !track ? edl->tracks->first : track->next; - Mixer *mixer = 0; - ZWindow *zwindow = get_mixer(mixer); - while( track ) { - track->play = track->record = 0; - if( track->data_type == TRACK_VIDEO ) { - sprintf(track->title, _("Mixer %d"), zwindow->idx); - } - mixer->mixer_ids.append(track->get_mixer_id()); - track = track->next; - } - char *path = indexable->path; - char *tp = strrchr(path, '/'); - if( !tp ) tp = path; else ++tp; - zwindow->set_title(tp); + for( int i=0; idrag_assets->size(); ++i ) { + Indexable *indexable = session->drag_assets->get(i); + ZWindow *zwindow = create_mixer(indexable); + new_mixers.append(zwindow); + } + for( int i=0; idrag_clips->size(); ++i ) { + Indexable *indexable = (Indexable*)session->drag_clips->get(i); + ZWindow *zwindow = create_mixer(indexable); new_mixers.append(zwindow); } @@ -1723,6 +1741,11 @@ void MWindow::stop_playback(int wait) } } +void MWindow::stop_transport() +{ + gui->stop_transport(gui->get_window_lock() ? "MWindow::stop_transport" : 0); +} + int MWindow::load_filenames(ArrayList *filenames, int load_mode, int update_filename) @@ -1935,10 +1958,10 @@ if(debug) printf("MWindow::load_filenames %d\n", __LINE__); // Load temporary EDL for nesting. EDL *nested_edl = new EDL; nested_edl->create_objects(); - nested_edl->set_path(filenames->get(i)); nested_edl->load_xml(&xml_file, LOAD_ALL); //printf("MWindow::load_filenames %p %s\n", nested_edl, nested_edl->project_path); - edl_to_nested(new_edl, nested_edl); + new_edl->create_nested(nested_edl); + new_edl->set_path(filenames->get(i)); nested_edl->Garbage::remove_user(); } else { @@ -2022,40 +2045,33 @@ if(debug) printf("MWindow::load_filenames %d\n", __LINE__); // Add new assets to EDL and schedule assets for index building. int got_indexes = 0; - for(int i = 0; i < new_edls.size(); i++) - { + for( int i=0; inested_edls->size(); j++) - { - mainindexes->add_next_asset(0, - new_edl->nested_edls->get(j)); + for( int j=0; jnested_edls.size(); ++j ) { + mainindexes->add_next_asset(0, new_edl->nested_edls[j]); + edl->nested_edls.update_index(new_edl->nested_edls[j]); got_indexes = 1; - edl->nested_edls->update_index(new_edl->nested_edls->get(j)); } } if(debug) printf("MWindow::load_filenames %d\n", __LINE__); - for(int i = 0; i < new_assets.size(); i++) - { + for( int i=0; iasset->path, - new_asset->path)) - { + if( !strcmp(new_file->asset->path, new_asset->path) ) { got_it = 1; break; } } mainindexes->add_next_asset(got_it ? new_file : 0, new_asset); - got_indexes = 1; edl->assets->update(new_asset); + got_indexes = 1; } if(debug) printf("MWindow::load_filenames %d\n", __LINE__); @@ -2247,32 +2263,37 @@ void MWindow::test_plugins(EDL *new_edl, char *path) } -void MWindow::init_shm() +void MWindow::init_shm(const char *pfn, int64_t min) { + int64_t result = 0; // Fix shared memory - FILE *fd = fopen("/proc/sys/kernel/shmmax", "w"); - if(fd) { - fprintf(fd, "0x7fffffff"); + FILE *fd = fopen(pfn, "r"); + if( fd ) { + fscanf(fd, "%jd", &result); fclose(fd); + if( result >= min ) return; } - fd = 0; - fd = fopen("/proc/sys/kernel/shmmax", "r"); - if(!fd) { - MainError::show_error("MWindow::init_shm: couldn't open /proc/sys/kernel/shmmax for reading.\n"); + fd = fopen(pfn, "w"); + if( !fd ) return; + fprintf(fd, "0x%jx", min); + fclose(fd); + + fd = fopen(pfn, "r"); + if( !fd ) { + eprintf(_("MWindow::init_shm: couldn't open %s for reading.\n"), pfn); return; } - int64_t result = 0; fscanf(fd, "%jd", &result); fclose(fd); - fd = 0; - if(result < 0x7fffffff) { - eprintf(_("MWindow::init_shm: /proc/sys/kernel/shmmax is %p.\n" + if( result < min ) { + eprintf(_("MWindow::init_shm: %s is %p.\n" "you probably need to be root, or:\n" - "as root, run: echo 0x7fffffff > /proc/sys/kernel/shmmax\n" + "as root, run: echo 0x%jx > %s\n" "before trying to start cinelerra.\n" - "It should be at least 0x7fffffff for Cinelerra.\n"), (void *)result); + "It should be at least 0x%jx for Cinelerra.\n"), + pfn, (void *)result, min, pfn, min); } } @@ -2457,7 +2478,8 @@ void MWindow::create_objects(int want_gui, &MWindowGUI::keyboard_listener); hide_splash(); - init_shm(); + init_shm("/proc/sys/kernel/shmmax", 0x7fffffff); + init_shm("/proc/sys/kernel/shmmni", 0x4000); if(debug) PRINT_TRACE BC_WindowBase::get_resources()->vframe_shm = 1; @@ -3201,38 +3223,6 @@ if(debug) printf("MWindow::asset_to_edl %d\n", __LINE__); return 0; } -int MWindow::edl_to_nested(EDL *new_edl, - EDL *nested_edl) -{ - -// Keep frame rate, sample rate, and output size unchanged. -// These parameters would revert the project if VWindow displayed an asset -// of different size than the project. - - - -// Nest all video & audio outputs - new_edl->session->video_tracks = 1; - new_edl->session->audio_tracks = nested_edl->session->audio_channels; - new_edl->create_default_tracks(); - - - - new_edl->insert_asset(0, - nested_edl, - 0, - 0, - 0); - - char string[BCTEXTLEN]; - FileSystem fs; - fs.extract_name(string, nested_edl->path); -//printf("MWindow::edl_to_nested %p %s\n", nested_edl, nested_edl->path); - - strcpy(new_edl->local_session->clip_title, string); - - return 0; -} // Reset everything after a load. void MWindow::update_project(int load_mode) @@ -3280,6 +3270,10 @@ void MWindow::update_project(int load_mode) if( !vwindow->is_running() ) continue; vwindow->close_window(); } + for( int i=0; ivwindow_edls.size(); ++i ) { + VWindow *vwindow = get_viewer(1, -1); + vwindow->change_source(i); + } if(debug) PRINT_TRACE select_zwindow(0); close_mixers(); @@ -3361,10 +3355,13 @@ void MWindow::save_backup() FileXML file; edl->optimize(); edl->set_path(session->filename); - char backup_path[BCTEXTLEN]; + char backup_path[BCTEXTLEN], backup_path1[BCTEXTLEN]; snprintf(backup_path, sizeof(backup_path), "%s/%s", File::get_config_path(), BACKUP_FILE); - edl->save_xml(&file, backup_path, 0, 0); + snprintf(backup_path1, sizeof(backup_path1), "%s/%s", + File::get_config_path(), BACKUP_FILE1); + rename(backup_path, backup_path1); + edl->save_xml(&file, backup_path); file.terminate_string(); FileSystem fs; fs.complete_path(backup_path); @@ -3400,6 +3397,29 @@ void MWindow::load_backup() save_backup(); } + +void MWindow::save_undo_data() +{ + char perpetual_path[BCTEXTLEN]; + snprintf(perpetual_path, sizeof(perpetual_path), "%s/%s", + File::get_config_path(), PERPETUAL_FILE); + FILE *fp = fopen(perpetual_path,"w"); + if( !fp ) return; + undo->save(fp); + fclose(fp); +} + +void MWindow::load_undo_data() +{ + char perpetual_path[BCTEXTLEN]; + snprintf(perpetual_path, sizeof(perpetual_path), "%s/%s", + File::get_config_path(), PERPETUAL_FILE); + FILE *fp = fopen(perpetual_path,"r"); + if( !fp ) return; + undo->load(fp); + fclose(fp); +} + static inline int gcd(int m, int n) { int r;