X-Git-Url: https://git.cinelerra-gg.org/git/?p=goodguy%2Fcinelerra.git;a=blobdiff_plain;f=cinelerra-5.1%2Fcinelerra%2Fmwindowedit.C;h=d424d60879335f2f4dc267f2b57dedb9f88f47dc;hp=26aa4cb25054d2f3317c8d1222a16baa7202d48f;hb=9303c74f396d12f0fb48639ff6a835824cbc5987;hpb=a1ac06b20d3f74749b612998908e70fbac7f48ab diff --git a/cinelerra-5.1/cinelerra/mwindowedit.C b/cinelerra-5.1/cinelerra/mwindowedit.C index 26aa4cb2..d424d608 100644 --- a/cinelerra-5.1/cinelerra/mwindowedit.C +++ b/cinelerra-5.1/cinelerra/mwindowedit.C @@ -2722,3 +2722,91 @@ void MWindow::align_timecodes() 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(); +} +