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);
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();
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();
}
-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()
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();
for( Track *track=dest_track; track; track=track->next ) {
if( gang && track->master && !first_track ) break;
if( track->data_type != data_type ) continue;
- if( !track->armed ) continue;
+ if( !track->is_armed() ) continue;
int module = edl->tracks->number_of(track);
for( int i=0; i<session->drag_pluginservers->total; ++i ) {
PluginServer *plugin = session->drag_pluginservers->values[i];
- int shared = gang && plugin->multichannel ? 1 : 0;
+ int shared = gang; // && plugin->multichannel ? 1 : 0;
int plugin_type = !first_track && shared ?
PLUGIN_SHAREDPLUGIN : PLUGIN_STANDALONE;
SharedLocation *shared_location = !first_track ?
&shared_locations[i] : &shared_locations.append();
insert_effect(plugin->title, shared_location, track,
- pluginset, start, length, plugin_type);
+ pluginset, start, length, plugin_type);
if( first_track && shared ) {
shared_location->module = module;
shared_location->plugin = pluginset ?
SharedLocation shared_location_local;
shared_location_local.copy_from(shared_location);
int first_track = 1;
+ double start_pos = edl->local_session->get_selectionstart(1);
+ double end_pos = edl->local_session->get_selectionend(1);
for( ; current; current=NEXT ) {
- if( current->data_type == data_type && current->is_armed() ) {
- double start = edl->local_session->get_selectionstart(1);
- double end = edl->local_session->get_selectionend(1);
- double length = end - start;
- if( start >= end ) {
- start = 0;
- length = current->get_length();
- }
- insert_effect(title, &shared_location_local,
+ if( current->data_type != data_type ) continue;
+ if( !current->is_armed() ) continue;
+ double start = start_pos, end = end_pos;
+ if( plugin_type == PLUGIN_STANDALONE && start >= end ) {
+ start = 0;
+ end = current->get_length();
+ }
+ double length = end - start;
+ insert_effect(title, &shared_location_local,
current, 0, start, length, plugin_type);
-
- if( first_track ) {
- if( plugin_type == PLUGIN_STANDALONE && single_standalone ) {
- plugin_type = PLUGIN_SHAREDPLUGIN;
- shared_location_local.module = edl->tracks->number_of(current);
- shared_location_local.plugin = current->plugin_set.total - 1;
- }
- first_track = 0;
+ if( first_track ) {
+ if( plugin_type == PLUGIN_STANDALONE && single_standalone ) {
+ plugin_type = PLUGIN_SHAREDPLUGIN;
+ shared_location_local.module = edl->tracks->number_of(current);
+ shared_location_local.plugin = current->plugin_set.total - 1;
+ start_pos = start; end_pos = end;
}
+ first_track = 0;
}
}
}
-
void MWindow::insert_effect(char *title,
- SharedLocation *shared_location,
- Track *track,
- PluginSet *plugin_set,
- double start,
- double length,
- int plugin_type)
+ SharedLocation *shared_location, Track *track, PluginSet *plugin_set,
+ double start, double length, int plugin_type)
{
KeyFrame *default_keyframe = 0;
PluginServer *server = 0;
server->save_data(default_keyframe);
}
// Insert plugin object
- track->insert_effect(title, shared_location,
- default_keyframe, plugin_set,
- start, length, plugin_type);
+ track->insert_effect(title, shared_location, default_keyframe,
+ plugin_set, start, length, plugin_type);
track->optimize();
if( plugin_type == PLUGIN_STANDALONE ) {
}
+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();
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();
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);
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);
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();
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);
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);
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 ) {
}
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; i<AUTOMATION_TOTAL; ++i ) {
+ Autos *old_autos = old_track->automation->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; i<n; ++i ) {
+ PluginSet *old_plugin_set = old_track->plugin_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;
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(); i<n; ++i ) {
+ if( master_track->index_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 && i<n; ++i ) {
+ int mixer_id = master_mixer->mixer_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 && i<n; ++i ) {
+ Mixer *mixer = edl->mixers[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();
+}
+