X-Git-Url: https://git.cinelerra-gg.org/git/?p=goodguy%2Fcinelerra.git;a=blobdiff_plain;f=cinelerra-5.1%2Fcinelerra%2Fmwindowedit.C;h=47b29ee891e06898cc2ce14dbad0e2a5a36d1117;hp=6336841b434dfbd73a51c5bf0a6f516c9299a57d;hb=84ac8a2bb3357c04a3f67cf763b0f61ddbbd021d;hpb=9a75aafbc51be29b49351a51e9084bb34d255c0d diff --git a/cinelerra-5.1/cinelerra/mwindowedit.C b/cinelerra-5.1/cinelerra/mwindowedit.C index 6336841b..47b29ee8 100644 --- a/cinelerra-5.1/cinelerra/mwindowedit.C +++ b/cinelerra-5.1/cinelerra/mwindowedit.C @@ -85,7 +85,8 @@ void MWindow::add_audio_track_entry(int above, Track *dst) { undo_before(); - add_audio_track(above, dst); + Track *track = add_audio_track(above, dst); + track->master = 1; save_backup(); undo_after(_("add track"), LOAD_ALL); @@ -95,10 +96,11 @@ void MWindow::add_audio_track_entry(int above, Track *dst) cwindow->refresh_frame(CHANGE_EDL); } -void MWindow::add_video_track_entry(Track *dst) +void MWindow::add_video_track_entry(int above, Track *dst) { undo_before(); - add_video_track(1, dst); + Track *track = add_video_track(above, dst); + track->master = 1; undo_after(_("add track"), LOAD_ALL); restart_brender(); @@ -109,10 +111,11 @@ void MWindow::add_video_track_entry(Track *dst) save_backup(); } -void MWindow::add_subttl_track_entry(Track *dst) +void MWindow::add_subttl_track_entry(int above, Track *dst) { undo_before(); - add_subttl_track(1, dst); + Track *track = add_subttl_track(above, dst); + track->master = 1; undo_after(_("add track"), LOAD_ALL); restart_brender(); @@ -124,28 +127,28 @@ void MWindow::add_subttl_track_entry(Track *dst) } -int MWindow::add_audio_track(int above, Track *dst) +Track *MWindow::add_audio_track(int above, Track *dst) { - edl->tracks->add_audio_track(above, dst); + Track *track = edl->tracks->add_audio_track(above, dst); edl->tracks->update_y_pixels(theme); save_backup(); - return 0; + return track; } -int MWindow::add_video_track(int above, Track *dst) +Track *MWindow::add_video_track(int above, Track *dst) { - edl->tracks->add_video_track(above, dst); + Track *track = edl->tracks->add_video_track(above, dst); edl->tracks->update_y_pixels(theme); save_backup(); - return 0; + return track; } -int MWindow::add_subttl_track(int above, Track *dst) +Track *MWindow::add_subttl_track(int above, Track *dst) { - edl->tracks->add_subttl_track(above, dst); + Track *track = edl->tracks->add_subttl_track(above, dst); edl->tracks->update_y_pixels(theme); save_backup(); - return 0; + return track; } void MWindow::asset_to_all() @@ -286,7 +289,8 @@ void MWindow::clear_entry() edl->optimize(); save_backup(); - undo_after(_("clear"), LOAD_EDITS | LOAD_TIMEBAR); + undo_after(_("clear"), + LOAD_AUTOMATION + LOAD_EDITS + LOAD_TIMEBAR); restart_brender(); update_plugin_guis(); @@ -1202,6 +1206,56 @@ void MWindow::move_tracks_up() } +void MWindow::swap_track_down(Track *track) +{ + undo_before(); + edl->tracks->swap_track_down(track); + save_backup(); + undo_after(_("swap track down"), LOAD_ALL); + + restart_brender(); + gui->update(1, NORMAL_DRAW, 0, 0, 1, 0, 0); + sync_parameters(CHANGE_EDL); + save_backup(); +} + +void MWindow::swap_tracks_down() +{ + undo_before(); + edl->tracks->swap_tracks_down(); + save_backup(); + undo_after(_("swap tracks down"), LOAD_ALL); + + restart_brender(); + gui->update(1, NORMAL_DRAW, 0, 0, 1, 0, 0); + sync_parameters(CHANGE_EDL); + save_backup(); +} + +void MWindow::swap_track_up(Track *track) +{ + undo_before(); + edl->tracks->swap_track_up(track); + save_backup(); + undo_after(_("swap track up"), LOAD_ALL); + restart_brender(); + gui->update(1, NORMAL_DRAW, 0, 0, 1, 0, 0); + sync_parameters(CHANGE_EDL); + save_backup(); +} + +void MWindow::swap_tracks_up() +{ + undo_before(); + edl->tracks->swap_tracks_up(); + save_backup(); + undo_after(_("swap tracks up"), LOAD_ALL); + restart_brender(); + gui->update(1, NORMAL_DRAW, 0, 0, 1, 0, 0); + sync_parameters(CHANGE_EDL); +} + + void MWindow::mute_selection() { double start = edl->local_session->get_selectionstart(); @@ -1273,7 +1327,8 @@ void MWindow::overwrite(EDL *source, int all) edl->local_session->set_selectionend(dst_start + overwrite_len); save_backup(); - undo_after(_("overwrite"), LOAD_EDITS); + undo_after(_("overwrite"), + LOAD_AUTOMATION + LOAD_EDITS + LOAD_TIMEBAR); restart_brender(); update_plugin_guis(); @@ -1326,7 +1381,8 @@ void MWindow::paste(double start, Track *first_track, int clear_selection, int o save_backup(); - undo_after(_("paste"), LOAD_EDITS | LOAD_TIMEBAR); + undo_after(_("paste"), + LOAD_AUTOMATION + LOAD_EDITS + LOAD_TIMEBAR); restart_brender(); update_plugin_guis(); gui->update(1, FORCE_REDRAW, 1, 1, 0, 1, 0); @@ -1363,7 +1419,8 @@ int MWindow::paste_assets(double position, Track *dest_track, int overwrite) save_backup(); - undo_after(_("paste assets"), LOAD_EDITS); + undo_after(_("paste assets"), + LOAD_AUTOMATION + LOAD_EDITS + LOAD_TIMEBAR); restart_brender(); gui->update(1, FORCE_REDRAW, 1, 0, 0, 1, 0); sync_parameters(CHANGE_EDL); @@ -1784,7 +1841,8 @@ void MWindow::paste_silence() edl->session->autos_follow_edits); edl->optimize(); save_backup(); - undo_after(_("silence"), LOAD_EDITS | LOAD_TIMEBAR); + undo_after(_("silence"), + LOAD_AUTOMATION + LOAD_EDITS + LOAD_TIMEBAR); update_plugin_guis(); restart_brender(); @@ -2155,7 +2213,8 @@ void MWindow::splice(EDL *source, int all) edl->local_session->set_selectionend(start + source_end - source_start); save_backup(); - undo_after(_("splice"), LOAD_EDITS | LOAD_TIMEBAR); + undo_after(_("splice"), + LOAD_AUTOMATION + LOAD_EDITS + LOAD_TIMEBAR); update_plugin_guis(); restart_brender(); gui->update(1, NORMAL_DRAW, 1, 1, 0, 1, 0); @@ -2286,7 +2345,8 @@ void MWindow::trim_selection() edl->session->autos_follow_edits); save_backup(); - undo_after(_("trim selection"), LOAD_EDITS | LOAD_TIMEBAR); + undo_after(_("trim selection"), + LOAD_AUTOMATION + LOAD_EDITS + LOAD_TIMEBAR); update_plugin_guis(); gui->update(1, FORCE_REDRAW, 1, 1, 1, 1, 0); cwindow->update(1, 0, 0, 0, 1); @@ -2516,7 +2576,10 @@ void MWindow::cut_commercials() int MWindow::normalize_speed(EDL *old_edl, EDL *new_edl) { - int result = 0; + int result = 0, first_track = 1; + int plugins_follow_edits = edl->session->plugins_follow_edits; + int autos_follow_edits = edl->session->autos_follow_edits; + int labels_follow_edits = edl->session->labels_follow_edits; Track *old_track = old_edl->tracks->first; Track *new_track = new_edl->tracks->first; for( ; old_track && new_track; old_track=old_track->next, new_track=new_track->next ) { @@ -2532,17 +2595,101 @@ int MWindow::normalize_speed(EDL *old_edl, EDL *new_edl) } Edit *old_edit = old_track->edits->first; Edit *new_edit = new_track->edits->first; - for( ; old_edit && new_edit; old_edit=old_edit->next, new_edit=new_edit->next ) { - int64_t edit_start = old_edit->startproject, edit_end = edit_start + old_edit->length; + while( old_edit && new_edit ) { + int64_t edit_start = old_edit->startproject; + int64_t edit_end = edit_start + old_edit->length; if( old_speed || new_speed ) { double orig_start = old_speeds->automation_integral(0, edit_start, PLAY_FORWARD); double orig_end = old_speeds->automation_integral(0, edit_end, PLAY_FORWARD); - edit_start = new_speeds->speed_position(orig_start); - edit_end = new_speeds->speed_position(orig_end); + edit_start = new_track->frame_align(new_speeds->speed_position(orig_start), 1); + edit_end = new_track->frame_align(new_speeds->speed_position(orig_end), 1); result = 1; } new_edit->startproject = edit_start; new_edit->length = edit_end - edit_start; + old_edit = old_edit->next; + new_edit = new_edit->next; + } + if( first_track && old_track->is_armed() ) { + if( labels_follow_edits ) { + Labels *old_labels = old_edl->labels; + Labels *new_labels = new_edl->labels; + Label *old_label = old_labels ? old_labels->first : 0; + Label *new_label = new_labels ? new_labels->first : 0; + while( old_label && new_label ) { + int64_t label_pos = old_track->to_units(old_label->position, 1); + if( old_speed || new_speed ) { + double orig_pos = old_speeds->automation_integral(0, label_pos, PLAY_FORWARD); + label_pos = new_track->frame_align(new_speeds->speed_position(orig_pos), 1); + result = 1; + } + new_label->position = new_track->from_units(label_pos); + old_label = old_label->next; + new_label = new_label->next; + } + } + first_track = 0; + } + if( autos_follow_edits ) { + for( int i=0; iautomation->autos[i]; + Autos *new_autos = new_track->automation->autos[i]; + Auto *old_auto = old_autos ? old_autos->first : 0; + Auto *new_auto = new_autos ? new_autos->first : 0; + while( old_auto && new_auto ) { + int64_t auto_pos = old_auto->position; + if( old_speed || new_speed ) { + double orig_pos = old_speeds->automation_integral(0, auto_pos, PLAY_FORWARD); + auto_pos = new_track->frame_align(new_speeds->speed_position(orig_pos), 1); + result = 1; + } + new_auto->position = auto_pos; + old_auto = old_auto->next; + new_auto = new_auto->next; + } + } + } + if( !plugins_follow_edits ) continue; + int old_size = old_track->plugin_set.size(); + int new_size = new_track->plugin_set.size(); + int n = bmin(old_size, new_size); + for( int i=0; iplugin_set[i]; + Plugin *old_plugin = (Plugin *)(old_plugin_set ? old_plugin_set->first : 0); + PluginSet *new_plugin_set = new_track->plugin_set[i]; + Plugin *new_plugin = (Plugin *)(new_plugin_set ? new_plugin_set->first : 0); + while( old_plugin && new_plugin ) { + int64_t plugin_start = old_plugin->startproject; + int64_t plugin_end = plugin_start + old_plugin->length; + if( old_speed || new_speed ) { + double orig_start = old_speeds->automation_integral(0, plugin_start, PLAY_FORWARD); + double orig_end = old_speeds->automation_integral(0, plugin_end, PLAY_FORWARD); + plugin_start = new_track->frame_align(new_speeds->speed_position(orig_start), 1); + plugin_end = new_track->frame_align(new_speeds->speed_position(orig_end), 1); + result = 1; + } + new_plugin->startproject = plugin_start; + new_plugin->length = plugin_end - plugin_start; + if( autos_follow_edits ) { + KeyFrames *old_keyframes = old_plugin->keyframes; + Auto *old_auto = old_keyframes ? old_keyframes->first : 0; + KeyFrames *new_keyframes = new_plugin->keyframes; + Auto *new_auto = new_keyframes ? new_keyframes->first : 0; + while( old_auto && new_auto ) { + int64_t auto_pos = old_auto->position; + if( old_speed || new_speed ) { + double orig_pos = old_speeds->automation_integral(0, auto_pos, PLAY_FORWARD); + auto_pos = new_track->frame_align(new_speeds->speed_position(orig_pos), 1); + result = 1; + } + new_auto->position = auto_pos; + old_auto = old_auto->next; + new_auto = new_auto->next; + } + } + old_plugin = (Plugin *)old_plugin->next; + new_plugin = (Plugin *)new_plugin->next; + } } } return result; @@ -2657,3 +2804,120 @@ void MWindow::paste_effects() group->remove_user(); } +void MWindow::align_timecodes() +{ + undo_before(); + double offset = edl->tracks->align_timecodes(); + set_timecode_offset(offset); + save_backup(); + undo_after(_("align timecodes"), LOAD_ALL); + restart_brender(); + cwindow->refresh_frame(CHANGE_EDL); + update_plugin_guis(); +} + + +int MWindow::masters_to_mixers() +{ + Track *master_track = edl->tracks->first; + while( master_track && !master_track->master ) + master_track = master_track->next; + while( master_track ) { // test for track/mixer conflicts + int failed = 0; + Track *mixer_last = master_track; + Track *track = master_track->next; + for( ; track && !track->master; track=track->next ) + mixer_last = track; + Track *next_track = track; + Mixer *master_mixer = 0; + for( int i=0, n=edl->mixers.size(); iindex_in(edl->mixers[i]) >= 0 ) { + master_mixer = edl->mixers[i]; + break; + } + } + if( master_mixer ) { // existing mixer track group + for( track=master_track; !failed && track; track=track->next ) { + if( track->index_in(master_mixer) < 0 ) { + eprintf("Mixer: %s missing track: %s", + master_mixer->title, track->title); + failed = 1; + } + if( track == mixer_last ) break; + } + for( int i=0, n=master_mixer->mixer_ids.size(); !failed && imixer_ids[i], found = 0; + for( track=master_track; track; track=track->next ) { + if( track->mixer_id == mixer_id ) { + found = 1; + break; + } + if( track == mixer_last ) break; + } + if( !found ) { + eprintf("Mixer: %s track missing: %s", + master_mixer->title, track->title); + failed = 1; + } + } + } + else { // create mixer + for( track=master_track->next; !failed && track; track=track->next ) { + for( int i=0, n=edl->mixers.size(); !failed && imixers[i]; + if( track->index_in(mixer) >= 0 ) { + eprintf("Track: %s already exists in mixer: %s", + track->title, mixer->title); + failed = 1; + break; + } + } + if( track == mixer_last ) break; + } + if( !failed ) { // new mixer + ZWindow *zwindow = get_mixer(master_mixer); + zwindow->set_title(master_track->title); + sprintf(master_track->title, _("Mixer %d"), zwindow->idx); + for( track=master_track; track; track=track->next ) { + track->play = track->armed = 0; + master_mixer->mixer_ids.append(track->get_mixer_id()); + if( track == mixer_last ) break; + } + zwindow->start(); + } + } + master_track = next_track; + } + return 0; +} + +void MWindow::mix_masters() +{ + undo_before(); + masters_to_mixers(); + undo_after(_("mix masters"), LOAD_ALL); + + restart_brender(); + gui->update(1, NORMAL_DRAW, 0, 0, 1, 0, 0); + gui->activate_timeline(); + cwindow->refresh_frame(CHANGE_EDL); + save_backup(); +} + +void MWindow::create_keyframes(int mask, int mode) +{ + undo_before(); + double start = edl->local_session->get_selectionstart(); + edl->tracks->create_keyframes(start, mask, mode); + double end = edl->local_session->get_selectionend(); + if( end != start ) + edl->tracks->create_keyframes(end, mask, mode); + undo_after(_("create kyfrms"), LOAD_AUTOMATION); + + restart_brender(); + gui->update(1, NORMAL_DRAW, 0, 0, 1, 0, 0); + gui->activate_timeline(); + cwindow->refresh_frame(CHANGE_EDL); + save_backup(); +} +